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
|
= RDOC - Ruby Documentation System
This package contains Rdoc and SimpleMarkup. Rdoc is an application
that produces documentation for one or more Ruby source files. We work
similarly to JavaDoc, parsing the source, and extracting the
definition for classes, modules, and methods (along with includes and
requires). We associate with these optional documentation contained
in the immediately preceding comment block, and then render the result
using a pluggable output formatter. (Currently, HTML is the only
supported format. Markup is a library that converts plain text into
various output formats. The Markup library is used to interpret the
comment blocks that Rdoc uses to document methods, classes, and so on.
This library contains two packages, rdoc itself and a text markup
library, 'markup'.
== Roadmap
* If you want to use Rdoc to create documentation for your Ruby source
files, read on.
* If you want to include extensions written in C, see rdoc/parsers/parse_c.rb.
* For information on the various markups available in comment
blocks, see markup/simple_markup.rb.
* If you want to drive Rdoc programatically, see RDoc::RDoc.
* If you want to use the library to format text blocks into HTML,
have a look at SM::SimpleMarkup.
* If you want to try writing your own HTML output template, see
RDoc::Page.
== Summary
Once installed, you can create documentation using the 'rdoc' command
(the command is 'rdoc.bat' under Windows)
% rdoc [options] [names...]
Type "rdoc --help" for an up-to-date option summary.
A typical use might be to generate documentation for a package of Ruby
source (such as rdoc itself).
% rdoc
This command generates documentation for all the Ruby and C source
files in and below the current directory. These will be stored in a
documentation tree starting in the subdirectory 'doc'.
You can make this slightly more useful for your readers by having the
index page contain the documentation for the primary file. In our
case, we could type
% rdoc --main rdoc/rdoc.rb
You'll find information on the various formatting tricks you can use
in comment blocks in the documentation this generates.
RDoc uses file extensions to determine how to process each file. File
names ending <tt>.rb</tt> and <tt>.rbw</tt> are assumed to be Ruby
source. Files ending <tt>.c</tt> are parsed as C files. All other
files are assumed to contain just SimpleMarkup-style markup (with or
without leading '#' comment markers). If directory names are passed to
RDoc, they are scanned recursively for C and Ruby source files only.
== Credits
* The Ruby parser in rdoc/parse.rb is based heavily on the outstanding
work of Keiju ISHITSUKA of Nippon Rational Inc, who produced the Ruby
parser for irb and the rtags package.
* Code to diagram classes and modules was written by Sergey A Yanovitsky
(Jah) of Enticla.
* Charset patch from MoonWolf.
* Rich Kilmer wrote the kilmer.rb output template.
* Dan Brickley led the design of the RDF format.
== License
RDoc is Copyright (c) 2001-2003 Dave Thomas, The Pragmatic Programmers. It
is free software, and may be redistributed under the terms specified
in the README file of the Ruby distribution.
= Usage
RDoc is invoked from the command line using:
% rdoc <options> [name...]
Files are parsed, and the information they contain collected, before
any output is produced. This allows cross references between all files
to be resolved. If a name is a directory, it is traversed. If no
names are specified, all Ruby files in the current directory (and
subdirectories) are processed.
Options are:
[<tt>--accessor</tt> <i>name[,name...]</i>]
specifies the name(s) of additional methods that should be treated
as if they were <tt>attr_</tt><i>xxx</i> methods. Specifying
"--accessor db_opt" means lines such as
db_opt :name, :age
will get parsed and displayed in the documentation. Each name may have an
optional "=flagtext" appended, in which case the given flagtext will appear
where (for example) the 'rw' appears for attr_accessor.
[<tt>--all</tt>]
include protected and private methods in the output (by default
only public methods are included)
[<tt>--charset</tt> _charset_]
Set the character set for the generated HTML.
[<tt>--diagram</tt>]
include diagrams showing modules and classes. This is currently
an experimental feature, and may not be supported by all output
templates. You need dot V1.8.6 or later to use the --diagram
option correctly (http://www.research.att.com/sw/tools/graphviz/).
[<tt>--exclude</tt> <i>pattern</i>]
exclude files and directories matching this pattern from processing
[<tt>--extension</tt> <i>new=old</i>]
treat files ending <i>.new</i> as if they ended
<i>.old</i>. Saying '--extension cgi=rb' causes RDoc to treat .cgi
files as Ruby source.
[<tt>fileboxes</tt>]
Classes are put in boxes which represents files, where these
classes reside. Classes shared between more than one file are
shown with list of files that sharing them. Silently discarded if
--diagram is not given Experimental.
[<tt>--fmt</tt> _fmt_]
generate output in a particular format.
[<tt>--help</tt>]
generate a usage summary.
[<tt>--help-output</tt>]
explain the various output options.
[<tt>--image-format</tt> <i>gif/png/jpg/jpeg</i>]
sets output image format for diagrams. Can be png, gif, jpeg,
jpg. If this option is omitted, png is used. Requires --diagram.
[<tt>--include</tt> <i>dir,...</i>]
specify one or more directories to be searched when satisfying
:+include+: directives. Multiple <tt>--include</tt> options may be
given. The directory containing the file currently being processed
is always searched.
[<tt>--inline-source</tt>]
By default, the source code of methods is shown in a popup. With
this option, it's displayed inline.
[<tt>line-numbers</tt>]
include line numbers in the source code
[<tt>--main</tt> _name_]
the class of module _name_ will appear on the index page. If you
want to set a particular file as a main page (a README, for
example) simply specifiy its name as the first on the command
line.
[<tt>--merge</tt>]
when generating _ri_ output, if classes being processed already
exist in the destination directory, merge in the current details
rather than overwrite them.
[<tt>--one-file</tt>]
place all the output into a single file
[<tt>--op</tt> _dir_]
set the output directory to _dir_ (the default is the directory
"doc")
[<tt>--op-name</tt> _name_]
set the name of the output. Has no effect for HTML.
"doc")
[<tt>--opname</tt> _name_]
set the output name (has no effect for HTML).
[<tt>--promiscuous</tt>]
If a module or class is defined in more than one source file, and
you click on a particular file's name in the top navigation pane,
RDoc will normally only show you the inner classes and modules of
that class that are defined in the particular file. Using this
option makes it show all classes and modules defined in the class,
regardless of the file they were defined in.
[<tt>--quiet</tt>]
do not display progress messages
[<tt>--ri</tt>, <tt>--ri-site</tt>, _and_ <tt>--ri-system</tt>]
generate output than can be read by the _ri_ command-line tool.
By default --ri places its output in ~/.rdoc, --ri-site in
$datadir/ri/<ver>/site, and --ri-system in
$datadir/ri/<ver>/system. All can be overridden with a subsequent
--op option. All default directories are in ri's default search
path.
[<tt>--show-hash</tt>]
A name of the form #name in a comment is a possible hyperlink to
an instance method name. When displayed, the '#' is removed unless
this option is specified
[<tt>--style</tt> <i>stylesheet url</i>]
specifies the URL of an external stylesheet to use (rather than
generating one of our own)
[<tt>tab-width</tt> _n_]
set the width of tab characters (default 8)
[<tt>--template</tt> <i>name</i>]
specify an alternate template to use when generating output (the
default is 'standard'). This template should be in a directory
accessible via $: as rdoc/generator/xxxx_template, where 'xxxx'
depends on the output formatter.
[<tt>--version</tt>]
display RDoc's version
[<tt>--webcvs</tt> _url_]
Specify a URL for linking to a web frontend to CVS. If the URL
contains a '\%s', the name of the current file will be
substituted; if the URL doesn't contain a '\%s', the filename will
be appended to it.
= Example
A typical small Ruby program commented using RDoc might be as follows. You
can see the formatted result in EXAMPLE.rb and Anagram.
:include: EXAMPLE.rb
= Markup
Comment blocks can be written fairly naturally, either using '#' on
successive lines of the comment, or by including the comment in
an =begin/=end block. If you use the latter form, the =begin line
must be flagged with an RDoc tag:
=begin rdoc
Documentation to
be processed by RDoc.
=end
Paragraphs are lines that share the left margin. Text indented past
this margin are formatted verbatim.
1. Lists are typed as indented paragraphs with:
* a '*' or '-' (for bullet lists)
* a digit followed by a period for
numbered lists
* an upper or lower case letter followed
by a period for alpha lists.
For example, the input that produced the above paragraph looked like
1. Lists are typed as indented
paragraphs with:
* a '*' or '-' (for bullet lists)
* a digit followed by a period for
numbered lists
* an upper or lower case letter followed
by a period for alpha lists.
2. Labeled lists (sometimes called description
lists) are typed using square brackets for the label.
[cat] small domestic animal
[+cat+] command to copy standard input
3. Labeled lists may also be produced by putting a double colon
after the label. This sets the result in tabular form, so the
descriptions all line up. This was used to create the 'author'
block at the bottom of this description.
cat:: small domestic animal
+cat+:: command to copy standard input
For both kinds of labeled lists, if the body text starts on the same
line as the label, then the start of that text determines the block
indent for the rest of the body. The text may also start on the line
following the label, indented from the start of the label. This is
often preferable if the label is long. Both the following are
valid labeled list entries:
<tt>--output</tt> <i>name [, name]</i>::
specify the name of one or more output files. If multiple
files are present, the first is used as the index.
<tt>--quiet:</tt>:: do not output the names, sizes, byte counts,
index areas, or bit ratios of units as
they are processed.
4. Headings are entered using equals signs
= Level One Heading
== Level Two Heading
and so on
5. Rules (horizontal lines) are entered using three or
more hyphens.
6. Non-verbatim text can be marked up:
_italic_:: \_word_ or \<em>text</em>
*bold*:: \*word* or \<b>text</b>
+typewriter+:: \+word+ or \<tt>text</tt>
The first form only works around 'words', where a word is a
sequence of upper and lower case letters and underscores. Putting a
backslash before inline markup stops it being interpreted, which is
how I created the table above:
_italic_:: \_word_ or \<em>text</em>
*bold*:: \*word* or \<b>text</b>
+typewriter+:: \+word+ or \<tt>text</tt>
7. Names of classes, source files, and any method names
containing an underscore or preceded by a hash
character are automatically hyperlinked from
comment text to their description.
8. Hyperlinks to the web starting http:, mailto:, ftp:, or www. are
recognized. An HTTP url that references an external image file is
converted into an inline <IMG..>. Hyperlinks starting 'link:' are
assumed to refer to local files whose path is relative to the --op
directory.
Hyperlinks can also be of the form <tt>label</tt>[url], in which
case the label is used in the displayed text, and <tt>url</tt> is
used as the target. If <tt>label</tt> contains multiple words,
put it in braces: <em>{multi word label}[</em>url<em>]</em>.
9. Method parameter lists are extracted and displayed with
the method description. If a method calls +yield+, then
the parameters passed to yield will also be displayed:
def fred
...
yield line, address
This will get documented as
fred() { |line, address| ... }
You can override this using a comment containing
':yields: ...' immediately after the method definition
def fred # :yields: index, position
...
yield line, address
which will get documented as
fred() { |index, position| ... }
10. ':yields:' is an example of a documentation modifier. These appear
immediately after the start of the document element they are modifying.
Other modifiers include
[<tt>:nodoc:</tt><i>[all]</i>]
don't include this element in the documentation. For classes
and modules, the methods, aliases, constants, and attributes
directly within the affected class or module will also be
omitted. By default, though, modules and classes within that
class of module _will_ be documented. This is turned off by
adding the +all+ modifier.
module SM #:nodoc:
class Input
end
end
module Markup #:nodoc: all
class Output
end
end
In the above code, only class <tt>SM::Input</tt> will be
documented.
[<tt>:doc:</tt>]
force a method or attribute to be documented even if it
wouldn't otherwise be. Useful if, for example, you want to
include documentation of a particular private method.
[<tt>:notnew:</tt>]
only applicable to the +initialize+ instance method. Normally
RDoc assumes that the documentation and parameters for
#initialize are actually for the ::new method, and so fakes
out a ::new for the class. THe :notnew: modifier stops
this. Remember that #initialize is protected, so you won't
see the documentation unless you use the -a command line
option.
11. RDoc stops processing comments if it finds a comment
line containing '<tt>#--</tt>'. This can be used to
separate external from internal comments, or
to stop a comment being associated with a method,
class, or module. Commenting can be turned back on with
a line that starts '<tt>#++</tt>'.
# Extract the age and calculate the
# date-of-birth.
#--
# FIXME: fails if the birthday falls on
# February 29th
#++
# The DOB is returned as a Time object.
def get_dob(person)
...
12. Comment blocks can contain other directives:
[<tt>:section: title</tt>]
Starts a new section in the output. The title following
<tt>:section:</tt> is used as the section heading, and the
remainder of the comment containing the section is used as
introductory text. Subsequent methods, aliases, attributes,
and classes will be documented in this section. A :section:
comment block may have one or more lines before the :section:
directive. These will be removed, and any identical lines at
the end of the block are also removed. This allows you to add
visual cues such as
# ----------------------------------------
# :section: My Section
# This is the section that I wrote.
# See it glisten in the noon-day sun.
# ----------------------------------------
[<tt>call-seq:</tt>]
lines up to the next blank line in the comment are treated as
the method's calling sequence, overriding the
default parsing of method parameters and yield arguments.
[<tt>:include:</tt><i>filename</i>]
include the contents of the named file at this point. The
file will be searched for in the directories listed by
the <tt>--include</tt> option, or in the current
directory by default. The contents of the file will be
shifted to have the same indentation as the ':' at the
start of the :include: directive.
[<tt>:title:</tt><i>text</i>]
Sets the title for the document. Equivalent to the --title command
line parameter. (The command line parameter overrides any :title:
directive in the source).
[<tt>:enddoc:</tt>]
Document nothing further at the current level.
[<tt>:main:</tt><i>name</i>]
Equivalent to the --main command line parameter.
[<tt>:stopdoc: / :startdoc:</tt>]
Stop and start adding new documentation elements to the
current container. For example, if a class has a number of
constants that you don't want to document, put a
<tt>:stopdoc:</tt> before the first, and a
<tt>:startdoc:</tt> after the last. If you don't specifiy a
<tt>:startdoc:</tt> by the end of the container, disables
documentation for the entire class or module.
---
See also markup/simple_markup.rb.
= Other stuff
Author:: Dave Thomas <dave@pragmaticprogrammer.com>
Requires:: Ruby 1.8.1 or later
License:: Copyright (c) 2001-2003 Dave Thomas.
Released under the same license as Ruby.
== Warranty
This software is provided "as is" and without any express or
implied warranties, including, without limitation, the implied
warranties of merchantibility and fitness for a particular
purpose.
|