この章は OCamldoc の解説をします。これは、ソースファイルに埋め込まれた特殊なコメントから文書を生成するツールです。OCamldoc で使われるコメントは (**...*) という形式で、 15.2 のフォーマットに従います。
Ocamldoc は多くのフォーマットで文書を作成できます。HTML、 LATEX、TeXinfo、Unixのmanページ、dot依存グラフなど。さらに、ユーザは自分でカスタム生成を追加できます。これについては 15.3 を参照してください。
この章では、私たちはエレメントという単語を、OCamlのソースファイルにおける次のような部分について言及するために使います: 型宣言、値、モジュール、例外、モジュール型、型コンストラクタ、レコードのフィールド、クラス、クラス型、クラスメソッド、クラスの値、クラスの継承節。
OCamldoc は ocamldoc によって呼ばれます。使い方は、
ocamldoc options sourcefiles
Options for choosing the output format |
|
次のようなオプションによって、生成される文書のフォーマットが決定されます。
-
-html
-
デフォルトのHTML形式で文書を生成します。生成されたHTMLページは現在のディレクトリか、もしくは -d オプションで指定したディレクトリに保存します。生成されたページのスタイルは生成された style.css ファイルを修正することで可能です。もしくは -css-style オプションによって自分のスタイルシートを指定できます。
- -latex
-
デフォルトの LATEX 形式で文書を生成します。生成された LATEX ドキュメントは ocamldoc.out という名前のファイルか、 -o オプションで指定した名前のファイルで保存されます。ドキュメントは OCamldoc の配布物に含まれる ocamldoc.sty というスタイルを使います。このファイルは好きな LATEX 文書スタイルファイルに変更できます。
- -texi
-
デフォルトの TeXinfo 形式で文書を生成します。生成された LATEX 文書は ocamldoc.out という名前のファイルか、 -o オプションで指定した名前のファイルで保存されます。
- -man
-
Unixの man ページの集まりとして文書を生成されます。生成されたページは現在のディレクトリか、 -d オプションで指定したディレクトリに保存されます。
- -dot
-
トップレベルモジュールのための依存グラフを生成します。フォーマットは dot によって表示/処理されます。dot ツールは http://www.research.att.com/sw/tools/graphviz/ から利用できます。このグラフのテキスト表現は ocamldoc.out という名前のファイルか、 -o オプションで指定されるファイルに保存されます。表示には dot ocamldoc.out としてください。
- -g file.cm[o,a]
-
カスタムの文書生成のために与えられたファイルを動的ロードします。 15.4.1 を参照してください。このオプションは ocamldoc コマンドではサポートされていますが、そのネイティブコード版である ocamldoc.opt ではサポートされていません。
- -d dir
-
カレントディレクトリではなく、ディレクトリ dir にファイルを生成します。
- -dump file
-
集めた情報をファイル file にダンプします。この情報は、次の ocamldoc 実行時の -load オプションによって読むことができます。
- -hide modules
-
生成された文書から、指定した完全な名前のモジュールを隠します。modules は ',' で区切られ空白を含まない完全なモジュール名のリストです。例: Pervasives,M2.M3。
- -inv-merge-ml-mli
-
マージの際に実装とインタフェースを反転させます。実装ファイルの全てのエレメントは保持され、 -m オプションはインタフェースファイルにあるコメントの断片を実装ファイルにあるコメントと統合することを意味します。
- -keep-code
-
値、メソッド、インスタンス変数については、可能ならばソースコードを保持しておきます。ソースコードは .ml ファイルが与えられれば常に保持していますが、 .mli が与えられた時はデフォルトで捨ててしまいます。このオプションは常にソースコードを保持しておくためのものです。
- -load file
-
file から、 ocamldoc -dump によって生成された情報をロードします。複数の -load オプションも可能です。
- -m flags
-
インタフェースと実装をマージします (詳しくは 15.1.2 を参照)。flags は次の文字の1つ以上が指定可能です:
-
d
- 記述をマージ
- a
- @author をマージ
- v
- @version をマージ
- l
- @see をマージ
- s
- @since をマージ
- o
- @deprecated をマージ
- p
- @param をマージ
- e
- @raise をマージ
- r
- @return をマージ
- A
- すべてをマージ
- -no-custom-tags
-
カスタム @-tags を許可しません (15.2.5を参照)。
- -no-stop
-
(**/**) の特殊なコメントの後にあるエレメントをそのままにします(15.2 を参照のこと)。
- -o file
-
生成した文書を ocamldoc.out のかわりに file に出力します。このオプションは -latex、 -texi、 -dot オプションと併用した時のみ意味があります。
- -pp command
-
プリプロセッサ command にソースを通してから処理します。
- -sort
-
文書生成の前にトップレベルモジュールのリストをソートします。
- -stars
-
各コメント行で、最初のアスタリスク ('*') までの空白文字を削除します。
- -t title
-
生成された文書のタイトルとして title を用います。
- -v
-
冗長モードです。進行状況の情報を表示します。
- -warn-error
-
警告をエラーとして扱います。
OCamldoc は型情報を獲得するために Objective Caml の型チェッカを呼出します。次のオプションは型チェックフェーズに影響を与えます。これらのオプションは ocamlc や ocamlopt コマンドのオプションと同じ意味を持ちます。
- -I directory
-
コンパイルされたインタフェースファイル(.cmi files)を捜すディレクトリのリストに directory を加えます。
- -nolabels
-
型におけるオプショナルなラベルを無視します。
- -rectypes
-
曖昧な再帰型を許します(ocamlc の -rectypes を参照)。
Options for generating HTML pages |
|
次のオプションは -html オプションと連動して用います:
-
-all-params
-
関数とメソッドの引数の完全なリストを表示します。
- -css-style filename
-
filename をスタイルシートファイルとして利用します。
- -colorize-code
-
[ ] や \{[ ]\} で囲まれた OCaml のコードの色をつけます。キーワード等々を強調するための色を用います。もしコード断片が文法的に正しくない時には、色は付加されません。
- -index-only
-
インデックスファイルのみを生成します。
Options for generating LATEX files |
|
次のオプションは -latex オプションと連動して用います:
-
-latex-value-prefix prefix
-
生成された LATEX 文書内の値のラベルとして使うためのプレフィクスを与えます。デフォルトは空の文字列です。同様なオプションとしては、 -latex-type-prefix 、 -latex-exception-prefix 、 -latex-module-prefix 、 -latex-module-type-prefix 、 -latex-class-prefix 、 -latex-class-type-prefix 、 -latex-attribute-prefix 、 -latex-method-prefix が使えます。
これらのオプションは例えば、同じ名前の型や値を持っている時に有用です。もしプレフィクスを与えなければ、 LATEX は多重定義されたラベルについて文句を言うでしょう。
- -latextitle n,style
-
スタイルの数 n と、与えられた LATEX セクション分けコマンド style(すなわちsection や subsection)を関連つけます(LATEX のみ有効)。これは生成されたドキュメントを他の LATEX ドキュメントで与えられたセクションレベルにインクルードする時に有用です。デフォルトは section に対し1、subsection に対し2、 subsubsection に対し3、paragraph に対し4、subparagraph に対し5です。
- -noheader
-
生成された文書のヘッダを抑制します。
- -notoc
-
目次を生成しません (LATEX のみ有効)。
- -notrailer
-
生成された文書のトレーラを抑制します。
- -sepfiles
-
単独の ocamldoc.out ファイルを生成するのではなく、トップレベルモジュールごとにひとつの .tex ファイルを生成します。
Options for generating TeXinfo files |
|
次のオプションは -texi オプションと連動して用います:
-
-esc8
-
Infoファイルのアクセントつき文字をエスケープします。
- -noindex
-
Info ファイルに対してインデックスを生成しません。
Options for generating dot graphs |
|
次のオプションは -dot オプションと連動して用います:
-
-dot-colors colors
-
生成された dot コードのなかで使う色を指定します。モジュール依存性を生成するときには、 ocamldoc はそのモジュールが存在するディレクトリをもとにモジュールごとに異なった色を使います。型依存を生成する時には、ocamldoc は定義されたモジュールをもとに型ごとに異なった色を使います。 colors は ',' で区切られた色の名前のリストです。たとえば、Red,Blue,Green など。色は dot ツールでサポートされている色のみです。
- -dot-include-all
-
コマンドラインや -load オプションで指定されているものだけでなく、 dot 出力における全てのモジュールを出力します。
- -dot-reduce
-
dot コードを出力する前に、グラフの依存関係の遷移を削減します。これはグラフ中に依存関係が非常に多い場合に有効かもしれません。
- -dot-types
-
モジュールの依存関係グラフではなく、型の依存関係グラフを表現した dot コードを出力します。
Options for generating man files |
|
次のオプションは -man オプションと連動して用います:
-
-man-mini
-
全てのエレメントではなく、モジュール、モジュール型、クラス、クラス型に関してのみ man ページを生成します。
- -man-suffix
-
生成された man のファイル名にサフィックスを付加します。デフォルトは 'o'です。たとえば List.o のように。
15.1.2 |
Merging of module information |
|
モジュールに関する情報はコマンドラインで与えられたファイルに依存して、 .mli ファイルや .ml ファイル、もしくはその両方から抽出できます。同じモジュールについて .mli ファイルと .ml ファイルの両方が与えられたら、これらのファイルから抽出された情報は次のルールに則ってマージされます:
-
.mliファイルで宣言されているエレメント (値、型、クラス、etc.) のみが保持されます。言いかえれば、.mli ファイルに記述されていない .ml ファイル内の宣言は文書化されません。
-
エレメントの記述や@-タグ内の記述は次のように扱われます。もし同じエレメントに関する記述や同じエレメントの@-タグにおける記述が両方のファイルに存在した場合は、対応する -m フラグをコマンドラインで与えておけば .ml ファイルの記述が .mli ファイル内の記述に連結されます。
次のルールは相互参照エラーによる名前衝突を回避するために尊重されなけばなりません:
15.2 |
Syntax of documentation comments |
|
文書化の元となるテキストを含むコメントをスペシャルコメントといい、 (** と *) の間に書かれます。スペシャルコメントは正確に (** から開始しなければなりません。 ( と2個より多い * から開始されるコメントは無視されます。
15.2.1 |
Placement of documentation comments |
|
OCamldoc はコメントと、ソースファイル中にあるエレメントの対応付けができます。対応付けはエレメントに対するコメントの位置によってなされます。 .mli と .ml ファイルでは、コメントの位置には違いがあります。
スペシャルコメントは、直前または直後にあるエレメントと関連付けられます。
あるスペシャルコメントがあるエレメントの前にあるとき、次の条件のもとでこのエレメントと関連付けられます :
-
スペシャルコメントとそのエレメントの間に空白行や他のスペシャルコメントが存在しない。しかし、スペシャルコメントとエレメントの間に通常のコメントが存在してもよい。
- スペシャルコメントは直前のエレメントと関連付けられない。
- スペシャルコメントはトップレベルモジュールの最初の1つではない。
あるスペシャルコメントがあるエレメントのあとにあるとき、空白行やコメントがそのスペシャルコメントとエレメントの間になければ関連付けられます。
例外が2つあります。型定義における型構築子とレコードフィールドがそれです。関連付けられるコメントは、構築子やフィールド定義の後にのみ置くことができます。空白行や他のコメントが間に存在してはいけません。
下記に、サンプルのインタフェースファイル foo.mli によって、 .mli ファイルにおけるコメント配置のルールを示します(訳注:コメントは訳出した)。
(** ファイルの最初のスペシャルコメントはモジュール全体と関連付けられる
コメントとなります。 *)
(** エレメントの間にもスペシャルコメントを配置することができ、
OCamldoc のツールによっても処理されますが、いかなるエレメントとも
関連付けられません。こうしたコメントにある@-タグは無視されます。 *)
(*******************************************************************)
(** 上行のような2つより多いアスタリスクのコメントは無視されます。 *)
(** 関数 f のコメント *)
val f : int -> int -> int
(** 関数 f のコメントの続き。 *)
(** 例外 My_exception のコメント。普通のコメントが間にあります。 *)
(* やあ、僕は単なるコメントだよ :-) *)
exception My_exception of (int -> int) * int
(** 型 weather のコメント *)
type weather =
| Rain of int (** 構築子 Rain のコメント *)
| Sun (** 構築子 Sun のコメント *)
(** 型 weather2 のコメント *)
type weather2 =
| Rain of int (** 構築子 Rain のコメント *)
| Sun (** 構築子 Sun のコメント *)
(** 直前のコメントがすでに型構築子と関連付けられているため、型
weather2 のコメントをここで継続することができます。 *)
(** 型 my_record のコメント *)
type my_record = {
val foo : int ; (** フィールド foo のコメント *)
val bar : string ; (** フィールド bar のコメント *)
}
(** 型 my_record のコメントの続き *)
(** foo のためのコメント *)
val foo : string
(** このコメントは foo に関連付けられ、 bar には関連付けられません。 *)
val bar : string
(** このコメントは bar に関連付けられます。 *)
(** クラス my_class のコメント *)
class my_class :
object
(** cl からの継承を記述するコメント *)
inherit cl
(** 属性値 tutu のコメント *)
val mutable tutu : string
(** 属性値 toto のコメント *)
val toto : int
(** このコメントは空白行が間に存在するため、 titi のコメントにはな
らず、クラス全体へのコメントとなります。 *)
val titi : string
(** メソッド toto のコメント *)
method toto : string
(** メソッド m のコメント *)
method m : float -> int
end
(** クラス型 my_class_type のコメント *)
class type my_class_type =
object
(** 変数 x のコメント *)
val mutable x : int
(** メソッド m のコメント *)
method m : int -> int
end
(** モジュール Foo のコメント *)
module Foo =
struct
(** x のコメント *)
val x : int
(** どのエレメントとも関連付けられないスペシャルコメント *)
end
(** モジュール型 my_module_type のコメント *)
module type my_module_type =
sig
(** 値 x のコメント *)
val x : int
(** モジュール M のコメント *)
module M =
struct
(** 値 y のコメント *)
val y : int
(* ... *)
end
end
エレメントの前に配置されていて、コメントとエレメントの間に空白行が存在しない時、スペシャルコメントはそのエレメントと関連付けられます。間には普通のコメントを入れてもかまいません。2つの例外が存在します。型定義における型構築子とレコードフィールドがそれです。ここでは構築子やフィールド定義の後に関連したコメントを置かねばなりません。空白行が間にあってはいけません。
toto.ml によって、 .ml ファイルにコメント配置の例を示します。
(** ファイルの最初のスペシャルコメントはモジュール全体と関連付けられた
コメントです。 *)
(** 関数 f のコメント *)
let f x y = x + y
(** このコメントは次の行にエレメントがないため、エレメントに関連付けら
れません。 *)
(** 例外 My_exception のコメント。普通のコメントがスペシャルコメントと
例外の間にあります。 *)
(* 単純なコメント *)
exception My_exception of (int -> int) * int
(** 型 weather のコメント *)
type weather =
| Rain of int (** 構築子 Rain のコメント *)
| Sun (** 構築子 Sun のコメント *)
(** 型 my_record のコメント *)
type my_record = {
val foo : int ; (** フィールド foo のコメント *)
val bar : string ; (** フィールド bar のコメント *)
}
(** クラス my_class のコメント *)
class my_class =
object
(** cl からの継承について記述するコメント *)
inherit cl
(** インスタンス変数 tutu のコメント *)
val mutable tutu = "tutu"
(** toto のコメント *)
val toto = 1
val titi = "titi"
(** メソッド toto のコメント *)
method toto = tutu ^ "!"
(** メソッド m のコメント *)
method m (f : float) = 1
end
(** クラス型 my_class_type のコメント *)
class type my_class_type =
object
(** インスタンス変数 x のコメント *)
val mutable x : int
(** メソッド m のコメント *)
method m : int -> int
end
(** モジュール Foo のコメント *)
module Foo =
struct
(** x のコメント *)
val x : int
(** モジュール内のスペシャルコメントですが、どんなエレメントとも関
連付けられません。 *)
end
(** モジュール型 my_module_type のコメント *)
module type my_module_type =
sig
(* 値 x のコメント *)
val x : int
(* ... *)
end
15.2.2 |
The Stop special comment |
|
スペシャルコメント (**/**) は、このコメントの後から現在のクラスや型、モジュールやモジュール型の終端までに配置されたエレメントについて無視するよう OCamldoc に指示します。例:
class type foo =
object
(** メソッド m のコメント *)
method m : string
(**/**)
(** このメソッドは文書には現れません *)
method bar : int
end
(** この値は文書には現れます。なぜなら、クラス内のスペシャルコメントの
無視はその親モジュールには影響を及ぼさないためです。 *)
val foo : string
(**/**)
(** 値 bar は文書には現れません。 *)
val bar : string
(** 型 t も現れません。 *)
type t = string
ocamldoc に -no-stop オプションを与えた場合は、スペシャルコメントの停止は無視されます。
15.2.3 |
Syntax of documentation comments |
|
コメント (**...*) の中は自由な書式のテキストにフォーマット用の表記を加えたもので構成されますが、オプショナルなタグによってパラメータやバージョン、著者といった情報を与えることができます。タグは @文字から続けて書きます。つまり、文書内のコメントは次のような形式になります。
(** このコメントは次のセクションに記述されたルールに則ったテキストで記
述されています。記述は最初のエスケープされていない '@' 文字まで続
きます。
@author Mr Smith
@param x パラメータxの記述
*)
いくつかのエレメントは全ての @-タグの一部のみをサポートします。エレメントに関係のないタグは単に無視されるだけです。たとえば、全てのタグは型構築子やレコードフィールド、クラス継承では無視されます。同様に、 @param タグはクラスのインスタンス変数では無視されます。
最後。 (**) は空の文書コメントです。
下記がテキスト記述フォーマットで利用されるマークアップ言語のための BNF 記法です。
text ::= (text_element)+
text_element ::=
| {[0-9]+ text} |
text をセクションのヘッダとみなします; { のあとの数値はセクション分けのレベルを意味します |
| {[0-9]+:label text} |
同様ですが、現在の位置が label で名付けられます。この位置は他のエレメントと同様に {! コマンド中のラベルから参照できます。 |
| {b text} |
text を太字にします。 |
| {i text} |
text をイタリック(斜体)にします。 |
| {e text} |
text を強調します。 |
| {C text} |
text を中央寄せにします。 |
| {L text} |
text を左寄せにします。 |
| {R text} |
text を右寄せにします。 |
| {ul list} |
リストを作ります。 |
| {ol list} |
番号つきリストを作ります。 |
| {{:string}text} |
本文 text に対して string で与えられるアドレスへのリンクを作成します。 |
| [string] |
string をソースコードスタイルにします。 |
| {[string]} |
string をフォーマット化されたソースコードスタイルにします。 |
| {v string v} |
string を verbatim スタイルにします。 |
| {% string %} |
string を生の LATEX コードとして扱います。 |
| {!string} |
string で名前付けされたエレメントに対する参照を挿入します。string は完全な要素名たとえば Foo.Bar.t などでなければなりません。 |
| {^ text} |
テキストを上つき文字にします。 |
| {_ text} |
テキストを下つき文字にします。 |
| escaped_string |
特殊な文字 ('{', '}', '[', ']' および '@') を文中に使う時は、 '\' でエスケープしなければなりません。 |
| blank_line |
強制的に改行します。 |
list ::=
| ({- text})+
| ({li text})+
リストは簡略な表記も可能です:
(** これが {b リスト}
- 要素 1
- 要素 2
- 要素 3
リストは空白行で終わり。*)
これは次と同等です:
(** これが {b リスト}
{ul {- 要素 1}
{- 要素 2}
{- 要素 3}}
リストは空白行で終わり。*)
同じショートカットは番号つきリストでも可能です。この場合、'-' のかわりに '+' を使ってください。ネストされたリストでは、このショートカットで定義できるリストはただ1つであることに注意してください。
値、型、例外、モジュール、モジュール型、クラス、クラス型の記述において、 最初の文 は目次や、その記述の一部が必要な時に使われます。最初の文章は、記述において
- 最初に空白のあとにピリオドが来るまでか、
- 最初の空白行まで
です。これは次のテキストフォーマットの外側になります:
{ul list},
{ol list},
[string],
{[string]},
{v string v},
{% string%},
{!string},
{^ text},
{_ text}.
15.2.5 |
Documentation tags (@-tags) |
|
次の表は、あらかじめその文法と意味が定義されている @-タグです。
@author string |
そのエレメントの著者。ひとつの @author タグにはひとりの著者を書きます。同じエレメントに複数の @author タグがあっても構いません。 |
@deprecated text |
text はそのエレメントが使われなくなった時期、代替物、可能ならばその理由などを記述するべきです。 |
@param id text |
与えられた記述 (text) を与えられたパラメータ名 id と関連付けます。このタグは関数やメソッド、クラス、ファンクターなどで使われます。 |
@raise Exc text |
そのエレメントが例外 Exc を raise することがあることを示します。 |
@return text |
返戻値として取りうる値を書きます。このタグは関数とメソッドで使います。 |
@see <url> text |
text に対して '<' と '>' の間に書かれた URL への参照を追加します。 |
@see 'filename' text |
text に対して(シングルクォートの間に書かれた)ファイル名への参照を追加します。 |
@see "document name" text |
text に対して(ダブルクォートの間に書かれた)ドキュメント名への参照を追加します。 |
@since string |
エレメントが導入された時期を示します。 |
@version string |
エレメントのバージョンを示します。 |
コメントの中でカスタムタグを利用することもできます。が、生成する側がそれを扱うことができなければ意味はありません。カスタムタグを使うには、たとえば foo を使う際、 @poo をコメント内に入れます。例:
(** カスタムタグを示すためのコメントですよ。
@foo ここは [foo] カスタムタグに対する引数部分
*)
カスタムタグを扱うためには、カスタムジェネレータを定義する必要があります。これは 15.3.2 で説明します。
OCamldoc は2段階に動作します:
- ソースファイルの解析;
- Odoc_args.class_generatorクラスのオブジェクトである文書ジェネレータを通した文書の生成
ユーザは、ステップ2においてデフォルトのジェネレータの代わりに自身の文書ジェネレータを利用できます。解析段階で抽出された全ての情報は Odoc_info モジュールで利用可能です。このモジュールはあるモジュールにおいて発見されたあらゆる型や関数に対して、関連付けされた記述とともにアクセスする手段を提供するものです。
カスタムジェネレータを定義するために利用できるファイルは、 OCaml の標準ライブラリディレクトリの下の ocamldoc に存在しています。
ジェネレータのクラスは Odoc_args.doc_generator 型のクラスです。これはただひとつのメソッド
generator : Odoc_info.Module.t_module list -> unit
を持ちます。このメソッドは解析され可能ならマージされた Odoc_info.t_module structure とともに呼ばれます。もちろん、このクラスは他のメソッドを持つこともできますが、その場合のオブジェクトは関数に渡される前に Odoc_args.doc_generator に隠蔽されなければなりません。
Odoc_args.set_doc_generator : Odoc_args.doc_generator -> unit
これが新しい文書ジェネレータをインストールします。
次の例は新しい文書ジェネレータを定義し、インストールするものです。完全な例のについては odoc_fhtml ジェネレータ (Ocamldoc Humpにあります) を参照してください。
class my_doc_gen =
object
(* ... *)
method generate module_list =
(* ... *)
()
(* ... *)
end
let my_generator = new my_doc_gen
let _ = Odoc_args.set_doc_generator (my_generator :> Odoc_args.doc_generator)
注意: 新しいクラスは Odoc_html.html や Odoc_latex.latex、 Odoc_man.man、Odoc_texi.texi、Odoc_dot.dot を継承することができ、現存するメソッドからいくつかのメソッドを再定義できます。
カスタムジェネレータがカスタムタグ(15.2.5参照)を扱えるようにするのは非常に簡単です。
ここではHTMLジェネレータがカスタムタグを扱う方法を説明します。
クラス Odoc_html.html はクラス Odoc_html.info を継承し、 tag_functions フィールドを持ちます。これは、カスタムタグ('foo'など)と text を受け取って HTML コード(string型)を返す関数のペアのリストです。新しいタグ bar を扱うには、現存のものから HTML ジェネレータクラスを作成し、tag_functions フィールドを補完します:
class my_gen =
object(self)
inherit Odoc_html.html
(** bar タグと text から HTML コードを出力する *)
method html_of_bar t = (* コードを書く *)
initializer
tag_functions <- ("bar", self#html_of_bar) :: tag_functions
end
クラス Odoc_html.info の他のメソッドはカスタムタグと関連付けられた関数を捜し、タグに与えられたテキストにそれを適用します。もしカスタムタグに関数が関連付けられていなければ、そのメソッドは stderr に警告を表示します。
HTML カスタムジェネレータの場合と同様に、新しい LATEX(や man) ジェネレータもクラス Odoc_latex.latex (や Odoc_man.man) を継承し、新しいタグハンドラをフィールド tag_functions に追加することで定義できます。
15.4 |
Adding command line options |
|
コマンド行の解析は文書ジェネレータを含むモジュールのロード後に行われるので、既存のリストにコマンドラインオプションを追加することができます。オプションの追加は関数
Odoc_args.add_option : string * Arg.spec * string -> unit
によって可能です。注意: 既存のコマンドラインオプションも、この関数によって再定義可能です。
Defining a custom generator class in one file |
|
custom.ml を、新しいジェネレータクラスを定義したファイルとします。 custom.ml のコンパイルは次のコマンドで可能です :
ocamlc -I +ocamldoc -c custom.ml
custom.cmo ファイルができます。これは次の方法で利用できます :
ocamldoc -g custom.cmo other_options source_files
-html など、 ocamldoc の既存のジェネレータを選択するようなオプションを入れないことが重要で、入れてしまうとロードしたものの代わりにそうしたジェネレータを利用してしまいます。
Defining a custom generator class in several files |
|
いくつかのモジュールから構成されるジェネレータクラスを定義することも可能です。この場合に、いくつかのファイル file1.ml[i], file2.ml[i], ...,
fileN.ml[i] によって定義されているとします。これらのファイルすべてを含むひとつの .cma ライブラリファイルを作成する必要があります。
下記コマンドは file1.ml[i], ...,
fileN.ml[i] から custom.cma ファイルを作成するものです :
ocamlc -I +ocamldoc -c file1.ml[i]
ocamlc -I +ocamldoc -c file2.ml[i]
...
ocamlc -I +ocamldoc -c fileN.ml[i]
ocamlc -o custom.cma -a file1.cmo file2.cmo ... fileN.cmo
次に、下記コマンドでカスタムジェネレータとして custom.cma を利用する指定をします
ocamldoc -g custom.cma other_options source_files
もちろん、 ocamldoc の既存のジェネレータを指定する -html などのオプションを入れないことが重要です。なぜなら、入れてしまうと自分のロードしたジェネレータの代わりにそちらのジェネレータを利用してしまうからです。