123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813 |
- ##
- # RDoc::Markup parses plain text documents and attempts to decompose them into
- # their constituent parts. Some of these parts are high-level: paragraphs,
- # chunks of verbatim text, list entries and the like. Other parts happen at
- # the character level: a piece of bold text, a word in code font. This markup
- # is similar in spirit to that used on WikiWiki webs, where folks create web
- # pages using a simple set of formatting rules.
- #
- # RDoc::Markup itself does no output formatting: this is left to a different
- # set of classes.
- #
- # RDoc::Markup is extendable at runtime: you can add \new markup elements to
- # be recognised in the documents that RDoc::Markup parses.
- #
- # RDoc::Markup is intended to be the basis for a family of tools which share
- # the common requirement that simple, plain-text should be rendered in a
- # variety of different output formats and media. It is envisaged that
- # RDoc::Markup could be the basis for formatting RDoc style comment blocks,
- # Wiki entries, and online FAQs.
- #
- # == Synopsis
- #
- # This code converts +input_string+ to HTML. The conversion takes place in
- # the +convert+ method, so you can use the same RDoc::Markup converter to
- # convert multiple input strings.
- #
- # require 'rdoc'
- #
- # h = RDoc::Markup::ToHtml.new
- #
- # puts h.convert(input_string)
- #
- # You can extend the RDoc::Markup parser to recognise new markup
- # sequences, and to add special processing for text that matches a
- # regular expression. Here we make WikiWords significant to the parser,
- # and also make the sequences {word} and \<no>text...</no> signify
- # strike-through text. We then subclass the HTML output class to deal
- # with these:
- #
- # require 'rdoc'
- #
- # class WikiHtml < RDoc::Markup::ToHtml
- # def handle_special_WIKIWORD(special)
- # "<font color=red>" + special.text + "</font>"
- # end
- # end
- #
- # markup = RDoc::Markup.new
- # markup.add_word_pair("{", "}", :STRIKE)
- # markup.add_html("no", :STRIKE)
- #
- # markup.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
- #
- # wh = WikiHtml.new markup
- # wh.add_tag(:STRIKE, "<strike>", "</strike>")
- #
- # puts "<body>#{wh.convert ARGF.read}</body>"
- #
- # == Encoding
- #
- # Where Encoding support is available, RDoc will automatically convert all
- # documents to the same output encoding. The output encoding can be set via
- # RDoc::Options#encoding and defaults to Encoding.default_external.
- #
- # = \RDoc Markup Reference
- #
- # == Block Markup
- #
- # === Paragraphs and Verbatim
- #
- # The markup engine looks for a document's natural left margin. This is
- # used as the initial margin for the document.
- #
- # Consecutive lines starting at this margin are considered to be a
- # paragraph. Empty lines separate paragraphs.
- #
- # Any line that starts to the right of the current margin is treated
- # as verbatim text. This is useful for code listings:
- #
- # 3.times { puts "Ruby" }
- #
- # In verbatim text, two or more blank lines are collapsed into one,
- # and trailing blank lines are removed:
- #
- # This is the first line
- #
- #
- # This is the second non-blank line,
- # after 2 blank lines in the source markup.
- #
- #
- # There were two trailing blank lines right above this paragraph, that
- # have been removed. In addition, the verbatim text has been shifted
- # left, so the amount of indentation of verbatim text is unimportant.
- #
- # For HTML output RDoc makes a small effort to determine if a verbatim section
- # contains ruby source code. If so, the verbatim block will be marked up as
- # HTML. Triggers include "def", "class", "module", "require", the "hash
- # rocket"# (=>) or a block call with a parameter.
- #
- # === Headers
- #
- # A line starting with an equal sign (=) is treated as a
- # heading. Level one headings have one equals sign, level two headings
- # have two, and so on until level six, which is the maximum
- # (seven hyphens or more result in a level six heading).
- #
- # For example, the above header was obtained with:
- #
- # === Headers
- #
- # In HTML output headers have an id matching their name. The above example's
- # HTML is:
- #
- # <h3 id="label-Headers">Headers</h3>
- #
- # If a heading is inside a method body the id will be prefixed with the
- # method's id. If the above header where in the documentation for a method
- # such as:
- #
- # ##
- # # This method does fun things
- # #
- # # = Example
- # #
- # # Example of fun things goes here ...
- #
- # def do_fun_things
- # end
- #
- # The header's id would be:
- #
- # <h1 id="method-i-do_fun_things-label-Example">Example</h3>
- #
- # The label can be linked-to using <tt>SomeClass@Headers</tt>. See
- # {Links}[RDoc::Markup@Links] for further details.
- #
- # === Rules
- #
- # A line starting with three or more hyphens (at the current indent)
- # generates a horizontal rule. The more hyphens, the thicker the rule
- # (within reason, and if supported by the output device).
- #
- # In the case of HTML output, three dashes generate a 1-pixel high rule,
- # four dashes result in 2 pixels, and so on. The actual height is limited
- # to 10 pixels:
- #
- # ---
- # -----
- # -----------------------------------------------------
- #
- # produces:
- #
- # ---
- # -----
- # -----------------------------------------------------
- #
- # === Simple Lists
- #
- # If a paragraph starts with a "*", "-", "<digit>." or "<letter>.",
- # then it is taken to be the start of a list. The margin is increased to be
- # the first non-space following the list start flag. Subsequent lines
- # should be indented to this new margin until the list ends. For example:
- #
- # * this is a list with three paragraphs in
- # the first item. This is the first paragraph.
- #
- # And this is the second paragraph.
- #
- # 1. This is an indented, numbered list.
- # 2. This is the second item in that list
- #
- # This is the third conventional paragraph in the
- # first list item.
- #
- # * This is the second item in the original list
- #
- # produces:
- #
- # * this is a list with three paragraphs in
- # the first item. This is the first paragraph.
- #
- # And this is the second paragraph.
- #
- # 1. This is an indented, numbered list.
- # 2. This is the second item in that list
- #
- # This is the third conventional paragraph in the
- # first list item.
- #
- # * This is the second item in the original list
- #
- # === Labeled Lists
- #
- # You can also construct labeled lists, sometimes called description
- # or definition lists. Do this by putting the label in square brackets
- # and indenting the list body:
- #
- # [cat] a small furry mammal
- # that seems to sleep a lot
- #
- # [ant] a little insect that is known
- # to enjoy picnics
- #
- # produces:
- #
- # [cat] a small furry mammal
- # that seems to sleep a lot
- #
- # [ant] a little insect that is known
- # to enjoy picnics
- #
- # If you want the list bodies to line up to the left of the labels,
- # use two colons:
- #
- # cat:: a small furry mammal
- # that seems to sleep a lot
- #
- # ant:: a little insect that is known
- # to enjoy picnics
- #
- # produces:
- #
- # cat:: a small furry mammal
- # that seems to sleep a lot
- #
- # ant:: a little insect that is known
- # to enjoy picnics
- #
- # Notice that blank lines right after the label are ignored in labeled lists:
- #
- # [one]
- #
- # definition 1
- #
- # [two]
- #
- # definition 2
- #
- # produces the same output as
- #
- # [one] definition 1
- # [two] definition 2
- #
- #
- # === Lists and Verbatim
- #
- # If you want to introduce a verbatim section right after a list, it has to be
- # less indented than the list item bodies, but more indented than the list
- # label, letter, digit or bullet. For instance:
- #
- # * point 1
- #
- # * point 2, first paragraph
- #
- # point 2, second paragraph
- # verbatim text inside point 2
- # point 2, third paragraph
- # verbatim text outside of the list (the list is therefore closed)
- # regular paragraph after the list
- #
- # produces:
- #
- # * point 1
- #
- # * point 2, first paragraph
- #
- # point 2, second paragraph
- # verbatim text inside point 2
- # point 2, third paragraph
- # verbatim text outside of the list (the list is therefore closed)
- # regular paragraph after the list
- #
- # == Text Markup
- #
- # === Bold, Italic, Typewriter Text
- #
- # You can use markup within text (except verbatim) to change the
- # appearance of parts of that text. Out of the box, RDoc::Markup
- # supports word-based and general markup.
- #
- # Word-based markup uses flag characters around individual words:
- #
- # <tt>\*_word_\*</tt>:: displays _word_ in a *bold* font
- # <tt>\__word_\_</tt>:: displays _word_ in an _emphasized_ font
- # <tt>\+_word_\+</tt>:: displays _word_ in a +code+ font
- #
- # General markup affects text between a start delimiter and an end
- # delimiter. Not surprisingly, these delimiters look like HTML markup.
- #
- # <tt>\<b>_text_</b></tt>:: displays _text_ in a *bold* font
- # <tt>\<em>_text_</em></tt>:: displays _text_ in an _emphasized_ font
- # (alternate tag: <tt>\<i></tt>)
- # <tt>\<tt>_text_\</tt></tt>:: displays _text_ in a +code+ font
- # (alternate tag: <tt>\<code></tt>)
- #
- # Unlike conventional Wiki markup, general markup can cross line
- # boundaries. You can turn off the interpretation of markup by
- # preceding the first character with a backslash (see <i>Escaping
- # Text Markup</i>, below).
- #
- # === Links
- #
- # Links to starting with +http:+, +https:+, +mailto:+, +ftp:+ or +www.+
- # are recognized. An HTTP url that references an external image is converted
- # into an inline image element.
- #
- # Classes and methods will be automatically linked to their definition. For
- # example, <tt>RDoc::Markup</tt> will link to this documentation. By default
- # methods will only be automatically linked if they contain an <tt>_</tt> (all
- # methods can be automatically linked through the <tt>--hyperlink-all</tt>
- # command line option).
- #
- # Single-word methods can be linked by using the <tt>#</tt> character for
- # instance methods or <tt>::</tt> for class methods. For example,
- # <tt>#convert</tt> links to #convert. A class or method may be combined like
- # <tt>RDoc::Markup#convert</tt>.
- #
- # A heading inside the documentation can be linked by following the class
- # or method by an <tt>@</tt> then the heading name.
- # <tt>RDoc::Markup@Links</tt> will link to this section like this:
- # RDoc::Markup@Links. Spaces in headings with multiple words must be escaped
- # with <tt>+</tt> like <tt>RDoc::Markup@Escaping+Text+Markup</tt>.
- # Punctuation and other special characters must be escaped like CGI.escape.
- #
- # Links can also be of the form <tt>label[url]</tt>, in which case +label+ is
- # used in the displayed text, and +url+ is used as the target. If +label+
- # contains multiple words, put it in braces: <tt>{multi word label}[url]</tt>.
- # The +url+ may be an +http:+-type link or a cross-reference to a class,
- # module or method with a label.
- #
- # Links with the <tt>rdoc-ref:</tt> scheme will link to the referenced class,
- # module, method, file, etc. If the referenced item is does not exist
- # no link will be generated and <tt>rdoc-ref:</tt> will be removed from the
- # resulting text.
- #
- # Links starting with <tt>rdoc-label:label_name</tt> will link to the
- # +label_name+. You can create a label for the current link (for
- # bidirectional links) by supplying a name for the current link like
- # <tt>rdoc-label:label-other:label-mine</tt>.
- #
- # Links starting with +link:+ refer to local files whose path is relative to
- # the <tt>--op</tt> directory. Use <tt>rdoc-ref:</tt> instead of
- # <tt>link:</tt> to link to files generated by RDoc as the link target may
- # be different across RDoc generators.
- #
- # Example links:
- #
- # https://github.com/rdoc/rdoc
- # mailto:user@example.com
- # {RDoc Documentation}[http://rdoc.rubyforge.org]
- # {RDoc Markup}[rdoc-ref:RDoc::Markup]
- #
- # === Escaping Text Markup
- #
- # Text markup can be escaped with a backslash, as in \<tt>, which was obtained
- # with <tt>\\<tt></tt>. Except in verbatim sections and between \<tt> tags,
- # to produce a backslash you have to double it unless it is followed by a
- # space, tab or newline. Otherwise, the HTML formatter will discard it, as it
- # is used to escape potential links:
- #
- # * The \ must be doubled if not followed by white space: \\.
- # * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
- # * This is a link to {ruby-lang}[www.ruby-lang.org].
- # * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org].
- # * This will not be linked to \RDoc::RDoc#document
- #
- # generates:
- #
- # * The \ must be doubled if not followed by white space: \\.
- # * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
- # * This is a link to {ruby-lang}[www.ruby-lang.org]
- # * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org]
- # * This will not be linked to \RDoc::RDoc#document
- #
- # Inside \<tt> tags, more precisely, leading backslashes are removed only if
- # followed by a markup character (<tt><*_+</tt>), a backslash, or a known link
- # reference (a known class or method). So in the example above, the backslash
- # of <tt>\S</tt> would be removed if there was a class or module named +S+ in
- # the current context.
- #
- # This behavior is inherited from RDoc version 1, and has been kept for
- # compatibility with existing RDoc documentation.
- #
- # === Conversion of characters
- #
- # HTML will convert two/three dashes to an em-dash. Other common characters are
- # converted as well:
- #
- # em-dash:: -- or ---
- # ellipsis:: ...
- #
- # single quotes:: 'text' or `text'
- # double quotes:: "text" or ``text''
- #
- # copyright:: (c)
- # registered trademark:: (r)
- #
- # produces:
- #
- # em-dash:: -- or ---
- # ellipsis:: ...
- #
- # single quotes:: 'text' or `text'
- # double quotes:: "text" or ``text''
- #
- # copyright:: (c)
- # registered trademark:: (r)
- #
- #
- # == Documenting Source Code
- #
- # Comment blocks can be written fairly naturally, either using <tt>#</tt> on
- # successive lines of the comment, or by including the comment in
- # a <tt>=begin</tt>/<tt>=end</tt> block. If you use the latter form,
- # the <tt>=begin</tt> line _must_ be flagged with an +rdoc+ tag:
- #
- # =begin rdoc
- # Documentation to be processed by RDoc.
- #
- # ...
- # =end
- #
- # RDoc stops processing comments if it finds a comment line starting
- # with <tt>--</tt> right after the <tt>#</tt> character (otherwise,
- # it will be treated as a rule if it has three dashes or more).
- # 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 with <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)
- # # ...
- # end
- #
- # Names of classes, files, and any method names containing an underscore or
- # preceded by a hash character are automatically linked from comment text to
- # their description. This linking works inside the current class or module,
- # and with ancestor methods (in included modules or in the superclass).
- #
- # 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| ... }
- #
- # +:yields:+ is an example of a documentation directive. These appear
- # immediately after the start of the document element they are modifying.
- #
- # RDoc automatically cross-references words with underscores or camel-case.
- # To suppress cross-references, prefix the word with a \ character. To
- # include special characters like "<tt>\n</tt>", you'll need to use
- # two \ characters in normal text, but only one in \<tt> text:
- #
- # "\\n" or "<tt>\n</tt>"
- #
- # produces:
- #
- # "\\n" or "<tt>\n</tt>"
- #
- # == Directives
- #
- # Directives are keywords surrounded by ":" characters.
- #
- # === Controlling what is documented
- #
- # [+:nodoc:+ / <tt>:nodoc: all</tt>]
- # This directive prevents documentation for the element from
- # being generated. For classes and modules, methods, aliases,
- # constants, and attributes directly within the affected class or
- # module also will be omitted. By default, though, modules and
- # classes within that class or module _will_ be documented. This is
- # turned off by adding the +all+ modifier.
- #
- # module MyModule # :nodoc:
- # class Input
- # end
- # end
- #
- # module OtherModule # :nodoc: all
- # class Output
- # end
- # end
- #
- # In the above code, only class <tt>MyModule::Input</tt> will be documented.
- #
- # The +:nodoc:+ directive, like +:enddoc:+, +:stopdoc:+ and +:startdoc:+
- # presented below, is local to the current file: if you do not want to
- # document a module that appears in several files, specify +:nodoc:+ on each
- # appearance, at least once per file.
- #
- # [+:stopdoc:+ / +:startdoc:+]
- # 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 +:stopdoc:+ before the first, and a +:startdoc:+ after the
- # last. If you don't specify a +:startdoc:+ by the end of the container,
- # disables documentation for the rest of the current file.
- #
- # [+:doc:+]
- # Forces a method or attribute to be documented even if it wouldn't be
- # otherwise. Useful if, for example, you want to include documentation of a
- # particular private method.
- #
- # [+:enddoc:+]
- # Document nothing further at the current level: directives +:startdoc:+ and
- # +:doc:+ that appear after this will not be honored for the current container
- # (file, class or module), in the current file.
- #
- # [+:notnew:+ / +:not_new:+ / +:not-new:+ ]
- # 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:+ directive stops this. Remember that +initialize+ is private,
- # so you won't see the documentation unless you use the +-a+ command line
- # option.
- #
- # === Method arguments
- #
- # [+:arg:+ or +:args:+ _parameters_]
- # Overrides the default argument handling with exactly these parameters.
- #
- # ##
- # # :args: a, b
- #
- # def some_method(*a)
- # end
- #
- # [+:yield:+ or +:yields:+ _parameters_]
- # Overrides the default yield discovery with these parameters.
- #
- # ##
- # # :yields: key, value
- #
- # def each_thing &block
- # @things.each(&block)
- # end
- #
- # [+:call-seq:+]
- # Lines up to the next blank line or lines with a common prefix in the
- # comment are treated as the method's calling sequence, overriding the
- # default parsing of method parameters and yield arguments.
- #
- # Multiple lines may be used.
- #
- # # :call-seq:
- # # ARGF.readlines(sep=$/) -> array
- # # ARGF.readlines(limit) -> array
- # # ARGF.readlines(sep, limit) -> array
- # #
- # # ARGF.to_a(sep=$/) -> array
- # # ARGF.to_a(limit) -> array
- # # ARGF.to_a(sep, limit) -> array
- # #
- # # The remaining lines are documentation ...
- #
- # === Sections
- #
- # Sections allow you to group methods in a class into sensible containers. If
- # you use the sections 'Public', 'Internal' and 'Deprecated' (the three
- # allowed method statuses from TomDoc) the sections will be displayed in that
- # order placing the most useful methods at the top. Otherwise, sections will
- # be displayed in alphabetical order.
- #
- # [+:category:+ _section_]
- # Adds this item to the named +section+ overriding the current section. Use
- # this to group methods by section in RDoc output while maintaining a
- # sensible ordering (like alphabetical).
- #
- # # :category: Utility Methods
- # #
- # # CGI escapes +text+
- #
- # def convert_string text
- # CGI.escapeHTML text
- # end
- #
- # An empty category will place the item in the default category:
- #
- # # :category:
- # #
- # # This method is in the default category
- #
- # def some_method
- # # ...
- # end
- #
- # Unlike the :section: directive, :category: is not sticky. The category
- # only applies to the item immediately following the comment.
- #
- # Use the :section: directive to provide introductory text for a section of
- # documentation.
- #
- # [+:section:+ _title_]
- # Provides section introductory text in RDoc output. The title following
- # +:section:+ is used as the section name and the remainder of the comment
- # containing the section is used as introductory text. A section's comment
- # block must be separated from following comment blocks. Use an empty title
- # to switch to the default section.
- #
- # The :section: directive is sticky, so subsequent methods, aliases,
- # attributes, and classes will be contained in this section until the
- # section is changed. The :category: directive will override the :section:
- # directive.
- #
- # 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 to the
- # section.
- #
- # Example:
- #
- # # ----------------------------------------
- # # :section: My Section
- # # This is the section that I wrote.
- # # See it glisten in the noon-day sun.
- # # ----------------------------------------
- #
- # ##
- # # Comment for some_method
- #
- # def some_method
- # # ...
- # end
- #
- # === Other directives
- #
- # [+:markup:+ _type_]
- # Overrides the default markup type for this comment with the specified
- # markup type. For ruby files, if the first comment contains this directive
- # it is applied automatically to all comments in the file.
- #
- # To add additional markup types to RDoc, add the type's name and parsing
- # class to RDoc::Text::MARKUP_FORMAT. The parsing class must respond to
- # \::parse and accept a String argument.
- #
- # The parsing class must return an RDoc::Document.
- #
- # [+:include:+ _filename_]
- # Include the contents of the named file at this point. This directive
- # must appear alone on one line, possibly preceded by spaces. In this
- # position, it can be escaped with a \ in front of the first colon.
- #
- # The file will be searched for in the directories listed by the +--include+
- # 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.
- #
- # [+:title:+ _text_]
- # Sets the title for the document. Equivalent to the <tt>--title</tt>
- # command line parameter. (The command line parameter overrides any :title:
- # directive in the source).
- #
- # [+:main:+ _name_]
- # Equivalent to the <tt>--main</tt> command line parameter.
- #
- #--
- # Original Author:: Dave Thomas, dave@pragmaticprogrammer.com
- # License:: Ruby license
- class RDoc::Markup
- ##
- # An AttributeManager which handles inline markup.
- attr_reader :attribute_manager
- ##
- # Parses +str+ into an RDoc::Markup::Document.
- def self.parse str
- RDoc::Markup::Parser.parse str
- rescue RDoc::Markup::Parser::Error => e
- $stderr.puts <<-EOF
- While parsing markup, RDoc encountered a #{e.class}:
- #{e}
- \tfrom #{e.backtrace.join "\n\tfrom "}
- ---8<---
- #{text}
- ---8<---
- RDoc #{RDoc::VERSION}
- Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_RELEASE_DATE}
- Please file a bug report with the above information at:
- https://github.com/rdoc/rdoc/issues
- EOF
- raise
- end
- ##
- # Take a block of text and use various heuristics to determine its
- # structure (paragraphs, lists, and so on). Invoke an event handler as we
- # identify significant chunks.
- def initialize attribute_manager = nil
- @attribute_manager = attribute_manager || RDoc::Markup::AttributeManager.new
- @output = nil
- end
- ##
- # Add to the sequences used to add formatting to an individual word (such
- # as *bold*). Matching entries will generate attributes that the output
- # formatters can recognize by their +name+.
- def add_word_pair(start, stop, name)
- @attribute_manager.add_word_pair(start, stop, name)
- end
- ##
- # Add to the sequences recognized as general markup.
- def add_html(tag, name)
- @attribute_manager.add_html(tag, name)
- end
- ##
- # Add to other inline sequences. For example, we could add WikiWords using
- # something like:
- #
- # parser.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
- #
- # Each wiki word will be presented to the output formatter via the
- # accept_special method.
- def add_special(pattern, name)
- @attribute_manager.add_special(pattern, name)
- end
- ##
- # We take +input+, parse it if necessary, then invoke the output +formatter+
- # using a Visitor to render the result.
- def convert input, formatter
- document = case input
- when RDoc::Markup::Document then
- input
- else
- RDoc::Markup::Parser.parse input
- end
- document.accept formatter
- end
- autoload :Parser, 'rdoc/markup/parser'
- autoload :PreProcess, 'rdoc/markup/pre_process'
- # Inline markup classes
- autoload :AttrChanger, 'rdoc/markup/attr_changer'
- autoload :AttrSpan, 'rdoc/markup/attr_span'
- autoload :Attribute, 'rdoc/markup/attribute'
- autoload :AttributeManager, 'rdoc/markup/attribute_manager'
- autoload :Special, 'rdoc/markup/special'
- # RDoc::Markup AST
- autoload :BlankLine, 'rdoc/markup/blank_line'
- autoload :Document, 'rdoc/markup/document'
- autoload :Heading, 'rdoc/markup/heading'
- autoload :Include, 'rdoc/markup/include'
- autoload :IndentedParagraph, 'rdoc/markup/indented_paragraph'
- autoload :List, 'rdoc/markup/list'
- autoload :ListItem, 'rdoc/markup/list_item'
- autoload :Paragraph, 'rdoc/markup/paragraph'
- autoload :Raw, 'rdoc/markup/raw'
- autoload :Rule, 'rdoc/markup/rule'
- autoload :Verbatim, 'rdoc/markup/verbatim'
- # Formatters
- autoload :Formatter, 'rdoc/markup/formatter'
- autoload :FormatterTestCase, 'rdoc/markup/formatter_test_case'
- autoload :TextFormatterTestCase, 'rdoc/markup/text_formatter_test_case'
- autoload :ToAnsi, 'rdoc/markup/to_ansi'
- autoload :ToBs, 'rdoc/markup/to_bs'
- autoload :ToHtml, 'rdoc/markup/to_html'
- autoload :ToHtmlCrossref, 'rdoc/markup/to_html_crossref'
- autoload :ToHtmlSnippet, 'rdoc/markup/to_html_snippet'
- autoload :ToLabel, 'rdoc/markup/to_label'
- autoload :ToRdoc, 'rdoc/markup/to_rdoc'
- autoload :ToTableOfContents, 'rdoc/markup/to_table_of_contents'
- autoload :ToTest, 'rdoc/markup/to_test'
- autoload :ToTtOnly, 'rdoc/markup/to_tt_only'
- end
|