From 937b7ab8b59346f02da81ef324b8955b01d7cc25 Mon Sep 17 00:00:00 2001 From: drbrain Date: Sun, 13 Jan 2008 03:02:49 +0000 Subject: Reorganize RDoc generators git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 + lib/rdoc/generators.rb | 20 +- lib/rdoc/generators/chm.rb | 113 ++ lib/rdoc/generators/chm/chm.rb | 98 ++ lib/rdoc/generators/chm_generator.rb | 113 -- lib/rdoc/generators/html.rb | 1531 ++++++++++++++++++++ lib/rdoc/generators/html/hefss.rb | 414 ++++++ lib/rdoc/generators/html/html.rb | 704 +++++++++ lib/rdoc/generators/html/kilmer.rb | 418 ++++++ lib/rdoc/generators/html/one_page_html.rb | 121 ++ lib/rdoc/generators/html_generator.rb | 1527 ------------------- lib/rdoc/generators/ri.rb | 228 +++ lib/rdoc/generators/ri_generator.rb | 228 --- lib/rdoc/generators/template/chm/chm.rb | 86 -- lib/rdoc/generators/template/html/hefss.rb | 430 ------ lib/rdoc/generators/template/html/html.rb | 711 --------- lib/rdoc/generators/template/html/kilmer.rb | 435 ------ lib/rdoc/generators/template/html/one_page_html.rb | 121 -- lib/rdoc/generators/template/xml/rdf.rb | 111 -- lib/rdoc/generators/template/xml/xml.rb | 111 -- lib/rdoc/generators/xml.rb | 120 ++ lib/rdoc/generators/xml/rdf.rb | 113 ++ lib/rdoc/generators/xml/xml.rb | 111 ++ lib/rdoc/generators/xml_generator.rb | 120 -- lib/rdoc/options.rb | 11 +- lib/rdoc/rdoc.rb | 4 +- 26 files changed, 4005 insertions(+), 3998 deletions(-) create mode 100644 lib/rdoc/generators/chm.rb create mode 100644 lib/rdoc/generators/chm/chm.rb delete mode 100644 lib/rdoc/generators/chm_generator.rb create mode 100644 lib/rdoc/generators/html.rb create mode 100644 lib/rdoc/generators/html/hefss.rb create mode 100644 lib/rdoc/generators/html/html.rb create mode 100644 lib/rdoc/generators/html/kilmer.rb create mode 100644 lib/rdoc/generators/html/one_page_html.rb delete mode 100644 lib/rdoc/generators/html_generator.rb create mode 100644 lib/rdoc/generators/ri.rb delete mode 100644 lib/rdoc/generators/ri_generator.rb delete mode 100644 lib/rdoc/generators/template/chm/chm.rb delete mode 100644 lib/rdoc/generators/template/html/hefss.rb delete mode 100644 lib/rdoc/generators/template/html/html.rb delete mode 100644 lib/rdoc/generators/template/html/kilmer.rb delete mode 100644 lib/rdoc/generators/template/html/one_page_html.rb delete mode 100644 lib/rdoc/generators/template/xml/rdf.rb delete mode 100644 lib/rdoc/generators/template/xml/xml.rb create mode 100644 lib/rdoc/generators/xml.rb create mode 100644 lib/rdoc/generators/xml/rdf.rb create mode 100644 lib/rdoc/generators/xml/xml.rb delete mode 100644 lib/rdoc/generators/xml_generator.rb diff --git a/ChangeLog b/ChangeLog index 9ff3c430e9..883d48692e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sun Jan 13 12:01:32 2008 Eric Hodel + + * lib/rdoc/generators*: Reorganize RDoc generators. + Sun Jan 13 11:41:11 2008 NARUSE, Yui * encoding.c (ENCINDEX_EUC_JP, ENCINDEX_SJIS): removed. diff --git a/lib/rdoc/generators.rb b/lib/rdoc/generators.rb index ac45622235..2970c89827 100644 --- a/lib/rdoc/generators.rb +++ b/lib/rdoc/generators.rb @@ -1,9 +1,25 @@ require 'cgi' +require 'rdoc' require 'rdoc/options' require 'rdoc/markup/simple_markup' require 'rdoc/template' -module RDoc; end # HACK +module RDoc::Generators -module RDoc::Generators; end + ## + # Name of sub-direcory that holds file descriptions + + FILE_DIR = "files" + + ## + # Name of sub-direcory that holds class descriptions + + CLASS_DIR = "classes" + + ## + # Name of the RDoc CSS file + + CSS_NAME = "rdoc-style.css" + +end diff --git a/lib/rdoc/generators/chm.rb b/lib/rdoc/generators/chm.rb new file mode 100644 index 0000000000..ce05d38d50 --- /dev/null +++ b/lib/rdoc/generators/chm.rb @@ -0,0 +1,113 @@ +require 'rdoc/generators/html' + +class RDoc::Generators::CHM < RDoc::Generators::HTML + + HHC_PATH = "c:/Program Files/HTML Help Workshop/hhc.exe" + + ## + # Standard generator factory + + def self.for(options) + new(options) + end + + def initialize(*args) + super + @op_name = @options.op_name || "rdoc" + check_for_html_help_workshop + end + + def check_for_html_help_workshop + stat = File.stat(HHC_PATH) + rescue + $stderr << + "\n.chm output generation requires that Microsoft's Html Help\n" << + "Workshop is installed. RDoc looks for it in:\n\n " << + HHC_PATH << + "\n\nYou can download a copy for free from:\n\n" << + " http://msdn.microsoft.com/library/default.asp?" << + "url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp\n\n" + end + + ## + # Generate the html as normal, then wrap it in a help project + + def generate(info) + super + @project_name = @op_name + ".hhp" + create_help_project + end + + ## + # The project contains the project file, a table of contents and an index + + def create_help_project + create_project_file + create_contents_and_index + compile_project + end + + ## + # The project file links together all the various + # files that go to make up the help. + + def create_project_file + template = RDoc::TemplatePage.new @template::HPP_FILE + values = { "title" => @options.title, "opname" => @op_name } + files = [] + @files.each do |f| + files << { "html_file_name" => f.path } + end + + values['all_html_files'] = files + + File.open(@project_name, "w") do |f| + template.write_html_on(f, values) + end + end + + ## + # The contents is a list of all files and modules. + # For each we include as sub-entries the list + # of methods they contain. As we build the contents + # we also build an index file + + def create_contents_and_index + contents = [] + index = [] + + (@files+@classes).sort.each do |entry| + content_entry = { "c_name" => entry.name, "ref" => entry.path } + index << { "name" => entry.name, "aref" => entry.path } + + internals = [] + + methods = entry.build_method_summary_list(entry.path) + + content_entry["methods"] = methods unless methods.empty? + contents << content_entry + index.concat methods + end + + values = { "contents" => contents } + template = RDoc::TemplatePage.new @template::CONTENTS + File.open("contents.hhc", "w") do |f| + template.write_html_on(f, values) + end + + values = { "index" => index } + template = RDoc::TemplatePage.new @template::CHM_INDEX + File.open("index.hhk", "w") do |f| + template.write_html_on(f, values) + end + end + + ## + # Invoke the windows help compiler to compiler the project + + def compile_project + system(HHC_PATH, @project_name) + end + +end + diff --git a/lib/rdoc/generators/chm/chm.rb b/lib/rdoc/generators/chm/chm.rb new file mode 100644 index 0000000000..4134420668 --- /dev/null +++ b/lib/rdoc/generators/chm/chm.rb @@ -0,0 +1,98 @@ +require 'rdoc/generators/chm' +require 'rdoc/generators/html/html' + +module RDoc::Generators::CHM::CHM + + HTML = RDoc::Generators::HTML::HTML + + INDEX = HTML::INDEX + + CLASS_INDEX = HTML::CLASS_INDEX + CLASS_PAGE = HTML::CLASS_PAGE + FILE_INDEX = HTML::FILE_INDEX + FILE_PAGE = HTML::FILE_PAGE + METHOD_INDEX = HTML::METHOD_INDEX + METHOD_LIST = HTML::METHOD_LIST + + FR_INDEX_BODY = HTML::FR_INDEX_BODY + + # This is a nasty little hack, but hhc doesn't support the /, '') + SRC_PAGE = HTML::SRC_PAGE.sub!(/<\?xml.*\?>/, '') + + HPP_FILE = <<-EOF +[OPTIONS] +Auto Index = Yes +Compatibility=1.1 or later +Compiled file=<%= values["opname"] %>.chm +Contents file=contents.hhc +Full-text search=Yes +Index file=index.hhk +Language=0x409 English(United States) +Title=<%= values["title"] %> + +[FILES] +<% values["all_html_files"].each do |all_html_files| %> +<%= all_html_files["html_file_name"] %> +<% end # values["all_html_files"] %> + EOF + + CONTENTS = <<-EOF + + + + + + + + + + + +
    +<% values["contents"].each do |contents| %> +
  • + "> + "> + +<% if contents["methods"] then %> +
      +<% contents["methods"].each do |methods| %> +
    • + "> + "> + +<% end # contents["methods"] %> +
    +<% end %> +
  • +<% end # values["contents"] %> +
+ + EOF + + CHM_INDEX = <<-EOF + + + + + + + + + + + +
    +<% values["index"].each do |index| %> +
  • + "> + "> + +<% end # values["index"] %> +
+ + EOF + +end + diff --git a/lib/rdoc/generators/chm_generator.rb b/lib/rdoc/generators/chm_generator.rb deleted file mode 100644 index c3272c9af3..0000000000 --- a/lib/rdoc/generators/chm_generator.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'rdoc/generators/html_generator' - -class RDoc::Generators::CHMGenerator < RDoc::Generators::HTMLGenerator - - HHC_PATH = "c:/Program Files/HTML Help Workshop/hhc.exe" - - ## - # Standard generator factory - - def self.for(options) - new(options) - end - - def initialize(*args) - super - @op_name = @options.op_name || "rdoc" - check_for_html_help_workshop - end - - def check_for_html_help_workshop - stat = File.stat(HHC_PATH) - rescue - $stderr << - "\n.chm output generation requires that Microsoft's Html Help\n" << - "Workshop is installed. RDoc looks for it in:\n\n " << - HHC_PATH << - "\n\nYou can download a copy for free from:\n\n" << - " http://msdn.microsoft.com/library/default.asp?" << - "url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp\n\n" - end - - ## - # Generate the html as normal, then wrap it in a help project - - def generate(info) - super - @project_name = @op_name + ".hhp" - create_help_project - end - - ## - # The project contains the project file, a table of contents and an index - - def create_help_project - create_project_file - create_contents_and_index - compile_project - end - - ## - # The project file links together all the various - # files that go to make up the help. - - def create_project_file - template = RDoc::TemplatePage.new RDoc::Page::HPP_FILE - values = { "title" => @options.title, "opname" => @op_name } - files = [] - @files.each do |f| - files << { "html_file_name" => f.path } - end - - values['all_html_files'] = files - - File.open(@project_name, "w") do |f| - template.write_html_on(f, values) - end - end - - ## - # The contents is a list of all files and modules. - # For each we include as sub-entries the list - # of methods they contain. As we build the contents - # we also build an index file - - def create_contents_and_index - contents = [] - index = [] - - (@files+@classes).sort.each do |entry| - content_entry = { "c_name" => entry.name, "ref" => entry.path } - index << { "name" => entry.name, "aref" => entry.path } - - internals = [] - - methods = entry.build_method_summary_list(entry.path) - - content_entry["methods"] = methods unless methods.empty? - contents << content_entry - index.concat methods - end - - values = { "contents" => contents } - template = RDoc::TemplatePage.new RDoc::Page::CONTENTS - File.open("contents.hhc", "w") do |f| - template.write_html_on(f, values) - end - - values = { "index" => index } - template = RDoc::TemplatePage.new RDoc::Page::CHM_INDEX - File.open("index.hhk", "w") do |f| - template.write_html_on(f, values) - end - end - - ## - # Invoke the windows help compiler to compiler the project - - def compile_project - system(HHC_PATH, @project_name) - end - -end - diff --git a/lib/rdoc/generators/html.rb b/lib/rdoc/generators/html.rb new file mode 100644 index 0000000000..10244576df --- /dev/null +++ b/lib/rdoc/generators/html.rb @@ -0,0 +1,1531 @@ +require 'fileutils' + +require 'rdoc/generators' +require 'rdoc/markup/simple_markup/to_html' + +module RDoc::Generators + + ## + # Build a hash of all items that can be cross-referenced. + # This is used when we output required and included names: + # if the names appear in this hash, we can generate + # an html cross reference to the appropriate description. + # We also use this when parsing comment blocks: any decorated + # words matching an entry in this list are hyperlinked. + + class AllReferences + @@refs = {} + + def AllReferences::reset + @@refs = {} + end + + def AllReferences.add(name, html_class) + @@refs[name] = html_class + end + + def AllReferences.[](name) + @@refs[name] + end + + def AllReferences.keys + @@refs.keys + end + end + + ## + # Subclass of the SM::ToHtml class that supports looking + # up words in the AllReferences list. Those that are + # found (like AllReferences in this comment) will + # be hyperlinked + + class HyperlinkHtml < SM::ToHtml + + ## + # We need to record the html path of our caller so we can generate + # correct relative paths for any hyperlinks that we find + def initialize(from_path, context, options) + super() + + @from_path = from_path + + @parent_name = context.parent_name + @parent_name += "::" if @parent_name + @context = context + + @options = options + end + + ## + # We're invoked when any text matches the CROSSREF pattern + # (defined in MarkUp). If we fine the corresponding reference, + # generate a hyperlink. If the name we're looking for contains + # no punctuation, we look for it up the module/class chain. For + # example, HyperlinkHtml is found, even without the Generators:: + # prefix, because we look for it in module Generators first. + + def handle_special_CROSSREF(special) + name = special.text + if name[0,1] == '#' + lookup = name[1..-1] + name = lookup unless @options.show_hash + else + lookup = name + end + + # Find class, module, or method in class or module. + if /([A-Z]\w*)[.\#](\w+[!?=]?)/ =~ lookup + container = $1 + method = $2 + ref = @context.find_symbol(container, method) + elsif /([A-Za-z]\w*)[.\#](\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?)/ =~ lookup + container = $1 + method = $2 + ref = @context.find_symbol(container, method) + else + ref = @context.find_symbol(lookup) + end + + if ref and ref.document_self + "#{name}" + else + name + end + end + + ## + # Generate a hyperlink for url, labeled with text. Handle the + # special cases for img: and link: described under handle_special_HYPEDLINK + + def gen_url(url, text) + if url =~ /([A-Za-z]+):(.*)/ + type = $1 + path = $2 + else + type = "http" + path = url + url = "http://#{url}" + end + + if type == "link" + if path[0,1] == '#' # is this meaningful? + url = path + else + url = HTML.gen_url(@from_path, path) + end + end + + if (type == "http" || type == "link") && + url =~ /\.(gif|png|jpg|jpeg|bmp)$/ + + "" + else + "#{text.sub(%r{^#{type}:/*}, '')}" + end + end + + ## + # And we're invoked with a potential external hyperlink mailto: + # just gets inserted. http: links are checked to see if they + # reference an image. If so, that image gets inserted using an + # tag. Otherwise a conventional is used. We also + # support a special type of hyperlink, link:, which is a reference + # to a local file whose path is relative to the --op directory. + + def handle_special_HYPERLINK(special) + url = special.text + gen_url(url, url) + end + + ## + # Here's a hypedlink where the label is different to the URL + #

/, '') + res.sub!(/<\/p>$/, '') + end + res + end + + ## + # Qualify a stylesheet URL; if if +css_name+ does not begin with '/' or + # 'http[s]://', prepend a prefix relative to +path+. Otherwise, return it + # unmodified. + + def style_url(path, css_name=nil) +# $stderr.puts "style_url( #{path.inspect}, #{css_name.inspect} )" + css_name ||= CSS_NAME + if %r{^(https?:/)?/} =~ css_name + return css_name + else + return HTML.gen_url(path, css_name) + end + end + + ## + # Build a webcvs URL with the given 'url' argument. URLs with a '%s' in them + # get the file's path sprintfed into them; otherwise they're just catenated + # together. + + def cvs_url(url, full_path) + if /%s/ =~ url + return sprintf( url, full_path ) + else + return url + full_path + end + end + + end + + ## + # A Context is built by the parser to represent a container: contexts + # hold classes, modules, methods, require lists and include lists. + # ClassModule and TopLevel are the context objects we process here + + class ContextUser + + include MarkUp + + attr_reader :context + + def initialize(context, options) + @context = context + @options = options + + # HACK ugly + @template = options.template_class + end + + ## + # convenience method to build a hyperlink + + def href(link, cls, name) + %{#{name}} #" + end + + ## + # Returns a reference to outselves to be used as an href= the form depends + # on whether we're all in one file or in multiple files + + def as_href(from_path) + if @options.all_one_file + "#" + path + else + HTML.gen_url(from_path, path) + end + end + + ## + # Create a list of HtmlMethod objects for each method in the corresponding + # context object. If the @options.show_all variable is set (corresponding + # to the --all option, we include all methods, otherwise just the + # public ones. + + def collect_methods + list = @context.method_list + unless @options.show_all + list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation } + end + @methods = list.collect {|m| HtmlMethod.new(m, self, @options) } + end + + ## + # Build a summary list of all the methods in this context + + def build_method_summary_list(path_prefix="") + collect_methods unless @methods + meths = @methods.sort + res = [] + meths.each do |meth| + res << { + "name" => CGI.escapeHTML(meth.name), + "aref" => "#{path_prefix}\##{meth.aref}" + } + end + res + end + + ## + # Build a list of aliases for which we couldn't find a + # corresponding method + + def build_alias_summary_list(section) + values = [] + @context.aliases.each do |al| + next unless al.section == section + res = { + 'old_name' => al.old_name, + 'new_name' => al.new_name, + } + if al.comment && !al.comment.empty? + res['desc'] = markup(al.comment, true) + end + values << res + end + values + end + + ## + # Build a list of constants + + def build_constants_summary_list(section) + values = [] + @context.constants.each do |co| + next unless co.section == section + res = { + 'name' => co.name, + 'value' => CGI.escapeHTML(co.value) + } + res['desc'] = markup(co.comment, true) if co.comment && !co.comment.empty? + values << res + end + values + end + + def build_requires_list(context) + potentially_referenced_list(context.requires) {|fn| [fn + ".rb"] } + end + + def build_include_list(context) + potentially_referenced_list(context.includes) + end + + ## + # Build a list from an array of Htmlxxx items. Look up each + # in the AllReferences hash: if we find a corresponding entry, + # we generate a hyperlink to it, otherwise just output the name. + # However, some names potentially need massaging. For example, + # you may require a Ruby file without the .rb extension, + # but the file names we know about may have it. To deal with + # this, we pass in a block which performs the massaging, + # returning an array of alternative names to match + + def potentially_referenced_list(array) + res = [] + array.each do |i| + ref = AllReferences[i.name] +# if !ref +# container = @context.parent +# while !ref && container +# name = container.name + "::" + i.name +# ref = AllReferences[name] +# container = container.parent +# end +# end + + ref = @context.find_symbol(i.name) + ref = ref.viewer if ref + + if !ref && block_given? + possibles = yield(i.name) + while !ref and !possibles.empty? + ref = AllReferences[possibles.shift] + end + end + h_name = CGI.escapeHTML(i.name) + if ref and ref.document_self + path = url(ref.path) + res << { "name" => h_name, "aref" => path } + else + res << { "name" => h_name } + end + end + res + end + + ## + # Build an array of arrays of method details. The outer array has up + # to six entries, public, private, and protected for both class + # methods, the other for instance methods. The inner arrays contain + # a hash for each method + + def build_method_detail_list(section) + outer = [] + + methods = @methods.sort + for singleton in [true, false] + for vis in [ :public, :protected, :private ] + res = [] + methods.each do |m| + if m.section == section and + m.document_self and + m.visibility == vis and + m.singleton == singleton + row = {} + if m.call_seq + row["callseq"] = m.call_seq.gsub(/->/, '→') + else + row["name"] = CGI.escapeHTML(m.name) + row["params"] = m.params + end + desc = m.description.strip + row["m_desc"] = desc unless desc.empty? + row["aref"] = m.aref + row["visibility"] = m.visibility.to_s + + alias_names = [] + m.aliases.each do |other| + if other.viewer # won't be if the alias is private + alias_names << { + 'name' => other.name, + 'aref' => other.viewer.as_href(path) + } + end + end + unless alias_names.empty? + row["aka"] = alias_names + end + + if @options.inline_source + code = m.source_code + row["sourcecode"] = code if code + else + code = m.src_url + if code + row["codeurl"] = code + row["imgurl"] = m.img_url + end + end + res << row + end + end + if res.size > 0 + outer << { + "type" => vis.to_s.capitalize, + "category" => singleton ? "Class" : "Instance", + "methods" => res + } + end + end + end + outer + end + + ## + # Build the structured list of classes and modules contained + # in this context. + + def build_class_list(level, from, section, infile=nil) + res = "" + prefix = "  ::" * level; + + from.modules.sort.each do |mod| + next unless mod.section == section + next if infile && !mod.defined_in?(infile) + if mod.document_self + res << + prefix << + "Module " << + href(url(mod.viewer.path), "link", mod.full_name) << + "
\n" << + build_class_list(level + 1, mod, section, infile) + end + end + + from.classes.sort.each do |cls| + next unless cls.section == section + next if infile && !cls.defined_in?(infile) + if cls.document_self + res << + prefix << + "Class " << + href(url(cls.viewer.path), "link", cls.full_name) << + "
\n" << + build_class_list(level + 1, cls, section, infile) + end + end + + res + end + + def url(target) + HTML.gen_url(path, target) + end + + def aref_to(target) + if @options.all_one_file + "#" + target + else + url(target) + end + end + + def document_self + @context.document_self + end + + def diagram_reference(diagram) + res = diagram.gsub(/((?:src|href)=")(.*?)"/) { + $1 + url($2) + '"' + } + res + end + + ## + # Find a symbol in ourselves or our parent + + def find_symbol(symbol, method=nil) + res = @context.find_symbol(symbol, method) + if res + res = res.viewer + end + res + end + + ## + # create table of contents if we contain sections + + def add_table_of_sections + toc = [] + @context.sections.each do |section| + if section.title + toc << { + 'secname' => section.title, + 'href' => section.sequence + } + end + end + + @values['toc'] = toc unless toc.empty? + end + + end + + ## + # Wrap a ClassModule context + + class HtmlClass < ContextUser + + attr_reader :path + + def initialize(context, html_file, prefix, options) + super(context, options) + + @html_file = html_file + @is_module = context.is_module? + @values = {} + + context.viewer = self + + if options.all_one_file + @path = context.full_name + else + @path = http_url(context.full_name, prefix) + end + + collect_methods + + AllReferences.add(name, self) + end + + ## + # Returns the relative file name to store this class in, which is also its + # url + + def http_url(full_name, prefix) + path = full_name.dup + if path['<<'] + path.gsub!(/<<\s*(\w*)/) { "from-#$1" } + end + File.join(prefix, path.split("::")) + ".html" + end + + def name + @context.full_name + end + + def parent_name + @context.parent.full_name + end + + def index_name + name + end + + def write_on(f) + value_hash + template = RDoc::TemplatePage.new(@template::BODY, + @template::CLASS_PAGE, + @template::METHOD_LIST) + template.write_html_on(f, @values) + end + + def value_hash + class_attribute_values + add_table_of_sections + + @values["charset"] = @options.charset + @values["style_url"] = style_url(path, @options.css) + + d = markup(@context.comment) + @values["description"] = d unless d.empty? + + ml = build_method_summary_list @path + @values["methods"] = ml unless ml.empty? + + il = build_include_list(@context) + @values["includes"] = il unless il.empty? + + @values["sections"] = @context.sections.map do |section| + + secdata = { + "sectitle" => section.title, + "secsequence" => section.sequence, + "seccomment" => markup(section.comment) + } + + al = build_alias_summary_list(section) + secdata["aliases"] = al unless al.empty? + + co = build_constants_summary_list(section) + secdata["constants"] = co unless co.empty? + + al = build_attribute_list(section) + secdata["attributes"] = al unless al.empty? + + cl = build_class_list(0, @context, section) + secdata["classlist"] = cl unless cl.empty? + + mdl = build_method_detail_list(section) + secdata["method_list"] = mdl unless mdl.empty? + + secdata + end + + @values + end + + def build_attribute_list(section) + atts = @context.attributes.sort + res = [] + atts.each do |att| + next unless att.section == section + if att.visibility == :public || att.visibility == :protected || @options.show_all + entry = { + "name" => CGI.escapeHTML(att.name), + "rw" => att.rw, + "a_desc" => markup(att.comment, true) + } + unless att.visibility == :public || att.visibility == :protected + entry["rw"] << "-" + end + res << entry + end + end + res + end + + def class_attribute_values + h_name = CGI.escapeHTML(name) + + @values["path"] = @path + @values["classmod"] = @is_module ? "Module" : "Class" + @values["title"] = "#{@values['classmod']}: #{h_name}" + + c = @context + c = c.parent while c and !c.diagram + if c && c.diagram + @values["diagram"] = diagram_reference(c.diagram) + end + + @values["full_name"] = h_name + + parent_class = @context.superclass + + if parent_class + @values["parent"] = CGI.escapeHTML(parent_class) + + if parent_name + lookup = parent_name + "::" + parent_class + else + lookup = parent_class + end + + parent_url = AllReferences[lookup] || AllReferences[parent_class] + + if parent_url and parent_url.document_self + @values["par_url"] = aref_to(parent_url.path) + end + end + + files = [] + @context.in_files.each do |f| + res = {} + full_path = CGI.escapeHTML(f.file_absolute_name) + + res["full_path"] = full_path + res["full_path_url"] = aref_to(f.viewer.path) if f.document_self + + if @options.webcvs + res["cvsurl"] = cvs_url( @options.webcvs, full_path ) + end + + files << res + end + + @values['infiles'] = files + end + + def <=>(other) + self.name <=> other.name + end + + end + + ## + # Handles the mapping of a file's information to HTML. In reality, + # a file corresponds to a +TopLevel+ object, containing modules, + # classes, and top-level methods. In theory it _could_ contain + # attributes and aliases, but we ignore these for now. + + class HtmlFile < ContextUser + + attr_reader :path + attr_reader :name + + def initialize(context, options, file_dir) + super(context, options) + + @values = {} + + if options.all_one_file + @path = filename_to_label + else + @path = http_url(file_dir) + end + + @name = @context.file_relative_name + + collect_methods + AllReferences.add(name, self) + context.viewer = self + end + + def http_url(file_dir) + File.join(file_dir, @context.file_relative_name.tr('.', '_')) + + ".html" + end + + def filename_to_label + @context.file_relative_name.gsub(/%|\/|\?|\#/) do |s| + '%%%x' % s[0].unpack('C') + end + end + + def index_name + name + end + + def parent_name + nil + end + + def value_hash + file_attribute_values + add_table_of_sections + + @values["charset"] = @options.charset + @values["href"] = path + @values["style_url"] = style_url(path, @options.css) + + if @context.comment + d = markup(@context.comment) + @values["description"] = d if d.size > 0 + end + + ml = build_method_summary_list + @values["methods"] = ml unless ml.empty? + + il = build_include_list(@context) + @values["includes"] = il unless il.empty? + + rl = build_requires_list(@context) + @values["requires"] = rl unless rl.empty? + + if @options.promiscuous + file_context = nil + else + file_context = @context + end + + + @values["sections"] = @context.sections.map do |section| + + secdata = { + "sectitle" => section.title, + "secsequence" => section.sequence, + "seccomment" => markup(section.comment) + } + + cl = build_class_list(0, @context, section, file_context) + @values["classlist"] = cl unless cl.empty? + + mdl = build_method_detail_list(section) + secdata["method_list"] = mdl unless mdl.empty? + + al = build_alias_summary_list(section) + secdata["aliases"] = al unless al.empty? + + co = build_constants_summary_list(section) + @values["constants"] = co unless co.empty? + + secdata + end + + @values + end + + def write_on(f) + value_hash + + template = RDoc::TemplatePage.new(@template::BODY, + @template::FILE_PAGE, + @template::METHOD_LIST) + + template.write_html_on(f, @values) + end + + def file_attribute_values + full_path = @context.file_absolute_name + short_name = File.basename(full_path) + + @values["title"] = CGI.escapeHTML("File: #{short_name}") + + if @context.diagram + @values["diagram"] = diagram_reference(@context.diagram) + end + + @values["short_name"] = CGI.escapeHTML(short_name) + @values["full_path"] = CGI.escapeHTML(full_path) + @values["dtm_modified"] = @context.file_stat.mtime.to_s + + if @options.webcvs + @values["cvsurl"] = cvs_url( @options.webcvs, @values["full_path"] ) + end + end + + def <=>(other) + self.name <=> other.name + end + + end + + class HtmlMethod + + include MarkUp + + attr_reader :context + attr_reader :src_url + attr_reader :img_url + attr_reader :source_code + + @@seq = "M000000" + + @@all_methods = [] + + def self.reset + @@all_methods = [] + end + + def initialize(context, html_class, options) + @context = context + @html_class = html_class + @options = options + + # HACK ugly + @template = options.template_class + + @@seq = @@seq.succ + @seq = @@seq + @@all_methods << self + + context.viewer = self + + if (ts = @context.token_stream) + @source_code = markup_code(ts) + unless @options.inline_source + @src_url = create_source_code_file(@source_code) + @img_url = HTML.gen_url(path, 'source.png') + end + end + + AllReferences.add(name, self) + end + + ## + # Returns a reference to outselves to be used as an href= the form depends + # on whether we're all in one file or in multiple files + + def as_href(from_path) + if @options.all_one_file + "#" + path + else + HTML.gen_url(from_path, path) + end + end + + def name + @context.name + end + + def section + @context.section + end + + def index_name + "#{@context.name} (#{@html_class.name})" + end + + def parent_name + if @context.parent.parent + @context.parent.parent.full_name + else + nil + end + end + + def aref + @seq + end + + def path + if @options.all_one_file + aref + else + @html_class.path + "#" + aref + end + end + + def description + markup(@context.comment) + end + + def visibility + @context.visibility + end + + def singleton + @context.singleton + end + + def call_seq + cs = @context.call_seq + if cs + cs.gsub(/\n/, "
\n") + else + nil + end + end + + def params + # params coming from a call-seq in 'C' will start with the + # method name + if p !~ /^\w/ + p = @context.params.gsub(/\s*\#.*/, '') + p = p.tr("\n", " ").squeeze(" ") + p = "(" + p + ")" unless p[0] == ?( + + if (block = @context.block_params) + # If this method has explicit block parameters, remove any + # explicit &block + + p.sub!(/,?\s*&\w+/, '') + + block.gsub!(/\s*\#.*/, '') + block = block.tr("\n", " ").squeeze(" ") + if block[0] == ?( + block.sub!(/^\(/, '').sub!(/\)/, '') + end + p << " {|#{block.strip}| ...}" + end + end + CGI.escapeHTML(p) + end + + def create_source_code_file(code_body) + meth_path = @html_class.path.sub(/\.html$/, '.src') + FileUtils.mkdir_p(meth_path) + file_path = File.join(meth_path, @seq) + ".html" + + template = RDoc::TemplatePage.new(@template::SRC_PAGE) + File.open(file_path, "w") do |f| + values = { + 'title' => CGI.escapeHTML(index_name), + 'code' => code_body, + 'style_url' => style_url(file_path, @options.css), + 'charset' => @options.charset + } + template.write_html_on(f, values) + end + HTML.gen_url(path, file_path) + end + + def self.all_methods + @@all_methods + end + + def <=>(other) + @context <=> other.context + end + + ## + # Given a sequence of source tokens, mark up the source code + # to make it look purty. + + def markup_code(tokens) + src = "" + tokens.each do |t| + next unless t + # p t.class +# style = STYLE_MAP[t.class] + style = case t + when RubyToken::TkCONSTANT then "ruby-constant" + when RubyToken::TkKW then "ruby-keyword kw" + when RubyToken::TkIVAR then "ruby-ivar" + when RubyToken::TkOp then "ruby-operator" + when RubyToken::TkId then "ruby-identifier" + when RubyToken::TkNode then "ruby-node" + when RubyToken::TkCOMMENT then "ruby-comment cmt" + when RubyToken::TkREGEXP then "ruby-regexp re" + when RubyToken::TkSTRING then "ruby-value str" + when RubyToken::TkVal then "ruby-value" + else + nil + end + + text = CGI.escapeHTML(t.text) + + if style + src << "#{text}" + else + src << text + end + end + + add_line_numbers(src) if @options.include_line_numbers + src + end + + ## + # We rely on the fact that the first line of a source code listing has + # # File xxxxx, line dddd + + def add_line_numbers(src) + if src =~ /\A.*, line (\d+)/ + first = $1.to_i - 1 + last = first + src.count("\n") + size = last.to_s.length + real_fmt = "%#{size}d: " + fmt = " " * (size+2) + src.gsub!(/^/) do + res = sprintf(fmt, first) + first += 1 + fmt = real_fmt + res + end + end + end + + def document_self + @context.document_self + end + + def aliases + @context.aliases + end + + def find_symbol(symbol, method=nil) + res = @context.parent.find_symbol(symbol, method) + if res + res = res.viewer + end + res + end + + end + + ## + # We're responsible for generating all the HTML files + # from the object tree defined in code_objects.rb. We + # generate: + # + # [files] an html file for each input file given. These + # input files appear as objects of class + # TopLevel + # + # [classes] an html file for each class or module encountered. + # These classes are not grouped by file: if a file + # contains four classes, we'll generate an html + # file for the file itself, and four html files + # for the individual classes. + # + # [indices] we generate three indices for files, classes, + # and methods. These are displayed in a browser + # like window with three index panes across the + # top and the selected description below + # + # Method descriptions appear in whatever entity (file, class, + # or module) that contains them. + # + # We generate files in a structure below a specified subdirectory, + # normally +doc+. + # + # opdir + # | + # |___ files + # | |__ per file summaries + # | + # |___ classes + # |__ per class/module descriptions + # + # HTML is generated using the Template class. + + class HTML + + include MarkUp + + ## + # Converts a target url to one that is relative to a given path + + def self.gen_url(path, target) + from = File.dirname(path) + to, to_file = File.split(target) + + from = from.split("/") + to = to.split("/") + + while from.size > 0 and to.size > 0 and from[0] == to[0] + from.shift + to.shift + end + + from.fill("..") + from.concat(to) + from << to_file + File.join(*from) + end + + ## + # Generators may need to return specific subclasses depending on the + # options they are passed. Because of this we create them using a factory + + def self.for(options) + AllReferences.reset + HtmlMethod.reset + + if options.all_one_file + HTMLInOne.new(options) + else + HTML.new(options) + end + end + + class < f.path, "name" => f.index_name } + end + end + + values = { + "entries" => res, + 'list_title' => CGI.escapeHTML(title), + 'index_url' => main_url, + 'charset' => @options.charset, + 'style_url' => style_url('', @options.css), + } + + File.open(filename, "w") do |f| + template.write_html_on(f, values) + end + end + + ## + # The main index page is mostly a template frameset, but includes the + # initial page. If the --main option was given, we use this as + # our main page, otherwise we use the first file specified on the command + # line. + + def gen_main_index + template = RDoc::TemplatePage.new @template::INDEX + + open 'index.html', 'w' do |f| + classes = @classes.sort.map { |klass| klass.value_hash } + + values = { + 'main_page' => @main_page, + 'initial_page' => main_url, + 'style_url' => style_url('', @options.css), + 'title' => CGI.escapeHTML(@options.title), + 'charset' => @options.charset, + 'classes' => classes, + } + + values['inline_source'] = @options.inline_source + + template.write_html_on f, values + end + end + + ## + # Returns the url of the main page + + def main_url + @main_page = @options.main_page + @main_page_ref = nil + if @main_page + @main_page_ref = AllReferences[@main_page] + if @main_page_ref then + @main_page_path = @main_page_ref.path + else + $stderr.puts "Could not find main page #{@main_page}" + end + end + + unless @main_page_path then + file = @files.find { |file| file.document_self } + @main_page_path = file.path if file + end + + unless @main_page_path then + $stderr.puts "Couldn't find anything to document" + $stderr.puts "Perhaps you've used :stopdoc: in all classes" + exit 1 + end + + @main_page_path + end + + end + + class HTMLInOne < HTML + + def initialize(*args) + super + end + + ## + # Build the initial indices and output objects + # based on an array of TopLevel objects containing + # the extracted information. + + def generate(info) + @toplevels = info + @files = [] + @classes = [] + @hyperlinks = {} + + build_indices + generate_xml + end + + ## + # Generate: + # + # * a list of HtmlFile objects for each TopLevel object. + # * a list of HtmlClass objects for each first level + # class or module in the TopLevel objects + # * a complete list of all hyperlinkable terms (file, + # class, module, and method names) + + def build_indices + + @toplevels.each do |toplevel| + @files << HtmlFile.new(toplevel, @options, FILE_DIR) + end + + RDoc::TopLevel.all_classes_and_modules.each do |cls| + build_class_list(cls, @files[0], CLASS_DIR) + end + end + + def build_class_list(from, html_file, class_dir) + @classes << HtmlClass.new(from, html_file, class_dir, @options) + from.each_classmodule do |mod| + build_class_list(mod, html_file, class_dir) + end + end + + ## + # Generate all the HTML. For the one-file case, we generate + # all the information in to one big hash + + def generate_xml + values = { + 'charset' => @options.charset, + 'files' => gen_into(@files), + 'classes' => gen_into(@classes), + 'title' => CGI.escapeHTML(@options.title), + } + + # this method is defined in the template file + write_extra_pages if defined? write_extra_pages + + template = RDoc::TemplatePage.new @template::ONE_PAGE + + if @options.op_name + opfile = File.open(@options.op_name, "w") + else + opfile = $stdout + end + template.write_html_on(opfile, values) + end + + def gen_into(list) + res = [] + list.each do |item| + res << item.value_hash + end + res + end + + def gen_file_index + gen_an_index(@files, 'Files') + end + + def gen_class_index + gen_an_index(@classes, 'Classes') + end + + def gen_method_index + gen_an_index(HtmlMethod.all_methods, 'Methods') + end + + def gen_an_index(collection, title) + res = [] + collection.sort.each do |f| + if f.document_self + res << { "href" => f.path, "name" => f.index_name } + end + end + + return { + "entries" => res, + 'list_title' => title, + 'index_url' => main_url, + } + end + + end + +end + diff --git a/lib/rdoc/generators/html/hefss.rb b/lib/rdoc/generators/html/hefss.rb new file mode 100644 index 0000000000..c7b4fcc449 --- /dev/null +++ b/lib/rdoc/generators/html/hefss.rb @@ -0,0 +1,414 @@ +require 'rdoc/generators/html' +require 'rdoc/generators/html/html' + +module RDoc::Generators::HTML::HEFSS + + FONTS = "Verdana, Arial, Helvetica, sans-serif" + +STYLE = <<-EOF +body,p { font-family: Verdana, Arial, Helvetica, sans-serif; + color: #000040; background: #BBBBBB; +} + +td { font-family: Verdana, Arial, Helvetica, sans-serif; + color: #000040; +} + +.attr-rw { font-size: small; color: #444488 } + +.title-row {color: #eeeeff; + background: #BBBBDD; +} + +.big-title-font { color: white; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: large; + height: 50px} + +.small-title-font { color: purple; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: small; } + +.aqua { color: purple } + +.method-name, attr-name { + font-family: monospace; font-weight: bold; +} + +.tablesubtitle { + width: 100%; + margin-top: 1ex; + margin-bottom: .5ex; + padding: 5px 0px 5px 20px; + font-size: large; + color: purple; + background: #BBBBCC; +} + +.tablesubsubtitle { + width: 100%; + margin-top: 1ex; + margin-bottom: .5ex; + padding: 5px 0px 5px 20px; + font-size: medium; + color: white; + background: #BBBBCC; +} + +.name-list { + font-family: monospace; + margin-left: 40px; + margin-bottom: 2ex; + line-height: 140%; +} + +.description { + margin-left: 40px; + margin-bottom: 2ex; + line-height: 140%; +} + +.methodtitle { + font-size: medium; + text_decoration: none; + padding: 3px 3px 3px 20px; + color: #0000AA; +} + +.column-title { + font-size: medium; + font-weight: bold; + text_decoration: none; + padding: 3px 3px 3px 20px; + color: #3333CC; + } + +.variable-name { + font-family: monospace; + font-size: medium; + text_decoration: none; + padding: 3px 3px 3px 20px; + color: #0000AA; +} + +.row-name { + font-size: medium; + font-weight: medium; + font-family: monospace; + text_decoration: none; + padding: 3px 3px 3px 20px; +} + +.paramsig { + font-size: small; +} + +.srcbut { float: right } + + EOF + + BODY = <<-EOF + + <%= values["title"] %> + "> + " type="text/css" media="screen" /> + + + + +<%= template_include %> + +<% if values["diagram"] then %> +
+<%= values["diagram"] %> +
+<% end %> + +<% if values["description"] then %> +

<%= values["description"] %>
+<% end %> + +<% if values["requires"] then %> + + +
Required files

+
+<% values["requires"].each do |requires| %> +<%= href requires["aref"], requires["name"] %> +<% end # values["requires"] %> +<% end %> +
+ +<% if values["sections"] then %> +<% values["sections"].each do |sections| %> +<% if sections["method_list"] then %> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> + + +
Subroutines and Functions

+
+<% method_list["methods"].each do |methods| %> +" target="source"><%= methods["name"] %> +<% end # values["methods"] %> +
+<% end %> +<% end # values["method_list"] %> +<% end %> + +<% if sections["attributes"] then %> + + +
Arguments

+ +<% sections["attributes"].each do |attributes| %> + +<% if attributes["rw"] then %> + +<% end %> +<% unless attributes["rw"] then %> + +<% end %> + + + +<% end # values["attributes"] %> +
 [<%= attributes["rw"] %>] <%= attributes["name"] %><%= attributes["a_desc"] %>
+<% end %> +<% end # values["sections"] %> +<% end %> + +<% if values["classlist"] then %> + + +
Modules

+<%= values["classlist"] %>
+<% end %> + + <%= template_include %> + + + + EOF + + FILE_PAGE = <<-EOF + + + + +
+ +
File
<%= values["short_name"] %>
+ + + + + + + + +
Path:<%= values["full_path"] %> +<% if values["cvsurl"] then %> +  (">CVS) +<% end %> +
Modified:<%= values["dtm_modified"] %>
+

+ EOF + + CLASS_PAGE = <<-EOF + + + + + +
+ <%= values["classmod"] %>
<%= values["full_name"] %> +
+ + + + + +<% if values["parent"] then %> + + + + +<% end %> +
In: +<% values["infiles"].each do |infiles| %> +<%= href infiles["full_path_url"], infiles["full_path"] %> +<% if infiles["cvsurl"] then %> + (">CVS) +<% end %> +<% end # values["infiles"] %> +
Parent: +<% if values["par_url"] then %> + " class="cyan"> +<% end %> +<%= values["parent"] %> +<% if values["par_url"] then %> + +<% end %> +
+

+ EOF + + METHOD_LIST = <<-EOF +<% if values["includes"] then %> +
Uses

+
+<% values["includes"].each do |includes| %> + <%= href includes["aref"], includes["name"] %> +<% end # values["includes"] %> +
+<% end %> + +<% if values["sections"] then %> +<% values["sections"].each do |sections| %> +<% if sections["method_list"] then %> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> + + +
<%= method_list["type"] %> <%= method_list["category"] %> methods
+<% method_list["methods"].each do |methods| %> + + +
+"> +<%= methods["name"] %><%= methods["params"] %> +<% if methods["codeurl"] then %> +" target="source" class="srclink">src +<% end %> +
+<% if method_list["m_desc"] then %> +
+<%= method_list["m_desc"] %> +
+<% end %> +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> +<% end %> +<% end # values["sections"] %> +<% end %> + EOF + + SRC_PAGE = <<-EOF + +<%= values["title"] %> +"> + + + +
<%= values["code"] %>
+ + + EOF + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = <<-EOF + + +"> + + + + + +<% values["entries"].each do |entries| %> +"><%= entries["name"] %>
+<% end # values["entries"] %> + + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF + + + <%= values["title"] %> + "> + + + + + + + + + + " name="docwin"> + + + + <body bgcolor="#BBBBBB"> + Click <a href="html/index.html">here</a> for a non-frames + version of this page. + </body> + + + + + EOF + + # Blank page to use as a target + BLANK = %{ + +} + + def write_extra_pages + template = TemplatePage.new(BLANK) + File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } + end + +end + diff --git a/lib/rdoc/generators/html/html.rb b/lib/rdoc/generators/html/html.rb new file mode 100644 index 0000000000..4eb7a86975 --- /dev/null +++ b/lib/rdoc/generators/html/html.rb @@ -0,0 +1,704 @@ +require 'rdoc/generators/html' +require 'rdoc/generators/html/one_page_html' + +## +# = CSS2 RDoc HTML template +# +# This is a template for RDoc that uses XHTML 1.0 Transitional and dictates a +# bit more of the appearance of the output to cascading stylesheets than the +# default. It was designed for clean inline code display, and uses DHTMl to +# toggle the visbility of each method's source with each click on the '[source]' +# link. +# +# == Authors +# +# * Michael Granger +# +# Copyright (c) 2002, 2003 The FaerieMUD Consortium. Some rights reserved. +# +# This work is licensed under the Creative Commons Attribution License. To view +# a copy of this license, visit http://creativecommons.org/licenses/by/1.0/ or +# send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California +# 94305, USA. + +module RDoc::Generators::HTML::HTML + + FONTS = "Verdana,Arial,Helvetica,sans-serif" + + STYLE = <<-EOF +body { + font-family: Verdana,Arial,Helvetica,sans-serif; + font-size: 90%; + margin: 0; + margin-left: 40px; + padding: 0; + background: white; +} + +h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } +h1 { font-size: 150%; } +h2,h3,h4 { margin-top: 1em; } + +a { background: #eef; color: #039; text-decoration: none; } +a:hover { background: #039; color: #eef; } + +/* Override the base stylesheet's Anchor inside a table cell */ +td > a { + background: transparent; + color: #039; + text-decoration: none; +} + +/* and inside a section title */ +.section-title > a { + background: transparent; + color: #eee; + text-decoration: none; +} + +/* === Structural elements =================================== */ + +div#index { + margin: 0; + margin-left: -40px; + padding: 0; + font-size: 90%; +} + + +div#index a { + margin-left: 0.7em; +} + +div#index .section-bar { + margin-left: 0px; + padding-left: 0.7em; + background: #ccc; + font-size: small; +} + + +div#classHeader, div#fileHeader { + width: auto; + color: white; + padding: 0.5em 1.5em 0.5em 1.5em; + margin: 0; + margin-left: -40px; + border-bottom: 3px solid #006; +} + +div#classHeader a, div#fileHeader a { + background: inherit; + color: white; +} + +div#classHeader td, div#fileHeader td { + background: inherit; + color: white; +} + + +div#fileHeader { + background: #057; +} + +div#classHeader { + background: #048; +} + + +.class-name-in-header { + font-size: 180%; + font-weight: bold; +} + + +div#bodyContent { + padding: 0 1.5em 0 1.5em; +} + +div#description { + padding: 0.5em 1.5em; + background: #efefef; + border: 1px dotted #999; +} + +div#description h1,h2,h3,h4,h5,h6 { + color: #125;; + background: transparent; +} + +div#validator-badges { + text-align: center; +} +div#validator-badges img { border: 0; } + +div#copyright { + color: #333; + background: #efefef; + font: 0.75em sans-serif; + margin-top: 5em; + margin-bottom: 0; + padding: 0.5em 2em; +} + + +/* === Classes =================================== */ + +table.header-table { + color: white; + font-size: small; +} + +.type-note { + font-size: small; + color: #DEDEDE; +} + +.xxsection-bar { + background: #eee; + color: #333; + padding: 3px; +} + +.section-bar { + color: #333; + border-bottom: 1px solid #999; + margin-left: -20px; +} + + +.section-title { + background: #79a; + color: #eee; + padding: 3px; + margin-top: 2em; + margin-left: -30px; + border: 1px solid #999; +} + +.top-aligned-row { vertical-align: top } +.bottom-aligned-row { vertical-align: bottom } + +/* --- Context section classes ----------------------- */ + +.context-row { } +.context-item-name { font-family: monospace; font-weight: bold; color: black; } +.context-item-value { font-size: small; color: #448; } +.context-item-desc { color: #333; padding-left: 2em; } + +/* --- Method classes -------------------------- */ +.method-detail { + background: #efefef; + padding: 0; + margin-top: 0.5em; + margin-bottom: 1em; + border: 1px dotted #ccc; +} +.method-heading { + color: black; + background: #ccc; + border-bottom: 1px solid #666; + padding: 0.2em 0.5em 0 0.5em; +} +.method-signature { color: black; background: inherit; } +.method-name { font-weight: bold; } +.method-args { font-style: italic; } +.method-description { padding: 0 0.5em 0 0.5em; } + +/* --- Source code sections -------------------- */ + +a.source-toggle { font-size: 90%; } +div.method-source-code { + background: #262626; + color: #ffdead; + margin: 1em; + padding: 0.5em; + border: 1px dashed #999; + overflow: hidden; +} + +div.method-source-code pre { color: #ffdead; overflow: hidden; } + +/* --- Ruby keyword styles --------------------- */ + +.standalone-code { background: #221111; color: #ffdead; overflow: hidden; } + +.ruby-constant { color: #7fffd4; background: transparent; } +.ruby-keyword { color: #00ffff; background: transparent; } +.ruby-ivar { color: #eedd82; background: transparent; } +.ruby-operator { color: #00ffee; background: transparent; } +.ruby-identifier { color: #ffdead; background: transparent; } +.ruby-node { color: #ffa07a; background: transparent; } +.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } +.ruby-regexp { color: #ffa07a; background: transparent; } +.ruby-value { color: #7fffd4; background: transparent; } +EOF + + +##################################################################### +### H E A D E R T E M P L A T E +##################################################################### + + XHTML_PREAMBLE = <<-EOF +"?> + + EOF + + HEADER = XHTML_PREAMBLE + <<-EOF + + + <%= values["title"] %> + " /> + + " type="text/css" media="screen" /> + + + + +EOF + +##################################################################### +### C O N T E X T C O N T E N T T E M P L A T E +##################################################################### + + CONTEXT_CONTENT = %{ +} + +##################################################################### +### F O O T E R T E M P L A T E +##################################################################### + + FOOTER = <<-EOF + + + + + EOF + + +##################################################################### +### F I L E P A G E H E A D E R T E M P L A T E +##################################################################### + + FILE_PAGE = <<-EOF +
+

<%= values["short_name"] %>

+ + + + + + + + + +
Path:<%= values["full_path"] %> +<% if values["cvsurl"] then %> +  (">CVS) +<% end %> +
Last Update:<%= values["dtm_modified"] %>
+
+ EOF + +##################################################################### +### C L A S S P A G E H E A D E R T E M P L A T E +##################################################################### + + CLASS_PAGE = <<-EOF +
+ + + + + + + + + + +<% if values["parent"] then %> + + + + +<% end %> +
<%= values["classmod"] %><%= values["full_name"] %>
In: +<% values["infiles"].each do |infiles| %> +<% if infiles["full_path_url"] then %> + "> +<% end %> + <%= infiles["full_path"] %> +<% if infiles["full_path_url"] then %> + +<% end %> +<% if infiles["cvsurl"] then %> +  (">CVS) +<% end %> +
+<% end # values["infiles"] %> +
Parent: +<% if values["par_url"] then %> + "> +<% end %> + <%= values["parent"] %> +<% if values["par_url"] then %> + +<% end %> +
+
+ EOF + +##################################################################### +### M E T H O D L I S T T E M P L A T E +##################################################################### + + METHOD_LIST = <<-EOF + +
+<% if values["diagram"] then %> +
+ <%= values["diagram"] %> +
+<% end %> + +<% if values["description"] then %> +
+ <%= values["description"] %> +
+<% end %> + +<% if values["requires"] then %> +
+

Required files

+ +
+<% values["requires"].each do |requires| %> + <%= href requires["aref"], requires["name"] %>   +<% end # values["requires"] %> +
+
+<% end %> + +<% if values["toc"] then %> +
+

Contents

+ +<% end %> +
+ +<% if values["methods"] then %> +
+

Methods

+ +
+<% values["methods"].each do |methods| %> + <%= href methods["aref"], methods["name"] %>   +<% end # values["methods"] %> +
+
+<% end %> + +
+ + + +<% if values["includes"] then %> +
+

Included Modules

+ +
+<% values["includes"].each do |includes| %> + <%= href includes["aref"], includes["name"] %> +<% end # values["includes"] %> +
+
+<% end %> + +<% values["sections"].each do |sections| %> +
+<% if sections["sectitle"] then %> +

"><%= sections["sectitle"] %>

+<% if sections["seccomment"] then %> +
+ <%= sections["seccomment"] %> +
+<% end %> +<% end %> + +<% if values["classlist"] then %> +
+

Classes and Modules

+ + <%= values["classlist"] %> +
+<% end %> + +<% if values["constants"] then %> +
+

Constants

+ +
+ +<% values["constants"].each do |constants| $stderr.puts({ :constants => constants }.inspect) %> + + + + +<% if values["desc"] then %> + + +<% end %> + +<% end # values["constants"] %> +
<%= values["name"] %>=<%= values["value"] %> <%= values["desc"] %>
+
+
+<% end %> + +<% if values["aliases"] then %> +
+

External Aliases

+ +
+ +<% values["aliases"].each do |aliases| $stderr.puts({ :aliases => aliases }.inspect) %> + + + + + +<% if values["desc"] then %> + + + + +<% end %> +<% end # values["aliases"] %> +
<%= values["old_name"] %>-><%= values["new_name"] %>
 <%= values["desc"] %>
+
+
+<% end %> + + +<% if values["attributes"] then %> +
+

Attributes

+ +
+ +<% values["attributes"].each do |attributes| $stderr.puts({ :attributes => attributes }.inspect) %> + + +<% if values["rw"] then %> + +<% end %> +<% unless values["rw"] then %> + +<% end %> + + +<% end # values["attributes"] %> +
<%= values["name"] %> [<%= values["rw"] %>]   <%= values["a_desc"] %>
+
+
+<% end %> + + + + +<% if sections["method_list"] then %> +
+<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +

<%= method_list["type"] %> <%= method_list["category"] %> methods

+ +<% method_list["methods"].each do |methods| %> +
" class="method-detail"> + "> + + + +
+<% if methods["m_desc"] then %> + <%= methods["m_desc"] %> +<% end %> +<% if methods["sourcecode"] then %> +

-source');return false;">[Source]

+
-source"> +
+<%= methods["sourcecode"] %>
+
+
+<% end %> +
+
+ +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> + +
+<% end %> +<% end # values["sections"] %> + EOF + +##################################################################### +### B O D Y T E M P L A T E +##################################################################### + + BODY = HEADER + %{ + +<%= template_include %> + +
+ +} + METHOD_LIST + %{ + +
+ +} + FOOTER + +##################################################################### +### S O U R C E C O D E T E M P L A T E +##################################################################### + + SRC_PAGE = XHTML_PREAMBLE + <<-EOF + + + <%= values["title"] %> + " /> + " type="text/css" media="screen" /> + + +
<%= values["code"] %>
+ + + EOF + + +##################################################################### +### I N D E X F I L E T E M P L A T E S +##################################################################### + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = XHTML_PREAMBLE + <<-EOF + + + + <%= values["list_title"] %> + " /> + " type="text/css" /> + + + +
+

<%= values["list_title"] %>

+
+<% values["entries"].each do |entries| %> + "><%= entries["name"] %>
+<% end # values["entries"] %> +
+
+ + + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF +"?> + + + + + + <%= values["title"] %> + " /> + + + + + + + + " name="docwin" /> + + + EOF + +end + diff --git a/lib/rdoc/generators/html/kilmer.rb b/lib/rdoc/generators/html/kilmer.rb new file mode 100644 index 0000000000..e4c5b115a6 --- /dev/null +++ b/lib/rdoc/generators/html/kilmer.rb @@ -0,0 +1,418 @@ +require 'rdoc/generators/html' + +module RDoc::Generators::HTML::KILMER + + FONTS = "Verdana, Arial, Helvetica, sans-serif" + + STYLE = <<-EOF +body,td,p { font-family: <%= values["fonts"] %>; + color: #000040; +} + +.attr-rw { font-size: xx-small; color: #444488 } + +.title-row { background-color: #CCCCFF; + color: #000010; +} + +.big-title-font { + color: black; + font-weight: bold; + font-family: <%= values["fonts"] %>; + font-size: large; + height: 60px; + padding: 10px 3px 10px 3px; +} + +.small-title-font { color: black; + font-family: <%= values["fonts"] %>; + font-size:10; } + +.aqua { color: black } + +.method-name, .attr-name { + font-family: font-family: <%= values["fonts"] %>; + font-weight: bold; + font-size: small; + margin-left: 20px; + color: #000033; +} + +.tablesubtitle, .tablesubsubtitle { + width: 100%; + margin-top: 1ex; + margin-bottom: .5ex; + padding: 5px 0px 5px 3px; + font-size: large; + color: black; + background-color: #CCCCFF; + border: thin; +} + +.name-list { + margin-left: 5px; + margin-bottom: 2ex; + line-height: 105%; +} + +.description { + margin-left: 5px; + margin-bottom: 2ex; + line-height: 105%; + font-size: small; +} + +.methodtitle { + font-size: small; + font-weight: bold; + text-decoration: none; + color: #000033; + background-color: white; +} + +.srclink { + font-size: small; + font-weight: bold; + text-decoration: none; + color: #0000DD; + background-color: white; +} + +.paramsig { + font-size: small; +} + +.srcbut { float: right } + EOF + + BODY = <<-EOF + + <%= values["title"] %> + "> + " type="text/css" media="screen" /> + + + + +<%= template_include %> + +<% if values["diagram"] then %> +
+<%= values["diagram"] %> +
+<% end %> + +<% if values["description"] then %> +
<%= values["description"] %>
+<% end %> + +<% if values["requires"] then %> + + +
Required files

+
+<% values["requires"].each do |requires| %> +<%= href requires["aref"], requires["name"] %> +<% end # values["requires"] %> +<% end %> +
+ +<% if values["methods"] then %> + + +
Methods

+
+<% values["methods"].each do |methods| %> +<%= href methods["aref"], methods["name"] %>, +<% end # values["methods"] %> +
+<% end %> + + +<% values["sections"].each do |sections| %> +
+<% if sections["sectitle"] then %> +

"><%= sections["sectitle"] %>

+<% if sections["seccomment"] then %> +
+ <%= sections["seccomment"] %> +
+<% end %> +<% end %> + +<% if sections["attributes"] then %> + + +
Attributes

+ +<% sections["attributes"].each do |attributes| %> + +<% if attributes["rw"] then %> + +<% end %> +<% unless attributes["rw"] then %> + +<% end %> + + + +<% end # sections["attributes"] %> +
 [<%= attributes["rw"] %>] <%= attributes["name"] %><%= attributes["a_desc"] %>
+<% end %> + +<% if sections["classlist"] then %> + + +
Classes and Modules

+<%= sections["classlist"] %>
+<% end %> + + <%= template_include %> + +<% end # values["sections"] %> + + + + EOF + + FILE_PAGE = <<-EOF + + + + +
+ +
File
<%= values["short_name"] %>
+ + + + + + + + +
Path:<%= values["full_path"] %> +<% if values["cvsurl"] then %> +  (">CVS) +<% end %> +
Modified:<%= values["dtm_modified"] %>
+

+ EOF + + CLASS_PAGE = <<-EOF + + + + + +
+ <%= values["classmod"] %>
<%= values["full_name"] %> +
+ + + + + +<% if values["parent"] then %> + + + + +<% end %> +
In: +<% values["infiles"].each do |infiles| %> +<%= href infiles["full_path_url"], infiles["full_path"] %> +<% if infiles["cvsurl"] then %> + (">CVS) +<% end %> +<% end # values["infiles"] %> +
Parent: +<% if values["par_url"] then %> + " class="cyan"> +<% end %> +<%= values["parent"] %> +<% if values["par_url"] then %> + +<% end %> +
+

+ EOF + + METHOD_LIST = <<-EOF +<% if values["includes"] then %> +
Included modules

+
+<% values["includes"].each do |includes| %> + <%= href includes["aref"], includes["name"] %> +<% end # values["includes"] %> +
+<% end %> + +<% if values["method_list"] then %> +<% values["method_list"].each do |method_list| $stderr.puts({ :method_list => method_list }.inspect) %> +<% if values["methods"] then %> + + +
<%= values["type"] %> <%= values["category"] %> methods
+<% values["methods"].each do |methods| $stderr.puts({ :methods => methods }.inspect) %> + + +
+"> +<% if values["callseq"] then %> +<%= values["callseq"] %> +<% end %> +<% unless values["callseq"] then %> + <%= values["name"] %><%= values["params"] %> +<% end %> +<% if values["codeurl"] then %> +" target="source" class="srclink">src +<% end %> +
+<% if values["m_desc"] then %> +
+<%= values["m_desc"] %> +
+<% end %> +<% if values["aka"] then %> +
+This method is also aliased as +<% values["aka"].each do |aka| $stderr.puts({ :aka => aka }.inspect) %> +"><%= values["name"] %> +<% end # values["aka"] %> +
+<% end %> +<% if values["sourcecode"] then %> +
+<%= values["sourcecode"] %>
+
+<% end %> +<% end # values["methods"] %> +<% end %> +<% end # values["method_list"] %> +<% end %> + EOF + + SRC_PAGE = <<-EOF + +<%= values["title"] %> +"> + + + +
<%= values["code"] %>
+ + + EOF + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = <<-EOF + + +"> + + + + + +<% values["entries"].each do |entries| %> +"><%= entries["name"] %>
+<% end # values["entries"] %> + + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF + + + <%= values["title"] %> + "> + + + + + + + + +<% if values["inline_source"] then %> + " name="docwin"> +<% end %> +<% unless values["inline_source"] then %> + + " name="docwin"> + + +<% end %> + + <body bgcolor="white"> + Click <a href="html/index.html">here</a> for a non-frames + version of this page. + </body> + + + + + EOF + + # A blank page to use as a target + BLANK = %{ + +} + + def write_extra_pages + template = TemplatePage.new(BLANK) + File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } + end + +end + diff --git a/lib/rdoc/generators/html/one_page_html.rb b/lib/rdoc/generators/html/one_page_html.rb new file mode 100644 index 0000000000..dbac9e2f5a --- /dev/null +++ b/lib/rdoc/generators/html/one_page_html.rb @@ -0,0 +1,121 @@ +require 'rdoc/generators/html' + +module RDoc::Generators::HTML::ONE_PAGE_HTML + + CONTENTS_XML = <<-EOF +<% if defined? classes and classes["description"] then %> +<%= classes["description"] %> +<% end %> + +<% if defined? files and files["requires"] then %> +

Requires:

+
    +<% files["requires"].each do |requires| %> +<% if requires["aref"] then %> +
  • "><%= requires["name"] %>
  • +<% end %> +<% unless requires["aref"] then %> +
  • <%= requires["name"] %>
  • +<% end %> +<% end # files["requires"] %> +
+<% end %> + +<% if defined? classes and classes["includes"] then %> +

Includes

+
    +<% classes["includes"].each do |includes| %> +<% if includes["aref"] then %> +
  • "><%= includes["name"] %>
  • +<% end %> +<% unless includes["aref"] then %> +
  • <%= includes["name"] %>
  • +<% end %> +<% end # classes["includes"] %> +
+<% end %> + +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> +

Attributes

+ +<% sections["attributes"].each do |attributes| %> + +<% end # sections["attributes"] %> +
<%= attributes["name"] %><%= attributes["rw"] %><%= attributes["a_desc"] %>
+<% end %> + +<% if sections["method_list"] then %> +

Methods

+<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +<% method_list["methods"].each do |methods| %> +

<%= methods["type"] %> <%= methods["category"] %> method: +<% if methods["callseq"] then %> +"><%= methods["callseq"] %> +<% end %> +<% unless methods["callseq"] then %> +"><%= methods["name"] %><%= methods["params"] %>

+<% end %> + +<% if methods["m_desc"] then %> +<%= methods["m_desc"] %> +<% end %> + +<% if methods["sourcecode"] then %> +
+<%= methods["sourcecode"] %>
+
+<% end %> +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> +<% end %> +<% end # classes["sections"] %> +<% end %> + EOF + + ONE_PAGE = %{ + + + + <%= values["title"] %> + " /> + + +<% values["files"].each do |files| %> +

File: <%= files["short_name"] %>

+ + + +
Path:<%= files["full_path"] %>
Modified:<%= files["dtm_modified"] %>
+} + CONTENTS_XML + %{ +<% end # values["files"] %> + +<% if values["classes"] then %> +

Classes

+<% values["classes"].each do |classes| %> +<% if classes["parent"] then %> +

<%= classes["classmod"] %> <%= classes["full_name"] %> < <%= href classes["par_url"], classes["parent"] %>

+<% end %> +<% unless classes["parent"] then %> +

<%= classes["classmod"] %> <%= classes["full_name"] %>

+<% end %> + +<% if classes["infiles"] then %> +(in files +<% classes["infiles"].each do |infiles| %> +<%= href infiles["full_path_url"], infiles["full_path"] %> +<% end # classes["infiles"] %> +) +<% end %> +} + CONTENTS_XML + %{ +<% end # values["classes"] %> +<% end %> + + +} + +end + diff --git a/lib/rdoc/generators/html_generator.rb b/lib/rdoc/generators/html_generator.rb deleted file mode 100644 index a887bd84dc..0000000000 --- a/lib/rdoc/generators/html_generator.rb +++ /dev/null @@ -1,1527 +0,0 @@ -require 'fileutils' - -require 'rdoc/generators' -require 'rdoc/markup/simple_markup/to_html' - -module RDoc::Generators - - ## - # Name of sub-direcory that holds file descriptions - - FILE_DIR = "files" - - ## - # Name of sub-direcory that holds class descriptions - - CLASS_DIR = "classes" - - ## - # Name of the RDoc CSS file - - CSS_NAME = "rdoc-style.css" - - ## - # Build a hash of all items that can be cross-referenced. - # This is used when we output required and included names: - # if the names appear in this hash, we can generate - # an html cross reference to the appropriate description. - # We also use this when parsing comment blocks: any decorated - # words matching an entry in this list are hyperlinked. - - class AllReferences - @@refs = {} - - def AllReferences::reset - @@refs = {} - end - - def AllReferences.add(name, html_class) - @@refs[name] = html_class - end - - def AllReferences.[](name) - @@refs[name] - end - - def AllReferences.keys - @@refs.keys - end - end - - ## - # Subclass of the SM::ToHtml class that supports looking - # up words in the AllReferences list. Those that are - # found (like AllReferences in this comment) will - # be hyperlinked - - class HyperlinkHtml < SM::ToHtml - - ## - # We need to record the html path of our caller so we can generate - # correct relative paths for any hyperlinks that we find - def initialize(from_path, context, options) - super() - - @from_path = from_path - - @parent_name = context.parent_name - @parent_name += "::" if @parent_name - @context = context - - @options = options - end - - ## - # We're invoked when any text matches the CROSSREF pattern - # (defined in MarkUp). If we fine the corresponding reference, - # generate a hyperlink. If the name we're looking for contains - # no punctuation, we look for it up the module/class chain. For - # example, HyperlinkHtml is found, even without the Generators:: - # prefix, because we look for it in module Generators first. - - def handle_special_CROSSREF(special) - name = special.text - if name[0,1] == '#' - lookup = name[1..-1] - name = lookup unless @options.show_hash - else - lookup = name - end - - # Find class, module, or method in class or module. - if /([A-Z]\w*)[.\#](\w+[!?=]?)/ =~ lookup - container = $1 - method = $2 - ref = @context.find_symbol(container, method) - elsif /([A-Za-z]\w*)[.\#](\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?)/ =~ lookup - container = $1 - method = $2 - ref = @context.find_symbol(container, method) - else - ref = @context.find_symbol(lookup) - end - - if ref and ref.document_self - "#{name}" - else - name - end - end - - ## - # Generate a hyperlink for url, labeled with text. Handle the - # special cases for img: and link: described under handle_special_HYPEDLINK - - def gen_url(url, text) - if url =~ /([A-Za-z]+):(.*)/ - type = $1 - path = $2 - else - type = "http" - path = url - url = "http://#{url}" - end - - if type == "link" - if path[0,1] == '#' # is this meaningful? - url = path - else - url = HTMLGenerator.gen_url(@from_path, path) - end - end - - if (type == "http" || type == "link") && - url =~ /\.(gif|png|jpg|jpeg|bmp)$/ - - "" - else - "#{text.sub(%r{^#{type}:/*}, '')}" - end - end - - ## - # And we're invoked with a potential external hyperlink mailto: - # just gets inserted. http: links are checked to see if they - # reference an image. If so, that image gets inserted using an - # tag. Otherwise a conventional is used. We also - # support a special type of hyperlink, link:, which is a reference - # to a local file whose path is relative to the --op directory. - - def handle_special_HYPERLINK(special) - url = special.text - gen_url(url, url) - end - - ## - # Here's a hypedlink where the label is different to the URL - #

/, '') - res.sub!(/<\/p>$/, '') - end - res - end - - ## - # Qualify a stylesheet URL; if if +css_name+ does not begin with '/' or - # 'http[s]://', prepend a prefix relative to +path+. Otherwise, return it - # unmodified. - - def style_url(path, css_name=nil) -# $stderr.puts "style_url( #{path.inspect}, #{css_name.inspect} )" - css_name ||= CSS_NAME - if %r{^(https?:/)?/} =~ css_name - return css_name - else - return HTMLGenerator.gen_url(path, css_name) - end - end - - ## - # Build a webcvs URL with the given 'url' argument. URLs with a '%s' in them - # get the file's path sprintfed into them; otherwise they're just catenated - # together. - - def cvs_url(url, full_path) - if /%s/ =~ url - return sprintf( url, full_path ) - else - return url + full_path - end - end - - end - - ## - # A Context is built by the parser to represent a container: contexts - # hold classes, modules, methods, require lists and include lists. - # ClassModule and TopLevel are the context objects we process here - - class ContextUser - - include MarkUp - - attr_reader :context - - def initialize(context, options) - @context = context - @options = options - end - - ## - # convenience method to build a hyperlink - - def href(link, cls, name) - %{#{name}} #" - end - - ## - # Returns a reference to outselves to be used as an href= the form depends - # on whether we're all in one file or in multiple files - - def as_href(from_path) - if @options.all_one_file - "#" + path - else - HTMLGenerator.gen_url(from_path, path) - end - end - - ## - # Create a list of HtmlMethod objects for each method in the corresponding - # context object. If the @options.show_all variable is set (corresponding - # to the --all option, we include all methods, otherwise just the - # public ones. - - def collect_methods - list = @context.method_list - unless @options.show_all - list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation } - end - @methods = list.collect {|m| HtmlMethod.new(m, self, @options) } - end - - ## - # Build a summary list of all the methods in this context - - def build_method_summary_list(path_prefix="") - collect_methods unless @methods - meths = @methods.sort - res = [] - meths.each do |meth| - res << { - "name" => CGI.escapeHTML(meth.name), - "aref" => "#{path_prefix}\##{meth.aref}" - } - end - res - end - - ## - # Build a list of aliases for which we couldn't find a - # corresponding method - - def build_alias_summary_list(section) - values = [] - @context.aliases.each do |al| - next unless al.section == section - res = { - 'old_name' => al.old_name, - 'new_name' => al.new_name, - } - if al.comment && !al.comment.empty? - res['desc'] = markup(al.comment, true) - end - values << res - end - values - end - - ## - # Build a list of constants - - def build_constants_summary_list(section) - values = [] - @context.constants.each do |co| - next unless co.section == section - res = { - 'name' => co.name, - 'value' => CGI.escapeHTML(co.value) - } - res['desc'] = markup(co.comment, true) if co.comment && !co.comment.empty? - values << res - end - values - end - - def build_requires_list(context) - potentially_referenced_list(context.requires) {|fn| [fn + ".rb"] } - end - - def build_include_list(context) - potentially_referenced_list(context.includes) - end - - ## - # Build a list from an array of Htmlxxx items. Look up each - # in the AllReferences hash: if we find a corresponding entry, - # we generate a hyperlink to it, otherwise just output the name. - # However, some names potentially need massaging. For example, - # you may require a Ruby file without the .rb extension, - # but the file names we know about may have it. To deal with - # this, we pass in a block which performs the massaging, - # returning an array of alternative names to match - - def potentially_referenced_list(array) - res = [] - array.each do |i| - ref = AllReferences[i.name] -# if !ref -# container = @context.parent -# while !ref && container -# name = container.name + "::" + i.name -# ref = AllReferences[name] -# container = container.parent -# end -# end - - ref = @context.find_symbol(i.name) - ref = ref.viewer if ref - - if !ref && block_given? - possibles = yield(i.name) - while !ref and !possibles.empty? - ref = AllReferences[possibles.shift] - end - end - h_name = CGI.escapeHTML(i.name) - if ref and ref.document_self - path = url(ref.path) - res << { "name" => h_name, "aref" => path } - else - res << { "name" => h_name } - end - end - res - end - - ## - # Build an array of arrays of method details. The outer array has up - # to six entries, public, private, and protected for both class - # methods, the other for instance methods. The inner arrays contain - # a hash for each method - - def build_method_detail_list(section) - outer = [] - - methods = @methods.sort - for singleton in [true, false] - for vis in [ :public, :protected, :private ] - res = [] - methods.each do |m| - if m.section == section and - m.document_self and - m.visibility == vis and - m.singleton == singleton - row = {} - if m.call_seq - row["callseq"] = m.call_seq.gsub(/->/, '→') - else - row["name"] = CGI.escapeHTML(m.name) - row["params"] = m.params - end - desc = m.description.strip - row["m_desc"] = desc unless desc.empty? - row["aref"] = m.aref - row["visibility"] = m.visibility.to_s - - alias_names = [] - m.aliases.each do |other| - if other.viewer # won't be if the alias is private - alias_names << { - 'name' => other.name, - 'aref' => other.viewer.as_href(path) - } - end - end - unless alias_names.empty? - row["aka"] = alias_names - end - - if @options.inline_source - code = m.source_code - row["sourcecode"] = code if code - else - code = m.src_url - if code - row["codeurl"] = code - row["imgurl"] = m.img_url - end - end - res << row - end - end - if res.size > 0 - outer << { - "type" => vis.to_s.capitalize, - "category" => singleton ? "Class" : "Instance", - "methods" => res - } - end - end - end - outer - end - - ## - # Build the structured list of classes and modules contained - # in this context. - - def build_class_list(level, from, section, infile=nil) - res = "" - prefix = "  ::" * level; - - from.modules.sort.each do |mod| - next unless mod.section == section - next if infile && !mod.defined_in?(infile) - if mod.document_self - res << - prefix << - "Module " << - href(url(mod.viewer.path), "link", mod.full_name) << - "
\n" << - build_class_list(level + 1, mod, section, infile) - end - end - - from.classes.sort.each do |cls| - next unless cls.section == section - next if infile && !cls.defined_in?(infile) - if cls.document_self - res << - prefix << - "Class " << - href(url(cls.viewer.path), "link", cls.full_name) << - "
\n" << - build_class_list(level + 1, cls, section, infile) - end - end - - res - end - - def url(target) - HTMLGenerator.gen_url(path, target) - end - - def aref_to(target) - if @options.all_one_file - "#" + target - else - url(target) - end - end - - def document_self - @context.document_self - end - - def diagram_reference(diagram) - res = diagram.gsub(/((?:src|href)=")(.*?)"/) { - $1 + url($2) + '"' - } - res - end - - ## - # Find a symbol in ourselves or our parent - - def find_symbol(symbol, method=nil) - res = @context.find_symbol(symbol, method) - if res - res = res.viewer - end - res - end - - ## - # create table of contents if we contain sections - - def add_table_of_sections - toc = [] - @context.sections.each do |section| - if section.title - toc << { - 'secname' => section.title, - 'href' => section.sequence - } - end - end - - @values['toc'] = toc unless toc.empty? - end - - end - - ## - # Wrap a ClassModule context - - class HtmlClass < ContextUser - - attr_reader :path - - def initialize(context, html_file, prefix, options) - super(context, options) - - @html_file = html_file - @is_module = context.is_module? - @values = {} - - context.viewer = self - - if options.all_one_file - @path = context.full_name - else - @path = http_url(context.full_name, prefix) - end - - collect_methods - - AllReferences.add(name, self) - end - - ## - # Returns the relative file name to store this class in, which is also its - # url - - def http_url(full_name, prefix) - path = full_name.dup - if path['<<'] - path.gsub!(/<<\s*(\w*)/) { "from-#$1" } - end - File.join(prefix, path.split("::")) + ".html" - end - - def name - @context.full_name - end - - def parent_name - @context.parent.full_name - end - - def index_name - name - end - - def write_on(f) - value_hash - template = RDoc::TemplatePage.new(RDoc::Page::BODY, - RDoc::Page::CLASS_PAGE, - RDoc::Page::METHOD_LIST) - template.write_html_on(f, @values) - end - - def value_hash - class_attribute_values - add_table_of_sections - - @values["charset"] = @options.charset - @values["style_url"] = style_url(path, @options.css) - - d = markup(@context.comment) - @values["description"] = d unless d.empty? - - ml = build_method_summary_list @path - @values["methods"] = ml unless ml.empty? - - il = build_include_list(@context) - @values["includes"] = il unless il.empty? - - @values["sections"] = @context.sections.map do |section| - - secdata = { - "sectitle" => section.title, - "secsequence" => section.sequence, - "seccomment" => markup(section.comment) - } - - al = build_alias_summary_list(section) - secdata["aliases"] = al unless al.empty? - - co = build_constants_summary_list(section) - secdata["constants"] = co unless co.empty? - - al = build_attribute_list(section) - secdata["attributes"] = al unless al.empty? - - cl = build_class_list(0, @context, section) - secdata["classlist"] = cl unless cl.empty? - - mdl = build_method_detail_list(section) - secdata["method_list"] = mdl unless mdl.empty? - - secdata - end - - @values - end - - def build_attribute_list(section) - atts = @context.attributes.sort - res = [] - atts.each do |att| - next unless att.section == section - if att.visibility == :public || att.visibility == :protected || @options.show_all - entry = { - "name" => CGI.escapeHTML(att.name), - "rw" => att.rw, - "a_desc" => markup(att.comment, true) - } - unless att.visibility == :public || att.visibility == :protected - entry["rw"] << "-" - end - res << entry - end - end - res - end - - def class_attribute_values - h_name = CGI.escapeHTML(name) - - @values["path"] = @path - @values["classmod"] = @is_module ? "Module" : "Class" - @values["title"] = "#{@values['classmod']}: #{h_name}" - - c = @context - c = c.parent while c and !c.diagram - if c && c.diagram - @values["diagram"] = diagram_reference(c.diagram) - end - - @values["full_name"] = h_name - - parent_class = @context.superclass - - if parent_class - @values["parent"] = CGI.escapeHTML(parent_class) - - if parent_name - lookup = parent_name + "::" + parent_class - else - lookup = parent_class - end - - parent_url = AllReferences[lookup] || AllReferences[parent_class] - - if parent_url and parent_url.document_self - @values["par_url"] = aref_to(parent_url.path) - end - end - - files = [] - @context.in_files.each do |f| - res = {} - full_path = CGI.escapeHTML(f.file_absolute_name) - - res["full_path"] = full_path - res["full_path_url"] = aref_to(f.viewer.path) if f.document_self - - if @options.webcvs - res["cvsurl"] = cvs_url( @options.webcvs, full_path ) - end - - files << res - end - - @values['infiles'] = files - end - - def <=>(other) - self.name <=> other.name - end - - end - - ## - # Handles the mapping of a file's information to HTML. In reality, - # a file corresponds to a +TopLevel+ object, containing modules, - # classes, and top-level methods. In theory it _could_ contain - # attributes and aliases, but we ignore these for now. - - class HtmlFile < ContextUser - - attr_reader :path - attr_reader :name - - def initialize(context, options, file_dir) - super(context, options) - - @values = {} - - if options.all_one_file - @path = filename_to_label - else - @path = http_url(file_dir) - end - - @name = @context.file_relative_name - - collect_methods - AllReferences.add(name, self) - context.viewer = self - end - - def http_url(file_dir) - File.join(file_dir, @context.file_relative_name.tr('.', '_')) + - ".html" - end - - def filename_to_label - @context.file_relative_name.gsub(/%|\/|\?|\#/) do |s| - '%%%x' % s[0].unpack('C') - end - end - - def index_name - name - end - - def parent_name - nil - end - - def value_hash - file_attribute_values - add_table_of_sections - - @values["charset"] = @options.charset - @values["href"] = path - @values["style_url"] = style_url(path, @options.css) - - if @context.comment - d = markup(@context.comment) - @values["description"] = d if d.size > 0 - end - - ml = build_method_summary_list - @values["methods"] = ml unless ml.empty? - - il = build_include_list(@context) - @values["includes"] = il unless il.empty? - - rl = build_requires_list(@context) - @values["requires"] = rl unless rl.empty? - - if @options.promiscuous - file_context = nil - else - file_context = @context - end - - - @values["sections"] = @context.sections.map do |section| - - secdata = { - "sectitle" => section.title, - "secsequence" => section.sequence, - "seccomment" => markup(section.comment) - } - - cl = build_class_list(0, @context, section, file_context) - @values["classlist"] = cl unless cl.empty? - - mdl = build_method_detail_list(section) - secdata["method_list"] = mdl unless mdl.empty? - - al = build_alias_summary_list(section) - secdata["aliases"] = al unless al.empty? - - co = build_constants_summary_list(section) - @values["constants"] = co unless co.empty? - - secdata - end - - @values - end - - def write_on(f) - value_hash - template = RDoc::TemplatePage.new(RDoc::Page::BODY, - RDoc::Page::FILE_PAGE, - RDoc::Page::METHOD_LIST) - template.write_html_on(f, @values) - end - - def file_attribute_values - full_path = @context.file_absolute_name - short_name = File.basename(full_path) - - @values["title"] = CGI.escapeHTML("File: #{short_name}") - - if @context.diagram - @values["diagram"] = diagram_reference(@context.diagram) - end - - @values["short_name"] = CGI.escapeHTML(short_name) - @values["full_path"] = CGI.escapeHTML(full_path) - @values["dtm_modified"] = @context.file_stat.mtime.to_s - - if @options.webcvs - @values["cvsurl"] = cvs_url( @options.webcvs, @values["full_path"] ) - end - end - - def <=>(other) - self.name <=> other.name - end - - end - - class HtmlMethod - - include MarkUp - - attr_reader :context - attr_reader :src_url - attr_reader :img_url - attr_reader :source_code - - @@seq = "M000000" - - @@all_methods = [] - - def self.reset - @@all_methods = [] - end - - def initialize(context, html_class, options) - @context = context - @html_class = html_class - @options = options - @@seq = @@seq.succ - @seq = @@seq - @@all_methods << self - - context.viewer = self - - if (ts = @context.token_stream) - @source_code = markup_code(ts) - unless @options.inline_source - @src_url = create_source_code_file(@source_code) - @img_url = HTMLGenerator.gen_url(path, 'source.png') - end - end - - AllReferences.add(name, self) - end - - ## - # Returns a reference to outselves to be used as an href= the form depends - # on whether we're all in one file or in multiple files - - def as_href(from_path) - if @options.all_one_file - "#" + path - else - HTMLGenerator.gen_url(from_path, path) - end - end - - def name - @context.name - end - - def section - @context.section - end - - def index_name - "#{@context.name} (#{@html_class.name})" - end - - def parent_name - if @context.parent.parent - @context.parent.parent.full_name - else - nil - end - end - - def aref - @seq - end - - def path - if @options.all_one_file - aref - else - @html_class.path + "#" + aref - end - end - - def description - markup(@context.comment) - end - - def visibility - @context.visibility - end - - def singleton - @context.singleton - end - - def call_seq - cs = @context.call_seq - if cs - cs.gsub(/\n/, "
\n") - else - nil - end - end - - def params - # params coming from a call-seq in 'C' will start with the - # method name - p = @context.params - if p !~ /^\w/ - p = @context.params.gsub(/\s*\#.*/, '') - p = p.tr("\n", " ").squeeze(" ") - p = "(" + p + ")" unless p[0] == ?( - - if (block = @context.block_params) - # If this method has explicit block parameters, remove any - # explicit &block - - p.sub!(/,?\s*&\w+/, '') - - block.gsub!(/\s*\#.*/, '') - block = block.tr("\n", " ").squeeze(" ") - if block[0] == ?( - block.sub!(/^\(/, '').sub!(/\)/, '') - end - p << " {|#{block.strip}| ...}" - end - end - CGI.escapeHTML(p) - end - - def create_source_code_file(code_body) - meth_path = @html_class.path.sub(/\.html$/, '.src') - FileUtils.mkdir_p(meth_path) - file_path = File.join(meth_path, @seq) + ".html" - - template = RDoc::TemplatePage.new(RDoc::Page::SRC_PAGE) - File.open(file_path, "w") do |f| - values = { - 'title' => CGI.escapeHTML(index_name), - 'code' => code_body, - 'style_url' => style_url(file_path, @options.css), - 'charset' => @options.charset - } - template.write_html_on(f, values) - end - HTMLGenerator.gen_url(path, file_path) - end - - def self.all_methods - @@all_methods - end - - def <=>(other) - @context <=> other.context - end - - ## - # Given a sequence of source tokens, mark up the source code - # to make it look purty. - - def markup_code(tokens) - src = "" - tokens.each do |t| - next unless t - # p t.class -# style = STYLE_MAP[t.class] - style = case t - when RubyToken::TkCONSTANT then "ruby-constant" - when RubyToken::TkKW then "ruby-keyword kw" - when RubyToken::TkIVAR then "ruby-ivar" - when RubyToken::TkOp then "ruby-operator" - when RubyToken::TkId then "ruby-identifier" - when RubyToken::TkNode then "ruby-node" - when RubyToken::TkCOMMENT then "ruby-comment cmt" - when RubyToken::TkREGEXP then "ruby-regexp re" - when RubyToken::TkSTRING then "ruby-value str" - when RubyToken::TkVal then "ruby-value" - else - nil - end - - text = CGI.escapeHTML(t.text) - - if style - src << "#{text}" - else - src << text - end - end - - add_line_numbers(src) if @options.include_line_numbers - src - end - - ## - # We rely on the fact that the first line of a source code listing has - # # File xxxxx, line dddd - - def add_line_numbers(src) - if src =~ /\A.*, line (\d+)/ - first = $1.to_i - 1 - last = first + src.count("\n") - size = last.to_s.length - real_fmt = "%#{size}d: " - fmt = " " * (size+2) - src.gsub!(/^/) do - res = sprintf(fmt, first) - first += 1 - fmt = real_fmt - res - end - end - end - - def document_self - @context.document_self - end - - def aliases - @context.aliases - end - - def find_symbol(symbol, method=nil) - res = @context.parent.find_symbol(symbol, method) - if res - res = res.viewer - end - res - end - - end - - ## - # We're responsible for generating all the HTML files - # from the object tree defined in code_objects.rb. We - # generate: - # - # [files] an html file for each input file given. These - # input files appear as objects of class - # TopLevel - # - # [classes] an html file for each class or module encountered. - # These classes are not grouped by file: if a file - # contains four classes, we'll generate an html - # file for the file itself, and four html files - # for the individual classes. - # - # [indices] we generate three indices for files, classes, - # and methods. These are displayed in a browser - # like window with three index panes across the - # top and the selected description below - # - # Method descriptions appear in whatever entity (file, class, - # or module) that contains them. - # - # We generate files in a structure below a specified subdirectory, - # normally +doc+. - # - # opdir - # | - # |___ files - # | |__ per file summaries - # | - # |___ classes - # |__ per class/module descriptions - # - # HTML is generated using the Template class. - - class HTMLGenerator - - include MarkUp - - ## - # Converts a target url to one that is relative to a given path - - def self.gen_url(path, target) - from = File.dirname(path) - to, to_file = File.split(target) - - from = from.split("/") - to = to.split("/") - - while from.size > 0 and to.size > 0 and from[0] == to[0] - from.shift - to.shift - end - - from.fill("..") - from.concat(to) - from << to_file - File.join(*from) - end - - ## - # Generators may need to return specific subclasses depending on the - # options they are passed. Because of this we create them using a factory - - def self.for(options) - AllReferences.reset - HtmlMethod.reset - - if options.all_one_file - HTMLGeneratorInOne.new(options) - else - HTMLGenerator.new(options) - end - end - - class < RDoc::Page::FONTS } - template.write_html_on(f, values) - end - end - end - - ## - # See the comments at the top for a description of the directory structure - - def gen_sub_directories - FileUtils.mkdir_p(FILE_DIR) - FileUtils.mkdir_p(CLASS_DIR) - rescue - $stderr.puts $!.message - exit 1 - end - - ## - # Generate: - # - # * a list of HtmlFile objects for each TopLevel object. - # * a list of HtmlClass objects for each first level - # class or module in the TopLevel objects - # * a complete list of all hyperlinkable terms (file, - # class, module, and method names) - - def build_indices - @toplevels.each do |toplevel| - @files << HtmlFile.new(toplevel, @options, FILE_DIR) - end - - RDoc::TopLevel.all_classes_and_modules.each do |cls| - build_class_list(cls, @files[0], CLASS_DIR) - end - end - - def build_class_list(from, html_file, class_dir) - @classes << HtmlClass.new(from, html_file, class_dir, @options) - from.each_classmodule do |mod| - build_class_list(mod, html_file, class_dir) - end - end - - ## - # Generate all the HTML - - def generate_html - # the individual descriptions for files and classes - gen_into(@files) - gen_into(@classes) - # and the index files - gen_file_index - gen_class_index - gen_method_index - gen_main_index - - # this method is defined in the template file - write_extra_pages if defined? write_extra_pages - end - - def gen_into(list) - list.each do |item| - if item.document_self - op_file = item.path - FileUtils.mkdir_p(File.dirname(op_file)) - File.open(op_file, "w") { |file| item.write_on(file) } - end - end - - end - - def gen_file_index - gen_an_index(@files, 'Files', - RDoc::Page::FILE_INDEX, - "fr_file_index.html") - end - - def gen_class_index - gen_an_index(@classes, 'Classes', - RDoc::Page::CLASS_INDEX, - "fr_class_index.html") - end - - def gen_method_index - gen_an_index(HtmlMethod.all_methods, 'Methods', - RDoc::Page::METHOD_INDEX, - "fr_method_index.html") - end - - def gen_an_index(collection, title, template, filename) - template = RDoc::TemplatePage.new(RDoc::Page::FR_INDEX_BODY, template) - res = [] - collection.sort.each do |f| - if f.document_self - res << { "href" => f.path, "name" => f.index_name } - end - end - - values = { - "entries" => res, - 'list_title' => CGI.escapeHTML(title), - 'index_url' => main_url, - 'charset' => @options.charset, - 'style_url' => style_url('', @options.css), - } - - File.open(filename, "w") do |f| - template.write_html_on(f, values) - end - end - - ## - # The main index page is mostly a template frameset, but includes the - # initial page. If the --main option was given, we use this as - # our main page, otherwise we use the first file specified on the command - # line. - - def gen_main_index - template = RDoc::TemplatePage.new RDoc::Page::INDEX - - open 'index.html', 'w' do |f| - classes = @classes.sort.map { |klass| klass.value_hash } - - values = { - 'main_page' => @main_page, - 'initial_page' => main_url, - 'style_url' => style_url('', @options.css), - 'title' => CGI.escapeHTML(@options.title), - 'charset' => @options.charset, - 'classes' => classes, - } - - values['inline_source'] = @options.inline_source - - template.write_html_on f, values - end - end - - ## - # Returns the url of the main page - - def main_url - @main_page = @options.main_page - @main_page_ref = nil - if @main_page - @main_page_ref = AllReferences[@main_page] - if @main_page_ref then - @main_page_path = @main_page_ref.path - else - $stderr.puts "Could not find main page #{@main_page}" - end - end - - unless @main_page_path then - file = @files.find { |file| file.document_self } - @main_page_path = file.path if file - end - - unless @main_page_path then - $stderr.puts "Couldn't find anything to document" - $stderr.puts "Perhaps you've used :stopdoc: in all classes" - exit 1 - end - - @main_page_path - end - - end - - class HTMLGeneratorInOne < HTMLGenerator - - def initialize(*args) - super - end - - ## - # Build the initial indices and output objects - # based on an array of TopLevel objects containing - # the extracted information. - - def generate(info) - @toplevels = info - @files = [] - @classes = [] - @hyperlinks = {} - - build_indices - generate_xml - end - - ## - # Generate: - # - # * a list of HtmlFile objects for each TopLevel object. - # * a list of HtmlClass objects for each first level - # class or module in the TopLevel objects - # * a complete list of all hyperlinkable terms (file, - # class, module, and method names) - - def build_indices - - @toplevels.each do |toplevel| - @files << HtmlFile.new(toplevel, @options, FILE_DIR) - end - - RDoc::TopLevel.all_classes_and_modules.each do |cls| - build_class_list(cls, @files[0], CLASS_DIR) - end - end - - def build_class_list(from, html_file, class_dir) - @classes << HtmlClass.new(from, html_file, class_dir, @options) - from.each_classmodule do |mod| - build_class_list(mod, html_file, class_dir) - end - end - - ## - # Generate all the HTML. For the one-file case, we generate - # all the information in to one big hash - - def generate_xml - values = { - 'charset' => @options.charset, - 'files' => gen_into(@files), - 'classes' => gen_into(@classes), - 'title' => CGI.escapeHTML(@options.title), - } - - # this method is defined in the template file - write_extra_pages if defined? write_extra_pages - - template = RDoc::TemplatePage.new(RDoc::Page::ONE_PAGE) - - if @options.op_name - opfile = File.open(@options.op_name, "w") - else - opfile = $stdout - end - template.write_html_on(opfile, values) - end - - def gen_into(list) - res = [] - list.each do |item| - res << item.value_hash - end - res - end - - def gen_file_index - gen_an_index(@files, 'Files') - end - - def gen_class_index - gen_an_index(@classes, 'Classes') - end - - def gen_method_index - gen_an_index(HtmlMethod.all_methods, 'Methods') - end - - def gen_an_index(collection, title) - res = [] - collection.sort.each do |f| - if f.document_self - res << { "href" => f.path, "name" => f.index_name } - end - end - - return { - "entries" => res, - 'list_title' => title, - 'index_url' => main_url, - } - end - - end - -end - diff --git a/lib/rdoc/generators/ri.rb b/lib/rdoc/generators/ri.rb new file mode 100644 index 0000000000..a8cacc7501 --- /dev/null +++ b/lib/rdoc/generators/ri.rb @@ -0,0 +1,228 @@ +require 'rdoc/generators' +require 'rdoc/markup/simple_markup/to_flow' + +require 'rdoc/ri/cache' +require 'rdoc/ri/reader' +require 'rdoc/ri/writer' +require 'rdoc/ri/descriptions' + +class RDoc::Generators::RI + + ## + # Generators may need to return specific subclasses depending on the + # options they are passed. Because of this we create them using a factory + + def self.for(options) + new(options) + end + + class << self + protected :new + end + + ## + # Set up a new RDoc::Generators::RI. + + def initialize(options) #:not-new: + @options = options + @ri_writer = RDoc::RI::Writer.new "." + @markup = SM::SimpleMarkup.new + @to_flow = SM::ToFlow.new + + @generated = {} + end + + ## + # Build the initial indices and output objects based on an array of + # TopLevel objects containing the extracted information. + + def generate(toplevels) + RDoc::TopLevel.all_classes_and_modules.each do |cls| + process_class(cls) + end + end + + def process_class(from_class) + generate_class_info(from_class) + + # now recure into this classes constituent classess + from_class.each_classmodule do |mod| + process_class(mod) + end + end + + def generate_class_info(cls) + if cls === RDoc::NormalModule + cls_desc = RDoc::RI::ModuleDescription.new + else + cls_desc = RDoc::RI::ClassDescription.new + cls_desc.superclass = cls.superclass + end + cls_desc.name = cls.name + cls_desc.full_name = cls.full_name + cls_desc.comment = markup(cls.comment) + + cls_desc.attributes = cls.attributes.sort.map do |a| + RDoc::RI::Attribute.new(a.name, a.rw, markup(a.comment)) + end + + cls_desc.constants = cls.constants.map do |c| + RDoc::RI::Constant.new(c.name, c.value, markup(c.comment)) + end + + cls_desc.includes = cls.includes.map do |i| + RDoc::RI::IncludedModule.new(i.name) + end + + class_methods, instance_methods = method_list(cls) + + cls_desc.class_methods = class_methods.map do |m| + RDoc::RI::MethodSummary.new(m.name) + end + + cls_desc.instance_methods = instance_methods.map do |m| + RDoc::RI::MethodSummary.new(m.name) + end + + update_or_replace(cls_desc) + + class_methods.each do |m| + generate_method_info(cls_desc, m) + end + + instance_methods.each do |m| + generate_method_info(cls_desc, m) + end + end + + def generate_method_info(cls_desc, method) + meth_desc = RDoc::RI::MethodDescription.new + meth_desc.name = method.name + meth_desc.full_name = cls_desc.full_name + if method.singleton + meth_desc.full_name += "::" + else + meth_desc.full_name += "#" + end + meth_desc.full_name << method.name + + meth_desc.comment = markup(method.comment) + meth_desc.params = params_of(method) + meth_desc.visibility = method.visibility.to_s + meth_desc.is_singleton = method.singleton + meth_desc.block_params = method.block_params + + meth_desc.aliases = method.aliases.map do |a| + RDoc::RI::AliasName.new(a.name) + end + + @ri_writer.add_method(cls_desc, meth_desc) + end + + private + + ## + # Returns a list of class and instance methods that we'll be documenting + + def method_list(cls) + list = cls.method_list + unless @options.show_all + list = list.find_all do |m| + m.visibility == :public || m.visibility == :protected || m.force_documentation + end + end + + c = [] + i = [] + list.sort.each do |m| + if m.singleton + c << m + else + i << m + end + end + return c,i + end + + def params_of(method) + if method.call_seq + method.call_seq + else + params = method.params || "" + + p = params.gsub(/\s*\#.*/, '') + p = p.tr("\n", " ").squeeze(" ") + p = "(" + p + ")" unless p[0] == ?( + + if (block = method.block_params) + block.gsub!(/\s*\#.*/, '') + block = block.tr("\n", " ").squeeze(" ") + if block[0] == ?( + block.sub!(/^\(/, '').sub!(/\)/, '') + end + p << " {|#{block.strip}| ...}" + end + p + end + end + + def markup(comment) + return nil if !comment || comment.empty? + + # Convert leading comment markers to spaces, but only + # if all non-blank lines have them + + if comment =~ /^(?>\s*)[^\#]/ + content = comment + else + content = comment.gsub(/^\s*(#+)/) { $1.tr('#',' ') } + end + @markup.convert(content, @to_flow) + end + + ## + # By default we replace existing classes with the same name. If the + # --merge option was given, we instead merge this definition into an + # existing class. We add our methods, aliases, etc to that class, but do + # not change the class's description. + + def update_or_replace(cls_desc) + old_cls = nil + + if @options.merge + rdr = RDoc::RI::Reader.new RDoc::RI::Cache.new(@options.op_dir) + + namespace = rdr.top_level_namespace + namespace = rdr.lookup_namespace_in(cls_desc.name, namespace) + if namespace.empty? + $stderr.puts "You asked me to merge this source into existing " + $stderr.puts "documentation. This file references a class or " + $stderr.puts "module called #{cls_desc.name} which I don't" + $stderr.puts "have existing documentation for." + $stderr.puts + $stderr.puts "Perhaps you need to generate its documentation first" + exit 1 + else + old_cls = namespace[0] + end + end + + prev_cls = @generated[cls_desc.full_name] + + if old_cls and not prev_cls then + old_desc = rdr.get_class old_cls + cls_desc.merge_in old_desc + end + + if prev_cls then + cls_desc.merge_in prev_cls + end + + @generated[cls_desc.full_name] = cls_desc + + @ri_writer.remove_class cls_desc + @ri_writer.add_class cls_desc + end + +end + diff --git a/lib/rdoc/generators/ri_generator.rb b/lib/rdoc/generators/ri_generator.rb deleted file mode 100644 index 111a232856..0000000000 --- a/lib/rdoc/generators/ri_generator.rb +++ /dev/null @@ -1,228 +0,0 @@ -require 'rdoc/generators' -require 'rdoc/markup/simple_markup/to_flow' - -require 'rdoc/ri/cache' -require 'rdoc/ri/reader' -require 'rdoc/ri/writer' -require 'rdoc/ri/descriptions' - -class RDoc::Generators::RIGenerator - - ## - # Generators may need to return specific subclasses depending on the - # options they are passed. Because of this we create them using a factory - - def self.for(options) - new(options) - end - - class << self - protected :new - end - - ## - # Set up a new RIGenerator. - - def initialize(options) #:not-new: - @options = options - @ri_writer = RDoc::RI::Writer.new "." - @markup = SM::SimpleMarkup.new - @to_flow = SM::ToFlow.new - - @generated = {} - end - - ## - # Build the initial indices and output objects based on an array of - # TopLevel objects containing the extracted information. - - def generate(toplevels) - RDoc::TopLevel.all_classes_and_modules.each do |cls| - process_class(cls) - end - end - - def process_class(from_class) - generate_class_info(from_class) - - # now recure into this classes constituent classess - from_class.each_classmodule do |mod| - process_class(mod) - end - end - - def generate_class_info(cls) - if cls === RDoc::NormalModule - cls_desc = RDoc::RI::ModuleDescription.new - else - cls_desc = RDoc::RI::ClassDescription.new - cls_desc.superclass = cls.superclass - end - cls_desc.name = cls.name - cls_desc.full_name = cls.full_name - cls_desc.comment = markup(cls.comment) - - cls_desc.attributes = cls.attributes.sort.map do |a| - RDoc::RI::Attribute.new(a.name, a.rw, markup(a.comment)) - end - - cls_desc.constants = cls.constants.map do |c| - RDoc::RI::Constant.new(c.name, c.value, markup(c.comment)) - end - - cls_desc.includes = cls.includes.map do |i| - RDoc::RI::IncludedModule.new(i.name) - end - - class_methods, instance_methods = method_list(cls) - - cls_desc.class_methods = class_methods.map do |m| - RDoc::RI::MethodSummary.new(m.name) - end - - cls_desc.instance_methods = instance_methods.map do |m| - RDoc::RI::MethodSummary.new(m.name) - end - - update_or_replace(cls_desc) - - class_methods.each do |m| - generate_method_info(cls_desc, m) - end - - instance_methods.each do |m| - generate_method_info(cls_desc, m) - end - end - - def generate_method_info(cls_desc, method) - meth_desc = RDoc::RI::MethodDescription.new - meth_desc.name = method.name - meth_desc.full_name = cls_desc.full_name - if method.singleton - meth_desc.full_name += "::" - else - meth_desc.full_name += "#" - end - meth_desc.full_name << method.name - - meth_desc.comment = markup(method.comment) - meth_desc.params = params_of(method) - meth_desc.visibility = method.visibility.to_s - meth_desc.is_singleton = method.singleton - meth_desc.block_params = method.block_params - - meth_desc.aliases = method.aliases.map do |a| - RDoc::RI::AliasName.new(a.name) - end - - @ri_writer.add_method(cls_desc, meth_desc) - end - - private - - ## - # Returns a list of class and instance methods that we'll be documenting - - def method_list(cls) - list = cls.method_list - unless @options.show_all - list = list.find_all do |m| - m.visibility == :public || m.visibility == :protected || m.force_documentation - end - end - - c = [] - i = [] - list.sort.each do |m| - if m.singleton - c << m - else - i << m - end - end - return c,i - end - - def params_of(method) - if method.call_seq - method.call_seq - else - params = method.params || "" - - p = params.gsub(/\s*\#.*/, '') - p = p.tr("\n", " ").squeeze(" ") - p = "(" + p + ")" unless p[0] == ?( - - if (block = method.block_params) - block.gsub!(/\s*\#.*/, '') - block = block.tr("\n", " ").squeeze(" ") - if block[0] == ?( - block.sub!(/^\(/, '').sub!(/\)/, '') - end - p << " {|#{block.strip}| ...}" - end - p - end - end - - def markup(comment) - return nil if !comment || comment.empty? - - # Convert leading comment markers to spaces, but only - # if all non-blank lines have them - - if comment =~ /^(?>\s*)[^\#]/ - content = comment - else - content = comment.gsub(/^\s*(#+)/) { $1.tr('#',' ') } - end - @markup.convert(content, @to_flow) - end - - ## - # By default we replace existing classes with the same name. If the - # --merge option was given, we instead merge this definition into an - # existing class. We add our methods, aliases, etc to that class, but do - # not change the class's description. - - def update_or_replace(cls_desc) - old_cls = nil - - if @options.merge - rdr = RDoc::RI::Reader.new RDoc::RI::Cache.new(@options.op_dir) - - namespace = rdr.top_level_namespace - namespace = rdr.lookup_namespace_in(cls_desc.name, namespace) - if namespace.empty? - $stderr.puts "You asked me to merge this source into existing " - $stderr.puts "documentation. This file references a class or " - $stderr.puts "module called #{cls_desc.name} which I don't" - $stderr.puts "have existing documentation for." - $stderr.puts - $stderr.puts "Perhaps you need to generate its documentation first" - exit 1 - else - old_cls = namespace[0] - end - end - - prev_cls = @generated[cls_desc.full_name] - - if old_cls and not prev_cls then - old_desc = rdr.get_class old_cls - cls_desc.merge_in old_desc - end - - if prev_cls then - cls_desc.merge_in prev_cls - end - - @generated[cls_desc.full_name] = cls_desc - - @ri_writer.remove_class cls_desc - @ri_writer.add_class cls_desc - end - -end - diff --git a/lib/rdoc/generators/template/chm/chm.rb b/lib/rdoc/generators/template/chm/chm.rb deleted file mode 100644 index 1932023416..0000000000 --- a/lib/rdoc/generators/template/chm/chm.rb +++ /dev/null @@ -1,86 +0,0 @@ -module RDoc::Page - -require "rdoc/generators/template/html/html" - -# This is a nasty little hack, but hhc doesn't support the /, '') -SRC_PAGE.sub!(/<\?xml.*\?>/, '') - -HPP_FILE = %{ -[OPTIONS] -Auto Index = Yes -Compatibility=1.1 or later -Compiled file=<%= values["opname"] %>.chm -Contents file=contents.hhc -Full-text search=Yes -Index file=index.hhk -Language=0x409 English(United States) -Title=<%= values["title"] %> - -[FILES] -<% values["all_html_files"].each do |all_html_files| %> -<%= all_html_files["html_file_name"] %> -<% end # values["all_html_files"] %> -} - -CONTENTS = %{ - - - - - - - - - - - -

    -<% values["contents"].each do |contents| %> -
  • - "> - "> - -<% if contents["methods"] then %> -
      -<% contents["methods"].each do |methods| %> -
    • - "> - "> - -<% end # contents["methods"] %> -
    -<% end %> -
  • -<% end # values["contents"] %> -
- -} - -CHM_INDEX = %{ - - - - - - - - - - - -
    -<% values["index"].each do |index| %> -
  • - "> - "> - -<% end # values["index"] %> -
- -} - -end - diff --git a/lib/rdoc/generators/template/html/hefss.rb b/lib/rdoc/generators/template/html/hefss.rb deleted file mode 100644 index a7baac6fd3..0000000000 --- a/lib/rdoc/generators/template/html/hefss.rb +++ /dev/null @@ -1,430 +0,0 @@ -module RDoc -module Page - - -FONTS = "Verdana, Arial, Helvetica, sans-serif" - -STYLE = %{ -body,p { font-family: Verdana, Arial, Helvetica, sans-serif; - color: #000040; background: #BBBBBB; -} - -td { font-family: Verdana, Arial, Helvetica, sans-serif; - color: #000040; -} - -.attr-rw { font-size: small; color: #444488 } - -.title-row {color: #eeeeff; - background: #BBBBDD; -} - -.big-title-font { color: white; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: large; - height: 50px} - -.small-title-font { color: purple; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: small; } - -.aqua { color: purple } - -.method-name, attr-name { - font-family: monospace; font-weight: bold; -} - -.tablesubtitle { - width: 100%; - margin-top: 1ex; - margin-bottom: .5ex; - padding: 5px 0px 5px 20px; - font-size: large; - color: purple; - background: #BBBBCC; -} - -.tablesubsubtitle { - width: 100%; - margin-top: 1ex; - margin-bottom: .5ex; - padding: 5px 0px 5px 20px; - font-size: medium; - color: white; - background: #BBBBCC; -} - -.name-list { - font-family: monospace; - margin-left: 40px; - margin-bottom: 2ex; - line-height: 140%; -} - -.description { - margin-left: 40px; - margin-bottom: 2ex; - line-height: 140%; -} - -.methodtitle { - font-size: medium; - text_decoration: none; - padding: 3px 3px 3px 20px; - color: #0000AA; -} - -.column-title { - font-size: medium; - font-weight: bold; - text_decoration: none; - padding: 3px 3px 3px 20px; - color: #3333CC; - } - -.variable-name { - font-family: monospace; - font-size: medium; - text_decoration: none; - padding: 3px 3px 3px 20px; - color: #0000AA; -} - -.row-name { - font-size: medium; - font-weight: medium; - font-family: monospace; - text_decoration: none; - padding: 3px 3px 3px 20px; -} - -.paramsig { - font-size: small; -} - -.srcbut { float: right } - -} - - -############################################################################ - - -BODY = %{ - - <%= values["title"] %> - "> - " type="text/css" media="screen" /> - - - - -<%= template_include %> - -<% if values["diagram"] then %> -
-<%= values["diagram"] %> -
-<% end %> - -<% if values["description"] then %> -
<%= values["description"] %>
-<% end %> - -<% if values["requires"] then %> - - -
Required files

-
-<% values["requires"].each do |requires| %> -<%= href requires["aref"], requires["name"] %> -<% end # values["requires"] %> -<% end %> -
- -<% if values["sections"] then %> -<% values["sections"].each do |sections| %> -<% if sections["method_list"] then %> -<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> - - -
Subroutines and Functions

-
-<% method_list["methods"].each do |methods| %> -" target="source"><%= methods["name"] %> -<% end # values["methods"] %> -
-<% end %> -<% end # values["method_list"] %> -<% end %> - -<% if sections["attributes"] then %> - - -
Arguments

- -<% sections["attributes"].each do |attributes| %> - -<% if attributes["rw"] then %> - -<% end %> -<% unless attributes["rw"] then %> - -<% end %> - - - -<% end # values["attributes"] %> -
 [<%= attributes["rw"] %>] <%= attributes["name"] %><%= attributes["a_desc"] %>
-<% end %> -<% end # values["sections"] %> -<% end %> - -<% if values["classlist"] then %> - - -
Modules

-<%= values["classlist"] %>
-<% end %> - - <%= template_include %> - - - -} - -############################################################################### - -FILE_PAGE = <<_FILE_PAGE_ - - - - -
- -
File
<%= values["short_name"] %>
- - - - - - - - -
Path:<%= values["full_path"] %> -<% if values["cvsurl"] then %> -  (">CVS) -<% end %> -
Modified:<%= values["dtm_modified"] %>
-

-_FILE_PAGE_ - -################################################################### - -CLASS_PAGE = %{ - - - - - -
- <%= values["classmod"] %>
<%= values["full_name"] %> -
- - - - - -<% if values["parent"] then %> - - - - -<% end %> -
In: -<% values["infiles"].each do |infiles| %> -<%= href infiles["full_path_url"], infiles["full_path"] %> -<% if infiles["cvsurl"] then %> - (">CVS) -<% end %> -<% end # values["infiles"] %> -
Parent: -<% if values["par_url"] then %> - " class="cyan"> -<% end %> -<%= values["parent"] %> -<% if values["par_url"] then %> - -<% end %> -
-

-} - -################################################################### - -METHOD_LIST = %{ -<% if values["includes"] then %> -
Uses

-
-<% values["includes"].each do |includes| %> - <%= href includes["aref"], includes["name"] %> -<% end # values["includes"] %> -
-<% end %> - -<% if values["sections"] then %> -<% values["sections"].each do |sections| %> -<% if sections["method_list"] then %> -<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> - - -
<%= method_list["type"] %> <%= method_list["category"] %> methods
-<% method_list["methods"].each do |methods| %> - - -
-"> -<%= methods["name"] %><%= methods["params"] %> -<% if methods["codeurl"] then %> -" target="source" class="srclink">src -<% end %> -
-<% if method_list["m_desc"] then %> -
-<%= method_list["m_desc"] %> -
-<% end %> -<% end # method_list["methods"] %> -<% end %> -<% end # sections["method_list"] %> -<% end %> -<% end # values["sections"] %> -<% end %> -} - -=begin -=end - -########################## Source code ########################## - -SRC_PAGE = %{ - -<%= values["title"] %> -"> - - - -
<%= values["code"] %>
- - -} - -########################## Index ################################ - -FR_INDEX_BODY = %{ -<%= template_include %> -} - -FILE_INDEX = %{ - - -"> - - - - - -<% values["entries"].each do |entries| %> -"><%= entries["name"] %>
-<% end # values["entries"] %> - -} - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = %{ - - - <%= values["title"] %> - "> - - - - - - - - - - " name="docwin"> - - - - <body bgcolor="#BBBBBB"> - Click <a href="html/index.html">here</a> for a non-frames - version of this page. - </body> - - - - -} - -# and a blank page to use as a target -BLANK = %{ - -} - -def write_extra_pages - template = TemplatePage.new(BLANK) - File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } -end - -end -end diff --git a/lib/rdoc/generators/template/html/html.rb b/lib/rdoc/generators/template/html/html.rb deleted file mode 100644 index 528058382b..0000000000 --- a/lib/rdoc/generators/template/html/html.rb +++ /dev/null @@ -1,711 +0,0 @@ -# -# = CSS2 RDoc HTML template -# -# This is a template for RDoc that uses XHTML 1.0 Transitional and dictates a -# bit more of the appearance of the output to cascading stylesheets than the -# default. It was designed for clean inline code display, and uses DHTMl to -# toggle the visbility of each method's source with each click on the '[source]' -# link. -# -# == Authors -# -# * Michael Granger -# -# Copyright (c) 2002, 2003 The FaerieMUD Consortium. Some rights reserved. -# -# This work is licensed under the Creative Commons Attribution License. To view -# a copy of this license, visit http://creativecommons.org/licenses/by/1.0/ or -# send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California -# 94305, USA. -# - -module RDoc - module Page - - FONTS = "Verdana,Arial,Helvetica,sans-serif" - -STYLE = <<-EOF -body { - font-family: Verdana,Arial,Helvetica,sans-serif; - font-size: 90%; - margin: 0; - margin-left: 40px; - padding: 0; - background: white; -} - -h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } -h1 { font-size: 150%; } -h2,h3,h4 { margin-top: 1em; } - -a { background: #eef; color: #039; text-decoration: none; } -a:hover { background: #039; color: #eef; } - -/* Override the base stylesheet's Anchor inside a table cell */ -td > a { - background: transparent; - color: #039; - text-decoration: none; -} - -/* and inside a section title */ -.section-title > a { - background: transparent; - color: #eee; - text-decoration: none; -} - -/* === Structural elements =================================== */ - -div#index { - margin: 0; - margin-left: -40px; - padding: 0; - font-size: 90%; -} - - -div#index a { - margin-left: 0.7em; -} - -div#index .section-bar { - margin-left: 0px; - padding-left: 0.7em; - background: #ccc; - font-size: small; -} - - -div#classHeader, div#fileHeader { - width: auto; - color: white; - padding: 0.5em 1.5em 0.5em 1.5em; - margin: 0; - margin-left: -40px; - border-bottom: 3px solid #006; -} - -div#classHeader a, div#fileHeader a { - background: inherit; - color: white; -} - -div#classHeader td, div#fileHeader td { - background: inherit; - color: white; -} - - -div#fileHeader { - background: #057; -} - -div#classHeader { - background: #048; -} - - -.class-name-in-header { - font-size: 180%; - font-weight: bold; -} - - -div#bodyContent { - padding: 0 1.5em 0 1.5em; -} - -div#description { - padding: 0.5em 1.5em; - background: #efefef; - border: 1px dotted #999; -} - -div#description h1,h2,h3,h4,h5,h6 { - color: #125;; - background: transparent; -} - -div#validator-badges { - text-align: center; -} -div#validator-badges img { border: 0; } - -div#copyright { - color: #333; - background: #efefef; - font: 0.75em sans-serif; - margin-top: 5em; - margin-bottom: 0; - padding: 0.5em 2em; -} - - -/* === Classes =================================== */ - -table.header-table { - color: white; - font-size: small; -} - -.type-note { - font-size: small; - color: #DEDEDE; -} - -.xxsection-bar { - background: #eee; - color: #333; - padding: 3px; -} - -.section-bar { - color: #333; - border-bottom: 1px solid #999; - margin-left: -20px; -} - - -.section-title { - background: #79a; - color: #eee; - padding: 3px; - margin-top: 2em; - margin-left: -30px; - border: 1px solid #999; -} - -.top-aligned-row { vertical-align: top } -.bottom-aligned-row { vertical-align: bottom } - -/* --- Context section classes ----------------------- */ - -.context-row { } -.context-item-name { font-family: monospace; font-weight: bold; color: black; } -.context-item-value { font-size: small; color: #448; } -.context-item-desc { color: #333; padding-left: 2em; } - -/* --- Method classes -------------------------- */ -.method-detail { - background: #efefef; - padding: 0; - margin-top: 0.5em; - margin-bottom: 1em; - border: 1px dotted #ccc; -} -.method-heading { - color: black; - background: #ccc; - border-bottom: 1px solid #666; - padding: 0.2em 0.5em 0 0.5em; -} -.method-signature { color: black; background: inherit; } -.method-name { font-weight: bold; } -.method-args { font-style: italic; } -.method-description { padding: 0 0.5em 0 0.5em; } - -/* --- Source code sections -------------------- */ - -a.source-toggle { font-size: 90%; } -div.method-source-code { - background: #262626; - color: #ffdead; - margin: 1em; - padding: 0.5em; - border: 1px dashed #999; - overflow: hidden; -} - -div.method-source-code pre { color: #ffdead; overflow: hidden; } - -/* --- Ruby keyword styles --------------------- */ - -.standalone-code { background: #221111; color: #ffdead; overflow: hidden; } - -.ruby-constant { color: #7fffd4; background: transparent; } -.ruby-keyword { color: #00ffff; background: transparent; } -.ruby-ivar { color: #eedd82; background: transparent; } -.ruby-operator { color: #00ffee; background: transparent; } -.ruby-identifier { color: #ffdead; background: transparent; } -.ruby-node { color: #ffa07a; background: transparent; } -.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } -.ruby-regexp { color: #ffa07a; background: transparent; } -.ruby-value { color: #7fffd4; background: transparent; } -EOF - - -##################################################################### -### H E A D E R T E M P L A T E -##################################################################### - -XHTML_PREAMBLE = %{"?> - -} - -HEADER = XHTML_PREAMBLE + <<-EOF - - - <%= values["title"] %> - " /> - - " type="text/css" media="screen" /> - - - - -EOF - - -##################################################################### -### C O N T E X T C O N T E N T T E M P L A T E -##################################################################### - -CONTEXT_CONTENT = %{ -} - - -##################################################################### -### F O O T E R T E M P L A T E -##################################################################### -FOOTER = <<-EOF - - - - -EOF - - -##################################################################### -### F I L E P A G E H E A D E R T E M P L A T E -##################################################################### - -FILE_PAGE = <<-EOF -
-

<%= values["short_name"] %>

- - - - - - - - - -
Path:<%= values["full_path"] %> -<% if values["cvsurl"] then %> -  (">CVS) -<% end %> -
Last Update:<%= values["dtm_modified"] %>
-
-EOF - - -##################################################################### -### C L A S S P A G E H E A D E R T E M P L A T E -##################################################################### - -CLASS_PAGE = <<-EOF -
- - - - - - - - - - -<% if values["parent"] then %> - - - - -<% end %> -
<%= values["classmod"] %><%= values["full_name"] %>
In: -<% values["infiles"].each do |infiles| %> -<% if infiles["full_path_url"] then %> - "> -<% end %> - <%= infiles["full_path"] %> -<% if infiles["full_path_url"] then %> - -<% end %> -<% if infiles["cvsurl"] then %> -  (">CVS) -<% end %> -
-<% end # values["infiles"] %> -
Parent: -<% if values["par_url"] then %> - "> -<% end %> - <%= values["parent"] %> -<% if values["par_url"] then %> - -<% end %> -
-
-EOF - - -##################################################################### -### M E T H O D L I S T T E M P L A T E -##################################################################### - -METHOD_LIST = <<-EOF - -
-<% if values["diagram"] then %> -
- <%= values["diagram"] %> -
-<% end %> - -<% if values["description"] then %> -
- <%= values["description"] %> -
-<% end %> - -<% if values["requires"] then %> -
-

Required files

- -
-<% values["requires"].each do |requires| %> - <%= href requires["aref"], requires["name"] %>   -<% end # values["requires"] %> -
-
-<% end %> - -<% if values["toc"] then %> -
-

Contents

-
    -<% values["toc"].each do |toc| $stderr.puts({ :toc => toc }.inspect) %> -
  • "><%= values["secname"] %>
  • -<% end # values["toc"] %> -
-<% end %> -
- -<% if values["methods"] then %> -
-

Methods

- -
-<% values["methods"].each do |methods| %> - <%= href methods["aref"], methods["name"] %>   -<% end # values["methods"] %> -
-
-<% end %> - -
- - - -<% if values["includes"] then %> -
-

Included Modules

- -
-<% values["includes"].each do |includes| %> - <%= href includes["aref"], includes["name"] %> -<% end # values["includes"] %> -
-
-<% end %> - -<% values["sections"].each do |sections| %> -
-<% if sections["sectitle"] then %> -

"><%= sections["sectitle"] %>

-<% if sections["seccomment"] then %> -
- <%= sections["seccomment"] %> -
-<% end %> -<% end %> - -<% if values["classlist"] then %> -
-

Classes and Modules

- - <%= values["classlist"] %> -
-<% end %> - -<% if values["constants"] then %> -
-

Constants

- -
- -<% values["constants"].each do |constants| $stderr.puts({ :constants => constants }.inspect) %> - - - - -<% if values["desc"] then %> - - -<% end %> - -<% end # values["constants"] %> -
<%= values["name"] %>=<%= values["value"] %> <%= values["desc"] %>
-
-
-<% end %> - -<% if values["aliases"] then %> -
-

External Aliases

- -
- -<% values["aliases"].each do |aliases| $stderr.puts({ :aliases => aliases }.inspect) %> - - - - - -<% if values["desc"] then %> - - - - -<% end %> -<% end # values["aliases"] %> -
<%= values["old_name"] %>-><%= values["new_name"] %>
 <%= values["desc"] %>
-
-
-<% end %> - - -<% if values["attributes"] then %> -
-

Attributes

- -
- -<% values["attributes"].each do |attributes| $stderr.puts({ :attributes => attributes }.inspect) %> - - -<% if values["rw"] then %> - -<% end %> -<% unless values["rw"] then %> - -<% end %> - - -<% end # values["attributes"] %> -
<%= values["name"] %> [<%= values["rw"] %>]   <%= values["a_desc"] %>
-
-
-<% end %> - - - - -<% if sections["method_list"] then %> -
-<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> -

<%= method_list["type"] %> <%= method_list["category"] %> methods

- -<% method_list["methods"].each do |methods| %> -
" class="method-detail"> - "> - - - -
-<% if methods["m_desc"] then %> - <%= methods["m_desc"] %> -<% end %> -<% if methods["sourcecode"] then %> -

-source');return false;">[Source]

-
-source"> -
-<%= methods["sourcecode"] %>
-
-
-<% end %> -
-
- -<% end # method_list["methods"] %> -<% end %> -<% end # sections["method_list"] %> - -
-<% end %> -<% end # values["sections"] %> -EOF - - -##################################################################### -### B O D Y T E M P L A T E -##################################################################### - -BODY = HEADER + %{ - -<%= template_include %> - -
- -} + METHOD_LIST + %{ - -
- -} + FOOTER - - - -##################################################################### -### S O U R C E C O D E T E M P L A T E -##################################################################### - -SRC_PAGE = XHTML_PREAMBLE + <<-EOF - - - <%= values["title"] %> - " /> - " type="text/css" media="screen" /> - - -
<%= values["code"] %>
- - -EOF - - -##################################################################### -### I N D E X F I L E T E M P L A T E S -##################################################################### - -FR_INDEX_BODY = %{ -<%= template_include %> -} - -FILE_INDEX = XHTML_PREAMBLE + %{ - - - - <%= values["list_title"] %> - " /> - " type="text/css" /> - - - -
-

<%= values["list_title"] %>

-
-<% values["entries"].each do |entries| %> - "><%= entries["name"] %>
-<% end # values["entries"] %> -
-
- - -} - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = %{"?> - - - - - - <%= values["title"] %> - " /> - - - - - - - - " name="docwin" /> - - -} - - - - end # module Page -end # class RDoc - -require 'rdoc/generators/template/html/one_page_html' diff --git a/lib/rdoc/generators/template/html/kilmer.rb b/lib/rdoc/generators/template/html/kilmer.rb deleted file mode 100644 index 64687ff3cd..0000000000 --- a/lib/rdoc/generators/template/html/kilmer.rb +++ /dev/null @@ -1,435 +0,0 @@ -module RDoc -module Page - - -FONTS = "Verdana, Arial, Helvetica, sans-serif" - -STYLE = %{ -body,td,p { font-family: <%= values["fonts"] %>; - color: #000040; -} - -.attr-rw { font-size: xx-small; color: #444488 } - -.title-row { background-color: #CCCCFF; - color: #000010; -} - -.big-title-font { - color: black; - font-weight: bold; - font-family: <%= values["fonts"] %>; - font-size: large; - height: 60px; - padding: 10px 3px 10px 3px; -} - -.small-title-font { color: black; - font-family: <%= values["fonts"] %>; - font-size:10; } - -.aqua { color: black } - -.method-name, .attr-name { - font-family: font-family: <%= values["fonts"] %>; - font-weight: bold; - font-size: small; - margin-left: 20px; - color: #000033; -} - -.tablesubtitle, .tablesubsubtitle { - width: 100%; - margin-top: 1ex; - margin-bottom: .5ex; - padding: 5px 0px 5px 3px; - font-size: large; - color: black; - background-color: #CCCCFF; - border: thin; -} - -.name-list { - margin-left: 5px; - margin-bottom: 2ex; - line-height: 105%; -} - -.description { - margin-left: 5px; - margin-bottom: 2ex; - line-height: 105%; - font-size: small; -} - -.methodtitle { - font-size: small; - font-weight: bold; - text-decoration: none; - color: #000033; - background-color: white; -} - -.srclink { - font-size: small; - font-weight: bold; - text-decoration: none; - color: #0000DD; - background-color: white; -} - -.paramsig { - font-size: small; -} - -.srcbut { float: right } - -} - - -############################################################################ - - -BODY = %{ - - <%= values["title"] %> - "> - " type="text/css" media="screen" /> - - - - -<%= template_include %> - -<% if values["diagram"] then %> -
-<%= values["diagram"] %> -
-<% end %> - -<% if values["description"] then %> -
<%= values["description"] %>
-<% end %> - -<% if values["requires"] then %> - - -
Required files

-
-<% values["requires"].each do |requires| %> -<%= href requires["aref"], requires["name"] %> -<% end # values["requires"] %> -<% end %> -
- -<% if values["methods"] then %> - - -
Methods

-
-<% values["methods"].each do |methods| %> -<%= href methods["aref"], methods["name"] %>, -<% end # values["methods"] %> -
-<% end %> - - -<% values["sections"].each do |sections| %> -
-<% if sections["sectitle"] then %> -

"><%= sections["sectitle"] %>

-<% if sections["seccomment"] then %> -
- <%= sections["seccomment"] %> -
-<% end %> -<% end %> - -<% if sections["attributes"] then %> - - -
Attributes

- -<% sections["attributes"].each do |attributes| %> - -<% if attributes["rw"] then %> - -<% end %> -<% unless attributes["rw"] then %> - -<% end %> - - - -<% end # sections["attributes"] %> -
 [<%= attributes["rw"] %>] <%= attributes["name"] %><%= attributes["a_desc"] %>
-<% end %> - -<% if sections["classlist"] then %> - - -
Classes and Modules

-<%= sections["classlist"] %>
-<% end %> - - <%= template_include %> - -<% end # values["sections"] %> - - - -} - -############################################################################### - -FILE_PAGE = <<_FILE_PAGE_ - - - - -
- -
File
<%= values["short_name"] %>
- - - - - - - - -
Path:<%= values["full_path"] %> -<% if values["cvsurl"] then %> -  (">CVS) -<% end %> -
Modified:<%= values["dtm_modified"] %>
-

-_FILE_PAGE_ - -################################################################### - -CLASS_PAGE = %{ - - - - - -
- <%= values["classmod"] %>
<%= values["full_name"] %> -
- - - - - -<% if values["parent"] then %> - - - - -<% end %> -
In: -<% values["infiles"].each do |infiles| %> -<%= href infiles["full_path_url"], infiles["full_path"] %> -<% if infiles["cvsurl"] then %> - (">CVS) -<% end %> -<% end # values["infiles"] %> -
Parent: -<% if values["par_url"] then %> - " class="cyan"> -<% end %> -<%= values["parent"] %> -<% if values["par_url"] then %> - -<% end %> -
-

-} - -################################################################### - -METHOD_LIST = %{ -<% if values["includes"] then %> -
Included modules

-
-<% values["includes"].each do |includes| %> - <%= href includes["aref"], includes["name"] %> -<% end # values["includes"] %> -
-<% end %> - -<% if values["method_list"] then %> -<% values["method_list"].each do |method_list| $stderr.puts({ :method_list => method_list }.inspect) %> -<% if values["methods"] then %> - - -
<%= values["type"] %> <%= values["category"] %> methods
-<% values["methods"].each do |methods| $stderr.puts({ :methods => methods }.inspect) %> - - -
-"> -<% if values["callseq"] then %> -<%= values["callseq"] %> -<% end %> -<% unless values["callseq"] then %> - <%= values["name"] %><%= values["params"] %> -<% end %> -<% if values["codeurl"] then %> -" target="source" class="srclink">src -<% end %> -
-<% if values["m_desc"] then %> -
-<%= values["m_desc"] %> -
-<% end %> -<% if values["aka"] then %> -
-This method is also aliased as -<% values["aka"].each do |aka| $stderr.puts({ :aka => aka }.inspect) %> -"><%= values["name"] %> -<% end # values["aka"] %> -
-<% end %> -<% if values["sourcecode"] then %> -
-<%= values["sourcecode"] %>
-
-<% end %> -<% end # values["methods"] %> -<% end %> -<% end # values["method_list"] %> -<% end %> -} - -=begin -=end - -########################## Source code ########################## - -SRC_PAGE = %{ - -<%= values["title"] %> -"> - - - -
<%= values["code"] %>
- - -} - -########################## Index ################################ - -FR_INDEX_BODY = %{ -<%= template_include %> -} - -FILE_INDEX = %{ - - -"> - - - - - -<% values["entries"].each do |entries| %> -"><%= entries["name"] %>
-<% end # values["entries"] %> - -} - -CLASS_INDEX = FILE_INDEX -METHOD_INDEX = FILE_INDEX - -INDEX = %{ - - - <%= values["title"] %> - "> - - - - - - - - -<% if values["inline_source"] then %> - " name="docwin"> -<% end %> -<% unless values["inline_source"] then %> - - " name="docwin"> - - -<% end %> - - <body bgcolor="white"> - Click <a href="html/index.html">here</a> for a non-frames - version of this page. - </body> - - - - -} - -# and a blank page to use as a target -BLANK = %{ - -} - -def write_extra_pages - template = TemplatePage.new(BLANK) - File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } -end - -end -end diff --git a/lib/rdoc/generators/template/html/one_page_html.rb b/lib/rdoc/generators/template/html/one_page_html.rb deleted file mode 100644 index 170bbf23c8..0000000000 --- a/lib/rdoc/generators/template/html/one_page_html.rb +++ /dev/null @@ -1,121 +0,0 @@ -module RDoc::Page - -CONTENTS_XML = %{ -<% if defined? classes and classes["description"] then %> -<%= classes["description"] %> -<% end %> - -<% if defined? files and files["requires"] then %> -

Requires:

-
    -<% files["requires"].each do |requires| %> -<% if requires["aref"] then %> -
  • "><%= requires["name"] %>
  • -<% end %> -<% unless requires["aref"] then %> -
  • <%= requires["name"] %>
  • -<% end %> -<% end # files["requires"] %> -
-<% end %> - -<% if defined? classes and classes["includes"] then %> -

Includes

-
    -<% classes["includes"].each do |includes| %> -<% if includes["aref"] then %> -
  • "><%= includes["name"] %>
  • -<% end %> -<% unless includes["aref"] then %> -
  • <%= includes["name"] %>
  • -<% end %> -<% end # classes["includes"] %> -
-<% end %> - -<% if defined? classes and classes["sections"] then %> -<% classes["sections"].each do |sections| %> -<% if sections["attributes"] then %> -

Attributes

- -<% sections["attributes"].each do |attributes| %> - -<% end # sections["attributes"] %> -
<%= attributes["name"] %><%= attributes["rw"] %><%= attributes["a_desc"] %>
-<% end %> - -<% if sections["method_list"] then %> -

Methods

-<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> -<% method_list["methods"].each do |methods| %> -

<%= methods["type"] %> <%= methods["category"] %> method: -<% if methods["callseq"] then %> -"><%= methods["callseq"] %> -<% end %> -<% unless methods["callseq"] then %> -"><%= methods["name"] %><%= methods["params"] %>

-<% end %> - -<% if methods["m_desc"] then %> -<%= methods["m_desc"] %> -<% end %> - -<% if methods["sourcecode"] then %> -
-<%= methods["sourcecode"] %>
-
-<% end %> -<% end # method_list["methods"] %> -<% end %> -<% end # sections["method_list"] %> -<% end %> -<% end # classes["sections"] %> -<% end %> -} - -######################################################################## - -ONE_PAGE = %{ - - - - <%= values["title"] %> - " /> - - -<% values["files"].each do |files| %> -

File: <%= files["short_name"] %>

- - - -
Path:<%= files["full_path"] %>
Modified:<%= files["dtm_modified"] %>
-} + CONTENTS_XML + %{ -<% end # values["files"] %> - -<% if values["classes"] then %> -

Classes

-<% values["classes"].each do |classes| %> -<% if classes["parent"] then %> -

<%= classes["classmod"] %> <%= classes["full_name"] %> < <%= href classes["par_url"], classes["parent"] %>

-<% end %> -<% unless classes["parent"] then %> -

<%= classes["classmod"] %> <%= classes["full_name"] %>

-<% end %> - -<% if classes["infiles"] then %> -(in files -<% classes["infiles"].each do |infiles| %> -<%= href infiles["full_path_url"], infiles["full_path"] %> -<% end # classes["infiles"] %> -) -<% end %> -} + CONTENTS_XML + %{ -<% end # values["classes"] %> -<% end %> - - -} - -end - diff --git a/lib/rdoc/generators/template/xml/rdf.rb b/lib/rdoc/generators/template/xml/rdf.rb deleted file mode 100644 index fbeb599ce6..0000000000 --- a/lib/rdoc/generators/template/xml/rdf.rb +++ /dev/null @@ -1,111 +0,0 @@ -module RDoc::Page - -CONTENTS_RDF = %{ -<% if defined? classes and classes["description"] then %> - -<%= classes["description"] %> - -<% end %> - -<% if defined? files and files["requires"] then %> -<% files["requires"].each do |requires| %> - " /> -<% end # files["requires"] %> -<% end %> - -<% if defined? classes and classes["includes"] then %> - -<% classes["includes"].each do |includes| %> - " /> -<% end # includes["includes"] %> - -<% end %> - -<% if defined? classes and classes["sections"] then %> -<% classes["sections"].each do |sections| %> -<% if sections["attributes"] then %> -<% sections["attributes"].each do |attributes| %> - - "> -<% if attributes["rw"] then %> - <%= attributes["rw"] %> -<% end %> - <%= attributes["a_desc"] %> - - -<% end # sections["attributes"] %> -<% end %> - -<% if sections["method_list"] then %> -<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> -<% method_list["methods"].each do |methods| %> - - " rd:visibility="<%= methods["type"] %>" - rd:category="<%= methods["category"] %>" rd:id="<%= methods["aref"] %>"> - <%= methods["params"] %> -<% if methods["m_desc"] then %> - -<%= methods["m_desc"] %> - -<% end %> -<% if methods["sourcecode"] then %> - -<%= methods["sourcecode"] %> - -<% end %> - - -<% end # method_list["methods"] %> -<% end %> -<% end # sections["method_list"] %> -<% end %> - -<% end # classes["sections"] %> -<% end %> -} - -######################################################################## - -ONE_PAGE = %{ - - - -<% values["files"].each do |files| %> - " rd:id="<%= files["href"] %>"> - <%= files["full_path"] %> - <%= files["dtm_modified"] %> -} + CONTENTS_RDF + %{ - -<% end # values["files"] %> -<% values["classes"].each do |classes| %> - <<%= values["classmod"] %> rd:name="<%= classes["full_name"] %>" rd:id="<%= classes["full_name"] %>"> - -<% if classes["infiles"] then %> - -<% classes["infiles"].each do |infiles| %> - - " -<% if infiles["full_path_url"] then %> - rdf:about="<%= infiles["full_path_url"] %>" -<% end %> - /> - -<% end # classes["infiles"] %> - -<% end %> -<% if classes["parent"] then %> - <%= href classes["par_url"], classes["parent"] %> -<% end %> - -} + CONTENTS_RDF + %{ - > -<% end # values["classes"] %> - - -} - -end - diff --git a/lib/rdoc/generators/template/xml/xml.rb b/lib/rdoc/generators/template/xml/xml.rb deleted file mode 100644 index ab6355a1c5..0000000000 --- a/lib/rdoc/generators/template/xml/xml.rb +++ /dev/null @@ -1,111 +0,0 @@ -module RDoc::Page - -CONTENTS_XML = %{ -<% if defined? classes and classes["description"] then %> - -<%= classes["description"] %> - -<% end %> - -<% if defined? files and files["requires"] then %> - -<% files["requires"].each do |requires| %> - " -<% if requires["aref"] then %> - href="<%= requires["aref"] %>" -<% end %> - /> -<% end # files["requires"] %> - -<% end %> -<% if defined? classes and classes["sections"] then %> -<% classes["sections"].each do |sections| %> -<% if sections["attributes"] then %> - -<% sections["attributes"].each do |attributes| %> - "> -<% if attributes["rw"] then %> - <%= attributes["rw"] %> -<% end %> - <%= attributes["a_desc"] %> - -<% end # sections["attributes"] %> - -<% end %> -<% if sections["method_list"] then %> - -<% sections["method_list"].each do |method_list| %> -<% if method_list["methods"] then %> -<% method_list["methods"].each do |methods| %> - " type="<%= methods["type"] %>" category="<%= methods["category"] %>" id="<%= methods["aref"] %>"> - <%= methods["params"] %> -<% if methods["m_desc"] then %> - -<%= methods["m_desc"] %> - -<% end %> -<% if methods["sourcecode"] then %> - -<%= methods["sourcecode"] %> - -<% end %> - -<% end # method_list["methods"] %> -<% end %> -<% end # sections["method_list"] %> - -<% end %> -<% end # classes["sections"] %> -<% end %> -<% if defined? classes and classes["includes"] then %> - -<% classes["includes"].each do |includes| %> - " -<% if includes["aref"] then %> - href="<%= includes["aref"] %>" -<% end %> - /> -<% end # classes["includes"] %> - -<% end %> - -} - -######################################################################## - -ONE_PAGE = %{ - - -<% values["files"].each do |files| %> - " id="<%= files["href"] %>"> - - <%= files["full_path"] %> - <%= files["dtm_modified"] %> - -} + CONTENTS_XML + %{ - -<% end # values["files"] %> - - -<% values["classes"].each do |classes| %> - <<%= classes["classmod"] %> name="<%= classes["full_name"] %>" id="<%= classes["full_name"] %>"> - -<% if classes["infiles"] then %> - -<% classes["infiles"].each do |infiles| %> - <%= href infiles["full_path_url"], infiles["full_path"] %> -<% end # classes["infiles"] %> - -<% end %> -<% if classes["parent"] then %> - <%= href classes["par_url"], classes["parent"] %> -<% end %> - -} + CONTENTS_XML + %{ - > -<% end # values["classes"] %> - - -} - -end diff --git a/lib/rdoc/generators/xml.rb b/lib/rdoc/generators/xml.rb new file mode 100644 index 0000000000..d84cecc05c --- /dev/null +++ b/lib/rdoc/generators/xml.rb @@ -0,0 +1,120 @@ +require 'rdoc/generators/html' + +## +# Generate XML output as one big file + +class RDoc::Generators::XML < RDoc::Generators::HTML + + ## + # Standard generator factory + + def self.for(options) + new(options) + end + + def initialize(*args) + super + end + + ## + # Build the initial indices and output objects + # based on an array of TopLevel objects containing + # the extracted information. + + def generate(info) + @info = info + @files = [] + @classes = [] + @hyperlinks = {} + + build_indices + generate_xml + end + + ## + # Generate: + # + # * a list of HtmlFile objects for each TopLevel object. + # * a list of HtmlClass objects for each first level + # class or module in the TopLevel objects + # * a complete list of all hyperlinkable terms (file, + # class, module, and method names) + + def build_indices + @info.each do |toplevel| + @files << RDoc::Generators::HtmlFile.new(toplevel, @options, RDoc::Generators::FILE_DIR) + end + + RDoc::TopLevel.all_classes_and_modules.each do |cls| + build_class_list(cls, @files[0], RDoc::Generators::CLASS_DIR) + end + end + + def build_class_list(from, html_file, class_dir) + @classes << RDoc::Generators::HtmlClass.new(from, html_file, class_dir, @options) + from.each_classmodule do |mod| + build_class_list(mod, html_file, class_dir) + end + end + + ## + # Generate all the HTML. For the one-file case, we generate + # all the information in to one big hash + + def generate_xml + values = { + 'charset' => @options.charset, + 'files' => gen_into(@files), + 'classes' => gen_into(@classes) + } + + # this method is defined in the template file + write_extra_pages if defined? write_extra_pages + + template = RDoc::TemplatePage.new @template::ONE_PAGE + + if @options.op_name + opfile = File.open(@options.op_name, "w") + else + opfile = $stdout + end + template.write_html_on(opfile, values) + end + + def gen_into(list) + res = [] + list.each do |item| + res << item.value_hash + end + res + end + + def gen_file_index + gen_an_index(@files, 'Files') + end + + def gen_class_index + gen_an_index(@classes, 'Classes') + end + + def gen_method_index + gen_an_index(RDoc::Generators::HtmlMethod.all_methods, 'Methods') + end + + def gen_an_index(collection, title) + res = [] + collection.sort.each do |f| + if f.document_self + res << { "href" => f.path, "name" => f.index_name } + end + end + + return { + "entries" => res, + 'list_title' => title, + 'index_url' => main_url, + } + end + +end + diff --git a/lib/rdoc/generators/xml/rdf.rb b/lib/rdoc/generators/xml/rdf.rb new file mode 100644 index 0000000000..3f6643e15b --- /dev/null +++ b/lib/rdoc/generators/xml/rdf.rb @@ -0,0 +1,113 @@ +require 'rdoc/generators/xml' + +module RDoc::Generators::XML::RDF + + CONTENTS_RDF = <<-EOF +<% if defined? classes and classes["description"] then %> + +<%= classes["description"] %> + +<% end %> + +<% if defined? files and files["requires"] then %> +<% files["requires"].each do |requires| %> + " /> +<% end # files["requires"] %> +<% end %> + +<% if defined? classes and classes["includes"] then %> + +<% classes["includes"].each do |includes| %> + " /> +<% end # includes["includes"] %> + +<% end %> + +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> +<% sections["attributes"].each do |attributes| %> + + "> +<% if attributes["rw"] then %> + <%= attributes["rw"] %> +<% end %> + <%= attributes["a_desc"] %> + + +<% end # sections["attributes"] %> +<% end %> + +<% if sections["method_list"] then %> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +<% method_list["methods"].each do |methods| %> + + " rd:visibility="<%= methods["type"] %>" + rd:category="<%= methods["category"] %>" rd:id="<%= methods["aref"] %>"> + <%= methods["params"] %> +<% if methods["m_desc"] then %> + +<%= methods["m_desc"] %> + +<% end %> +<% if methods["sourcecode"] then %> + +<%= methods["sourcecode"] %> + +<% end %> + + +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> +<% end %> + +<% end # classes["sections"] %> +<% end %> + EOF + +######################################################################## + + ONE_PAGE = %{ + + + +<% values["files"].each do |files| %> + " rd:id="<%= files["href"] %>"> + <%= files["full_path"] %> + <%= files["dtm_modified"] %> +} + CONTENTS_RDF + %{ + +<% end # values["files"] %> +<% values["classes"].each do |classes| %> + <<%= values["classmod"] %> rd:name="<%= classes["full_name"] %>" rd:id="<%= classes["full_name"] %>"> + +<% if classes["infiles"] then %> + +<% classes["infiles"].each do |infiles| %> + + " +<% if infiles["full_path_url"] then %> + rdf:about="<%= infiles["full_path_url"] %>" +<% end %> + /> + +<% end # classes["infiles"] %> + +<% end %> +<% if classes["parent"] then %> + <%= href classes["par_url"], classes["parent"] %> +<% end %> + +} + CONTENTS_RDF + %{ + > +<% end # values["classes"] %> + + +} + +end + diff --git a/lib/rdoc/generators/xml/xml.rb b/lib/rdoc/generators/xml/xml.rb new file mode 100644 index 0000000000..e711b514fa --- /dev/null +++ b/lib/rdoc/generators/xml/xml.rb @@ -0,0 +1,111 @@ +require 'rdoc/generators/xml' + +module RDoc::Generators::XML::XML + + CONTENTS_XML = <<-EOF +<% if defined? classes and classes["description"] then %> + +<%= classes["description"] %> + +<% end %> + +<% if defined? files and files["requires"] then %> + +<% files["requires"].each do |requires| %> + " +<% if requires["aref"] then %> + href="<%= requires["aref"] %>" +<% end %> + /> +<% end # files["requires"] %> + +<% end %> +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> + +<% sections["attributes"].each do |attributes| %> + "> +<% if attributes["rw"] then %> + <%= attributes["rw"] %> +<% end %> + <%= attributes["a_desc"] %> + +<% end # sections["attributes"] %> + +<% end %> +<% if sections["method_list"] then %> + +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +<% method_list["methods"].each do |methods| %> + " type="<%= methods["type"] %>" category="<%= methods["category"] %>" id="<%= methods["aref"] %>"> + <%= methods["params"] %> +<% if methods["m_desc"] then %> + +<%= methods["m_desc"] %> + +<% end %> +<% if methods["sourcecode"] then %> + +<%= methods["sourcecode"] %> + +<% end %> + +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> + +<% end %> +<% end # classes["sections"] %> +<% end %> +<% if defined? classes and classes["includes"] then %> + +<% classes["includes"].each do |includes| %> + " +<% if includes["aref"] then %> + href="<%= includes["aref"] %>" +<% end %> + /> +<% end # classes["includes"] %> + +<% end %> + + EOF + + ONE_PAGE = %{ + + +<% values["files"].each do |files| %> + " id="<%= files["href"] %>"> + + <%= files["full_path"] %> + <%= files["dtm_modified"] %> + +} + CONTENTS_XML + %{ + +<% end # values["files"] %> + + +<% values["classes"].each do |classes| %> + <<%= classes["classmod"] %> name="<%= classes["full_name"] %>" id="<%= classes["full_name"] %>"> + +<% if classes["infiles"] then %> + +<% classes["infiles"].each do |infiles| %> + <%= href infiles["full_path_url"], infiles["full_path"] %> +<% end # classes["infiles"] %> + +<% end %> +<% if classes["parent"] then %> + <%= href classes["par_url"], classes["parent"] %> +<% end %> + +} + CONTENTS_XML + %{ + > +<% end # values["classes"] %> + + +} + +end diff --git a/lib/rdoc/generators/xml_generator.rb b/lib/rdoc/generators/xml_generator.rb deleted file mode 100644 index fe772f9ef4..0000000000 --- a/lib/rdoc/generators/xml_generator.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'rdoc/generators/html_generator' - -## -# Generate XML output as one big file - -class RDoc::Generators::XMLGenerator < RDoc::Generators::HTMLGenerator - - ## - # Standard generator factory - - def self.for(options) - new(options) - end - - def initialize(*args) - super - end - - ## - # Build the initial indices and output objects - # based on an array of TopLevel objects containing - # the extracted information. - - def generate(info) - @info = info - @files = [] - @classes = [] - @hyperlinks = {} - - build_indices - generate_xml - end - - ## - # Generate: - # - # * a list of HtmlFile objects for each TopLevel object. - # * a list of HtmlClass objects for each first level - # class or module in the TopLevel objects - # * a complete list of all hyperlinkable terms (file, - # class, module, and method names) - - def build_indices - @info.each do |toplevel| - @files << RDoc::Generators::HtmlFile.new(toplevel, @options, RDoc::Generators::FILE_DIR) - end - - RDoc::TopLevel.all_classes_and_modules.each do |cls| - build_class_list(cls, @files[0], RDoc::Generators::CLASS_DIR) - end - end - - def build_class_list(from, html_file, class_dir) - @classes << RDoc::Generators::HtmlClass.new(from, html_file, class_dir, @options) - from.each_classmodule do |mod| - build_class_list(mod, html_file, class_dir) - end - end - - ## - # Generate all the HTML. For the one-file case, we generate - # all the information in to one big hash - - def generate_xml - values = { - 'charset' => @options.charset, - 'files' => gen_into(@files), - 'classes' => gen_into(@classes) - } - - # this method is defined in the template file - write_extra_pages if defined? write_extra_pages - - template = RDoc::TemplatePage.new(RDoc::Page::ONE_PAGE) - - if @options.op_name - opfile = File.open(@options.op_name, "w") - else - opfile = $stdout - end - template.write_html_on(opfile, values) - end - - def gen_into(list) - res = [] - list.each do |item| - res << item.value_hash - end - res - end - - def gen_file_index - gen_an_index(@files, 'Files') - end - - def gen_class_index - gen_an_index(@classes, 'Classes') - end - - def gen_method_index - gen_an_index(RDoc::Generators::HtmlMethod.all_methods, 'Methods') - end - - def gen_an_index(collection, title) - res = [] - collection.sort.each do |f| - if f.document_self - res << { "href" => f.path, "name" => f.index_name } - end - end - - return { - "entries" => res, - 'list_title' => title, - 'index_url' => main_url, - } - end - -end - diff --git a/lib/rdoc/options.rb b/lib/rdoc/options.rb index 078635121c..a36fb017ad 100644 --- a/lib/rdoc/options.rb +++ b/lib/rdoc/options.rb @@ -132,6 +132,13 @@ class RDoc::Options attr_reader :template + ## + # Template class for file generation + #-- + # HACK around dependencies in lib/rdoc/generators/html.rb + + attr_accessor :template_class # :nodoc: + ## # Documentation title @@ -156,6 +163,7 @@ class RDoc::Options @rdoc_include = [] @title = nil @template = nil + @template_class = nil @diagram = false @fileboxes = false @show_hash = false @@ -379,6 +387,7 @@ Usage: #{opt.program_name} [options] [names...] "Put all the output into a single file.") do |value| @all_one_file = value @inline_source = value if value + @template = 'one_page_html' end opt.separator nil @@ -411,7 +420,7 @@ Usage: #{opt.program_name} [options] [names...] opt.on("--quiet", "-q", "Don't show progress as we parse.") do |value| - @quite = value + @quiet = value end opt.separator nil diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb index 115cb69f37..b376653549 100644 --- a/lib/rdoc/rdoc.rb +++ b/lib/rdoc/rdoc.rb @@ -68,11 +68,11 @@ module RDoc File.directory? "#{d}/rdoc/generators" end.each do |dir| Dir.entries("#{dir}/rdoc/generators").each do |gen| - next unless /(\w+)_generator.rb$/ =~ gen + next unless /(\w+)\.rb$/ =~ gen type = $1 unless GENERATORS.has_key? type GENERATORS[type] = Generator.new("rdoc/generators/#{gen}", - "#{type.upcase}Generator".intern, + "#{type.upcase}".intern, type) end end -- cgit v1.2.3