Skip to content

Instantly share code, notes, and snippets.

@p--q

p--q/python25.py Secret

Created August 10, 2014 01:34
Show Gist options
  • Save p--q/ee1b0b826d94967e74cf to your computer and use it in GitHub Desktop.
Save p--q/ee1b0b826d94967e74cf to your computer and use it in GitHub Desktop.
# -*- 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