text.info
- infoドキュメントアクセス ¶このモジュールは、texinfo
システムが生成する
info
ファイルから情報を抜き出す基本的な機能を提供します。
(texinfoについてはhttps://www.gnu.org/software/texinfo/参照)。
REPLのトップレベルコマンドinfo
やdoc
はこのモジュールを
使っています(REPLでの開発)。
主にGaucheのドキュメントを扱うために作られたので、texinfoの全ての機能はカバーされていません。
{text.info
}
infoファイルの集合であるinfoドキュメントを表すオブジェクトです。
open-info-document
が返します。スロットは全てプライベートです。
{text.info
}
infoノードを表すオブジェクトです。ノードの内容と他のノードへの参照を持っています。
インスタンスは変更不可なオブジェクトとして扱われなければなりません。
<info-document>
オブジェクトにinfo-get-node
を適用することで
ノードを得ることができます。
<info-node>
: name ¶ノードの名前の文字列です。どのinfoドキュメントにも、最低限"Top"
ノードは
含まれています。
<info-node>
: next ¶「次」のノードの名前の文字列です。「次」をたどってゆくことで、ドキュメントの全ての
ノードを見ることができます。
ドキュメントの最後のノードでは#f
になっています。
<info-node>
: prev ¶「前」のノードの名前の文字列です。「次」のノードとは逆のリンクになっています。
"Top"
のノードの前は慣習により"(dir)"
となっていて、
infoシステムではシステムにインストールされている全てのinfoドキュメントを表示する
特別なノード名となっています。
<info-node>
: up ¶このノードが他のノードのサブノードなら、親となるノードの名前の文字列。
例えばこのノードが節(section)なら、親は章(chapter)です。
"Top"
ノードではここは#f
です。
<info-node>
: file ¶このノードが含まれる<info-document>
オブジェクトです。
<info-node>
: content ¶ノードの内容の文字列です。
{text.info
}
指定されたパスのinfoドキュメントを読み込んで<info-document>
インスタンスを
返します。引数はマスターinfoファイルのパス名で、通常.info
サフィックスが
ついています。インストール状況によってはinfoファイルはgzipやbzip2で圧縮されていて、
.info
の後に.gz
や.bz2
がついていることもありますが、
これらの圧縮サフィックスはつける必要がありません。この手続きは指定のパス名そのものが
見つからなかったら圧縮サフィックスがついている名前も探します。
大きなinfoドキュメントは分割されていて、それぞれに.info-1
、.info-2
などの名前がついていますが、それらは自動的に読まれるので、マスターとなるinfoファイルだけ
指定すれば良いです。
infoドキュメントが見つからなかったり、ファイルフォーマットが認識できなかった場合は エラーが投げられます。
{text.info
}
<info-document>
のインスタンスinfo-docから、
node-nameを持つノードを探して、その<info-node>
インスタンスを返します。
該当するノードが見つからなければ#f
を返します。
{text.info
}
infoドキュメントinfo-docにある、名前index-node-name持つノードを
読み取り、そのメニューの内容をインデックステーブルに加えます。
この手続きは、infoドキュメントの索引ノードを読み込んで索引を作るのに便利です。
例えば関数索引のページを読み込めば、関数名から定義があるノードを探し当てることができます。
典型的なinfoドキュメントでは、索引ページにはIndex
という名前がついています。
但し、長いドキュメントでは索引がカテゴリごとに分けられていて、
それぞれ違う名前がついているかもしれません (Gaucheのユーザリファレンスもそのひとつです)。
この手続きをそれぞれの索引ノードについて呼び出すことで、複数の索引ノードの内容を
取り込むことができます。
省略可能なkey-modifier引数は、索引ノードのテーブルのキー(文字列)を取って
実際の見出しを文字列で返す手続きです。
しばしば索引に示されるキーは、実際の見出しとは異なることがあります。
例えばGaucheのクラス索引は、クラス名を囲む<
と>
を取り除いたものを
キーとしています。実際の名前を使うと、全てのキーが<
の下に集められてしまい
あまり有用ではないからです。この場合は、key-modifierに
(^e #"<~|e|>")
を渡すことで、実際の名前で索引を引けるようになります。
同じキーに対応するエントリが複数ある場合、それらは全てテーブルに格納されます。
下のinfo-index-ref
を参照してください。
{text.info
}
キーに対応するエントリを索引テーブルから探し、
(node-name line-number)
のリストを返します。
node-nameをinfo-node-get
に渡せば定義を含んでいるinfoノードを
得られます。また、そのinfoノードとline-numberを
info-extract-definition
に渡せば定義をテキストで得ることができます。
{text.info
}
infoドキュメントの索引テーブルに登録されているキー(文字列)のリストを返します。
{text.info
}
infoドキュメントの索引テーブルの内容を
((key (node line) ...) ...)
の形で返します。
{text.info
}
これはinfo-index-add!
の中で使われている手続きですが、
単独でinfoノード中のメニューをパーズするのにも使えます。
* Menu:
という行を探し、見つかったらそれに続く
エントリ名とノード名を集めます。索引ページの場合はノード名だけでなく
定義のある行番号も記されています。
見つかったメニューエントリのリストを返します。各エントリは次の形です。
(<entry-name> <node-name> [<line-number>])
{text.info
}
ノードの内容から、ひとつの定義を抜き出して文字列で返します。
定義はstart-lineで示される行から始まっていると解釈されます。
その行から順に見てゆき、定義の終わりを探します。定義の終わりは、
infoノードの終わりか、3つ未満の空白文字で始まっている行の手前までです
(但し、’defunx’形式の複数エントリは定義の終わりとはみなされません)。
定義を記述している文字列を返します。定義が見つからなければ空文字列が返ります。
典型的な使いかたは、まず索引ノードをinfo-index-add!
で登録しておき、
info-index-ref
で知りたい見出しの定義を含むノードと行を入手して、
この手続きで実際の定義を得るというものです。