[Py] Python 製作簡易 Mac 辭典 – 以國家教育研究院專有名詞網站資料為例(下)

「國家教育研究院雙語詞彙、學術名詞暨辭書資訊網」在讀文章、寫作業的時候是常常會用到的網站,他是一本涵蓋不同領域大量的專有名詞的好用網站。本文將介紹如何將從網站下載的試算表檔案包裝成 Mac 辭典並匯入之。下篇將會用 Python 產生必要的檔案供 DDK 編譯成 Mac 自有的字典格式。

需要的資源:

  • Python 3 (測試時使用 Python 3.5.2 ( Anaconda custom (x86_64) [GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin )。你會需要「Pandas」來讀取 MS xlsx 的檔案。未在 Python2 中測試,不過 Python2 在處理中文字很麻煩,所以就盡量避免吧~
  • 字詞對照表:請至「國家教育研究院雙語詞彙、學術名詞暨辭書資訊網」的「下載專區」下載所需的檔案。或建立 Excel 試算表,並在第一列以「英文名稱」、「中文名稱」作為標題。
  • Apple 的 Dictionary Development Kit(下面簡稱 DDK)。請至 開發者網站(https://developer.apple.com/)中 「Develop」>「Downloads」搜尋並下載「Auxiliary_Tools_for_Xcode_7.dmg」。
    網路上也有人在 Github 分享,可以見這邊
  • Xcode 7 以上 (我是用 Xcode 8)

流程:

這邊先說明我們要做什麼:

  1. 製作 MyDictionary.xml 鍵值配對的檔案,就是你的字典內容。
  2. 製作其他編譯時的必須檔案。這邊就比較次要的包括辭典名稱、文字外觀等等。

完整的程式連結會放在文末,下面記錄一些比較需要注意的部分。

開始吧!

最重要的就是產生 MyDictionary.xml 了!我們複習一下範例檔裡面的內容:

<d:entry id="make_1" d:title="make">
	<d:index d:value="make"/>
	<d:index d:value="makes"/>
	<d:index d:value="made" d:title="made (make)"/>
	<d:index d:value="making" d:priority="2"/>
	<d:index d:value="make it" d:parental-control="1" d:anchor="xpointer(//*[@id='make_it'])"/>
	<div d:priority="2"><h1>make</h1></div>
	<span class="syntax">
		<span d:pr="US">| māk |</span>
		<span d:pr="US_IPA">| meɪk |</span>
		<span d:pr="UK_IPA">| meɪk |</span>
	</span>
	<div>
		<ol>
			<li>
				Form by putting parts together or combining substances; construct; create; produce 
				<span d:priority="2"> : <i>Mother made her a beautiful dress</i>
				</span>
				.
			</li>
			<li>
				Cause to be or become
				<span d:priority="2"> : <i>The news made me happy</i>
				</span>
				.
			</li>
		</ol>
	</div>
	<div d:parental-control="1" d:priority="2">
		<h3>PHRASES</h3>
		<div id="make_it"><b>make it</b> : succeed in something; survive.</div>
		<h4><a href="x-dictionary:r:make_up_ones_mind"><b>make up one's mind</b></a></h4>
	</div>
</d:entry>

上面的檔案中,所有的字典內容包在「<d:entry>」的標籤中,而「<d:index d:value=””/>」則是紀錄字典服務中搜尋的鍵(key),其他內容則是 HTML格式的內容,使用者可以客製化的做出漂亮的頁面。因為我們只是要做一個很簡單的字典,所以內部的內容就只會有簡單的兩種標籤:「<p>」:內文、「<h1>」:大標題。

我用 Pandas 去讀取 MS Excel 的 xlsx 試算表檔案,所以沒有 Pandas 的可能要自己找個替代方案。這邊做的事很簡單:先列舉出資料夾中所有 xlsx 檔案,讀取每一個 Excel 檔案中第一個試算表中「英文名稱」與「中文名稱」兩個欄的內容,並且將其內容合併唯兩個 list :self.en 與 self.zhtw(用pandas.concat(),注意要加上 ignore_index=True 的選項)。

    def Read_xlsx(self):
        self.xlsx_file_list=self.EnumerateFlie(self.csv_dire,"xlsx")
        print("[Info] {} xlsx files found.".format(len(self.xlsx_file_list)))
        self.en=None
        self.zhtw=None
        if len(self.xlsx_file_list) == 0:
            raise MakeDictionaryException("[Error] No xlsx file found. The process will terminate.")
        else:
            for i in range(len(self.xlsx_file_list)):
                _xlsx=pandas.read_excel(self.xlsx_file_list[i])
                if i == 0:
                    self.en=_xlsx["英文名稱"]
                    self.zhtw=_xlsx["中文名稱"]
                else:                    
                    self.en=pandas.concat([self.en,_xlsx["英文名稱"]],ignore_index=True)
                    self.zhtw=pandas.concat([self.zhtw,_xlsx["中文名稱"]],ignore_index=True)
        print("[OK] Merged all xlsx files")
        print("[Info] {} records founded.".format(len(self.en)))

輸出完 list 以後,我們就開始寫入文字的檔案了。由於只是簡單的辭典,字典內容的格式是固定的,就分別把 self.en 填入「<d:index d:value=””>」裡面、把 self.zhtw 填入文字的內容中。

函式前面做了一些文字處理,因為有些英文中會有括號「()」,如果含有這些誇號的話文字內容要完全 Match 才搜尋的到,是十分的不便,可是國家教育研究院辭典有些令人困惑的部分,就是有些括號是代表「同義」,有些卻是「可有可無」,所以目前沒有很好的方法,使用者也可以自己改變部分處理方式來最佳化自己的需求。

    def Write_word(self,eng,zhtw,_id):
        _mode=1
        _search = re.search(self.pat1,eng)
        if _search != None:
            _mode=2
            if (_search.start()==0) and (_search.end() == len(_search.string)):# Case like (greywacke)
                _mode=1
                eng=eng[1:].rstrip(')')
            elif _search.end() == len(_search.string): #No content after ()
                _en1=eng[0:_search.start()].replace(" ","")
                _en2=_search.group(0)[1:-1].replace(" ","")
            elif _search.start()==0:# case like :(solid) products of weathering
                _en1=eng[1:].replace(')','')
                _en2=eng[_search.end():].lstrip(" ")
            else:
                _en1=eng[0:_search.start()]+" "+eng[_search.end():]
                _en2=_search.group(0)[1:-1]
        elif len(eng.split(";")) > 1:
            _mode=2
            _en1=eng.split(";")[0]
            _en2=eng.split(";")[1]          
        if _mode == 1:
            self._f.write("""
<d:entry id="{2}" d:title="{0}">
\t<d:index d:value="{0}"/>
\t\t<h1>{0}</h1>
\t\t<p>{1}</p>
</d:entry>
<!-- ===== ===== ===== -->
""".format(eng,zhtw,_id)) 
        else :
            self._f.write("""
<d:entry id="{3}" d:title="{0}">
\t<d:index d:value="{0}"/>
\t<d:index d:value="{1}"/>
\t\t<h1>{0}</h1>
\t\t<p>{2}</p>
</d:entry>
<!-- ===== ===== ===== -->
""".format(_en1,_en2,zhtw,_id)) 
        self._f.flush()

產生其他必須的檔案

這部分的更改在程式碼第 363 行開始(if __name__ == “__main__”:)有些客製化的選項

    Name_of_Dictionary="國家教育研究院地球科學名詞_NAER_Geology_Dictionary"
    Directory_where_xlsx_is=os.getcwd() # Or something like r"~/Dictionary" or r"D:\\Dictionary"
    Copyright_of_dictionary="Sun ChengWei (http://lcarbon.idv.tw)"
    Manufacturer_Name_of_Dictionary="Sun,ChengWei"
    BundleIdentifier="com.CWSun.dictionary.NAER.Geology"
    FBundleName=None
    Title_Colour="rgb(54,28,33)"
  • Name_of_Dictionary:字典的名字
  • Directory_where_xlsx_is:所有 xlsx 檔案所在的位置。os.getcwd() 會搜尋使用者所在的資料夾,你也可以換成其他路徑如: r”~/Dictionary”。
  • Copyright_of_dictionary:字典的版權。
  • Manufacturer_Name_of_Dictionary:字典的製造者。
  • BundleIdentifier:字典的開發者ID。
  • FBundleName:簡短的辭典名。
  • Title_Colour:標題顏色。

之後程式會自己產生上篇所述的其他檔案。

製作字典

使用說明:

  1. 先用文字編輯器開啟 MakeMacDictXHTML.py 檔案,移到最下面更改上一節提到的客製化部分。
  2. 將 MakeMacDictXHTML.py 放在你的 xlsx 相同資料夾下。
  3. 執行 python 產生製造字典必要的檔案。
    python MakeMacDictXHTML.py
  4. 確定你的 DDK 在「/Developer/Extras/Dictionary Development Kit」路徑,否則請在產生的 Makefile 中更改「DICT_BUILD_TOOL_DIR」參數的位置。
  5. 在完成的資料夾中,執行「make」指令,之後會產生一個「objects」的資料夾,生成的檔案會在這邊(如:國家教育研究院地球科學名詞_NAER_Geology_Dictionary.dictionary)。複製這個檔案到「~/Library/Dictionaries」即可使用。
    如果你想直接安裝到你的字典位置(~/Library/Dictionaries),你也可以用「make install」。

程式網址:https://github.com/lcabon258/EZMacDict

有任何問題歡迎回應與討論,或者有可以改進的地方也請指教:D

請多多指教!

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料