-
-
Save p--q/ee1b0b826d94967e74cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
def libreoffice57(): | |
dic_idl_html = dict() # キー:idl、値:idlのhtmlファイル名、の辞書。 | |
dic_memItem_html = dict() # キー:メンバーアイテム、値:メンバーアイテムのhtml、の辞書。 | |
dic_memItem_mdesc = dict() # キー:メンバーアイテム、値:メンバーアイテムの解説、の辞書。 | |
import re #正規表現モジュールのインポート。 | |
reg_idl = r'html">(\w+?)</a>' # 参照しているhtmlファイルのIDLを抽出する正規表現パターン。 | |
reg_idl_html = r'href="(a\d\d\d\d\d.html)">' # 参照しているhtmlファイル名を抽出する正規表現パターン。リストの最後の要素になる。 | |
reg_mdesc = r'<td class="mdescRight">(.+?)<a href=' # メンバーアイテムの解説を抽出する正規表現パターン。 | |
reg_fname = r'a0(\d\d\d\d).html' # glob()で得たファイルのフルパスからファイル名の下4桁の数字を抽出する正規表現パターン。 | |
import fileinput | |
import glob | |
with fileinput.input(openhook=fileinput.hook_encoded("utf-8"), files=(glob.glob('C:/Program Files (x86)/LibreOffice 4/sdk/docs/idl/ref/a0[0-3][0-9][0-9][0-9].html'))) as f: # 複数ファイルの読み込み。 | |
line = f.readline() # 1行ずつファイルを読み込む。 | |
while line: # 行がある間実行。 | |
f_name = re.findall(reg_fname, f.filename())[0] # 読み込んでいるファイル名から下4桁を取り出す。f.filename()のパスは/と\が混在していることに注意。 | |
if int(f_name) > 3687: # a03687.htmlより大きい数字のファイルのとき。 | |
f.nextfile() # 次のファイルにいく。行を読み込まないとf.filename()は更新されない。 | |
else: # a03687.html以下の数字のファイルのとき。 | |
while line: # 行がある間実行。 | |
if '<div id="nav-path" class="navpath">' in line: # パンくずリストのdivタグの行があったとき。 | |
line = f.readline() # 次の行を読み込む。 | |
while line: | |
idl = re.findall(reg_idl, line) # 正規表現でIDLのフルネームを抽出する。 | |
if idl: # IDLのフルネームが得られたとき。 | |
idl_html = re.findall(reg_idl_html, line)[len(idl)-1] # 同じ行からhtmlファイル名を抽出。リストidlの最終要素番号と一致。 | |
idl = "." + ".".join(idl[3:]) # com.sun.starは省略してドットでつなぐ。 | |
break # while文を抜ける。 | |
line = f.readline() # 次の行を読み込む。 | |
if any(['<a name="pub-methods">' in line, '<a name="pub-attribs">' in line]): # 「Public Member Functions」または「Public Attributes」のとき。 | |
if idl_html: # パンくずリストからhtmlファイル名が得られているとき。 | |
reg_memItem = r'{0}(#\w+?)">(\w+?)</a>'.format(idl_html) # メンバーアイテム名を抽出する正規表現パターン。 | |
line = f.readline() # 次の行を読み込む。 | |
flag = False # メンバーアイテムがあるかどうかのフラグをリセット。 | |
while line: | |
if any(['<img src="closed.png" alt="-"/>' in line, '</tbody>' in line]): break # 継承したものの項やテーブルの終了にきたときwhile文を抜ける。 | |
memItem = re.findall(reg_memItem, line) # 正規表現でメンバーアイテム名を抽出する。 | |
if memItem: # メンバーアイテム名が抽出できたとき。 | |
flag = True # フラグを立てる。 | |
memItem, memItem_html = idl + "::" + memItem[0][1], idl_html + memItem[0][0] # メンバーアイテム名をそのhtmlファイル名と取得。 | |
dic_memItem_html[memItem] = memItem_html # 辞書にメンバーアイテム名をキーに、そのhtmlファイルのジャンプ先を値にして取得。 | |
mdesc = re.findall(reg_mdesc, f.readline()) # メンバーアイテム名を得た次行からメンバーアイテムの解説を取得。 | |
if mdesc: dic_memItem_mdesc[memItem] = mdesc[0] # 解説が抽出できたとき辞書にメンバーアイテム名を収納。 | |
line = f.readline() # 次の行を読み込む。 | |
if flag: dic_idl_html[idl] = idl_html # メンバーアイテムがあるもののみ出力する。 | |
if 'id="details"' in line: | |
f.nextfile() # 次のファイルにいく。 | |
break # 「Detailed Description」まできたときwhile文を抜ける。 | |
line = f.readline() # 次の行を読み込む。 | |
line = f.readline() # 次の行を読み込む。 | |
if __name__ == "__main__": | |
import timeit | |
print(timeit.timeit("libreoffice57()", setup="from __main__ import libreoffice57", number=1)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment