使用者:CrowleyBot/task/1
CrowleyBot | |
---|---|
(討論 · 貢獻) | |
操作者: | EdwardAlexanderCrowley |
設計者: | EdwardAlexanderCrowley |
是否已批准? | 否 |
機器人權限? | 否 |
任務: | 處理rhymes模板過時的lang參數 |
編輯頻率: | 每分鐘10筆,視網絡情況 |
自動/手動: | 全自動 |
編程語言: | python |
可以緊急停止? | 直接封禁 |
受影響頁面
- Category:使用不推薦使用的模板的Undetermined頁面,其中少於1000個頁面中的rhymes模板含有過時的lang參數
- 已列於/list
技術細節
編輯- wikitextparser可以獲取結構化頁面信息,然後捕捉所有名稱符合
r'\s*[Rr]hymes{0,1}\s*'
的模板,然後有幾種情況:
{{rhymes|word}} -> 按章节标题(使用wikitextparser的ancestors)补足第二项,或不动
{{rhymes|[[word]]|lang=en}}或{{rhymes|lang=en|''[[word]]''}}之类 -> {{rhymes|en|word}}
{{rhymes|en|word}}不动
現暫不考慮用enwikt對應模板補足缺失的lang參數。
輸出信息
編輯代碼
編輯zh = mwc.Site('zh.wiktionary.org', clients_useragent = UA)
en = mwc.Site('en.wiktionary.org', clients_useragent = UA)
zh.login(UN, PWD)
en.login(UN, PWD)
zpgl = list(map(lambda pn: zh.Pages[pn], pnl))
n = len(zpgl)
def getepg(pg):
try:
return en.Pages[dict(pg.langlinks())['en']]
except:
return None
epgl = list(map(getepg, zpgl))
fail = []
success = []
delinkfail = [] #没用到,届时手工检查
zhl2enl = {'英': 'en', '法': 'fa', '德': 'de', '徳': 'de', '意大利': 'it', '義大利': 'it', '荷兰': 'nl', '荷蘭': 'nl', '馬來西亞': 'ms', '马来西亚': 'ms'}
def purify(s):
s = s.strip("'")
if s.find('#') == -1 and s.find('|') == -1:
s = s.strip('[]')
return s
def process():
def g(t): return re.fullmatch(r'\s*[Rr]hymes{0,1}\s*', t.name)
zpg = zpgl[i]
if zpg.namespace != 0:
return
zast = wtp.parse(zpg.text())
zts = list(filter(g, zast.templates))
if len(zts) == 0:
fail.append((0, i))
return
for j, zt in enumerate(zts):
zts0 = zt.string
zt.name = 'rhymes'
args = zt.arguments
an = len(args)
if an == 0:
fail.append((1, i, j, zts0))
return
if an >= 3:
if ag := zt.get_arg("lang"):
agv = ag.value
del ag[:]
zt.arguments[0].insert(0, '|' + agv)
# 经过测试,rhymes不需要purify,但plural of需要
zpg.edit(zast.string, '见[[User:CrowleyBot/task/1]], 处理rhymes的lang参数')
success.append((11, i, j, zts0, zt.string))
return
else:
success.append((12, i, j, zts0))
return
if an == 1:
if args[0].name == 'lang':
fail.append((2, i, j, zts0))
return
else:
# args[0].value = purify(args[0].value) 在后面一起执行
al0 = zt.ancestors(type_ = "Section")
def anf(s):
return re.match('[语語]', s.title)
al1 = list(filter(anf, al0))
if len(al1) == 0:
fail.append((3, i, j, zts0))
return
if len(al1) == 2:
fail.append((4, i, j, zts0, list(map(lambda x: x.title.strip(), al0))))
return
if True:
tt = al1[0].title.strip()[:-1]
try:
zt.set_arg('lang', zhl2enl[tt])
# 会append两次
success.append((8, i, j, zts0, zt.string))
except KeyError:
print('输入%s的语言代码:' % tt)
enl = input()
if enl:
zhl2enl[tt] = enl
zt.set_arg('lang', enl)
# 会append两次
success.append((9, i, j, zts0, zt.string))
else:
fail.append((5, i, j, zts0, list(map(lambda x: x.title.strip(), al0))))
return
if True:
if args[1].name == 'lang':
a0, a1 = args[0], args[1]
# 没办法,这个库不行
a0.name, a0.value, a0.positional, a1.name, a1.value, a1.positional = a1.name, a1.value, a1.positional, a0.name, a0.value, a0.positional
if args[0].name == 'lang':
args[0].positional = True
args[1].value = purify(args[1].value)
success.append((10, i, j, zts0, zt.string))
zpg.edit(zast.string, '见[[User:CrowleyBot/task/1]], 处理rhymes的lang参数')
# time.sleep(1) 这个脚本很慢
for i in range(n):
process()