Skip to content

Instantly share code, notes, and snippets.

@p--q
Last active August 29, 2015 14:05
Show Gist options
  • Save p--q/4fe0eaab5868f5a95e75 to your computer and use it in GitHub Desktop.
Save p--q/4fe0eaab5868f5a95e75 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
def libreoffice58():
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 glob
for i in glob.glob('C:/Program Files (x86)/LibreOffice 4/sdk/docs/idl/ref/a0[0-3][0-9][0-9][0-9].html'):
with open(i, 'r', encoding='utf-8') as f:
line = f.readline() # 1行ずつファイルを読み込む。
while line: # 行がある間実行。
f_name = re.findall(reg_fname, f.name)[0] # 読み込んでいるファイル名から下4桁を取り出す。f.filename()のパスは/と\が混在していることに注意。
if int(f_name) > 3687: # a03687.htmlより大きい数字のファイルのとき。
break # while文を抜けて次のファイルにいく。
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:
break # 「Detailed Description」まできたときwhile文を抜けて次のファイルにいく。
line = f.readline() # 次の行を読み込む。
line = f.readline() # 次の行を読み込む。
if __name__ == "__main__":
import timeit
print(timeit.timeit("libreoffice58()", setup="from __main__ import libreoffice58", number=1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment