2. ソースコードの読み方¶
主に、ソースコードを読み解く上での要点.
2.1. 主なクラスの役割¶
2.1.1. KanaTextクラス¶
データの読み取り
各処理に応じた文字列の生成
2.1.2. ExtIndexRackクラス¶
全体の処理を取りまとめるクラス
2.1.3. ExtIndexEntryクラス¶
indexドメインのentryのデータ構造に対応したクラス
2.1.4. ExtIndexUnitクラス¶
索引ページに表示する一つ一つの用語に対応したクラス
2.1.5. ExtSubtermクラス¶
ExtIndexUnitクラスの補助
2.2. ソースコードの読み方¶
2.2.1. 全体の流れを掴む¶
ExtIndexRack.__init__、create_indexがやっていることの全て
__init__ でbuilderオブジェクトのデータを受け取る
create_indexで処理を実行して、結果を返す
2.2.2. create_indexがやっていること¶
indexドメインからエントリーを受け取る.
エントリーにあるデータ一つ一つを確認しながら格納(extend, append)
self.entryclass内でKanaTextによって記法を含む文字列の解析が行われる.
全てのデータを見て決定するような処理は、ここでxxx_catalogにデータを貯める.
データの調整作業(update_units)
xxx_catalogを見て必要な更新を行う.
並び替え(sort_units)
並び順の細かい調整はassortで調整する.
データの作成(generate_genindex_data)
ここはテストケースで担保しているので、それほど理解する必要はない.
2.2.3. 拡張性ためのコツ¶
他のクラスは直接使うのではなく、クラス変数(textclass, packclass, unitclass, entryclass)を介して使う. こうすることで拡張クラスの差し替えが容易になる.
2.3. ExtIndexRackクラス¶
2.3.1. sort_unitsメソッド¶
このクラスの肝となるメソッド
def sort_units(self):
"""
What is done in Text is done in Text,
and what is done in IndexUnit is done in IndexUnit."""
self._rack.sort(key=lambda unit: (
unit[UNIT_CLSF].assort(), # classifier
unit[UNIT_TERM].assort(), # primary term
unit['link_type'], # see Convert. 1:'see', 2:'seealso', 3:'uri'.
unit[UNIT_SBTM].assort(), # secondary term
unit['main'], # see Convert. 3:'main', 4:''.
unit['file_name'],
unit['target']), )
# about x['file_name'], x['target'].
# Reversing it will make it dependent on the presence of "make clean".:w
unit[UNIT_XXXX].assortの役目
文字列をそのままソートするだけでは達成出来ない並び順を実現するためにリストを返す.
リストの最初の要素(数字)で独自の並び順を調整。次の要素は本来の文字列。
update_unitsメソッドの役目
ここでいい感じに並び替えが行われるように文字列を更新しておく.
2.3.2. appendメソッド¶
ここも処理の肝.
どんなデータがあるか全てチェックしてから登録する.
調べたデータを元にupdate_unitsメソッドが実行される.
2.3.3. generate_genindex_dataメソッド¶
プログラミングしていて楽しかった箇所.
データを整形しやすいようにsort_unitsが並べ替えてくれている.
基本的にはデータの変わり目をチェックしてアレコレ.
2.4. ExtIndexUnitクラス¶
索引ページに表示する各用語に対応するクラス.
2.5. ExtIndexEntryクラス¶
process_index_entry関数が作るデータに対応するクラス. IndexUnitクラスへのデータ変換を請け負うメソッドも持つ.