사용자:Utoleetest/every dict

시리즈:모두의 영한사전에 개별 단어를 등록할 때 유용한 스크립트입니다.

사용방법[편집 | 원본 편집]

  1. pywikibot이 있는 디렉토리에 text 폴더를 만든 뒤 새로 'everyDict.txt' 파일을 만듭니다.
    • 참고 : 다른 파일명을 사용했을 경우 아래 with open 부분에서 파일명을 바꾸면 됩니다. 그밖에 os 패키지 등을 불러서 적절히 여러 파일들을 업로드시키는 등 변형이 가능합니다.
  2. 그 다음 everyDict.txt에 다음과 같은 형식으로 작성합니다. 여기서 발음 부분과 의미 부분 아래는 반드시 서술해야 하며, 나머지 숙어, 파생어, 유의어, 반의어, 참조, 기타 부분은 서술하지 않으면 봇이 알아서 작성하지 않습니다. 괄호친 부분은 위키 문법 형식에 맞추어 작성하시면 됩니다.
    • 단어 : 영어단어를 사용하시면 됩니다. 반드시 = 사이는 공백을 한 칸만 띄우셔야 에러가 발생하지 않습니다.
    • 발음(필수) : 발음 텍스트를 집어넣으시면 됩니다. pre 문법이 나타나게 한 킨 띄우고 쓰는 것을 권장합니다.
    • 의미(필수) : 의미를 집어넣으시면 됩니다. 반드시 리스트 형식으로 집어넣으셔야 합니다. 강제 지침은 없으나 문서의 통일성을 위해 다음과 같은 형식을 권장합니다. 예문을 2개 이상 넣고 싶을 때에는 주석 부분을 해제하시면 됩니다.
    • 숙어 : 이 단어가 포함된 숙어구를 집어넣으시면 됩니다.
    • 파생어 : 이 단어에서 파생된 단어를 설명하면 됩니다. 의미와 유사하게 리스트 형식으로 서술할 것을 권장합니다.
    • 유의어 : 이 단어에 대해 유의어를 작성합니다.
    • 반의어 : 이 단어에 대한 반의어를 작성합니다.
    • 참조 : 이 단어와 관련된 참조사항을 작성합니다.
    • 기타 : 나머지 서술을 작성합니다. 첫 줄은 문단 기호를 사용해야 다른 문단의 하위문단에 들어가지 않고 독립 문단으로 서술됩니다.
  3. 마지막으로 아래 스크립트 내용을 scripts/userscripts 폴더에 저장한 뒤에 every_dict.py로 저장합니다.
  4. 호출할 때에는 pywikibot이 있는 콘솔창에 아래와 같이 입력하면 됩니다.
> python pwb.py every_dict

everyDict.txt 작성방법[편집 | 원본 편집]

아래 패턴을 여러 단어에 대해 서술할 경우 여러 단어를 한번에 업로드할 수 있습니다.

= (단어) =
<!--발음-->
(발음 텍스트)
<!--의미-->
(의미)
<!--숙어-->
(숙어)
<!--파생어-->
(파생어)
<!--어원-->
(어원)
<!--유의어-->
(유의어)
<!--반의어-->
(반의어)
<!--참조-->
(참조)
<!--기타-->
(기타)

의미 부분 권장형식[편집 | 원본 편집]

# (품사). 의미
#* (영어예문)
#** (예문에 대한 해석)
<!--#* (영어예문2
#** (예문2에 대한 해석) -->
<!--# (품사2). 의미2
#* (영어예문3)
#** (예문3에 대한 해석)-->

스크립트[편집 | 원본 편집]

import pywikibot
import re

site = pywikibot.Site('ko', 'libre')

with open('./text/everyDict.txt', 'r', encoding='utf-8') as f:
    txt_lines = f.readlines()

'''텍스트 형식 :
= (단어) =
<!--발음-->
(발음 텍스트)
<!--의미-->
(의미)
<!--숙어-->
(숙어)
<!--파생어-->
(파생어)
<!--어원-->
(어원)
<!--유의어-->
(유의어)
<!--반의어-->
(반의어)
<!--참조-->
(참조)
<!--기타-->
(기타)
'''

title_pat = r"^= (.*) ="  # word

doc_format = '''<big><big><big>{word_title}</big></big></big>
----
== 발음 ==
{pronunciation}
== 의미 ==
{meaning}
{T_idiom}
{T_derivation}
{T_origin}
== 관련 단어 ==
{T_synonym}
{T_antonym}
{T_reference}
{T_etc}
== 다른 곳 ==
* [[Wiktionary:{word}|영어 위키낱말사전 {word}]]
* [http://aha-dic.com/View.asp?word={word} 아하사전 {word}]
* [https://en.dict.naver.com/#/search?query={word} 네이버 사전 {word}]
* [https://www.oxfordlearnersdictionaries.com/definition/english/{word} 옥스포드 영영사전 {word}]
* [https://www.wordreference.com/enko/{word} Word Reference {word}]

== 관련 문서 ==
* [[시리즈:모두의 영한사전/목록]]

[[분류:모두의 영한사전/{word_title:.1}|{word}]]
'''

T_idiom = '''== 숙어 ==
{0}
'''

T_derivation = '''== 파생어/활용 ==
{0}
'''

T_origin = '''== 어원 ==
{0}
'''

T_synonym = '''=== 유의어 ===
{0}
'''

T_antonym = '''=== 반의어 ===
{0}
'''

T_reference = '''=== 참조 ===
{0}
'''

T_etc = '''{0}
'''

pat_pronunciation = r"^<!--(pronounce|pronunciation|발음)-->"
pat_meaning = r"^<!--(meaning|mean|의미|뜻)-->"
pat_idiom = r"^<!--(idiom|숙어)-->"
pat_derivation = r"^<!--(derivation|derive|파생어|파생어/활용|활용)-->"
pat_origin = r"^<!--(origin|어원|유래)-->"
pat_synonym = r"^<!--(synonym|sym|유의어|동의어)-->"
pat_antonym = r"^<!--(antonym|ant|반의어)-->"
pat_reference = r"^<!--(refer|reference|참조)-->"
pat_etc = r"^<!--(etc|misc|miscellaneous|기타)-->"

# 우선 단어별로 끊어놓는다.
# {"단어명": "설명"}
word_lists = {}
current = ''  # 데이터 수집할 유형
# pronunciation, meaning, idiom, derivation, synonym, antonym, reference, etc
word = ''  # 단어
pronunciation = ''
meaning = ''
idiom = ''
derivation = ''
origin = ''
synonym = ''
antonym = ''
reference = ''
etc = ''

for line in txt_lines:
    # with title_pat
    if re.match(title_pat, line):
        word_new = re.match(title_pat, line).group(1)
        current = ''
        # 새 단어를 만날 때 이전 단어를 패턴으로 처리

        if word != word_new and word != "":
            word_lists[word] = doc_format.format(
                word=word,
                word_title=word.title(),
                pronunciation=pronunciation,
                meaning=meaning,
                T_idiom=T_idiom.format(idiom) if idiom != "" else "",
                T_derivation=T_derivation.format(derivation) if derivation != "" else "",
                T_origin=T_origin.format(origin) if origin != "" else "",
                T_synonym=T_synonym.format(synonym) if synonym != "" else "",
                T_antonym=T_antonym.format(antonym) if antonym != "" else "",
                T_reference=T_reference.format(reference) if reference != "" else "",
                T_etc=T_etc.format(etc) if etc != "" else ""
            )
        if word != word_new:
            word = word_new
            # 충돌 방지를 위해 전부 초기화
            pronunciation = ''
            meaning = ''
            idiom = ''
            derivation = ''
            origin = ''
            synonym = ''
            antonym = ''
            reference = ''
            etc = ''

    elif re.match(pat_pronunciation, line):
        current = 'pronunciation'
        pronunciation = ''
    elif re.match(pat_meaning, line):
        current = 'meaning'
        meaning = ''
    elif re.match(pat_idiom, line):
        current = 'idiom'
        idiom = ''
    elif re.match(pat_derivation, line):
        current = 'derivation'
        derivation = ''
    elif re.match(pat_origin, line):
        current = 'origin'
        origin = ''
    elif re.match(pat_synonym, line):
        current = 'synonym'
        synonym = ''
    elif re.match(pat_antonym, line):
        current = 'antonym'
        antonym = ''
    elif re.match(pat_reference, line):
        current = 'reference'
        reference = ''
    elif re.match(pat_etc, line):
        current = 'etc'
        etc = ''
    else:  # 나머지 경우
        if current == "pronunciation":
            pronunciation += line
        elif current == "meaning":
            meaning += line
        elif current == "idiom":
            idiom += line
        elif current == "derivation":
            derivation += line
        elif current == "origin":
            origin += line
        elif current == "synonym":
            synonym += line
        elif current == "antonym":
            antonym += line
        elif current == "reference":
            reference += line
        elif current == "etc":
            etc += line
        else:
            pass

# last word pattern
word_lists[word] = doc_format.format(
    word=word,
    word_title=word.title(),
    pronunciation=pronunciation,
    meaning=meaning,
    T_idiom=T_idiom.format(idiom) if idiom != "" else "",
    T_derivation=T_derivation.format(derivation) if derivation != "" else "",
    T_origin=T_origin.format(origin) if origin != "" else "",
    T_synonym=T_synonym.format(synonym) if synonym != "" else "",
    T_antonym=T_antonym.format(antonym) if antonym != "" else "",
    T_reference=T_reference.format(reference) if reference != "" else "",
    T_etc=T_etc.format(etc) if etc != "" else ""
)

# remove duplicated carriage return
for key in word_lists.keys():
    word_lists[key] = re.sub(r'\n{3,}','\n\n', word_lists[key])

    page = pywikibot.Page(site, f'모두의 영한사전/{key}', 1600)
    page.text = word_lists[key]
    page.save('봇:모두의 영한사전에 단어 등록')