사용자:티첼/DisamList.py

위키백과, 우리 모두의 백과사전.
# -*- encoding: utf-8  -*-
# 출처: [[사용자:Klutzy:bot/script]]

import wikipedia, pagegenerators, catlib
from collections import defaultdict

def title_key(title):
    if isinstance(title, str): title = title.decode('utf-8')
    cho = (ord(title[0]) - ord(u'가'))/588
    if 0 <= cho and cho < 19:
        return u'ㄱㄱㄴㄷㄷㄹㅁㅂㅂㅅㅅㅇㅈㅈㅊㅋㅌㅍㅎ'[cho]
    else: return u'기타'

def combine(data, key, f):
    data.sort()
    res = u""
    res += u"== %s ==\n"%key
    res += u" -\n".join(f(i) for i in data)
    return res

def output(data, f):
    res = u""
    for key in sorted(data.keys()): # ㄱ, ㄴ, ..., ㅍ, ㅎ, 기타
        lis = data[key]
        res += combine(lis, key, f)
        res += u"\n\n"
    return res

def write_page(title, data, sub=False):
    page = wikipedia.Page(wikipedia.getSite(), title)
    text = page.get()

    head = text.split(u"==", 1)[0]
    tail = u""
    if not sub: # 서브페이지는 푸터가 없는 걸로 간주
        tailkey = u"[[분류:"
        tail = tailkey + text.split(tailkey, 1)[1]
    
    new_text = head + data + tail
    page.put(new_text, u"robot: 동음이의 목록 자동 갱신")
    
def main():
    u"""
    [[위키백과:동음이의어 문서의 목록]],
    [[위키백과:(동음이의) 문서의 목록]]을
    자동으로 관리합니다.

    문서에서 "=="로 시작하는 곳부터 "[[분류:"가 나오기 직전의
    모든 부분을 실제 편집하는 공간으로 간주합니다.
    """
    data1 = defaultdict(list) # 동음이의어
    data2 = defaultdict(list) # (동음이의)
    
    title = u"분류:동음이의어 문서"
    cat = catlib.Category(wikipedia.getSite(), title)
    for page in cat.articles():
        title = page.title()
        key = title_key(title)

        t = u" (동음이의)"
        if title.endswith(t):
            title = title[:-len(t)]
            data2[key].append(title)
        else:
            data1[key].append(title)
    
    for key in data1.keys():
        title = u"위키백과:동음이의어 문서의 목록/%s"%key
        res = combine(data1[key], key, lambda s: u"[[%s]]"%s)
        write_page(title, res, sub=True)

    res = output(data2, lambda s: u"[[%s (동음이의)|%s]]"%(s,s))
    write_page(u"위키백과:(동음이의) 문서의 목록", res)

try:
    main()
finally:
    wikipedia.stopme()