diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
commit | 0dc342de848a642ecce8db697b8fecd83a63e117 (patch) | |
tree | 2b7ed4724aff1f86073e4740134bda9c4aac1a39 /trunk/lib/rdoc/generator | |
parent | ef70cf7138ab8034b5b806f466e4b484b24f0f88 (diff) |
added tag v1_9_0_4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_9_0_4@18845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'trunk/lib/rdoc/generator')
-rw-r--r-- | trunk/lib/rdoc/generator/chm.rb | 113 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/chm/chm.rb | 98 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html.rb | 397 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html/frameless.rb | 795 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html/hefss.rb | 414 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html/html.rb | 698 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html/kilmer.rb | 418 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/html/one_page_html.rb | 121 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/ri.rb | 226 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/texinfo.rb | 84 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/texinfo/class.texinfo.erb | 44 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/texinfo/file.texinfo.erb | 6 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/texinfo/method.texinfo.erb | 6 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/texinfo/texinfo.erb | 28 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/xml.rb | 120 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/xml/rdf.rb | 113 | ||||
-rw-r--r-- | trunk/lib/rdoc/generator/xml/xml.rb | 111 |
17 files changed, 3792 insertions, 0 deletions
diff --git a/trunk/lib/rdoc/generator/chm.rb b/trunk/lib/rdoc/generator/chm.rb new file mode 100644 index 0000000000..7537365842 --- /dev/null +++ b/trunk/lib/rdoc/generator/chm.rb @@ -0,0 +1,113 @@ +require 'rdoc/generator/html' + +class RDoc::Generator::CHM < RDoc::Generator::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/trunk/lib/rdoc/generator/chm/chm.rb b/trunk/lib/rdoc/generator/chm/chm.rb new file mode 100644 index 0000000000..0a17a9e1ea --- /dev/null +++ b/trunk/lib/rdoc/generator/chm/chm.rb @@ -0,0 +1,98 @@ +require 'rdoc/generator/chm' +require 'rdoc/generator/html/html' + +module RDoc::Generator::CHM::CHM + + HTML = RDoc::Generator::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 <?xml tag, so... + BODY = HTML::BODY.sub!(/<\?xml.*\?>/, '') + 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 +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<HTML> +<HEAD> +<meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1"> +<!-- Sitemap 1.0 --> +</HEAD><BODY> +<OBJECT type="text/site properties"> + <param name="Foreground" value="0x80"> + <param name="Window Styles" value="0x800025"> + <param name="ImageType" value="Folder"> +</OBJECT> +<UL> +<% values["contents"].each do |contents| %> + <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="<%= contents["c_name"] %>"> + <param name="Local" value="<%= contents["ref"] %>"> + </OBJECT> +<% if contents["methods"] then %> +<ul> +<% contents["methods"].each do |methods| %> + <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="<%= methods["name"] %>"> + <param name="Local" value="<%= methods["aref"] %>"> + </OBJECT> +<% end # contents["methods"] %> +</ul> +<% end %> + </LI> +<% end # values["contents"] %> +</UL> +</BODY></HTML> + EOF + + CHM_INDEX = <<-EOF +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<HTML> +<HEAD> +<meta name="GENERATOR" content="Microsoft® HTML Help Workshop 4.1"> +<!-- Sitemap 1.0 --> +</HEAD><BODY> +<OBJECT type="text/site properties"> + <param name="Foreground" value="0x80"> + <param name="Window Styles" value="0x800025"> + <param name="ImageType" value="Folder"> +</OBJECT> +<UL> +<% values["index"].each do |index| %> + <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="<%= index["name"] %>"> + <param name="Local" value="<%= index["aref"] %>"> + </OBJECT> +<% end # values["index"] %> +</UL> +</BODY></HTML> + EOF + +end + diff --git a/trunk/lib/rdoc/generator/html.rb b/trunk/lib/rdoc/generator/html.rb new file mode 100644 index 0000000000..a9e030a896 --- /dev/null +++ b/trunk/lib/rdoc/generator/html.rb @@ -0,0 +1,397 @@ +require 'fileutils' + +require 'rdoc/generator' +require 'rdoc/markup/to_html' + +## +# 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 RDoc::Generator::HTML + + include RDoc::Generator::MarkUp + + ## + # Generator 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) + RDoc::Generator::AllReferences.reset + RDoc::Generator::Method.reset + + if options.all_one_file + RDoc::Generator::HTMLInOne.new options + else + new options + end + end + + class << self + protected :new + end + + ## + # Set up a new HTML generator. Basically all we do here is load up the + # correct output temlate + + def initialize(options) #:not-new: + @options = options + load_html_template + @main_page_path = nil + end + + ## + # Build the initial indices and output objects + # based on an array of TopLevel objects containing + # the extracted information. + + def generate(toplevels) + @toplevels = toplevels + @files = [] + @classes = [] + + write_style_sheet + gen_sub_directories + build_indices + generate_html + end + + private + + ## + # Load up the HTML template specified in the options. + # If the template name contains a slash, use it literally + + def load_html_template + template = @options.template + + unless template =~ %r{/|\\} then + template = File.join('rdoc', 'generator', @options.generator.key, + template) + end + + require template + + @template = self.class.const_get @options.template.upcase + @options.template_class = @template + + rescue LoadError + $stderr.puts "Could not find HTML template '#{template}'" + exit 99 + end + + ## + # Write out the style sheet used by the main frames + + def write_style_sheet + return unless @template.constants.include? :STYLE or + @template.constants.include? 'STYLE' + + template = RDoc::TemplatePage.new @template::STYLE + + unless @options.css then + open RDoc::Generator::CSS_NAME, 'w' do |f| + values = {} + + if @template.constants.include? :FONTS or + @template.constants.include? 'FONTS' then + values["fonts"] = @template::FONTS + end + + 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 RDoc::Generator::FILE_DIR + FileUtils.mkdir_p RDoc::Generator::CLASS_DIR + rescue + $stderr.puts $!.message + exit 1 + end + + def build_indices + @files, @classes = RDoc::Generator::Context.build_indicies(@toplevels, + @options) + 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) + @file_list ||= index_to_links @files + @class_list ||= index_to_links @classes + @method_list ||= index_to_links RDoc::Generator::Method.all_methods + + list.each do |item| + next unless item.document_self + + op_file = item.path + + FileUtils.mkdir_p File.dirname(op_file) + + open op_file, 'w' do |io| + item.write_on io, @file_list, @class_list, @method_list + end + end + end + + def gen_file_index + gen_an_index @files, 'Files', @template::FILE_INDEX, "fr_file_index.html" + end + + def gen_class_index + gen_an_index(@classes, 'Classes', @template::CLASS_INDEX, + "fr_class_index.html") + end + + def gen_method_index + gen_an_index(RDoc::Generator::Method.all_methods, 'Methods', + @template::METHOD_INDEX, "fr_method_index.html") + end + + def gen_an_index(collection, title, template, filename) + template = RDoc::TemplatePage.new @template::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), + } + + 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 <tt>--main</tt> 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 + if @template.const_defined? :FRAMELESS then + main = @files.find do |file| + @main_page == file.name + end + + if main.nil? then + main = @classes.find do |klass| + main_page == klass.context.full_name + end + end + else + main = RDoc::TemplatePage.new @template::INDEX + end + + open 'index.html', 'w' do |f| + style_url = style_url '', @options.css + + 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 + + if main.respond_to? :write_on then + main.write_on f, @file_list, @class_list, @method_list, values + else + main.write_html_on f, values + end + end + end + + def index_to_links(collection) + collection.sort.map do |f| + next unless f.document_self + { "href" => f.path, "name" => f.index_name } + end.compact + end + + ## + # Returns the url of the main page + + def main_url + @main_page = @options.main_page + @main_page_ref = nil + + if @main_page then + @main_page_ref = RDoc::Generator::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 { |context| context.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 RDoc::Generator::HTMLInOne < RDoc::Generator::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 + @hyperlinks = {} + + build_indices + generate_xml + end + + ## + # Generate: + # + # * a list of RDoc::Generator::File objects for each TopLevel object. + # * a list of RDoc::Generator::Class 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 + @files, @classes = RDoc::Generator::Context.build_indices(@toplevels, + @options) + 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 = 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::Generator::Method.all_methods, 'Methods') + end + + def gen_an_index(collection, title) + return { + "entries" => index_to_links(collection), + 'list_title' => title, + 'index_url' => main_url, + } + end + +end + diff --git a/trunk/lib/rdoc/generator/html/frameless.rb b/trunk/lib/rdoc/generator/html/frameless.rb new file mode 100644 index 0000000000..2af890ce04 --- /dev/null +++ b/trunk/lib/rdoc/generator/html/frameless.rb @@ -0,0 +1,795 @@ +require 'rdoc/generator/html' +require 'rdoc/generator/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 <ged@FaerieMUD.org> +# +# 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::Generator::HTML::FRAMELESS + + FRAMELESS = true + + FONTS = "Verdana,Arial,Helvetica,sans-serif" + + STYLE = <<-EOF +body { + font-family: #{FONTS}; + 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; +} + +:link, :visited { + background: #eef; + color: #039; + text-decoration: none; +} + +:link:hover, :visited:hover { + background: #039; + color: #eef; +} + +/* Override the base stylesheet's Anchor inside a table cell */ +td > :link, td > :visited { + background: transparent; + color: #039; + text-decoration: none; +} + +/* and inside a section title */ +.section-title > :link, .section-title > :visited { + background: transparent; + color: #eee; + text-decoration: none; +} + +/* === Structural elements =================================== */ + +.index { + margin: 0; + margin-left: -40px; + padding: 0; + font-size: 90%; +} + +.index :link, .index :visited { + margin-left: 0.7em; +} + +.index .section-bar { + margin-left: 0px; + padding-left: 0.7em; + background: #ccc; + font-size: small; +} + +#classHeader, #fileHeader { + width: auto; + color: white; + padding: 0.5em 1.5em 0.5em 1.5em; + margin: 0; + margin-left: -40px; + border-bottom: 3px solid #006; +} + +#classHeader :link, #fileHeader :link, +#classHeader :visited, #fileHeader :visited { + background: inherit; + color: white; +} + +#classHeader td, #fileHeader td { + background: inherit; + color: white; +} + +#fileHeader { + background: #057; +} + +#classHeader { + background: #048; +} + +.class-name-in-header { + font-size: 180%; + font-weight: bold; +} + +#bodyContent { + padding: 0 1.5em 0 1.5em; +} + +#description { + padding: 0.5em 1.5em; + background: #efefef; + border: 1px dotted #999; +} + +#description h1, #description h2, #description h3, +#description h4, #description h5, #description h6 { + color: #125; + background: transparent; +} + +#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 -------------------- */ + +:link.source-toggle, :visited.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 + + ## + # Header template + + XHTML_PREAMBLE = <<-EOF +<?xml version="1.0" encoding="<%= values["charset"] %>"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + EOF + + HEADER = XHTML_PREAMBLE + <<-EOF +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <meta http-equiv="Content-Script-Type" content="text/javascript" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> + <script type="text/javascript"> + // <![CDATA[ + + function popupCode( url ) { + window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400") + } + + function toggleCode( id ) { + if ( document.getElementById ) + elem = document.getElementById( id ); + else if ( document.all ) + elem = eval( "document.all." + id ); + else + return false; + + elemStyle = elem.style; + + if ( elemStyle.display != "block" ) { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + + return true; + } + + // Make codeblocks hidden by default + document.writeln( "<style type=\\"text/css\\">div.method-source-code { display: none }</style>" ) + + // ]]> + </script> + +</head> +<body> +EOF + + ## + # Context content template + + CONTEXT_CONTENT = %{ +} + + ## + # Footer template + + FOOTER = <<-EOF + <div id="popupmenu" class="index"> + <ul> + <li class="index-entries section-bar">Classes + <ul> +<% values["class_list"].each do |klass| %> + <li><a href="<%= klass["href"] %>"><%= klass["name"] %></a> +<% end %> + </ul> + </li> + + <li class="index-entries section-bar">Methods + <ul> +<% values["method_list"].each do |file| %> + <li><a href="<%= file["href"] %>"><%= file["name"] %></a> +<% end %> + </ul> + </li> + + <li class="index-entries section-bar">Files + <ul> +<% values["file_list"].each do |file| %> + <li><a href="<%= file["href"] %>"><%= file["name"] %></a> +<% end %> + </ul> + </li> + </ul> + </li> + +</body> +</html> + EOF + + ## + # File page header template + + FILE_PAGE = <<-EOF + <div id="fileHeader"> + <h1><%= values["short_name"] %></h1> + + <table class="header-table"> + <tr class="top-aligned-row"> + <td><strong>Path:</strong></td> + <td><%= values["full_path"] %> +<% if values["cvsurl"] then %> + (<a href="<%= values["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + </td> + </tr> + + <tr class="top-aligned-row"> + <td><strong>Last Update:</strong></td> + <td><%= values["dtm_modified"] %></td> + </tr> + </table> + </div> + EOF + + ## + # Class page header template + + CLASS_PAGE = <<-EOF + <div id="classHeader"> + <table class="header-table"> + <tr class="top-aligned-row"> + <td><strong><%= values["classmod"] %></strong></td> + <td class="class-name-in-header"><%= values["full_name"] %></td> + </tr> + + <tr class="top-aligned-row"> + <td><strong>In:</strong></td> + <td> +<% values["infiles"].each do |infiles| %> +<% if infiles["full_path_url"] then %> + <a href="<%= infiles["full_path_url"] %>"> +<% end %> + <%= infiles["full_path"] %> +<% if infiles["full_path_url"] then %> + </a> +<% end %> +<% if infiles["cvsurl"] then %> + (<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + <br /> +<% end %><%# values["infiles"] %> + </td> + </tr> + +<% if values["parent"] then %> + <tr class="top-aligned-row"> + <td><strong>Parent:</strong></td> + <td> +<% if values["par_url"] then %> + <a href="<%= values["par_url"] %>"> +<% end %> + <%= values["parent"] %> +<% if values["par_url"] then %> + </a> +<% end %> + </td> + </tr> +<% end %> + </table> + </div> + EOF + + ## + # Method list template + + METHOD_LIST = <<-EOF + + <div id="contextContent"> +<% if values["diagram"] then %> + <div id="diagram"> + <%= values["diagram"] %> + </div> +<% end %> + +<% if values["description"] then %> + <div id="description"> + <%= values["description"] %> + </div> +<% end %> + +<% if values["requires"] then %> + <div id="requires-list"> + <h3 class="section-bar">Required files</h3> + + <div class="name-list"> +<% values["requires"].each do |requires| %> + <%= href requires["aref"], requires["name"] %> +<% end %><%# values["requires"] %> + </div> + </div> +<% end %> + +<% if values["toc"] then %> + <div id="contents-list"> + <h3 class="section-bar">Contents</h3> + <ul> +<% values["toc"].each do |toc| %> + <li><a href="#<%= values["href"] %>"><%= values["secname"] %></a></li> +<% end %><%# values["toc"] %> + </ul> +<% end %> + </div> + +<% if values["methods"] then %> + <div id="method-list"> + <h3 class="section-bar">Methods</h3> + + <div class="name-list"> +<% values["methods"].each do |methods| %> + <%= href methods["aref"], methods["name"] %> +<% end %><%# values["methods"] %> + </div> + </div> +<% end %> + + </div> + + + <!-- if includes --> +<% if values["includes"] then %> + <div id="includes"> + <h3 class="section-bar">Included Modules</h3> + + <div id="includes-list"> +<% values["includes"].each do |includes| %> + <span class="include-name"><%= href includes["aref"], includes["name"] %></span> +<% end %><%# values["includes"] %> + </div> + </div> +<% end %> + +<% values["sections"].each do |sections| %> + <div id="section"> +<% if sections["sectitle"] then %> + <h2 class="section-title"><a name="<%= sections["secsequence"] %>"><%= sections["sectitle"] %></a></h2> +<% if sections["seccomment"] then %> + <div class="section-comment"> + <%= sections["seccomment"] %> + </div> +<% end %> +<% end %> + +<% if values["classlist"] then %> + <div id="class-list"> + <h3 class="section-bar">Classes and Modules</h3> + + <%= values["classlist"] %> + </div> +<% end %> + +<% if values["constants"] then %> + <div id="constants-list"> + <h3 class="section-bar">Constants</h3> + + <div class="name-list"> + <table summary="Constants"> +<% values["constants"].each do |constants| %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= constants["name"] %></td> + <td>=</td> + <td class="context-item-value"><%= constants["value"] %></td> +<% if values["desc"] then %> + <td width="3em"> </td> + <td class="context-item-desc"><%= constants["desc"] %></td> +<% end %> + </tr> +<% end %><%# values["constants"] %> + </table> + </div> + </div> +<% end %> + +<% if values["aliases"] then %> + <div id="aliases-list"> + <h3 class="section-bar">External Aliases</h3> + + <div class="name-list"> + <table summary="aliases"> +<% values["aliases"].each do |aliases| $stderr.puts({ :aliases => aliases }.inspect) %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= values["old_name"] %></td> + <td>-></td> + <td class="context-item-value"><%= values["new_name"] %></td> + </tr> +<% if values["desc"] then %> + <tr class="top-aligned-row context-row"> + <td> </td> + <td colspan="2" class="context-item-desc"><%= values["desc"] %></td> + </tr> +<% end %> +<% end %><%# values["aliases"] %> + </table> + </div> + </div> +<% end %> + + +<% if values["attributes"] then %> + <div id="attribute-list"> + <h3 class="section-bar">Attributes</h3> + + <div class="name-list"> + <table> +<% values["attributes"].each do |attributes| $stderr.puts({ :attributes => attributes }.inspect) %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= values["name"] %></td> +<% if values["rw"] then %> + <td class="context-item-value"> [<%= values["rw"] %>] </td> +<% end %> +<% unless values["rw"] then %> + <td class="context-item-value"> </td> +<% end %> + <td class="context-item-desc"><%= values["a_desc"] %></td> + </tr> +<% end %><%# values["attributes"] %> + </table> + </div> + </div> +<% end %> + + <!-- if method_list --> +<% if sections["method_list"] then %> + <div id="methods"> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> + <h3 class="section-bar"><%= method_list["type"] %> <%= method_list["category"] %> methods</h3> + +<% method_list["methods"].each do |methods| %> + <div id="method-<%= methods["aref"] %>" class="method-detail"> + <a name="<%= methods["aref"] %>"></a> + + <div class="method-heading"> +<% if methods["codeurl"] then %> + <a href="<%= methods["codeurl"] %>" target="Code" class="method-signature" + onclick="popupCode('<%= methods["codeurl"] %>');return false;"> +<% end %> +<% if methods["sourcecode"] then %> + <a href="#<%= methods["aref"] %>" class="method-signature"> +<% end %> +<% if methods["callseq"] then %> + <span class="method-name"><%= methods["callseq"] %></span> +<% end %> +<% unless methods["callseq"] then %> + <span class="method-name"><%= methods["name"] %></span><span class="method-args"><%= methods["params"] %></span> +<% end %> +<% if methods["codeurl"] then %> + </a> +<% end %> +<% if methods["sourcecode"] then %> + </a> +<% end %> + </div> + + <div class="method-description"> +<% if methods["m_desc"] then %> + <%= methods["m_desc"] %> +<% end %> +<% if methods["sourcecode"] then %> + <p><a class="source-toggle" href="#" + onclick="toggleCode('<%= methods["aref"] %>-source');return false;">[Source]</a></p> + <div class="method-source-code" id="<%= methods["aref"] %>-source"> +<pre> +<%= methods["sourcecode"] %> +</pre> + </div> +<% end %> + </div> + </div> + +<% end %><%# method_list["methods"] %> +<% end %> +<% end %><%# sections["method_list"] %> + + </div> +<% end %> +<% end %><%# values["sections"] %> + EOF + + ## + # Body template + + BODY = HEADER + %{ + +<%= template_include %> <!-- banner header --> + + <div id="bodyContent"> + +} + METHOD_LIST + %{ + + </div> + +} + FOOTER + + ## + # Source code template + + SRC_PAGE = XHTML_PREAMBLE + <<-EOF +<html> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> +</head> +<body class="standalone-code"> + <pre><%= values["code"] %></pre> +</body> +</html> + EOF + + ## + # Index file templates + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = XHTML_PREAMBLE + <<-EOF +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["list_title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" /> + <base target="docwin" /> +</head> +<body> +<div class="index"> + <h1 class="section-bar"><%= values["list_title"] %></h1> + <div class="index-entries"> +<% values["entries"].each do |entries| %> + <a href="<%= entries["href"] %>"><%= entries["name"] %></a><br /> +<% end %><%# values["entries"] %> + </div> +</div> +</body> +</html> + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF +<?xml version="1.0" encoding="<%= values["charset"] %>"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> +</head> +<frameset rows="20%, 80%"> + <frameset cols="45%,55%"> + <frame src="fr_class_index.html" name="Classes" /> + <frame src="fr_method_index.html" name="Methods" /> + </frameset> + <frame src="<%= values["initial_page"] %>" name="docwin" /> +</frameset> +</html> + EOF + +end + diff --git a/trunk/lib/rdoc/generator/html/hefss.rb b/trunk/lib/rdoc/generator/html/hefss.rb new file mode 100644 index 0000000000..e186a40384 --- /dev/null +++ b/trunk/lib/rdoc/generator/html/hefss.rb @@ -0,0 +1,414 @@ +require 'rdoc/generator/html' +require 'rdoc/generator/html/html' + +module RDoc::Generator::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 +<html><head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> + <script type="text/javascript" language="JavaScript"> + <!-- + function popCode(url) { + parent.frames.source.location = url + } + //--> + </script> +</head> +<body bgcolor="#BBBBBB"> + +<%= template_include %> <!-- banner header --> + +<% if values["diagram"] then %> +<table width="100%"><tr><td align="center"> +<%= values["diagram"] %> +</td></tr></table> +<% end %> + +<% if values["description"] then %> +<div class="description"><%= values["description"] %></div> +<% end %> + +<% if values["requires"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Required files</td></tr> +</table><br /> +<div class="name-list"> +<% values["requires"].each do |requires| %> +<%= href requires["aref"], requires["name"] %> +<% end %><%# values["requires"] %> +<% end %> +</div> + +<% 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 %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Subroutines and Functions</td></tr> +</table><br /> +<div class="name-list"> +<% method_list["methods"].each do |methods| %> +<a href="<%= methods["codeurl"] %>" target="source"><%= methods["name"] %></a> +<% end %><%# values["methods"] %> +</div> +<% end %> +<% end %><%# values["method_list"] %> +<% end %> + +<% if sections["attributes"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Arguments</td></tr> +</table><br /> +<table cellspacing="5"> +<% sections["attributes"].each do |attributes| %> + <tr valign="top"> +<% if attributes["rw"] then %> + <td align="center" class="attr-rw"> [<%= attributes["rw"] %>] </td> +<% end %> +<% unless attributes["rw"] then %> + <td></td> +<% end %> + <td class="attr-name"><%= attributes["name"] %></td> + <td><%= attributes["a_desc"] %></td> + </tr> +<% end %><%# values["attributes"] %> +</table> +<% end %> +<% end %><%# values["sections"] %> +<% end %> + +<% if values["classlist"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Modules</td></tr> +</table><br /> +<%= values["classlist"] %><br /> +<% end %> + + <%= template_include %> <!-- method descriptions --> + +</body> +</html> + EOF + + FILE_PAGE = <<-EOF +<table width="100%"> + <tr class="title-row"> + <td><table width="100%"><tr> + <td class="big-title-font" colspan="2"><font size="-3"><b>File</b><br /></font><%= values["short_name"] %></td> + <td align="right"><table cellspacing="0" cellpadding="2"> + <tr> + <td class="small-title-font">Path:</td> + <td class="small-title-font"><%= values["full_path"] %> +<% if values["cvsurl"] then %> + (<a href="<%= values["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + </td> + </tr> + <tr> + <td class="small-title-font">Modified:</td> + <td class="small-title-font"><%= values["dtm_modified"] %></td> + </tr> + </table> + </td></tr></table></td> + </tr> +</table><br /> + EOF + + CLASS_PAGE = <<-EOF +<table width="100%" border="0" cellspacing="0"> + <tr class="title-row"> + <td class="big-title-font"> + <font size="-3"><b><%= values["classmod"] %></b><br /></font><%= values["full_name"] %> + </td> + <td align="right"> + <table cellspacing="0" cellpadding="2"> + <tr valign="top"> + <td class="small-title-font">In:</td> + <td class="small-title-font"> +<% values["infiles"].each do |infiles| %> +<%= href infiles["full_path_url"], infiles["full_path"] %> +<% if infiles["cvsurl"] then %> + (<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> +<% end %><%# values["infiles"] %> + </td> + </tr> +<% if values["parent"] then %> + <tr> + <td class="small-title-font">Parent:</td> + <td class="small-title-font"> +<% if values["par_url"] then %> + <a href="<%= values["par_url"] %>" class="cyan"> +<% end %> +<%= values["parent"] %> +<% if values["par_url"] then %> + </a> +<% end %> + </td> + </tr> +<% end %> + </table> + </td> + </tr> +</table><br /> + EOF + + METHOD_LIST = <<-EOF +<% if values["includes"] then %> +<div class="tablesubsubtitle">Uses</div><br /> +<div class="name-list"> +<% values["includes"].each do |includes| %> + <span class="method-name"><%= href includes["aref"], includes["name"] %></span> +<% end %><%# values["includes"] %> +</div> +<% 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 %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle"><%= method_list["type"] %> <%= method_list["category"] %> methods</td></tr> +</table> +<% method_list["methods"].each do |methods| %> +<table width="100%" cellspacing="0" cellpadding="5" border="0"> +<tr><td class="methodtitle"> +<a name="<%= methods["aref"] %>"> +<b><%= methods["name"] %></b><%= methods["params"] %> +<% if methods["codeurl"] then %> +<a href="<%= methods["codeurl"] %>" target="source" class="srclink">src</a> +<% end %> +</a></td></tr> +</table> +<% if method_list["m_desc"] then %> +<div class="description"> +<%= method_list["m_desc"] %> +</div> +<% end %> +<% end %><%# method_list["methods"] %> +<% end %> +<% end %><%# sections["method_list"] %> +<% end %> +<% end %><%# values["sections"] %> +<% end %> + EOF + + SRC_PAGE = <<-EOF +<html> +<head><title><%= values["title"] %></title> +<meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +<style type="text/css"> + .kw { color: #3333FF; font-weight: bold } + .cmt { color: green; font-style: italic } + .str { color: #662222; font-style: italic } + .re { color: #662222; } +.ruby-comment { color: green; font-style: italic } +.ruby-constant { color: #4433aa; font-weight: bold; } +.ruby-identifier { color: #222222; } +.ruby-ivar { color: #2233dd; } +.ruby-keyword { color: #3333FF; font-weight: bold } +.ruby-node { color: #777777; } +.ruby-operator { color: #111111; } +.ruby-regexp { color: #662222; } +.ruby-value { color: #662222; font-style: italic } +</style> +</head> +<body bgcolor="#BBBBBB"> +<pre><%= values["code"] %></pre> +</body> +</html> + EOF + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = <<-EOF +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +<style type="text/css"> +<!-- + body { +background-color: #bbbbbb; + font-family: #{FONTS}; + font-size: 11px; + font-style: normal; + line-height: 14px; + color: #000040; + } +div.banner { + background: #bbbbcc; + color: white; + padding: 1; + margin: 0; + font-size: 90%; + font-weight: bold; + line-height: 1.1; + text-align: center; + width: 100%; +} + +--> +</style> +<base target="docwin"> +</head> +<body> +<div class="banner"><%= values["list_title"] %></div> +<% values["entries"].each do |entries| %> +<a href="<%= entries["href"] %>"><%= entries["name"] %></a><br /> +<% end %><%# values["entries"] %> +</body></html> + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF +<html> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +</head> + +<frameset cols="20%,*"> + <frameset rows="15%,35%,50%"> + <frame src="fr_file_index.html" title="Files" name="Files"> + <frame src="fr_class_index.html" name="Modules"> + <frame src="fr_method_index.html" name="Subroutines and Functions"> + </frameset> + <frameset rows="80%,20%"> + <frame src="<%= values["initial_page"] %>" name="docwin"> + <frame src="blank.html" name="source"> + </frameset> + <noframes> + <body bgcolor="#BBBBBB"> + Click <a href="html/index.html">here</a> for a non-frames + version of this page. + </body> + </noframes> +</frameset> + +</html> + EOF + + # Blank page to use as a target + BLANK = %{ +<html><body bgcolor="#BBBBBB"></body></html> +} + + def write_extra_pages + template = TemplatePage.new(BLANK) + File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } + end + +end + diff --git a/trunk/lib/rdoc/generator/html/html.rb b/trunk/lib/rdoc/generator/html/html.rb new file mode 100644 index 0000000000..1ab90c6264 --- /dev/null +++ b/trunk/lib/rdoc/generator/html/html.rb @@ -0,0 +1,698 @@ +require 'rdoc/generator/html' +require 'rdoc/generator/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 visibility of each method's source with each click on the +# '[source]' link. +# +# == Authors +# +# * Michael Granger <ged@FaerieMUD.org> +# +# 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::Generator::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 +<?xml version="1.0" encoding="<%= values["charset"] %>"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + EOF + + HEADER = XHTML_PREAMBLE + <<-EOF +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <meta http-equiv="Content-Script-Type" content="text/javascript" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> + <script type="text/javascript"> + // <![CDATA[ + + function popupCode( url ) { + window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400") + } + + function toggleCode( id ) { + if ( document.getElementById ) + elem = document.getElementById( id ); + else if ( document.all ) + elem = eval( "document.all." + id ); + else + return false; + + elemStyle = elem.style; + + if ( elemStyle.display != "block" ) { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + + return true; + } + + // Make codeblocks hidden by default + document.writeln( "<style type=\\"text/css\\">div.method-source-code { display: none }</style>" ) + + // ]]> + </script> + +</head> +<body> +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 +<div id="validator-badges"> + <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> +</div> + +</body> +</html> + 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 + <div id="fileHeader"> + <h1><%= values["short_name"] %></h1> + <table class="header-table"> + <tr class="top-aligned-row"> + <td><strong>Path:</strong></td> + <td><%= values["full_path"] %> +<% if values["cvsurl"] then %> + (<a href="<%= values["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + </td> + </tr> + <tr class="top-aligned-row"> + <td><strong>Last Update:</strong></td> + <td><%= values["dtm_modified"] %></td> + </tr> + </table> + </div> + 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 + <div id="classHeader"> + <table class="header-table"> + <tr class="top-aligned-row"> + <td><strong><%= values["classmod"] %></strong></td> + <td class="class-name-in-header"><%= values["full_name"] %></td> + </tr> + <tr class="top-aligned-row"> + <td><strong>In:</strong></td> + <td> +<% values["infiles"].each do |infiles| %> +<% if infiles["full_path_url"] then %> + <a href="<%= infiles["full_path_url"] %>"> +<% end %> + <%= infiles["full_path"] %> +<% if infiles["full_path_url"] then %> + </a> +<% end %> +<% if infiles["cvsurl"] then %> + (<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + <br /> +<% end %><%# values["infiles"] %> + </td> + </tr> + +<% if values["parent"] then %> + <tr class="top-aligned-row"> + <td><strong>Parent:</strong></td> + <td> +<% if values["par_url"] then %> + <a href="<%= values["par_url"] %>"> +<% end %> + <%= values["parent"] %> +<% if values["par_url"] then %> + </a> +<% end %> + </td> + </tr> +<% end %> + </table> + </div> + EOF + +##################################################################### +### M E T H O D L I S T T E M P L A T E +##################################################################### + + METHOD_LIST = <<-EOF + <div id="contextContent"> +<% if values["diagram"] then %> + <div id="diagram"> + <%= values["diagram"] %> + </div> +<% end + + if values["description"] then %> + <div id="description"> + <%= values["description"] %> + </div> +<% end + + if values["requires"] then %> + <div id="requires-list"> + <h3 class="section-bar">Required files</h3> + + <div class="name-list"> +<% values["requires"].each do |requires| %> + <%= href requires["aref"], requires["name"] %> +<% end %><%# values["requires"] %> + </div> + </div> +<% end + + if values["toc"] then %> + <div id="contents-list"> + <h3 class="section-bar">Contents</h3> + <ul> +<% values["toc"].each do |toc| %> + <li><a href="#<%= toc["href"] %>"><%= toc["secname"] %></a></li> +<% end %><%# values["toc"] %> + </ul> +<% end %> + </div> + +<% if values["methods"] then %> + <div id="method-list"> + <h3 class="section-bar">Methods</h3> + + <div class="name-list"> +<% values["methods"].each do |methods| %> + <%= href methods["aref"], methods["name"] %> +<% end %><%# values["methods"] %> + </div> + </div> +<% end %> + </div> + + <!-- if includes --> +<% if values["includes"] then %> + <div id="includes"> + <h3 class="section-bar">Included Modules</h3> + + <div id="includes-list"> +<% values["includes"].each do |includes| %> + <span class="include-name"><%= href includes["aref"], includes["name"] %></span> +<% end %><%# values["includes"] %> + </div> + </div> +<% end + + values["sections"].each do |sections| %> + <div id="section"> +<% if sections["sectitle"] then %> + <h2 class="section-title"><a name="<%= sections["secsequence"] %>"><%= sections["sectitle"] %></a></h2> +<% if sections["seccomment"] then %> + <div class="section-comment"> + <%= sections["seccomment"] %> + </div> +<% end + end + + if sections["classlist"] then %> + <div id="class-list"> + <h3 class="section-bar">Classes and Modules</h3> + + <%= sections["classlist"] %> + </div> +<% end + + if sections["constants"] then %> + <div id="constants-list"> + <h3 class="section-bar">Constants</h3> + + <div class="name-list"> + <table summary="Constants"> +<% sections["constants"].each do |constants| %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= constants["name"] %></td> + <td>=</td> + <td class="context-item-value"><%= constants["value"] %></td> +<% if sections["desc"] then %> + <td width="3em"> </td> + <td class="context-item-desc"><%= constants["desc"] %></td> +<% end %> + </tr> +<% end %><%# sections["constants"] %> + </table> + </div> + </div> +<% end + + if sections["aliases"] then %> + <div id="aliases-list"> + <h3 class="section-bar">External Aliases</h3> + + <div class="name-list"> + <table summary="aliases"> +<% sections["aliases"].each do |aliases| %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= aliases["old_name"] %></td> + <td>-></td> + <td class="context-item-value"><%= aliases["new_name"] %></td> + </tr> +<% if aliases["desc"] then %> + <tr class="top-aligned-row context-row"> + <td> </td> + <td colspan="2" class="context-item-desc"><%= aliases["desc"] %></td> + </tr> +<% end + end %><%# sections["aliases"] %> + </table> + </div> + </div> +<% end %> + +<% if sections["attributes"] then %> + <div id="attribute-list"> + <h3 class="section-bar">Attributes</h3> + + <div class="name-list"> + <table> +<% sections["attributes"].each do |attribute| %> + <tr class="top-aligned-row context-row"> + <td class="context-item-name"><%= attribute["name"] %></td> +<% if attribute["rw"] then %> + <td class="context-item-value"> [<%= attribute["rw"] %>] </td> +<% end + unless attribute["rw"] then %> + <td class="context-item-value"> </td> +<% end %> + <td class="context-item-desc"><%= attribute["a_desc"] %></td> + </tr> +<% end %><%# sections["attributes"] %> + </table> + </div> + </div> +<% end %> + + <!-- if method_list --> +<% if sections["method_list"] then %> + <div id="methods"> +<% sections["method_list"].each do |method_list| + if method_list["methods"] then %> + <h3 class="section-bar"><%= method_list["type"] %> <%= method_list["category"] %> methods</h3> + +<% method_list["methods"].each do |methods| %> + <div id="method-<%= methods["aref"] %>" class="method-detail"> + <a name="<%= methods["aref"] %>"></a> + + <div class="method-heading"> +<% if methods["codeurl"] then %> + <a href="<%= methods["codeurl"] %>" target="Code" class="method-signature" + onclick="popupCode('<%= methods["codeurl"] %>');return false;"> +<% end + if methods["sourcecode"] then %> + <a href="#<%= methods["aref"] %>" class="method-signature"> +<% end + if methods["callseq"] then %> + <span class="method-name"><%= methods["callseq"] %></span> +<% end + unless methods["callseq"] then %> + <span class="method-name"><%= methods["name"] %></span><span class="method-args"><%= methods["params"] %></span> +<% end + if methods["codeurl"] then %> + </a> +<% end + if methods["sourcecode"] then %> + </a> +<% end %> + </div> + + <div class="method-description"> +<% if methods["m_desc"] then %> + <%= methods["m_desc"] %> +<% end + if methods["sourcecode"] then %> + <p><a class="source-toggle" href="#" + onclick="toggleCode('<%= methods["aref"] %>-source');return false;">[Source]</a></p> + <div class="method-source-code" id="<%= methods["aref"] %>-source"> +<pre> +<%= methods["sourcecode"] %> +</pre> + </div> +<% end %> + </div> + </div> + +<% end %><%# method_list["methods"] %><% + end + end %><%# sections["method_list"] %> + + </div> +<% end %> +<% end %><%# values["sections"] %> + EOF + +##################################################################### +### B O D Y T E M P L A T E +##################################################################### + + BODY = HEADER + %{ + +<%= template_include %> <!-- banner header --> + + <div id="bodyContent"> + +} + METHOD_LIST + %{ + + </div> + +} + FOOTER + +##################################################################### +### S O U R C E C O D E T E M P L A T E +##################################################################### + + SRC_PAGE = XHTML_PREAMBLE + <<-EOF +<html> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> +</head> +<body class="standalone-code"> + <pre><%= values["code"] %></pre> +</body> +</html> + 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"] %> + + --> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["list_title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" /> + <base target="docwin" /> +</head> +<body> +<div id="index"> + <h1 class="section-bar"><%= values["list_title"] %></h1> + <div id="index-entries"> +<% values["entries"].each do |entries| %> + <a href="<%= entries["href"] %>"><%= entries["name"] %></a><br /> +<% end %><%# values["entries"] %> + </div> +</div> +</body> +</html> + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF +<?xml version="1.0" encoding="<%= values["charset"] %>"?> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> + +<!-- + + <%= values["title"] %> + + --> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> +</head> +<frameset rows="20%, 80%"> + <frameset cols="25%,35%,45%"> + <frame src="fr_file_index.html" title="Files" name="Files" /> + <frame src="fr_class_index.html" name="Classes" /> + <frame src="fr_method_index.html" name="Methods" /> + </frameset> + <frame src="<%= values["initial_page"] %>" name="docwin" /> +</frameset> +</html> + EOF + +end + diff --git a/trunk/lib/rdoc/generator/html/kilmer.rb b/trunk/lib/rdoc/generator/html/kilmer.rb new file mode 100644 index 0000000000..6479abaf8b --- /dev/null +++ b/trunk/lib/rdoc/generator/html/kilmer.rb @@ -0,0 +1,418 @@ +require 'rdoc/generator/html' + +module RDoc::Generator::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 +<html><head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> + <link rel="stylesheet" href="<%= values["style_url"] %>" type="text/css" media="screen" /> + <script type="text/javascript" language="JavaScript"> + <!-- + function popCode(url) { + parent.frames.source.location = url + } + //--> + </script> +</head> +<body bgcolor="white"> + +<%= template_include %> <!-- banner header --> + +<% if values["diagram"] then %> +<table width="100%"><tr><td align="center"> +<%= values["diagram"] %> +</td></tr></table> +<% end %> + +<% if values["description"] then %> +<div class="description"><%= values["description"] %></div> +<% end %> + +<% if values["requires"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Required files</td></tr> +</table><br /> +<div class="name-list"> +<% values["requires"].each do |requires| %> +<%= href requires["aref"], requires["name"] %> +<% end %><%# values["requires"] %> +<% end %> +</div> + +<% if values["methods"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Methods</td></tr> +</table><br /> +<div class="name-list"> +<% values["methods"].each do |methods| %> +<%= href methods["aref"], methods["name"] %>, +<% end %><%# values["methods"] %> +</div> +<% end %> + + +<% values["sections"].each do |sections| %> + <div id="section"> +<% if sections["sectitle"] then %> + <h2 class="section-title"><a name="<%= sections["secsequence"] %>"><%= sections["sectitle"] %></a></h2> +<% if sections["seccomment"] then %> + <div class="section-comment"> + <%= sections["seccomment"] %> + </div> +<% end %> +<% end %> + +<% if sections["attributes"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Attributes</td></tr> +</table><br /> +<table cellspacing="5"> +<% sections["attributes"].each do |attributes| %> + <tr valign="top"> +<% if attributes["rw"] then %> + <td align="center" class="attr-rw"> [<%= attributes["rw"] %>] </td> +<% end %> +<% unless attributes["rw"] then %> + <td></td> +<% end %> + <td class="attr-name"><%= attributes["name"] %></td> + <td><%= attributes["a_desc"] %></td> + </tr> +<% end %><%# sections["attributes"] %> +</table> +<% end %> + +<% if sections["classlist"] then %> +<table cellpadding="5" width="100%"> +<tr><td class="tablesubtitle">Classes and Modules</td></tr> +</table><br /> +<%= sections["classlist"] %><br /> +<% end %> + + <%= template_include %> <!-- method descriptions --> + +<% end %><%# values["sections"] %> + +</body> +</html> + EOF + + FILE_PAGE = <<-EOF +<table width="100%"> + <tr class="title-row"> + <td><table width="100%"><tr> + <td class="big-title-font" colspan="2"><font size="-3"><b>File</b><br /></font><%= values["short_name"] %></td> + <td align="right"><table cellspacing="0" cellpadding="2"> + <tr> + <td class="small-title-font">Path:</td> + <td class="small-title-font"><%= values["full_path"] %> +<% if values["cvsurl"] then %> + (<a href="<%= values["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> + </td> + </tr> + <tr> + <td class="small-title-font">Modified:</td> + <td class="small-title-font"><%= values["dtm_modified"] %></td> + </tr> + </table> + </td></tr></table></td> + </tr> +</table><br /> + EOF + + CLASS_PAGE = <<-EOF +<table width="100%" border="0" cellspacing="0"> + <tr class="title-row"> + <td class="big-title-font"> + <font size="-3"><b><%= values["classmod"] %></b><br /></font><%= values["full_name"] %> + </td> + <td align="right"> + <table cellspacing="0" cellpadding="2"> + <tr valign="top"> + <td class="small-title-font">In:</td> + <td class="small-title-font"> +<% values["infiles"].each do |infiles| %> +<%= href infiles["full_path_url"], infiles["full_path"] %> +<% if infiles["cvsurl"] then %> + (<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>) +<% end %> +<% end %><%# values["infiles"] %> + </td> + </tr> +<% if values["parent"] then %> + <tr> + <td class="small-title-font">Parent:</td> + <td class="small-title-font"> +<% if values["par_url"] then %> + <a href="<%= values["par_url"] %>" class="cyan"> +<% end %> +<%= values["parent"] %> +<% if values["par_url"] then %> + </a> +<% end %> + </td> + </tr> +<% end %> + </table> + </td> + </tr> +</table><br /> + EOF + + METHOD_LIST = <<-EOF +<% if values["includes"] then %> +<div class="tablesubsubtitle">Included modules</div><br /> +<div class="name-list"> +<% values["includes"].each do |includes| %> + <span class="method-name"><%= href includes["aref"], includes["name"] %></span> +<% end %><%# values["includes"] %> +</div> +<% end %> + +<% if values["method_list"] then %> +<% values["method_list"].each do |method_list| $stderr.puts({ :method_list => method_list }.inspect) %> +<% if values["methods"] then %> +<table cellpadding=5 width="100%"> +<tr><td class="tablesubtitle"><%= values["type"] %> <%= values["category"] %> methods</td></tr> +</table> +<% values["methods"].each do |methods| $stderr.puts({ :methods => methods }.inspect) %> +<table width="100%" cellspacing="0" cellpadding="5" border="0"> +<tr><td class="methodtitle"> +<a name="<%= values["aref"] %>"> +<% if values["callseq"] then %> +<b><%= values["callseq"] %></b> +<% end %> +<% unless values["callseq"] then %> + <b><%= values["name"] %></b><%= values["params"] %> +<% end %> +<% if values["codeurl"] then %> +<a href="<%= values["codeurl"] %>" target="source" class="srclink">src</a> +<% end %> +</a></td></tr> +</table> +<% if values["m_desc"] then %> +<div class="description"> +<%= values["m_desc"] %> +</div> +<% end %> +<% if values["aka"] then %> +<div class="aka"> +This method is also aliased as +<% values["aka"].each do |aka| $stderr.puts({ :aka => aka }.inspect) %> +<a href="<%= values["aref"] %>"><%= values["name"] %></a> +<% end %><%# values["aka"] %> +</div> +<% end %> +<% if values["sourcecode"] then %> +<pre class="source"> +<%= values["sourcecode"] %> +</pre> +<% end %> +<% end %><%# values["methods"] %> +<% end %> +<% end %><%# values["method_list"] %> +<% end %> + EOF + + SRC_PAGE = <<-EOF +<html> +<head><title><%= values["title"] %></title> +<meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +<style type="text/css"> +.ruby-comment { color: green; font-style: italic } +.ruby-constant { color: #4433aa; font-weight: bold; } +.ruby-identifier { color: #222222; } +.ruby-ivar { color: #2233dd; } +.ruby-keyword { color: #3333FF; font-weight: bold } +.ruby-node { color: #777777; } +.ruby-operator { color: #111111; } +.ruby-regexp { color: #662222; } +.ruby-value { color: #662222; font-style: italic } + .kw { color: #3333FF; font-weight: bold } + .cmt { color: green; font-style: italic } + .str { color: #662222; font-style: italic } + .re { color: #662222; } +</style> +</head> +<body bgcolor="white"> +<pre><%= values["code"] %></pre> +</body> +</html> + EOF + + FR_INDEX_BODY = %{ +<%= template_include %> +} + + FILE_INDEX = <<-EOF +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +<style> +<!-- +body { + background-color: #ddddff; + font-family: #{FONTS}; + font-size: 11px; + font-style: normal; + line-height: 14px; + color: #000040; +} + +div.banner { + background: #0000aa; + color: white; + padding: 1; + margin: 0; + font-size: 90%; + font-weight: bold; + line-height: 1.1; + text-align: center; + width: 100%; +} + +--> +</style> +<base target="docwin"> +</head> +<body> +<div class="banner"><%= values["list_title"] %></div> +<% values["entries"].each do |entries| %> +<a href="<%= entries["href"] %>"><%= entries["name"] %></a><br /> +<% end %><%# values["entries"] %> +</body></html> + EOF + + CLASS_INDEX = FILE_INDEX + METHOD_INDEX = FILE_INDEX + + INDEX = <<-EOF +<html> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>"> +</head> + +<frameset cols="20%,*"> + <frameset rows="15%,35%,50%"> + <frame src="fr_file_index.html" title="Files" name="Files"> + <frame src="fr_class_index.html" name="Classes"> + <frame src="fr_method_index.html" name="Methods"> + </frameset> +<% if values["inline_source"] then %> + <frame src="<%= values["initial_page"] %>" name="docwin"> +<% end %> +<% unless values["inline_source"] then %> + <frameset rows="80%,20%"> + <frame src="<%= values["initial_page"] %>" name="docwin"> + <frame src="blank.html" name="source"> + </frameset> +<% end %> + <noframes> + <body bgcolor="white"> + Click <a href="html/index.html">here</a> for a non-frames + version of this page. + </body> + </noframes> +</frameset> + +</html> + EOF + + # A blank page to use as a target + BLANK = %{ +<html><body bgcolor="white"></body></html> +} + + def write_extra_pages + template = TemplatePage.new(BLANK) + File.open("blank.html", "w") { |f| template.write_html_on(f, {}) } + end + +end + diff --git a/trunk/lib/rdoc/generator/html/one_page_html.rb b/trunk/lib/rdoc/generator/html/one_page_html.rb new file mode 100644 index 0000000000..c4dd95529d --- /dev/null +++ b/trunk/lib/rdoc/generator/html/one_page_html.rb @@ -0,0 +1,121 @@ +require 'rdoc/generator/html' + +module RDoc::Generator::HTML::ONE_PAGE_HTML + + CONTENTS_XML = <<-EOF +<% if defined? classes and classes["description"] then %> +<%= classes["description"] %> +<% end %> + +<% if defined? files and files["requires"] then %> +<h4>Requires:</h4> +<ul> +<% files["requires"].each do |requires| %> +<% if requires["aref"] then %> +<li><a href="<%= requires["aref"] %>"><%= requires["name"] %></a></li> +<% end %> +<% unless requires["aref"] then %> +<li><%= requires["name"] %></li> +<% end %> +<% end %><%# files["requires"] %> +</ul> +<% end %> + +<% if defined? classes and classes["includes"] then %> +<h4>Includes</h4> +<ul> +<% classes["includes"].each do |includes| %> +<% if includes["aref"] then %> +<li><a href="<%= includes["aref"] %>"><%= includes["name"] %></a></li> +<% end %> +<% unless includes["aref"] then %> +<li><%= includes["name"] %></li> +<% end %> +<% end %><%# classes["includes"] %> +</ul> +<% end %> + +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> +<h4>Attributes</h4> +<table> +<% sections["attributes"].each do |attributes| %> +<tr><td><%= attributes["name"] %></td><td><%= attributes["rw"] %></td><td><%= attributes["a_desc"] %></td></tr> +<% end %><%# sections["attributes"] %> +</table> +<% end %> + +<% if sections["method_list"] then %> +<h3>Methods</h3> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +<% method_list["methods"].each do |methods| %> +<h4><%= methods["type"] %> <%= methods["category"] %> method: +<% if methods["callseq"] then %> +<a name="<%= methods["aref"] %>"><%= methods["callseq"] %></a> +<% end %> +<% unless methods["callseq"] then %> +<a name="<%= methods["aref"] %>"><%= methods["name"] %><%= methods["params"] %></a></h4> +<% end %> + +<% if methods["m_desc"] then %> +<%= methods["m_desc"] %> +<% end %> + +<% if methods["sourcecode"] then %> +<blockquote><pre> +<%= methods["sourcecode"] %> +</pre></blockquote> +<% end %> +<% end %><%# method_list["methods"] %> +<% end %> +<% end %><%# sections["method_list"] %> +<% end %> +<% end %><%# classes["sections"] %> +<% end %> + EOF + + ONE_PAGE = %{ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title><%= values["title"] %></title> + <meta http-equiv="Content-Type" content="text/html; charset=<%= values["charset"] %>" /> +</head> +<body> +<% values["files"].each do |files| %> +<h2>File: <%= files["short_name"] %></h2> +<table> + <tr><td>Path:</td><td><%= files["full_path"] %></td></tr> + <tr><td>Modified:</td><td><%= files["dtm_modified"] %></td></tr> +</table> +} + CONTENTS_XML + %{ +<% end %><%# values["files"] %> + +<% if values["classes"] then %> +<h2>Classes</h2> +<% values["classes"].each do |classes| %> +<% if classes["parent"] then %> +<h3><%= classes["classmod"] %> <%= classes["full_name"] %> < <%= href classes["par_url"], classes["parent"] %></h3> +<% end %> +<% unless classes["parent"] then %> +<h3><%= classes["classmod"] %> <%= classes["full_name"] %></h3> +<% 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 %> +</body> +</html> +} + +end + diff --git a/trunk/lib/rdoc/generator/ri.rb b/trunk/lib/rdoc/generator/ri.rb new file mode 100644 index 0000000000..6b7a5932f8 --- /dev/null +++ b/trunk/lib/rdoc/generator/ri.rb @@ -0,0 +1,226 @@ +require 'rdoc/generator' +require 'rdoc/markup/to_flow' + +require 'rdoc/ri/cache' +require 'rdoc/ri/reader' +require 'rdoc/ri/writer' +require 'rdoc/ri/descriptions' + +class RDoc::Generator::RI + + ## + # Generator 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 + + ## + # Set up a new ri generator + + def initialize(options) #:not-new: + @options = options + @ri_writer = RDoc::RI::Writer.new "." + @markup = RDoc::Markup.new + @to_flow = RDoc::Markup::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 recurse into this class' constituent classes + from_class.each_classmodule do |mod| + process_class(mod) + end + end + + def generate_class_info(cls) + case cls + when RDoc::NormalModule then + 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/trunk/lib/rdoc/generator/texinfo.rb b/trunk/lib/rdoc/generator/texinfo.rb new file mode 100644 index 0000000000..0b79820228 --- /dev/null +++ b/trunk/lib/rdoc/generator/texinfo.rb @@ -0,0 +1,84 @@ +require 'rdoc/rdoc' +require 'rdoc/generator' +require 'rdoc/markup/to_texinfo' + +module RDoc + RDoc::GENERATORS['texinfo'] = RDoc::Generator.new("rdoc/generator/texinfo", + :Texinfo, + 'texinfo') + module Generator + # This generates Texinfo files for viewing with GNU Info or Emacs + # from RDoc extracted from Ruby source files. + class Texinfo + # What should the .info file be named by default? + DEFAULT_INFO_FILENAME = 'rdoc.info' + + include Generator::MarkUp + + # Accept some options + def initialize(options) + @options = options + @options.inline_source = true + @options.op_name ||= 'rdoc.texinfo' + @options.formatter = ::RDoc::Markup::ToTexInfo.new + end + + # Generate the +texinfo+ files + def generate(toplevels) + @toplevels = toplevels + @files, @classes = ::RDoc::Generator::Context.build_indicies(@toplevels, + @options) + + (@files + @classes).each { |x| x.value_hash } + + open(@options.op_name, 'w') do |f| + f.puts TexinfoTemplate.new('files' => @files, + 'classes' => @classes, + 'filename' => @options.op_name.gsub(/texinfo/, 'info'), + 'title' => @options.title).render + end + # TODO: create info files and install? + end + + class << self + # Factory? We don't need no stinkin' factory! + alias_method :for, :new + end + end + + # Basically just a wrapper around ERB. + # Should probably use RDoc::TemplatePage instead + class TexinfoTemplate + BASE_DIR = ::File.expand_path(::File.dirname(__FILE__)) # have to calculate this when the file's loaded. + + def initialize(values, file = 'texinfo.erb') + @v, @file = [values, file] + end + + def template + ::File.read(::File.join(BASE_DIR, 'texinfo', @file)) + end + + # Go! + def render + ERB.new(template).result binding + end + + def href(location, text) + text # TODO: how does texinfo do hyperlinks? + end + + def target(name, text) + text # TODO: how do hyperlink targets work? + end + + # TODO: this is probably implemented elsewhere? + def method_prefix(section) + { 'Class' => '.', + 'Module' => '::', + 'Instance' => '#', + }[section['category']] + end + end + end +end diff --git a/trunk/lib/rdoc/generator/texinfo/class.texinfo.erb b/trunk/lib/rdoc/generator/texinfo/class.texinfo.erb new file mode 100644 index 0000000000..07f17eaef2 --- /dev/null +++ b/trunk/lib/rdoc/generator/texinfo/class.texinfo.erb @@ -0,0 +1,44 @@ +@node <%= @v['class']['full_name'].gsub(/::/, '-') %> +@chapter <%= @v['class']["classmod"] %> <%= @v['class']['full_name'] %> + +<% if @v['class']["parent"] and @v['class']['par_url'] %> +Inherits <%= href @v['class']["par_url"], @v['class']["parent"] %><% end %> + +<%= @v['class']["description"] %> + +<% if @v['class']["includes"] %> +Includes +<% @v['class']["includes"].each do |include| %> +* <%= href include["aref"], include["name"] %> +<% end # @v['class']["includes"] %> +<% end %> + +<% if @v['class']["sections"] %> +<% @v['class']["sections"].each do |section| %> +<% if section["attributes"] %> +Attributes +<% section["attributes"].each do |attributes| %> +* <%= attributes["name"] %> <%= attributes["rw"] %> <%= attributes["a_desc"] %> +<% end # section["attributes"] %> +<% end %> +<% end %> + +<% @v['class']["sections"].each do |section| %> +<% if section["method_list"] %> +Methods +@menu +<% section["method_list"].each_with_index do |method_list, i| %> +<%= i %> +<% (method_list["methods"] || []).each do |method| %> +* <%= @v['class']['full_name'].gsub(/::/, '-') %><%= method_prefix method_list %><%= method['name'] %>::<% end %> +<% end %> +@end menu + +<% section["method_list"].each do |method_list| %> +<% (method_list["methods"] || []).uniq.each do |method| %> +<%= TexinfoTemplate.new(@v.merge({'method' => method, 'list' => method_list}), + 'method.texinfo.erb').render %><% end %> +<% end # section["method_list"] %> +<% end %> +<% end # @v['class']["sections"] %> +<% end %> diff --git a/trunk/lib/rdoc/generator/texinfo/file.texinfo.erb b/trunk/lib/rdoc/generator/texinfo/file.texinfo.erb new file mode 100644 index 0000000000..b619b94bd2 --- /dev/null +++ b/trunk/lib/rdoc/generator/texinfo/file.texinfo.erb @@ -0,0 +1,6 @@ +<% if false %> +<h2>File: <%= @v['file']["short_name"] %></h2> +Path: <%= @v['file']["full_path"] %> + +<%= TexinfoTemplate.new(@v, 'content.texinfo.erb').render %> +<% end %> diff --git a/trunk/lib/rdoc/generator/texinfo/method.texinfo.erb b/trunk/lib/rdoc/generator/texinfo/method.texinfo.erb new file mode 100644 index 0000000000..f5c2b73a4b --- /dev/null +++ b/trunk/lib/rdoc/generator/texinfo/method.texinfo.erb @@ -0,0 +1,6 @@ +@node <%= @v['class']['full_name'].gsub(/::/, '-') %><%= method_prefix @v['list'] %><%= @v['method']['name'] %> +@section <%= @v['class']["classmod"] %> <%= @v['class']['full_name'] %><%= method_prefix @v['list'] %><%= @v['method']['name'] %> +<%= @v['method']["type"] %> <%= @v['method']["category"] %> method: +<%= target @v['method']["aref"], @v['method']['callseq'] || + @v['method']["name"] + @v['method']["params"] %> +<%= @v['method']["m_desc"] %> diff --git a/trunk/lib/rdoc/generator/texinfo/texinfo.erb b/trunk/lib/rdoc/generator/texinfo/texinfo.erb new file mode 100644 index 0000000000..235f63d73c --- /dev/null +++ b/trunk/lib/rdoc/generator/texinfo/texinfo.erb @@ -0,0 +1,28 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename <%= @v['filename'] %> +@settitle <%= @v['title'] %> +@c %**end of header + +@contents @c TODO: whitespace is a mess... =\ + +@ifnottex +@node Top + +@top <%= @v['title'] %> +@end ifnottex + +<% if @f = @v['files'].detect { |f| f.name =~ /Readme/i } %> +<%= @f.values['description'] %><% end %> + +@menu +<% @v['classes'].each do |klass| %> +* <%= klass.name.gsub(/::/, '-') %>::<% end %> +@c TODO: add files +@end menu + +<% (@v['classes'] || []).each_with_index do |klass, i| %> +<%= TexinfoTemplate.new(@v.merge('class' => klass.values), + 'class.texinfo.erb').render %><% end %> + +@bye diff --git a/trunk/lib/rdoc/generator/xml.rb b/trunk/lib/rdoc/generator/xml.rb new file mode 100644 index 0000000000..3335f2ce7c --- /dev/null +++ b/trunk/lib/rdoc/generator/xml.rb @@ -0,0 +1,120 @@ +require 'rdoc/generator/html' + +## +# Generate XML output as one big file + +class RDoc::Generator::XML < RDoc::Generator::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::Generator::HtmlFile.new(toplevel, @options, RDoc::Generator::FILE_DIR) + end + + RDoc::TopLevel.all_classes_and_modules.each do |cls| + build_class_list(cls, @files[0], RDoc::Generator::CLASS_DIR) + end + end + + def build_class_list(from, html_file, class_dir) + @classes << RDoc::Generator::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::Generator::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/trunk/lib/rdoc/generator/xml/rdf.rb b/trunk/lib/rdoc/generator/xml/rdf.rb new file mode 100644 index 0000000000..7b15c69a18 --- /dev/null +++ b/trunk/lib/rdoc/generator/xml/rdf.rb @@ -0,0 +1,113 @@ +require 'rdoc/generator/xml' + +module RDoc::Generator::XML::RDF + + CONTENTS_RDF = <<-EOF +<% if defined? classes and classes["description"] then %> + <description rd:parseType="Literal"> +<%= classes["description"] %> + </description> +<% end %> + +<% if defined? files and files["requires"] then %> +<% files["requires"].each do |requires| %> + <rd:required-file rd:name="<%= requires["name"] %>" /> +<% end # files["requires"] %> +<% end %> + +<% if defined? classes and classes["includes"] then %> + <IncludedModuleList> +<% classes["includes"].each do |includes| %> + <included-module rd:name="<%= includes["name"] %>" /> +<% end # includes["includes"] %> + </IncludedModuleList> +<% end %> + +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> +<% sections["attributes"].each do |attributes| %> + <contents> + <Attribute rd:name="<%= attributes["name"] %>"> +<% if attributes["rw"] then %> + <attribute-rw><%= attributes["rw"] %></attribute-rw> +<% end %> + <description rdf:parseType="Literal"><%= attributes["a_desc"] %></description> + </Attribute> + </contents> +<% 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| %> + <contents> + <Method rd:name="<%= methods["name"] %>" rd:visibility="<%= methods["type"] %>" + rd:category="<%= methods["category"] %>" rd:id="<%= methods["aref"] %>"> + <parameters><%= methods["params"] %></parameters> +<% if methods["m_desc"] then %> + <description rdf:parseType="Literal"> +<%= methods["m_desc"] %> + </description> +<% end %> +<% if methods["sourcecode"] then %> + <source-code-listing rdf:parseType="Literal"> +<%= methods["sourcecode"] %> + </source-code-listing> +<% end %> + </Method> + </contents> +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> +<% end %> + <!-- end method list --> +<% end # classes["sections"] %> +<% end %> + EOF + +######################################################################## + + ONE_PAGE = %{<?xml version="1.0" encoding="utf-8"?> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://pragprog.com/rdoc/rdoc.rdf#" + xmlns:rd="http://pragprog.com/rdoc/rdoc.rdf#"> + +<!-- RDoc --> +<% values["files"].each do |files| %> + <rd:File rd:name="<%= files["short_name"] %>" rd:id="<%= files["href"] %>"> + <path><%= files["full_path"] %></path> + <dtm-modified><%= files["dtm_modified"] %></dtm-modified> +} + CONTENTS_RDF + %{ + </rd:File> +<% end # values["files"] %> +<% values["classes"].each do |classes| %> + <<%= values["classmod"] %> rd:name="<%= classes["full_name"] %>" rd:id="<%= classes["full_name"] %>"> + <classmod-info> +<% if classes["infiles"] then %> + <InFiles> +<% classes["infiles"].each do |infiles| %> + <infile> + <File rd:name="<%= infiles["full_path"] %>" +<% if infiles["full_path_url"] then %> + rdf:about="<%= infiles["full_path_url"] %>" +<% end %> + /> + </infile> +<% end # classes["infiles"] %> + </InFiles> +<% end %> +<% if classes["parent"] then %> + <superclass><%= href classes["par_url"], classes["parent"] %></superclass> +<% end %> + </classmod-info> +} + CONTENTS_RDF + %{ + </<%= classes["classmod"] %>> +<% end # values["classes"] %> +<!-- /RDoc --> +</rdf:RDF> +} + +end + diff --git a/trunk/lib/rdoc/generator/xml/xml.rb b/trunk/lib/rdoc/generator/xml/xml.rb new file mode 100644 index 0000000000..ffb1329c4e --- /dev/null +++ b/trunk/lib/rdoc/generator/xml/xml.rb @@ -0,0 +1,111 @@ +require 'rdoc/generator/xml' + +module RDoc::Generator::XML::XML + + CONTENTS_XML = <<-EOF +<% if defined? classes and classes["description"] then %> + <description> +<%= classes["description"] %> + </description> +<% end %> + <contents> +<% if defined? files and files["requires"] then %> + <required-file-list> +<% files["requires"].each do |requires| %> + <required-file name="<%= requires["name"] %>" +<% if requires["aref"] then %> + href="<%= requires["aref"] %>" +<% end %> + /> +<% end # files["requires"] %> + </required-file-list> +<% end %> +<% if defined? classes and classes["sections"] then %> +<% classes["sections"].each do |sections| %> +<% if sections["attributes"] then %> + <attribute-list> +<% sections["attributes"].each do |attributes| %> + <attribute name="<%= attributes["name"] %>"> +<% if attributes["rw"] then %> + <attribute-rw><%= attributes["rw"] %></attribute-rw> +<% end %> + <description><%= attributes["a_desc"] %></description> + </attribute> +<% end # sections["attributes"] %> + </attribute-list> +<% end %> +<% if sections["method_list"] then %> + <method-list> +<% sections["method_list"].each do |method_list| %> +<% if method_list["methods"] then %> +<% method_list["methods"].each do |methods| %> + <method name="<%= methods["name"] %>" type="<%= methods["type"] %>" category="<%= methods["category"] %>" id="<%= methods["aref"] %>"> + <parameters><%= methods["params"] %></parameters> +<% if methods["m_desc"] then %> + <description> +<%= methods["m_desc"] %> + </description> +<% end %> +<% if methods["sourcecode"] then %> + <source-code-listing> +<%= methods["sourcecode"] %> + </source-code-listing> +<% end %> + </method> +<% end # method_list["methods"] %> +<% end %> +<% end # sections["method_list"] %> + </method-list> +<% end %> +<% end # classes["sections"] %> +<% end %> +<% if defined? classes and classes["includes"] then %> + <included-module-list> +<% classes["includes"].each do |includes| %> + <included-module name="<%= includes["name"] %>" +<% if includes["aref"] then %> + href="<%= includes["aref"] %>" +<% end %> + /> +<% end # classes["includes"] %> + </included-module-list> +<% end %> + </contents> + EOF + + ONE_PAGE = %{<?xml version="1.0" encoding="utf-8"?> +<rdoc> +<file-list> +<% values["files"].each do |files| %> + <file name="<%= files["short_name"] %>" id="<%= files["href"] %>"> + <file-info> + <path><%= files["full_path"] %></path> + <dtm-modified><%= files["dtm_modified"] %></dtm-modified> + </file-info> +} + CONTENTS_XML + %{ + </file> +<% end # values["files"] %> +</file-list> +<class-module-list> +<% values["classes"].each do |classes| %> + <<%= classes["classmod"] %> name="<%= classes["full_name"] %>" id="<%= classes["full_name"] %>"> + <classmod-info> +<% if classes["infiles"] then %> + <infiles> +<% classes["infiles"].each do |infiles| %> + <infile><%= href infiles["full_path_url"], infiles["full_path"] %></infile> +<% end # classes["infiles"] %> + </infiles> +<% end %> +<% if classes["parent"] then %> + <superclass><%= href classes["par_url"], classes["parent"] %></superclass> +<% end %> + </classmod-info> +} + CONTENTS_XML + %{ + </<%= classes["classmod"] %>> +<% end # values["classes"] %> +</class-module-list> +</rdoc> +} + +end |