123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- = Developer Introduction
- So you want to write a generator, fix a bug, or otherwise work with RDoc. This
- document provides an overview of how RDoc works from parsing options to
- generating output. Most of the documentation can be found in the specific
- classes for each feature.
- == Bugs
- If you think you found a bug, file a ticket on the {issues
- tracker}[https://github.com/rdoc/rdoc/issues] on github.
- To get your bug fixed as fast as possible please include a sample file that
- illustrates the problem or link to a repository and include steps to reproduce
- the issue. Here are some examples of good issues:
- * https://github.com/rdoc/rdoc/issues/55
- * https://github.com/rdoc/rdoc/issues/61
- == Plugins
- When 'rdoc/rdoc' is loaded RDoc looks for 'rdoc/discover' files in your
- installed gems. This can be used to load parsers, alternate generators, or
- additional preprocessor directives. An rdoc plugin layout should look
- something like this:
- lib/rdoc/discover.rb
- lib/my/rdoc/plugin.rb
- # etc.
- In your rdoc/discover.rb file you will want to wrap the loading of your plugin
- in an RDoc version check like this:
- begin
- gem 'rdoc', '~> 3'
- require 'my/rdoc/plugin'
- rescue Gem::LoadError
- end
- === Plugin Types
- In RDoc you can change the following behaviors:
- * Add a parser for a new file format
- * Add a new output generator
- * Add a new markup directive
- * Add a new type of documentation markup
- * Add a new type of formatter
- All of these are described below
- == Option Parsing
- Option parsing is handled by RDoc::Options. When you're writing a generator
- you can provide the user with extra options by providing a class method
- +setup_options+. The option parser will call this after your generator is
- loaded. See RDoc::Generator for details.
- == File Parsing
- After options are parsed, RDoc parses files from the files and directories in
- ARGV. RDoc compares the filename against what each parser claims it can parse
- via RDoc::Parser#parse_files_matching. For example, RDoc::Parser::C can parse
- C files, C headers, C++ files, C++ headers and yacc grammars.
- Once a matching parser class is found it is instantiated and +scan+ is called.
- The parser needs to extract documentation from the file and add it to the RDoc
- document tree. Usually this involves starting at the root and adding a class
- or a module (RDoc::TopLevel#add_class and RDoc::TopLevel#add_module) and
- proceeding to add classes, modules and methods to each nested item.
- When the parsers are finished the document tree is cleaned up to remove
- dangling references to aliases and includes that were not found (and may exist
- in a separate library) through RDoc::ClassModule#complete.
- To write your own parser for a new file format see RDoc::Parser.
- === Documentation Tree
- The parsers build a documentation tree that is composed of RDoc::CodeObject and
- its subclasses. There are various methods to walk the tree to extract
- information, see RDoc::Context and its subclasses.
- Within a class or module, attributes, methods and constants are divided into
- sections. The section represents a functional grouping of parts of the class.
- TomDoc uses the sections "Public", "Internal" and "Deprecated". The sections
- can be enumerated using RDoc::Context#each_section.
- == Output Generation
- An RDoc generator turns the documentation tree into some other kind of output.
- RDoc comes with an HTML generator (RDoc::Generator::Darkfish) and an RI
- database generator (RDoc::Generator::RI). The output a generator creates does
- not have to be human-readable.
- To create your own generator see RDoc::Generator.
- === Comments
- In RDoc 3.10 and newer the comment on an RDoc::CodeObject is now an
- RDoc::Comment object instead of a String. This is to support various
- documentation markup formats like rdoc, TomDoc and rd. The comments are
- normalized to remove comment markers and remove indentation then parsed lazily
- via RDoc::Comment#document to create a generic markup tree that can be
- processed by a formatter.
- To add your own markup format see RDoc::Markup@Other+directives
- ==== Formatters
- To transform a comment into some form of output an RDoc::Markup::Formatter
- subclass is used like RDoc::Markup::ToHtml. A formatter is a visitor that
- walks a parsed comment tree (an RDoc::Markup::Document) of any format. To help
- write a formatter RDoc::Markup::FormatterTestCase exists for generic parsers,
- and RDoc::Markup::TextFormatterTestCase which contains extra test cases for
- text-type output (like +ri+ output).
- RDoc ships with formatters that will turn a comment into HTML, rdoc-markup-like
- text, ANSI or terminal backspace highlighted text, HTML, cross-referenced HTML,
- an HTML snippet free of most markup, an HTML label for use in id attributes, a
- table-of-contents page, and text with only code blocks.
- The output of the formatter does not need to be text or text-like.
- RDoc::Markup::ToLabel creates an HTML-safe label for use in an HTML id
- attribute. A formatter could count the number of words and the average word
- length for a comment, for example.
- ==== Directives
- For comments in markup you can add new directives (:nodoc: is a directive).
- Directives may replace text or store it off for later use.
- See RDoc::Markup::PreProcess::register for details.
- === JSONIndex
- RDoc contains a special generator, RDoc::Generator::JSONIndex, which creates a
- JSON-based search index and includes a search engine for use with HTML output.
- This generator can be used to add searching to any HTML output and is designed
- to be called from inside an HTML generator.
|