forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 4
/
ddoc.dd
919 lines (780 loc) · 30.6 KB
/
ddoc.dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
Ddoc
$(SPEC_S 埋め込みドキュメント,
$(P
D言語は既に、"契約" や "単体テスト" のコードを実際のコードに埋め込んで、
それら全ての一貫性を常に保ちやすいような設計になっていました。
ここで欠けていたのは、埋め込みドキュメントです。
普通のコメントは自動抽出してマニュアルへと整形するのには
あまり向いていませんでした。
ドキュメントをソースコードの中に埋め込むことには、重要な利点があります。
ドキュメントを2度書く必要がなくなることや、
コードとドキュメントを無矛盾に保ちやすくなることが主な利点です。
)
$(P
これに関する既存のアプローチとしては:
)
$(UL
$(LI <a href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a> は既にD言語対応です)
$(LI Java's <a href="http://java.sun.com/j2se/javadoc/">Javadoc</a>,
は最もよく知られた例でしょう)
$(LI C#'s <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcoriXMLDocumentation.asp">embedded XML</a>)
$(LI その他の <a href="http://www.python.org/sigs/doc-sig/otherlangs.html">ドキュメント化ツール</a>)
)
$(P
Dでの埋め込みドキュメントの目標は:
)
$(OL
$(LI 抽出して変換処理せずとも、
埋め込みドキュメントとしても綺麗に読めること)
$(LI 自然にそして簡単に書けること。
<タグ> やその他生成後のドキュメントには現れないようなごちゃごちゃした
要素への依存は最小にする。)
$(LI コンパイラが構文解析によって把握できる情報を
繰り返し書く必要をなくすこと)
$(LI 他の目的の情報抽出の邪魔にならないよう、
HTML埋め込みには頼らないこと)
$(LI 既存のDのコメント形式に基づいて、
Dのコードだけを使う他のパーザは完全に独立に実装できるようにすること)
$(LI コードと混同されることのないよう、
見た目はコード部分とは異なって見えるようにすること)
$(LI もし必要なら、ユーザーが Doxygen
やその他のドキュメント抽出ツールも使えるようにすること)
)
<h2>仕様</h2>
$(P
埋め込みドキュメントコメントの形式に関する以下の仕様は、
コンパイラに対してどのように情報が伝わるのか、のみを定めています。
その情報が最終的にどのように使われるのかは実装毎に定義されます。
最終的な出力がHTMLウェブページなのか、manページなのか、あるいは
PDFファイルなのか、などは
プログラミング言語Dの規格としては定義されません。
)
<h3>処理フェーズ</h3>
$(P
埋め込みドキュメントコメントは、以下の一連のフェーズに沿って処理されます:
)
$(OL
$(LI Lexical -
コード中のドキュメントコメント部分が認識されます。)
$(LI Parsing - ドキュメントコメントが、特定の宣言に関連付けられ、
結合されます。)
$(LI Sections - それぞれのドキュメントコメントを、
幾つかのセクションに分解します。)
$(LI 特殊セクションが処理されます。)
$(LI 非特殊セクションのHighlightingが実行されます。)
$(LI モジュール用の全てのセクションが結合されます。)
$(LI マクロ置換が実行され、最終結果が生成されます。)
)
<h3>Lexical</h3>
$(P
埋め込みドキュメントコメントは、以下のうちいずれかの形式で書かれます:
)
$(OL
$(LI $(D_COMMENT /** ... */) 先頭スラッシュの後に2つの *)
$(LI $(D_COMMENT /++ ... +/) 先頭スラッシュの後に2つの +)
$(LI $(D_COMMENT ///) 3つのスラッシュ)
)
$(P 以下の例は全て埋め込みドキュメントコメントです:)
---------------------------
/// これは一行ドキュメントコメントです。
/** これも同じく。 */
/++ これも。 +/
/**
これは短いドキュメントコメントです。
*/
/**
* この行の先頭の * はドキュメントコメントの一部としては扱われません。
*/
/*********************************
/**の後に続いている余分な*は、
ドキュメントコメントの一部ではありません。
*/
/++
これは短いドキュメントコメントです。
+/
/++
+ この行の先頭の + はドキュメントコメントの一部としては扱われません。
+/
/+++++++++++++++++++++++++++++++++
余分な+は、
ドキュメントコメントの一部ではありません。
+/
/**************** 閉じ*も一部ではありません *****************/
---------------------------
$(P
コメント開始部、終了部及び左マージンの余分な * や + は、
無視され、
埋め込みドキュメントとしては処理されません。
以上の形式のどれにも沿っていないコメントは、ドキュメントコメントではありません。
)
<h3>Parsing</h3>
$(P
ドキュメントコメントはそれぞれ、宣言へと関連付けられます。
ドキュメントコメントと同じ行に空白文字しか残っていない場合、
次に出現する
宣言を参照するものとします。
同じ宣言に適用されるドキュメントコメントが複数あるときは、
それらは結合されます。
宣言に関連付いていないドキュメントコメントは無視されます。
$(I ModuleDeclaration) の前にあるドキュメントコメントは、
モジュール全体に適用されます。
ドキュメントコメントが宣言と同じ行でその右側に出現するときは、
その宣言に適用されます。
)
$(P
宣言に対するドキュメントコメントが
$(D ditto) という識別子のみからなる場合、
同じスコープにある直前のドキュメントコメントが、
その宣言に対しても同様に適用されます。
)
$(P
宣言に関連するドキュメントコメントがひとつも無い場合、
その宣言はドキュメントに出力されない可能性があります。確実に出力したい場合、
空のドキュメントコメントを付けておく必要があります。
)
------------------------------------
int a; /// aに関するドキュメント; bはドキュメントなし
int b;
/** cとdに関するドキュメント */
/** さらにcとdに関するドキュメント */
int c;
/** ditto */
int d;
/** eとfに関するドキュメント */ int e;
int f; /// ditto
/** gに関するドキュメント */
int g; /// さらにgに関するドキュメント
/// C と D に関するドキュメント
class C {
int x; /// C.x に関するドキュメント
/** C.y と C.z に関するドキュメント */
int y;
int z; /// ditto
}
/// ditto
class D { }
------------------------------------
<h3>Sections</h3>
$(P
ドキュメントコメントは、一連の $(I Section) で構成されています。
$(I Section) とは、行の最初の非空白文字であって、直後に
':' が続いている名前のことを言います。この名前がセクション名です。
セクション名については、大文字小文字が区別されません。
)
<h4>Summary</h4>
$(P
最初のセクションは $(I Summary) です。セクション名はありません。
空行かセクション名が現れるまでの最初の段落です。
Summaryがどれだけ長くても仕様上は問題ありませんが、出来る限り一行に収めるべきです。
$(I Summary) セクションは省略可能です。
)
<h4>Description</h4>
$(P
次の無名のセクションが、$(I Description) です。
$(I Summary) の後、セクション名かコメント終端が現れるまでの
全ての段落がこのセクションに含まれます。
)
$(P
$(I Description) セクションは省略可能ですが、
$(I Summary) セクションなしに $(I Description) を書くことはできません。
)
------------------------------------
/***********************************
* myfunc 関数の短い要旨で、
* ここがsummaryセクションになります。
*
* 概要の説明の第一段落です。
*
* 概要の説明の
* 第二段落です。ここまでdescriptionセクション。
*/
void myfunc() { }
------------------------------------
$(P
無名セクション $(I Summary) と $(I Description) の後に、名前つきセクションが続きます。
)
<h3>標準セクション</h3>
$(P
一貫性やわかりやすさのために、幾つか標準的なセクションが規定されています。
どれも、必須の要素ではありません。
)
<dl>
<dt> $(B Authors:)
<dd> コードを書いた人のリスト
------------------------------------
/**
* Authors: Melvin D. Nerd, [email protected]
*/
------------------------------------
<dt> $(B Bugs:)
<dd> 既知のバグのリスト
------------------------------------
/**
* Bugs: 負の数では動作しない
*/
------------------------------------
<dt> $(B Date:)
<dd> 現在のバージョンの更新日時。
std.date で解析可能な形式で記述する
------------------------------------
/**
* Date: March 14, 2003
*/
------------------------------------
<dt> $(B Deprecated:)
<dd> 非推奨な宣言について、
代替手段についてなどの説明
------------------------------------
/**
* Deprecated: 関数 bar() に置き換えられました
*/
deprecated void foo() { ... }
------------------------------------
<dt> $(B Examples:)
<dd> 使い方の例
------------------------------------
/**
* Examples:
* --------------------
* writefln("3"); // 標準出力に '3' を表示
* --------------------
*/
------------------------------------
<dt> $(B History:)
<dd> 更新履歴
------------------------------------
/**
* History:
* V1 最初のバージョン
*
* V2 機能Xを追加
*/
------------------------------------
<dt> $(B License:)
<dd> 著作権のあるコードに関して、ライセンスの情報
------------------------------------
/**
* License: どんな用途にもご自由にお使いください
*/
void bar() { ... }
------------------------------------
<dt> $(B Returns:)
<dd> 関数の返値に関する説明。
$(B void) を返す場合、無駄にそうドキュメントを書かないこと
------------------------------------
/**
* ファイルを読み込みます
* Returns: ファイルの内容
*/
void[] readFile(char[] filename) { ... }
------------------------------------
<dt> $(B See_Also:)
<dd> 関連する識別子や、URLのリスト
------------------------------------
/**
* See_Also:
* foo, bar, http://www.digitalmars.com/d/phobos/index.html
*/
------------------------------------
<dt> $(B Standards:)
<dd> 何らかの標準規格に準拠した宣言の場合、
そのことに関する説明はここに
------------------------------------
/**
* Standards: DSPEC-1234 準拠
*/
------------------------------------
<dt> $(B Throws:)
<dd> 送出される可能性のある例外と、例外が起きる場合のリスト
------------------------------------
/**
* ファイルに書き込みます
* Throws: 失敗時, WriteException
*/
void writeFile(char[] filename) { ... }
------------------------------------
<dt> $(B Version:)
<dd> 現在のバージョン番号を記述します
------------------------------------
/**
* Version: 1.6a
*/
------------------------------------
</dl>
<h3>特殊セクション</h3>
$(P
幾つかのセクションには、特別な意味と構文が定義されています。
)
<dl>
<dt> $(B Copyright:)
<dd> 著作権表示のセクションです。モジュール宣言のドキュメントとして使われると、
このセクションの内容が COPYRIGHT マクロにセットされます。
Copyrightセクションは、
モジュール宣言に対して使われたときのみ特別な動作になります。
------------------------------------
/** Copyright: Public Domain */
module foo;
------------------------------------
<dt> $(B Params:)
<dd> 関数の引数は、Params セクションにリストアップすることでドキュメント化します。
変数名、そして '=' と続く行が、新しい引数の説明の開始となります。
説明は
複数行にまたがっても構いません。
------------------------
/***********************************
* foo はこれこれの動作をします。
* Params:
* x = は、これに使われます。
* あれではありません。
* y = は、あれに使われます。
*/
void foo(int x, int y)
{
}
-------------------------
<dt> $(B Macros:) </dt>
<dd> マクロセクションは、$(B Params:) セクションと同じ構文で書かれます。
つまり、$(I NAME)=$(I value) の組が複数並ぶことになります。
$(I NAME) がマクロ名で、$(I value)
が置換先の文字列です。
------------------------------------
/**
* Macros:
* FOO = 本日は
* 晴天なり
* BAR = bar
* MAGENTA = <font color=magenta>$0</font>
*/
------------------------------------
</dl>
<h2>Highlighting</h2>
<h4>埋め込みコメント</h4>
$(P
ドキュメントコメントの中に、
$(DDOC_COMMENT comment text) 構文でコメントを入れることができます。
このコメントをネストすることはできません。
)
<h4>埋め込みコード</h4>
$(P
D のコードは、コードセクションを区切る
三個以上のハイフンを含む行によって埋め込むことができます。
)
------------------------------------
/++
+ 我々の関数
+
+ Example:
+ ---
+ import std.stdio;
+
+ void foo()
+ {
+ writefln("foo!"); /* 文字列を表示 */
+ }
+ ---
+/
------------------------------------
$(P
コードセクションの中で $(D_COMMENT /++ ... +/)
を使えるようにするため、ここではドキュメント化コメントとして
$(D_COMMENT /* ... */) 形式を使いました。
)
<h4>埋め込みHTML</h4>
$(P
ドキュメント化コメントの中にHTMLを埋め込むことも可能で、
HTML出力の際には変更されずそのまま出力されます。
しかし、必ずしも出力形式がHTMLであるとは限らないため、
実際には
これは使わないでおくべきでしょう。
)
------------------------------------
/**
* HTML 埋め込みの例:
*
* <ol>
* <li><a href="http://www.digitalmars.com">Digital Mars</a></li>
* <li><a href="http://www.classicempire.com">Empire</a></li>
* </ol>
*/
------------------------------------
<h4>強調</h4>
$(P
ドキュメントコメント内の識別子で、関数の引数や、
その他関連する宣言のスコープで定義されている名前となっているものは
出力中で強調表示されます。
強調は、斜体や太字、ハイパーリンクなどで表現されます。
どのように強調されるかは、それが関数引数なのか、型なのか、
あるいはDの予約語なのか、などに依存します。
意図しない強調表示を避けるためには、単語の直前に下線 (_) をつけます。
この下線は出力時に自動的に除去されます。
)
<h4>文字実体</h4>
$(P
ドキュメントプロセッサにとって特別な意味を持つ文字が幾つか存在します。
混乱を避けるには、
それらの文字を対応するエンティティに置き換えるのがベストでしょう:
)
$(TABLE2 文字とエンティティ,
$(TR $(TH 文字) $(TH エンティティ))
$(TR $(TD < )$(TD &lt; ))
$(TR $(TD > )$(TD &gt; ))
$(TR $(TD & )$(TD &amp; ))
)
$(P
コードセクションの中でこの置換をしておく必要はありません。
あるいは特殊文字の直後に#や英数字が来ない場合も不要です。
)
<h4>ドキュメント生成されない場合<h4>
$(P
たとえドキュメントコメントがあったとしても、
以下の要素についてはドキュメントは生成されません。
)
$(UL
$(LI invariant 不変条件)
$(V2 $(LI Postblits))
$(LI デストラクタ)
$(LI 静的コンストラクタと静的デストラクタ)
$(LI Class info, type info, module info)
)
<h2>マクロ</h2>
$(P
ドキュメント化コメントの処理系は、
単純なマクロテキストのプリプロセッサを備えています。
$($(I NAME)) という形がセクションの文章に現れると、
対応するマクロ $(I NAME)
の指す文字列へと置換されます。
置換後の文字列は再帰的に、さらなるマクロ展開のために走査されます。
再帰的に
同じマクロが同じ引数で出現した場合は、
空のテキストへと置換されます。
置換テキストの境界をまたぐようなマクロ起動は、
展開されません。
マクロ名が未定義の時は、
空文字列へと置換されます。
マクロ展開されずに $(NAME) という文字列そのものを出力したい場合は、
$ の代わりに &#36; と記述してください。
)
$(P
マクロは引数を取ることもできます。マクロ名の後ろから
閉じ括弧 $(SINGLEQUOTE $(RPAREN)) までの全ての文字列が $0 引数です。
置換文字列の中の $0 が、
引数文字列に置き換えられます。
引数の中にカンマがあると、$1 が最初のカンマまでの文字列を表し、
$2 が最初のカンマから2番目のカンマまでを表し…、
と $9 まで用意されています。
$+ は、最初のカンマから閉じ $(SINGLEQUOTE $(RPAREN)) までの文字列です。
引数文字列内にはネストした括弧や、"" や '' による文字列、
<!-- ... --> コメントやタグも含むことができます。
対応していない括弧が必要な場合は、
( の代わりに文字実体 &#40;、) の代わりに &#41; を使用します。
)
$(P
マクロ定義は、
以下の位置から以下の順番で取得されます:
)
$(OL
$(LI 定義済みマクロ)
$(LI $(DPLLINK dmd-windows.html#sc_ini, sc.ini) や
$(DPLLINK dmd-linux.html#dmd_conf, dmd.conf) の DDOCFILE 設定での定義)
$(LI コマンドラインで指定された *.ddoc ファイルでの定義)
$(LI Ddoc によって生成される実行時定義)
$(LI Macros: セクションでの定義)
)
$(P
マクロの再定義によって、前に定義された同名のマクロを置き換えることができます。
つまり、様々な定義元から取得された一連のマクロ定義は階層構造を
なすことになります。
)
$(P
"D_" や "DDOC_" で始まるマクロ名は予約されています。
)
<h3>定義済みマクロ</h3>
$(P
これらは、Ddoc内部に組み込まれ、
Ddocが整形とハイライト処理を行うために必要な最小の定義セット
となっているものです。
定義は、簡単なHTMLを出力するものとなっています。
)
$(DDOCCODE
B = <b>$0</b>
I = <i>$0</i>
U = <u>$0</u>
P = <p>$0</p>
DL = <dl>$0</dl>
DT = <dt>$0</dt>
DD = <dd>$0</dd>
TABLE = <table>$0</table>
TR = <tr>$0</tr>
TH = <th>$0</th>
TD = <td>$0</td>
OL = <ol>$0</ol>
UL = <ul>$0</ul>
LI = <li>$0</li>
BIG = <big>$0</big>
SMALL = <small>$0</small>
BR = <br>
LINK = <a href="$0">$0</a>
LINK2 = <a href="$1">$+</a>
LPAREN= $(LPAREN)
RPAREN= $(RPAREN)
RED = <font color=red>$0</font>
BLUE = <font color=blue>$0</font>
GREEN = <font color=green>$0</font>
YELLOW =<font color=yellow>$0</font>
BLACK = <font color=black>$0</font>
WHITE = <font color=white>$0</font>
D_CODE = <pre class="d_code">$0</pre>
D_COMMENT = $(GREEN $0)
D_STRING = $(RED $0)
D_KEYWORD = $(BLUE $0)
D_PSYMBOL = $(U $0)
D_PARAM = $(I $0)
DDOC = <html><head>
<META http-equiv="content-type" content="text/html; charset=utf-8">
<title>$(TITLE)</title>
</head><body>
<h1>$(TITLE)</h1>
$(BODY)
</body></html>
DDOC_COMMENT = <!-- $0 -->
DDOC_DECL = $(DT $(BIG $0))
DDOC_DECL_DD = $(DD $0)
DDOC_DITTO = $(BR)$0
DDOC_SECTIONS = $0
DDOC_SUMMARY = $0$(BR)$(BR)
DDOC_DESCRIPTION = $0$(BR)$(BR)
DDOC_AUTHORS = $(B Authors:)$(BR)
$0$(BR)$(BR)
DDOC_BUGS = $(RED BUGS:)$(BR)
$0$(BR)$(BR)
DDOC_COPYRIGHT = $(B Copyright:)$(BR)
$0$(BR)$(BR)
DDOC_DATE = $(B Date:)$(BR)
$0$(BR)$(BR)
DDOC_DEPRECATED = $(RED Deprecated:)$(BR)
$0$(BR)$(BR)
DDOC_EXAMPLES = $(B Examples:)$(BR)
$0$(BR)$(BR)
DDOC_HISTORY = $(B History:)$(BR)
$0$(BR)$(BR)
DDOC_LICENSE = $(B License:)$(BR)
$0$(BR)$(BR)
DDOC_RETURNS = $(B Returns:)$(BR)
$0$(BR)$(BR)
DDOC_SEE_ALSO = $(B See Also:)$(BR)
$0$(BR)$(BR)
DDOC_STANDARDS = $(B Standards:)$(BR)
$0$(BR)$(BR)
DDOC_THROWS = $(B Throws:)$(BR)
$0$(BR)$(BR)
DDOC_VERSION = $(B Version:)$(BR)
$0$(BR)$(BR)
DDOC_SECTION_H = $(B $0)$(BR)$(BR)
DDOC_SECTION = $0$(BR)$(BR)
DDOC_MEMBERS = $(DL $0)
DDOC_MODULE_MEMBERS = $(DDOC_MEMBERS $0)
DDOC_CLASS_MEMBERS = $(DDOC_MEMBERS $0)
DDOC_STRUCT_MEMBERS = $(DDOC_MEMBERS $0)
DDOC_ENUM_MEMBERS = $(DDOC_MEMBERS $0)
DDOC_TEMPLATE_MEMBERS = $(DDOC_MEMBERS $0)
DDOC_PARAMS = $(B Params:)$(BR)\n$(TABLE $0)$(BR)
DDOC_PARAM_ROW = $(TR $0)
DDOC_PARAM_ID = $(TD $0)
DDOC_PARAM_DESC = $(TD $0)
DDOC_BLANKLINE = $(BR)$(BR)
DDOC_PSYMBOL = $(U $0)
DDOC_KEYWORD = $(B $0)
DDOC_PARAM = $(I $0)
)
$(P
Ddoc は HTML コードを生成するわけではありません。Ddoc
は基本書式化マクロを生成し、(その定義済み形式に従って)
HTMLへの展開を行います。
HTML以外の形式での出力が必要な場合、
以下のマクロを再定義する必要があります。
)
$(TABLE2 基本書式化マクロ,
$(TR $(TD $(B B)) $(TD 引数を太字にする))
$(TR $(TD $(B I)) $(TD 引数を斜体にする))
$(TR $(TD $(B U)) $(TD 引数に下線をひく))
$(TR $(TD $(B P)) $(TD 引数をひとつの段落とする))
$(TR $(TD $(B DL)) $(TD 引数は定義リスト))
$(TR $(TD $(B DT)) $(TD 引数は定義リスト内の定義名))
$(TR $(TD $(B DD)) $(TD 引数は定義リスト内の定義説明部分))
$(TR $(TD $(B TABLE)) $(TD 引数は表))
$(TR $(TD $(B TR)) $(TD 引数は表の列))
$(TR $(TD $(B TH)) $(TD 引数は表の列のヘッダ項目))
$(TR $(TD $(B TD)) $(TD 引数は表の列のデータ項目))
$(TR $(TD $(B OL)) $(TD 引数は順序つきリスト))
$(TR $(TD $(B UL)) $(TD 引数は順序なしリスト))
$(TR $(TD $(B LI)) $(TD 引数はリストの要素))
$(TR $(TD $(B BIG)) $(TD 引数を一回り大きく表示))
$(TR $(TD $(B SMALL)) $(TD 引数を一回り小さく表示))
$(TR $(TD $(B BR)) $(TD 改行))
$(TR $(TD $(B LINK)) $(TD 引数をクリック可能なリンクとする))
$(TR $(TD $(B LINK2)) $(TD 引数をクリック可能なリンクとする。第一引数がアドレス))
$(TR $(TD $(B RED)) $(TD 引数を赤く表示))
$(TR $(TD $(B BLUE)) $(TD 引数を青く表示))
$(TR $(TD $(B GREEN)) $(TD 引数を緑に表示))
$(TR $(TD $(B YELLOW)) $(TD 引数を黄色く表示))
$(TR $(TD $(B BLACK)) $(TD 引数を黒く表示))
$(TR $(TD $(B WHITE)) $(TD 引数を白く表示))
$(TR $(TD $(B D_CODE)) $(TD 引数をDソースコードとして処理))
$(TR $(TD $(B DDOC)) $(TD 出力全体のテンプレート))
)
$(P
$(B DDOC) は、生成されたテキスト全体(Ddocの生成するマクロ $(B BODY)
で参照できます)が挿入される雛形になるという意味で、特殊なマクロです。
例えばスタイルシートを使うには、
$(B DDOC) を次のように再定義します:
)
$(DDOCCODE
DDOC = <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<META http-equiv="content-type" content="text/html; charset=utf-8">
<title>$(TITLE)</title>
<link rel="stylesheet" type="text/css" href="$(B style.css)">
</head><body>
<h1>$(TITLE)</h1>
$(BODY)
</body></html>
)
$(P
$(B DDOC_COMMENT)
は出力ファイルにコメントを挿入するのに使えます。
)
$(P
Dのソースコードのハイライト表示は以下のマクロで行われます:
)
$(TABLE2 D ソースコード整形マクロ,
$(TR $(TD $(B D_COMMENT)) $(TD コメントのハイライト))
$(TR $(TD $(B D_STRING)) $(TD 文字列リテラルのハイライト))
$(TR $(TD $(B D_KEYWORD)) $(TD 予約語のハイライト))
$(TR $(TD $(B D_PSYMBOL)) $(TD 現在の宣言名のハイライト))
$(TR $(TD $(B D_PARAM)) $(TD 現在の関数引数のハイライト))
)
$(P
ハイライト表示マクロは $(B DDOC_) で始まります。
これらによって表示の個々のパートの整形を制御します。
)
$(TABLE2 Ddoc セクション整形マクロ,
$(TR $(TD $(B DDOC_DECL)) $(TD 宣言のハイライト))
$(TR $(TD $(B DDOC_DECL_DD)) $(TD 宣言の説明部のハイライト))
$(TR $(TD $(B DDOC_DITTO)) $(TD ditto 宣言のハイライト))
$(TR $(TD $(B DDOC_SECTIONS)) $(TD 全セクションのハイライト))
$(TR $(TD $(B DDOC_SUMMARY)) $(TD Summaryセクションのハイライト))
$(TR $(TD $(B DDOC_DESCRIPTION)) $(TD Descriptionセクションのハイライト))
$(TR $(TD $(B DDOC_AUTHORS .. DDOC_VERSION)) $(TD それぞれ対応する標準セクションのハイライト))
$(TR $(TD $(B DDOC_SECTION_H)) $(TD 非標準セクションのセクション名のハイライト))
$(TR $(TD $(B DDOC_SECTION)) $(TD 非標準セクションの内容のハイライト))
$(TR $(TD $(B DDOC_MEMBERS)) $(TD クラスや構造体などのメンバのデフォルトのハイライト))
$(TR $(TD $(B DDOC_MODULE_MEMBERS)) $(TD モジュールメンバのハイライト))
$(TR $(TD $(B DDOC_CLASS_MEMBERS)) $(TD クラスメンバのハイライト))
$(TR $(TD $(B DDOC_STRUCT_MEMBERS)) $(TD 構造体メンバのハイライト))
$(TR $(TD $(B DDOC_ENUM_MEMBERS)) $(TD 列挙体メンバのハイライト))
$(TR $(TD $(B DDOC_TEMPLATE_MEMBERS)) $(TD テンプレートメンバのハイライト))
$(TR $(TD $(B DDOC_PARAMS)) $(TD 関数引数セクションのハイライト))
$(TR $(TD $(B DDOC_PARAM_ROW)) $(TD name=value 関数引数のハイライト))
$(TR $(TD $(B DDOC_PARAM_ID)) $(TD 引数名 name のハイライト))
$(TR $(TD $(B DDOC_PARAM_DESC)) $(TD 引数説明 value のハイライト))
$(TR $(TD $(B DDOC_PSYMBOL)) $(TD 特定のセクションから参照されている宣言名のハイライト))
$(TR $(TD $(B DDOC_KEYWORD)) $(TD D予約語のハイライト))
$(TR $(TD $(B DDOC_PARAM)) $(TD 関数引数のハイライト))
$(TR $(TD $(B DDOC_BLANKLINE)) $(TD 空行の挿入))
)
$(P
例えば、$(B DDOC_SUMMARY) を次のように再定義できます:
)
$(DDOCCODE
DDOC_SUMMARY = $(GREEN $0)
)
$(P
これで、Summaryセクションが全て緑色になります。
)
<h3>$(DPLLINK dmd-windows.html#sc_ini, $(D sc.ini))/$(DPLLINK dmd-linux.html#dmd_conf, $(D dmd.conf)) の DDOCFILE によるマクロ定義</h3>
$(P
マクロ定義のテキストファイルを作っておくことができ、
$(D sc.ini) や $(D dmd.conf) で指定可能です:
)
$(DDOCCODE
DDOCFILE=myproject.ddoc
)
<h3>コマンドライン指定による .ddoc ファイルからのマクロ定義</h3>
$(P
拡張子 .ddoc を持つファイルが DMD のコマンドラインに渡ると、
順番に読み込まれ処理されます。
)
<h3>Ddoc の生成するマクロ定義</h3>
$(TABLE2 生成されるマクロ定義,
$(TR
$(TH マクロ名)
$(TH 内容)
)
$(TR
$(TD $(B BODY))
$(TD ドキュメントテキスト本文が入ります)
)
$(TR
$(TD $(B TITLE))
$(TD モジュール名が入ります)
)
$(TR
$(TD $(B DATETIME))
$(TD 現在の日時が入ります)
)
$(TR
$(TD $(B YEAR))
$(TD 現在の年が入ります)
)
$(TR
$(TD $(B COPYRIGHT))
$(TD モジュールコメントの $(B Copyright:)
セクションの内容が入ります)
)
$(TR
$(TD $(B DOCFILENAME))
$(TD 生成されるファイルの名前が入ります)
)
$(TR
$(TD $(B SRCFILENAME))
$(TD ドキュメント生成の元となった
ソースファイルの名前が入ります。)
)
)
<h2>他のドキュメント生成に Ddoc を使う</h2>
$(P
当初は Ddoc は、埋め込みコメントからのドキュメント生成用に作られました。
しかしながら、
その他の一般的なドキュメントの処理にも使用できます。
埋め込みコメント以外でも利用する利点としては、
Ddoc のマクロ機能や、
ソースコードの構文ハイライト機能があります。
)
$(P
.d ソースファイルが Ddoc という文字列で開始している場合、
Dのソースコードではなく一般的なドキュメントファイルとして扱われます。
"Ddoc" 文字列の直後から、ファイル終端か "Macros:"
セクションまでがドキュメントとなります。
テキストには、---行 で囲まれた埋め込みソースコード部分以外は、
自動的構文ハイライト処理は行われません。
マクロ処理だけが実行されます。
)
$(P
このページを含め、
Dのドキュメントそのものも、多くはこのようにして生成されています。
そのようなドキュメントには、一番下に Ddoc
で生成された旨を表示してあります。
)
<h2>参考文献</h2>
$(P
$(LINK2 http://www.dsource.org/projects/helix/wiki/CandyDoc, CandyDoc)
は、マクロとスタイルシートによって
Ddoc
の出力をカスタマイズする非常に良い例です。
)
)
Macros:
TITLE=埋め込みドキュメント
WIKI=Ddoc
CATEGORY_SPEC=$0
RPAREN=)