markup.rb 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. ##
  2. # RDoc::Markup parses plain text documents and attempts to decompose them into
  3. # their constituent parts. Some of these parts are high-level: paragraphs,
  4. # chunks of verbatim text, list entries and the like. Other parts happen at
  5. # the character level: a piece of bold text, a word in code font. This markup
  6. # is similar in spirit to that used on WikiWiki webs, where folks create web
  7. # pages using a simple set of formatting rules.
  8. #
  9. # RDoc::Markup itself does no output formatting: this is left to a different
  10. # set of classes.
  11. #
  12. # RDoc::Markup is extendable at runtime: you can add \new markup elements to
  13. # be recognised in the documents that RDoc::Markup parses.
  14. #
  15. # RDoc::Markup is intended to be the basis for a family of tools which share
  16. # the common requirement that simple, plain-text should be rendered in a
  17. # variety of different output formats and media. It is envisaged that
  18. # RDoc::Markup could be the basis for formatting RDoc style comment blocks,
  19. # Wiki entries, and online FAQs.
  20. #
  21. # == Synopsis
  22. #
  23. # This code converts +input_string+ to HTML. The conversion takes place in
  24. # the +convert+ method, so you can use the same RDoc::Markup converter to
  25. # convert multiple input strings.
  26. #
  27. # require 'rdoc'
  28. #
  29. # h = RDoc::Markup::ToHtml.new
  30. #
  31. # puts h.convert(input_string)
  32. #
  33. # You can extend the RDoc::Markup parser to recognise new markup
  34. # sequences, and to add special processing for text that matches a
  35. # regular expression. Here we make WikiWords significant to the parser,
  36. # and also make the sequences {word} and \<no>text...</no> signify
  37. # strike-through text. We then subclass the HTML output class to deal
  38. # with these:
  39. #
  40. # require 'rdoc'
  41. #
  42. # class WikiHtml < RDoc::Markup::ToHtml
  43. # def handle_special_WIKIWORD(special)
  44. # "<font color=red>" + special.text + "</font>"
  45. # end
  46. # end
  47. #
  48. # markup = RDoc::Markup.new
  49. # markup.add_word_pair("{", "}", :STRIKE)
  50. # markup.add_html("no", :STRIKE)
  51. #
  52. # markup.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
  53. #
  54. # wh = WikiHtml.new markup
  55. # wh.add_tag(:STRIKE, "<strike>", "</strike>")
  56. #
  57. # puts "<body>#{wh.convert ARGF.read}</body>"
  58. #
  59. # == Encoding
  60. #
  61. # Where Encoding support is available, RDoc will automatically convert all
  62. # documents to the same output encoding. The output encoding can be set via
  63. # RDoc::Options#encoding and defaults to Encoding.default_external.
  64. #
  65. # = \RDoc Markup Reference
  66. #
  67. # == Block Markup
  68. #
  69. # === Paragraphs and Verbatim
  70. #
  71. # The markup engine looks for a document's natural left margin. This is
  72. # used as the initial margin for the document.
  73. #
  74. # Consecutive lines starting at this margin are considered to be a
  75. # paragraph. Empty lines separate paragraphs.
  76. #
  77. # Any line that starts to the right of the current margin is treated
  78. # as verbatim text. This is useful for code listings:
  79. #
  80. # 3.times { puts "Ruby" }
  81. #
  82. # In verbatim text, two or more blank lines are collapsed into one,
  83. # and trailing blank lines are removed:
  84. #
  85. # This is the first line
  86. #
  87. #
  88. # This is the second non-blank line,
  89. # after 2 blank lines in the source markup.
  90. #
  91. #
  92. # There were two trailing blank lines right above this paragraph, that
  93. # have been removed. In addition, the verbatim text has been shifted
  94. # left, so the amount of indentation of verbatim text is unimportant.
  95. #
  96. # For HTML output RDoc makes a small effort to determine if a verbatim section
  97. # contains ruby source code. If so, the verbatim block will be marked up as
  98. # HTML. Triggers include "def", "class", "module", "require", the "hash
  99. # rocket"# (=>) or a block call with a parameter.
  100. #
  101. # === Headers
  102. #
  103. # A line starting with an equal sign (=) is treated as a
  104. # heading. Level one headings have one equals sign, level two headings
  105. # have two, and so on until level six, which is the maximum
  106. # (seven hyphens or more result in a level six heading).
  107. #
  108. # For example, the above header was obtained with:
  109. #
  110. # === Headers
  111. #
  112. # In HTML output headers have an id matching their name. The above example's
  113. # HTML is:
  114. #
  115. # <h3 id="label-Headers">Headers</h3>
  116. #
  117. # If a heading is inside a method body the id will be prefixed with the
  118. # method's id. If the above header where in the documentation for a method
  119. # such as:
  120. #
  121. # ##
  122. # # This method does fun things
  123. # #
  124. # # = Example
  125. # #
  126. # # Example of fun things goes here ...
  127. #
  128. # def do_fun_things
  129. # end
  130. #
  131. # The header's id would be:
  132. #
  133. # <h1 id="method-i-do_fun_things-label-Example">Example</h3>
  134. #
  135. # The label can be linked-to using <tt>SomeClass@Headers</tt>. See
  136. # {Links}[RDoc::Markup@Links] for further details.
  137. #
  138. # === Rules
  139. #
  140. # A line starting with three or more hyphens (at the current indent)
  141. # generates a horizontal rule. The more hyphens, the thicker the rule
  142. # (within reason, and if supported by the output device).
  143. #
  144. # In the case of HTML output, three dashes generate a 1-pixel high rule,
  145. # four dashes result in 2 pixels, and so on. The actual height is limited
  146. # to 10 pixels:
  147. #
  148. # ---
  149. # -----
  150. # -----------------------------------------------------
  151. #
  152. # produces:
  153. #
  154. # ---
  155. # -----
  156. # -----------------------------------------------------
  157. #
  158. # === Simple Lists
  159. #
  160. # If a paragraph starts with a "*", "-", "<digit>." or "<letter>.",
  161. # then it is taken to be the start of a list. The margin is increased to be
  162. # the first non-space following the list start flag. Subsequent lines
  163. # should be indented to this new margin until the list ends. For example:
  164. #
  165. # * this is a list with three paragraphs in
  166. # the first item. This is the first paragraph.
  167. #
  168. # And this is the second paragraph.
  169. #
  170. # 1. This is an indented, numbered list.
  171. # 2. This is the second item in that list
  172. #
  173. # This is the third conventional paragraph in the
  174. # first list item.
  175. #
  176. # * This is the second item in the original list
  177. #
  178. # produces:
  179. #
  180. # * this is a list with three paragraphs in
  181. # the first item. This is the first paragraph.
  182. #
  183. # And this is the second paragraph.
  184. #
  185. # 1. This is an indented, numbered list.
  186. # 2. This is the second item in that list
  187. #
  188. # This is the third conventional paragraph in the
  189. # first list item.
  190. #
  191. # * This is the second item in the original list
  192. #
  193. # === Labeled Lists
  194. #
  195. # You can also construct labeled lists, sometimes called description
  196. # or definition lists. Do this by putting the label in square brackets
  197. # and indenting the list body:
  198. #
  199. # [cat] a small furry mammal
  200. # that seems to sleep a lot
  201. #
  202. # [ant] a little insect that is known
  203. # to enjoy picnics
  204. #
  205. # produces:
  206. #
  207. # [cat] a small furry mammal
  208. # that seems to sleep a lot
  209. #
  210. # [ant] a little insect that is known
  211. # to enjoy picnics
  212. #
  213. # If you want the list bodies to line up to the left of the labels,
  214. # use two colons:
  215. #
  216. # cat:: a small furry mammal
  217. # that seems to sleep a lot
  218. #
  219. # ant:: a little insect that is known
  220. # to enjoy picnics
  221. #
  222. # produces:
  223. #
  224. # cat:: a small furry mammal
  225. # that seems to sleep a lot
  226. #
  227. # ant:: a little insect that is known
  228. # to enjoy picnics
  229. #
  230. # Notice that blank lines right after the label are ignored in labeled lists:
  231. #
  232. # [one]
  233. #
  234. # definition 1
  235. #
  236. # [two]
  237. #
  238. # definition 2
  239. #
  240. # produces the same output as
  241. #
  242. # [one] definition 1
  243. # [two] definition 2
  244. #
  245. #
  246. # === Lists and Verbatim
  247. #
  248. # If you want to introduce a verbatim section right after a list, it has to be
  249. # less indented than the list item bodies, but more indented than the list
  250. # label, letter, digit or bullet. For instance:
  251. #
  252. # * point 1
  253. #
  254. # * point 2, first paragraph
  255. #
  256. # point 2, second paragraph
  257. # verbatim text inside point 2
  258. # point 2, third paragraph
  259. # verbatim text outside of the list (the list is therefore closed)
  260. # regular paragraph after the list
  261. #
  262. # produces:
  263. #
  264. # * point 1
  265. #
  266. # * point 2, first paragraph
  267. #
  268. # point 2, second paragraph
  269. # verbatim text inside point 2
  270. # point 2, third paragraph
  271. # verbatim text outside of the list (the list is therefore closed)
  272. # regular paragraph after the list
  273. #
  274. # == Text Markup
  275. #
  276. # === Bold, Italic, Typewriter Text
  277. #
  278. # You can use markup within text (except verbatim) to change the
  279. # appearance of parts of that text. Out of the box, RDoc::Markup
  280. # supports word-based and general markup.
  281. #
  282. # Word-based markup uses flag characters around individual words:
  283. #
  284. # <tt>\*_word_\*</tt>:: displays _word_ in a *bold* font
  285. # <tt>\__word_\_</tt>:: displays _word_ in an _emphasized_ font
  286. # <tt>\+_word_\+</tt>:: displays _word_ in a +code+ font
  287. #
  288. # General markup affects text between a start delimiter and an end
  289. # delimiter. Not surprisingly, these delimiters look like HTML markup.
  290. #
  291. # <tt>\<b>_text_</b></tt>:: displays _text_ in a *bold* font
  292. # <tt>\<em>_text_</em></tt>:: displays _text_ in an _emphasized_ font
  293. # (alternate tag: <tt>\<i></tt>)
  294. # <tt>\<tt>_text_\</tt></tt>:: displays _text_ in a +code+ font
  295. # (alternate tag: <tt>\<code></tt>)
  296. #
  297. # Unlike conventional Wiki markup, general markup can cross line
  298. # boundaries. You can turn off the interpretation of markup by
  299. # preceding the first character with a backslash (see <i>Escaping
  300. # Text Markup</i>, below).
  301. #
  302. # === Links
  303. #
  304. # Links to starting with +http:+, +https:+, +mailto:+, +ftp:+ or +www.+
  305. # are recognized. An HTTP url that references an external image is converted
  306. # into an inline image element.
  307. #
  308. # Classes and methods will be automatically linked to their definition. For
  309. # example, <tt>RDoc::Markup</tt> will link to this documentation. By default
  310. # methods will only be automatically linked if they contain an <tt>_</tt> (all
  311. # methods can be automatically linked through the <tt>--hyperlink-all</tt>
  312. # command line option).
  313. #
  314. # Single-word methods can be linked by using the <tt>#</tt> character for
  315. # instance methods or <tt>::</tt> for class methods. For example,
  316. # <tt>#convert</tt> links to #convert. A class or method may be combined like
  317. # <tt>RDoc::Markup#convert</tt>.
  318. #
  319. # A heading inside the documentation can be linked by following the class
  320. # or method by an <tt>@</tt> then the heading name.
  321. # <tt>RDoc::Markup@Links</tt> will link to this section like this:
  322. # RDoc::Markup@Links. Spaces in headings with multiple words must be escaped
  323. # with <tt>+</tt> like <tt>RDoc::Markup@Escaping+Text+Markup</tt>.
  324. # Punctuation and other special characters must be escaped like CGI.escape.
  325. #
  326. # Links can also be of the form <tt>label[url]</tt>, in which case +label+ is
  327. # used in the displayed text, and +url+ is used as the target. If +label+
  328. # contains multiple words, put it in braces: <tt>{multi word label}[url]</tt>.
  329. # The +url+ may be an +http:+-type link or a cross-reference to a class,
  330. # module or method with a label.
  331. #
  332. # Links with the <tt>rdoc-ref:</tt> scheme will link to the referenced class,
  333. # module, method, file, etc. If the referenced item is does not exist
  334. # no link will be generated and <tt>rdoc-ref:</tt> will be removed from the
  335. # resulting text.
  336. #
  337. # Links starting with <tt>rdoc-label:label_name</tt> will link to the
  338. # +label_name+. You can create a label for the current link (for
  339. # bidirectional links) by supplying a name for the current link like
  340. # <tt>rdoc-label:label-other:label-mine</tt>.
  341. #
  342. # Links starting with +link:+ refer to local files whose path is relative to
  343. # the <tt>--op</tt> directory. Use <tt>rdoc-ref:</tt> instead of
  344. # <tt>link:</tt> to link to files generated by RDoc as the link target may
  345. # be different across RDoc generators.
  346. #
  347. # Example links:
  348. #
  349. # https://github.com/rdoc/rdoc
  350. # mailto:user@example.com
  351. # {RDoc Documentation}[http://rdoc.rubyforge.org]
  352. # {RDoc Markup}[rdoc-ref:RDoc::Markup]
  353. #
  354. # === Escaping Text Markup
  355. #
  356. # Text markup can be escaped with a backslash, as in \<tt>, which was obtained
  357. # with <tt>\\<tt></tt>. Except in verbatim sections and between \<tt> tags,
  358. # to produce a backslash you have to double it unless it is followed by a
  359. # space, tab or newline. Otherwise, the HTML formatter will discard it, as it
  360. # is used to escape potential links:
  361. #
  362. # * The \ must be doubled if not followed by white space: \\.
  363. # * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
  364. # * This is a link to {ruby-lang}[www.ruby-lang.org].
  365. # * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org].
  366. # * This will not be linked to \RDoc::RDoc#document
  367. #
  368. # generates:
  369. #
  370. # * The \ must be doubled if not followed by white space: \\.
  371. # * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
  372. # * This is a link to {ruby-lang}[www.ruby-lang.org]
  373. # * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org]
  374. # * This will not be linked to \RDoc::RDoc#document
  375. #
  376. # Inside \<tt> tags, more precisely, leading backslashes are removed only if
  377. # followed by a markup character (<tt><*_+</tt>), a backslash, or a known link
  378. # reference (a known class or method). So in the example above, the backslash
  379. # of <tt>\S</tt> would be removed if there was a class or module named +S+ in
  380. # the current context.
  381. #
  382. # This behavior is inherited from RDoc version 1, and has been kept for
  383. # compatibility with existing RDoc documentation.
  384. #
  385. # === Conversion of characters
  386. #
  387. # HTML will convert two/three dashes to an em-dash. Other common characters are
  388. # converted as well:
  389. #
  390. # em-dash:: -- or ---
  391. # ellipsis:: ...
  392. #
  393. # single quotes:: 'text' or `text'
  394. # double quotes:: "text" or ``text''
  395. #
  396. # copyright:: (c)
  397. # registered trademark:: (r)
  398. #
  399. # produces:
  400. #
  401. # em-dash:: -- or ---
  402. # ellipsis:: ...
  403. #
  404. # single quotes:: 'text' or `text'
  405. # double quotes:: "text" or ``text''
  406. #
  407. # copyright:: (c)
  408. # registered trademark:: (r)
  409. #
  410. #
  411. # == Documenting Source Code
  412. #
  413. # Comment blocks can be written fairly naturally, either using <tt>#</tt> on
  414. # successive lines of the comment, or by including the comment in
  415. # a <tt>=begin</tt>/<tt>=end</tt> block. If you use the latter form,
  416. # the <tt>=begin</tt> line _must_ be flagged with an +rdoc+ tag:
  417. #
  418. # =begin rdoc
  419. # Documentation to be processed by RDoc.
  420. #
  421. # ...
  422. # =end
  423. #
  424. # RDoc stops processing comments if it finds a comment line starting
  425. # with <tt>--</tt> right after the <tt>#</tt> character (otherwise,
  426. # it will be treated as a rule if it has three dashes or more).
  427. # This can be used to separate external from internal comments,
  428. # or to stop a comment being associated with a method, class, or module.
  429. # Commenting can be turned back on with a line that starts with <tt>++</tt>.
  430. #
  431. # ##
  432. # # Extract the age and calculate the date-of-birth.
  433. # #--
  434. # # FIXME: fails if the birthday falls on February 29th
  435. # #++
  436. # # The DOB is returned as a Time object.
  437. #
  438. # def get_dob(person)
  439. # # ...
  440. # end
  441. #
  442. # Names of classes, files, and any method names containing an underscore or
  443. # preceded by a hash character are automatically linked from comment text to
  444. # their description. This linking works inside the current class or module,
  445. # and with ancestor methods (in included modules or in the superclass).
  446. #
  447. # Method parameter lists are extracted and displayed with the method
  448. # description. If a method calls +yield+, then the parameters passed to yield
  449. # will also be displayed:
  450. #
  451. # def fred
  452. # ...
  453. # yield line, address
  454. #
  455. # This will get documented as:
  456. #
  457. # fred() { |line, address| ... }
  458. #
  459. # You can override this using a comment containing ':yields: ...' immediately
  460. # after the method definition
  461. #
  462. # def fred # :yields: index, position
  463. # # ...
  464. #
  465. # yield line, address
  466. #
  467. # which will get documented as
  468. #
  469. # fred() { |index, position| ... }
  470. #
  471. # +:yields:+ is an example of a documentation directive. These appear
  472. # immediately after the start of the document element they are modifying.
  473. #
  474. # RDoc automatically cross-references words with underscores or camel-case.
  475. # To suppress cross-references, prefix the word with a \ character. To
  476. # include special characters like "<tt>\n</tt>", you'll need to use
  477. # two \ characters in normal text, but only one in \<tt> text:
  478. #
  479. # "\\n" or "<tt>\n</tt>"
  480. #
  481. # produces:
  482. #
  483. # "\\n" or "<tt>\n</tt>"
  484. #
  485. # == Directives
  486. #
  487. # Directives are keywords surrounded by ":" characters.
  488. #
  489. # === Controlling what is documented
  490. #
  491. # [+:nodoc:+ / <tt>:nodoc: all</tt>]
  492. # This directive prevents documentation for the element from
  493. # being generated. For classes and modules, methods, aliases,
  494. # constants, and attributes directly within the affected class or
  495. # module also will be omitted. By default, though, modules and
  496. # classes within that class or module _will_ be documented. This is
  497. # turned off by adding the +all+ modifier.
  498. #
  499. # module MyModule # :nodoc:
  500. # class Input
  501. # end
  502. # end
  503. #
  504. # module OtherModule # :nodoc: all
  505. # class Output
  506. # end
  507. # end
  508. #
  509. # In the above code, only class <tt>MyModule::Input</tt> will be documented.
  510. #
  511. # The +:nodoc:+ directive, like +:enddoc:+, +:stopdoc:+ and +:startdoc:+
  512. # presented below, is local to the current file: if you do not want to
  513. # document a module that appears in several files, specify +:nodoc:+ on each
  514. # appearance, at least once per file.
  515. #
  516. # [+:stopdoc:+ / +:startdoc:+]
  517. # Stop and start adding new documentation elements to the current container.
  518. # For example, if a class has a number of constants that you don't want to
  519. # document, put a +:stopdoc:+ before the first, and a +:startdoc:+ after the
  520. # last. If you don't specify a +:startdoc:+ by the end of the container,
  521. # disables documentation for the rest of the current file.
  522. #
  523. # [+:doc:+]
  524. # Forces a method or attribute to be documented even if it wouldn't be
  525. # otherwise. Useful if, for example, you want to include documentation of a
  526. # particular private method.
  527. #
  528. # [+:enddoc:+]
  529. # Document nothing further at the current level: directives +:startdoc:+ and
  530. # +:doc:+ that appear after this will not be honored for the current container
  531. # (file, class or module), in the current file.
  532. #
  533. # [+:notnew:+ / +:not_new:+ / +:not-new:+ ]
  534. # Only applicable to the +initialize+ instance method. Normally RDoc
  535. # assumes that the documentation and parameters for +initialize+ are
  536. # actually for the +new+ method, and so fakes out a +new+ for the class.
  537. # The +:notnew:+ directive stops this. Remember that +initialize+ is private,
  538. # so you won't see the documentation unless you use the +-a+ command line
  539. # option.
  540. #
  541. # === Method arguments
  542. #
  543. # [+:arg:+ or +:args:+ _parameters_]
  544. # Overrides the default argument handling with exactly these parameters.
  545. #
  546. # ##
  547. # # :args: a, b
  548. #
  549. # def some_method(*a)
  550. # end
  551. #
  552. # [+:yield:+ or +:yields:+ _parameters_]
  553. # Overrides the default yield discovery with these parameters.
  554. #
  555. # ##
  556. # # :yields: key, value
  557. #
  558. # def each_thing &block
  559. # @things.each(&block)
  560. # end
  561. #
  562. # [+:call-seq:+]
  563. # Lines up to the next blank line or lines with a common prefix in the
  564. # comment are treated as the method's calling sequence, overriding the
  565. # default parsing of method parameters and yield arguments.
  566. #
  567. # Multiple lines may be used.
  568. #
  569. # # :call-seq:
  570. # # ARGF.readlines(sep=$/) -> array
  571. # # ARGF.readlines(limit) -> array
  572. # # ARGF.readlines(sep, limit) -> array
  573. # #
  574. # # ARGF.to_a(sep=$/) -> array
  575. # # ARGF.to_a(limit) -> array
  576. # # ARGF.to_a(sep, limit) -> array
  577. # #
  578. # # The remaining lines are documentation ...
  579. #
  580. # === Sections
  581. #
  582. # Sections allow you to group methods in a class into sensible containers. If
  583. # you use the sections 'Public', 'Internal' and 'Deprecated' (the three
  584. # allowed method statuses from TomDoc) the sections will be displayed in that
  585. # order placing the most useful methods at the top. Otherwise, sections will
  586. # be displayed in alphabetical order.
  587. #
  588. # [+:category:+ _section_]
  589. # Adds this item to the named +section+ overriding the current section. Use
  590. # this to group methods by section in RDoc output while maintaining a
  591. # sensible ordering (like alphabetical).
  592. #
  593. # # :category: Utility Methods
  594. # #
  595. # # CGI escapes +text+
  596. #
  597. # def convert_string text
  598. # CGI.escapeHTML text
  599. # end
  600. #
  601. # An empty category will place the item in the default category:
  602. #
  603. # # :category:
  604. # #
  605. # # This method is in the default category
  606. #
  607. # def some_method
  608. # # ...
  609. # end
  610. #
  611. # Unlike the :section: directive, :category: is not sticky. The category
  612. # only applies to the item immediately following the comment.
  613. #
  614. # Use the :section: directive to provide introductory text for a section of
  615. # documentation.
  616. #
  617. # [+:section:+ _title_]
  618. # Provides section introductory text in RDoc output. The title following
  619. # +:section:+ is used as the section name and the remainder of the comment
  620. # containing the section is used as introductory text. A section's comment
  621. # block must be separated from following comment blocks. Use an empty title
  622. # to switch to the default section.
  623. #
  624. # The :section: directive is sticky, so subsequent methods, aliases,
  625. # attributes, and classes will be contained in this section until the
  626. # section is changed. The :category: directive will override the :section:
  627. # directive.
  628. #
  629. # A :section: comment block may have one or more lines before the :section:
  630. # directive. These will be removed, and any identical lines at the end of
  631. # the block are also removed. This allows you to add visual cues to the
  632. # section.
  633. #
  634. # Example:
  635. #
  636. # # ----------------------------------------
  637. # # :section: My Section
  638. # # This is the section that I wrote.
  639. # # See it glisten in the noon-day sun.
  640. # # ----------------------------------------
  641. #
  642. # ##
  643. # # Comment for some_method
  644. #
  645. # def some_method
  646. # # ...
  647. # end
  648. #
  649. # === Other directives
  650. #
  651. # [+:markup:+ _type_]
  652. # Overrides the default markup type for this comment with the specified
  653. # markup type. For ruby files, if the first comment contains this directive
  654. # it is applied automatically to all comments in the file.
  655. #
  656. # To add additional markup types to RDoc, add the type's name and parsing
  657. # class to RDoc::Text::MARKUP_FORMAT. The parsing class must respond to
  658. # \::parse and accept a String argument.
  659. #
  660. # The parsing class must return an RDoc::Document.
  661. #
  662. # [+:include:+ _filename_]
  663. # Include the contents of the named file at this point. This directive
  664. # must appear alone on one line, possibly preceded by spaces. In this
  665. # position, it can be escaped with a \ in front of the first colon.
  666. #
  667. # The file will be searched for in the directories listed by the +--include+
  668. # option, or in the current directory by default. The contents of the file
  669. # will be shifted to have the same indentation as the ':' at the start of
  670. # the +:include:+ directive.
  671. #
  672. # [+:title:+ _text_]
  673. # Sets the title for the document. Equivalent to the <tt>--title</tt>
  674. # command line parameter. (The command line parameter overrides any :title:
  675. # directive in the source).
  676. #
  677. # [+:main:+ _name_]
  678. # Equivalent to the <tt>--main</tt> command line parameter.
  679. #
  680. #--
  681. # Original Author:: Dave Thomas, dave@pragmaticprogrammer.com
  682. # License:: Ruby license
  683. class RDoc::Markup
  684. ##
  685. # An AttributeManager which handles inline markup.
  686. attr_reader :attribute_manager
  687. ##
  688. # Parses +str+ into an RDoc::Markup::Document.
  689. def self.parse str
  690. RDoc::Markup::Parser.parse str
  691. rescue RDoc::Markup::Parser::Error => e
  692. $stderr.puts <<-EOF
  693. While parsing markup, RDoc encountered a #{e.class}:
  694. #{e}
  695. \tfrom #{e.backtrace.join "\n\tfrom "}
  696. ---8<---
  697. #{text}
  698. ---8<---
  699. RDoc #{RDoc::VERSION}
  700. Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_RELEASE_DATE}
  701. Please file a bug report with the above information at:
  702. https://github.com/rdoc/rdoc/issues
  703. EOF
  704. raise
  705. end
  706. ##
  707. # Take a block of text and use various heuristics to determine its
  708. # structure (paragraphs, lists, and so on). Invoke an event handler as we
  709. # identify significant chunks.
  710. def initialize attribute_manager = nil
  711. @attribute_manager = attribute_manager || RDoc::Markup::AttributeManager.new
  712. @output = nil
  713. end
  714. ##
  715. # Add to the sequences used to add formatting to an individual word (such
  716. # as *bold*). Matching entries will generate attributes that the output
  717. # formatters can recognize by their +name+.
  718. def add_word_pair(start, stop, name)
  719. @attribute_manager.add_word_pair(start, stop, name)
  720. end
  721. ##
  722. # Add to the sequences recognized as general markup.
  723. def add_html(tag, name)
  724. @attribute_manager.add_html(tag, name)
  725. end
  726. ##
  727. # Add to other inline sequences. For example, we could add WikiWords using
  728. # something like:
  729. #
  730. # parser.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
  731. #
  732. # Each wiki word will be presented to the output formatter via the
  733. # accept_special method.
  734. def add_special(pattern, name)
  735. @attribute_manager.add_special(pattern, name)
  736. end
  737. ##
  738. # We take +input+, parse it if necessary, then invoke the output +formatter+
  739. # using a Visitor to render the result.
  740. def convert input, formatter
  741. document = case input
  742. when RDoc::Markup::Document then
  743. input
  744. else
  745. RDoc::Markup::Parser.parse input
  746. end
  747. document.accept formatter
  748. end
  749. autoload :Parser, 'rdoc/markup/parser'
  750. autoload :PreProcess, 'rdoc/markup/pre_process'
  751. # Inline markup classes
  752. autoload :AttrChanger, 'rdoc/markup/attr_changer'
  753. autoload :AttrSpan, 'rdoc/markup/attr_span'
  754. autoload :Attribute, 'rdoc/markup/attribute'
  755. autoload :AttributeManager, 'rdoc/markup/attribute_manager'
  756. autoload :Special, 'rdoc/markup/special'
  757. # RDoc::Markup AST
  758. autoload :BlankLine, 'rdoc/markup/blank_line'
  759. autoload :Document, 'rdoc/markup/document'
  760. autoload :Heading, 'rdoc/markup/heading'
  761. autoload :Include, 'rdoc/markup/include'
  762. autoload :IndentedParagraph, 'rdoc/markup/indented_paragraph'
  763. autoload :List, 'rdoc/markup/list'
  764. autoload :ListItem, 'rdoc/markup/list_item'
  765. autoload :Paragraph, 'rdoc/markup/paragraph'
  766. autoload :Raw, 'rdoc/markup/raw'
  767. autoload :Rule, 'rdoc/markup/rule'
  768. autoload :Verbatim, 'rdoc/markup/verbatim'
  769. # Formatters
  770. autoload :Formatter, 'rdoc/markup/formatter'
  771. autoload :FormatterTestCase, 'rdoc/markup/formatter_test_case'
  772. autoload :TextFormatterTestCase, 'rdoc/markup/text_formatter_test_case'
  773. autoload :ToAnsi, 'rdoc/markup/to_ansi'
  774. autoload :ToBs, 'rdoc/markup/to_bs'
  775. autoload :ToHtml, 'rdoc/markup/to_html'
  776. autoload :ToHtmlCrossref, 'rdoc/markup/to_html_crossref'
  777. autoload :ToHtmlSnippet, 'rdoc/markup/to_html_snippet'
  778. autoload :ToLabel, 'rdoc/markup/to_label'
  779. autoload :ToRdoc, 'rdoc/markup/to_rdoc'
  780. autoload :ToTableOfContents, 'rdoc/markup/to_table_of_contents'
  781. autoload :ToTest, 'rdoc/markup/to_test'
  782. autoload :ToTtOnly, 'rdoc/markup/to_tt_only'
  783. end