Skip to content

Instantly share code, notes, and snippets.

@p--q
Last active August 29, 2015 14:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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():
import re #正規表現モジュールのインポート。
from glob import glob # パス名のパターン展開モジュールのインポート。
dic_idl_html = dict() # キー:idl、値:idlのhtmlファイル名、の辞書。
dic_memItem_html = dict() # キー:メンバーアイテム、値:メンバーアイテムのhtml、の辞書。
dic_memItem_mdesc = dict() # キー:メンバーアイテム、値:メンバーアイテムの解説、の辞書。
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桁の数字を抽出する正規表現パターン。
for i in sorted(glob('C:/Program Files (x86)/LibreOffice 4/sdk/docs/idl/ref/a0[0-3][0-9][0-9][0-9].html')): # a00000.htmlからa03999.htmlまでのファイル名を昇順にiに得る。
with open(i, 'r', encoding='utf-8') as f: # ファイルiをutf-8で開く。
f_name = re.findall(reg_fname, f.name)[0] # 読み込んでいるファイル名から下4桁を取り出す。f.name()のパスは/と\が混在していることに注意。
if int(f_name) > 3687: # a03687.htmlより大きい数字のファイルのとき。
break # for文を抜けて以降のファイルは処理しない。
else: # a03687.html以下の数字のファイルのとき。
line = f.readline() # 1行目をを読み込む。
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は省略してドットでつなぐ。
dic_idl_html[idl] = idl_html # 辞書に出力する。
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() # 次の行を読み込む。
while line:
if any(['<img src="closed.png" alt="-"/>' in line, '</tbody>' in line]): break # 継承したものの項やテーブルの終了にきたときwhile文を抜ける。
memItem = re.findall(reg_memItem, line) # 正規表現でメンバーアイテム名を抽出する。
if memItem: # メンバーアイテム名が抽出できたとき。
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 'id="details"' in line: break # 「Detailed Description」まできたときwhile文を抜けて次のファイルにいく。
line = f.readline() # 次の行を読み込む。
import shelve # Pythonオブジェクトをディスクに保存するshelveモジュール。
from contextlib import closing # withでdbファイルを開いたときに閉じるためのモジュール。
with closing(shelve.open("dic_IDL.db")) as d:
d["dic_idl_html"] = dic_idl_html
d["dic_memItem_html"] = dic_memItem_html
d["dic_memItem_mdesc"] = dic_memItem_mdesc
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