summaryrefslogtreecommitdiff
path: root/lib/rdoc/generator
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rdoc/generator')
-rw-r--r--lib/rdoc/generator/html.rb63
-rw-r--r--lib/rdoc/generator/html/frameless.rb795
-rw-r--r--lib/rdoc/generator/html/hefss.rb22
-rw-r--r--lib/rdoc/generator/html/html.rb168
-rw-r--r--lib/rdoc/generator/html/kilmer.rb20
-rw-r--r--lib/rdoc/generator/html/one_page_html.rb18
-rw-r--r--lib/rdoc/generator/ri.rb2
-rw-r--r--lib/rdoc/generator/texinfo.rb84
-rw-r--r--lib/rdoc/generator/texinfo/class.texinfo.erb44
-rw-r--r--lib/rdoc/generator/texinfo/file.texinfo.erb6
-rw-r--r--lib/rdoc/generator/texinfo/method.texinfo.erb6
-rw-r--r--lib/rdoc/generator/texinfo/texinfo.erb28
12 files changed, 1120 insertions, 136 deletions
diff --git a/lib/rdoc/generator/html.rb b/lib/rdoc/generator/html.rb
index b99af4d47b..a9e030a896 100644
--- a/lib/rdoc/generator/html.rb
+++ b/lib/rdoc/generator/html.rb
@@ -82,7 +82,7 @@ class RDoc::Generator::HTML
@classes = []
write_style_sheet
- gen_sub_directories()
+ gen_sub_directories
build_indices
generate_html
end
@@ -157,6 +157,7 @@ class RDoc::Generator::HTML
# the individual descriptions for files and classes
gen_into(@files)
gen_into(@classes)
+
# and the index files
gen_file_index
gen_class_index
@@ -168,14 +169,21 @@ class RDoc::Generator::HTML
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|
- if item.document_self
- op_file = item.path
- FileUtils.mkdir_p(File.dirname(op_file))
- open(op_file, "w") { |file| item.write_on(file) }
+ 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
@@ -221,9 +229,23 @@ class RDoc::Generator::HTML
# line.
def gen_main_index
- template = RDoc::TemplatePage.new @template::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 = {
@@ -237,18 +259,31 @@ class RDoc::Generator::HTML
values['inline_source'] = @options.inline_source
- template.write_html_on f, values
+ 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
+
+ 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
@@ -351,15 +386,8 @@ class RDoc::Generator::HTMLInOne < RDoc::Generator::HTML
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,
+ "entries" => index_to_links(collection),
'list_title' => title,
'index_url' => main_url,
}
@@ -367,4 +395,3 @@ class RDoc::Generator::HTMLInOne < RDoc::Generator::HTML
end
-
diff --git a/lib/rdoc/generator/html/frameless.rb b/lib/rdoc/generator/html/frameless.rb
new file mode 100644
index 0000000000..2af890ce04
--- /dev/null
+++ b/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 %>
+ &nbsp;(<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 %>
+ &nbsp;(<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"] %>&nbsp;&nbsp;
+<% 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"] %>&nbsp;&nbsp;
+<% 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">&nbsp;</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>-&gt;</td>
+ <td class="context-item-value"><%= values["new_name"] %></td>
+ </tr>
+<% if values["desc"] then %>
+ <tr class="top-aligned-row context-row">
+ <td>&nbsp;</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">&nbsp;[<%= values["rw"] %>]&nbsp;</td>
+<% end %>
+<% unless values["rw"] then %>
+ <td class="context-item-value">&nbsp;&nbsp;</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/lib/rdoc/generator/html/hefss.rb b/lib/rdoc/generator/html/hefss.rb
index 294d5b62f6..e186a40384 100644
--- a/lib/rdoc/generator/html/hefss.rb
+++ b/lib/rdoc/generator/html/hefss.rb
@@ -141,7 +141,7 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<div class="name-list">
<% values["requires"].each do |requires| %>
<%= href requires["aref"], requires["name"] %>
-<% end # values["requires"] %>
+<% end %><%# values["requires"] %>
<% end %>
</div>
@@ -156,10 +156,10 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<div class="name-list">
<% method_list["methods"].each do |methods| %>
<a href="<%= methods["codeurl"] %>" target="source"><%= methods["name"] %></a>
-<% end # values["methods"] %>
+<% end %><%# values["methods"] %>
</div>
<% end %>
-<% end # values["method_list"] %>
+<% end %><%# values["method_list"] %>
<% end %>
<% if sections["attributes"] then %>
@@ -178,10 +178,10 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<td class="attr-name"><%= attributes["name"] %></td>
<td><%= attributes["a_desc"] %></td>
</tr>
-<% end # values["attributes"] %>
+<% end %><%# values["attributes"] %>
</table>
<% end %>
-<% end # values["sections"] %>
+<% end %><%# values["sections"] %>
<% end %>
<% if values["classlist"] then %>
@@ -237,7 +237,7 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<% if infiles["cvsurl"] then %>
&nbsp;(<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>)
<% end %>
-<% end # values["infiles"] %>
+<% end %><%# values["infiles"] %>
</td>
</tr>
<% if values["parent"] then %>
@@ -266,7 +266,7 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<div class="name-list">
<% values["includes"].each do |includes| %>
<span class="method-name"><%= href includes["aref"], includes["name"] %></span>
-<% end # values["includes"] %>
+<% end %><%# values["includes"] %>
</div>
<% end %>
@@ -293,11 +293,11 @@ td { font-family: Verdana, Arial, Helvetica, sans-serif;
<%= method_list["m_desc"] %>
</div>
<% end %>
-<% end # method_list["methods"] %>
+<% end %><%# method_list["methods"] %>
<% end %>
-<% end # sections["method_list"] %>
+<% end %><%# sections["method_list"] %>
<% end %>
-<% end # values["sections"] %>
+<% end %><%# values["sections"] %>
<% end %>
EOF
@@ -365,7 +365,7 @@ div.banner {
<div class="banner"><%= values["list_title"] %></div>
<% values["entries"].each do |entries| %>
<a href="<%= entries["href"] %>"><%= entries["name"] %></a><br />
-<% end # values["entries"] %>
+<% end %><%# values["entries"] %>
</body></html>
EOF
diff --git a/lib/rdoc/generator/html/html.rb b/lib/rdoc/generator/html/html.rb
index 63c83ee5fd..1ab90c6264 100644
--- a/lib/rdoc/generator/html/html.rb
+++ b/lib/rdoc/generator/html/html.rb
@@ -7,8 +7,8 @@ require 'rdoc/generator/html/one_page_html'
# 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.
+# toggle the visibility of each method's source with each click on the
+# '[source]' link.
#
# == Authors
#
@@ -16,10 +16,10 @@ require 'rdoc/generator/html/one_page_html'
#
# 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.
+# 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
@@ -361,7 +361,7 @@ EOF
&nbsp;(<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>)
<% end %>
<br />
-<% end # values["infiles"] %>
+<% end %><%# values["infiles"] %>
</td>
</tr>
@@ -388,39 +388,38 @@ EOF
#####################################################################
METHOD_LIST = <<-EOF
-
<div id="contextContent">
<% if values["diagram"] then %>
<div id="diagram">
<%= values["diagram"] %>
</div>
-<% end %>
+<% end
-<% if values["description"] then %>
+ if values["description"] then %>
<div id="description">
<%= values["description"] %>
</div>
-<% end %>
+<% end
-<% if values["requires"] then %>
+ 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"] %>&nbsp;&nbsp;
-<% end # values["requires"] %>
+<% end %><%# values["requires"] %>
</div>
</div>
-<% end %>
+<% end
-<% if values["toc"] then %>
+ 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"] %>
+ <li><a href="#<%= toc["href"] %>"><%= toc["secname"] %></a></li>
+<% end %><%# values["toc"] %>
</ul>
<% end %>
</div>
@@ -430,16 +429,14 @@ EOF
<h3 class="section-bar">Methods</h3>
<div class="name-list">
-<% values["methods"].each do |methods| %>
+<% values["methods"].each do |methods| %>
<%= href methods["aref"], methods["name"] %>&nbsp;&nbsp;
-<% end # values["methods"] %>
+<% end %><%# values["methods"] %>
</div>
</div>
<% end %>
-
</div>
-
<!-- if includes -->
<% if values["includes"] then %>
<div id="includes">
@@ -448,140 +445,137 @@ EOF
<div id="includes-list">
<% values["includes"].each do |includes| %>
<span class="include-name"><%= href includes["aref"], includes["name"] %></span>
-<% end # values["includes"] %>
+<% end %><%# values["includes"] %>
</div>
</div>
-<% end %>
+<% end
-<% values["sections"].each do |sections| %>
+ values["sections"].each do |sections| %>
<div id="section">
-<% if sections["sectitle"] then %>
+<% if sections["sectitle"] then %>
<h2 class="section-title"><a name="<%= sections["secsequence"] %>"><%= sections["sectitle"] %></a></h2>
-<% if sections["seccomment"] then %>
+<% if sections["seccomment"] then %>
<div class="section-comment">
<%= sections["seccomment"] %>
</div>
-<% end %>
-<% end %>
+<% end
+ end
-<% if values["classlist"] then %>
+ if sections["classlist"] then %>
<div id="class-list">
<h3 class="section-bar">Classes and Modules</h3>
- <%= values["classlist"] %>
+ <%= sections["classlist"] %>
</div>
-<% end %>
+<% end
-<% if values["constants"] then %>
+ if sections["constants"] then %>
<div id="constants-list">
<h3 class="section-bar">Constants</h3>
<div class="name-list">
<table summary="Constants">
-<% values["constants"].each do |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 values["desc"] then %>
+<% if sections["desc"] then %>
<td width="3em">&nbsp;</td>
<td class="context-item-desc"><%= constants["desc"] %></td>
-<% end %>
+<% end %>
</tr>
-<% end # values["constants"] %>
+<% end %><%# sections["constants"] %>
</table>
</div>
</div>
-<% end %>
+<% end
-<% if values["aliases"] then %>
+ if sections["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) %>
+ <table summary="aliases">
+<% sections["aliases"].each do |aliases| %>
<tr class="top-aligned-row context-row">
- <td class="context-item-name"><%= values["old_name"] %></td>
+ <td class="context-item-name"><%= aliases["old_name"] %></td>
<td>-&gt;</td>
- <td class="context-item-value"><%= values["new_name"] %></td>
+ <td class="context-item-value"><%= aliases["new_name"] %></td>
</tr>
-<% if values["desc"] then %>
+<% if aliases["desc"] then %>
<tr class="top-aligned-row context-row">
<td>&nbsp;</td>
- <td colspan="2" class="context-item-desc"><%= values["desc"] %></td>
+ <td colspan="2" class="context-item-desc"><%= aliases["desc"] %></td>
</tr>
-<% end %>
-<% end # values["aliases"] %>
+<% end
+ end %><%# sections["aliases"] %>
</table>
</div>
</div>
-<% end %>
-
+<% end %>
-<% if values["attributes"] then %>
+<% if sections["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) %>
+<% sections["attributes"].each do |attribute| %>
<tr class="top-aligned-row context-row">
- <td class="context-item-name"><%= values["name"] %></td>
-<% if values["rw"] then %>
- <td class="context-item-value">&nbsp;[<%= values["rw"] %>]&nbsp;</td>
-<% end %>
-<% unless values["rw"] then %>
+ <td class="context-item-name"><%= attribute["name"] %></td>
+<% if attribute["rw"] then %>
+ <td class="context-item-value">&nbsp;[<%= attribute["rw"] %>]&nbsp;</td>
+<% end
+ unless attribute["rw"] then %>
<td class="context-item-value">&nbsp;&nbsp;</td>
-<% end %>
- <td class="context-item-desc"><%= values["a_desc"] %></td>
+<% end %>
+ <td class="context-item-desc"><%= attribute["a_desc"] %></td>
</tr>
-<% end # values["attributes"] %>
+<% end %><%# sections["attributes"] %>
</table>
</div>
</div>
-<% end %>
-
-
+<% end %>
<!-- if method_list -->
-<% if sections["method_list"] then %>
+<% if sections["method_list"] then %>
<div id="methods">
-<% sections["method_list"].each do |method_list| %>
-<% if method_list["methods"] then %>
+<% 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| %>
+<% 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 %>
+<% if methods["codeurl"] then %>
<a href="<%= methods["codeurl"] %>" target="Code" class="method-signature"
onclick="popupCode('<%= methods["codeurl"] %>');return false;">
-<% end %>
-<% if methods["sourcecode"] then %>
+<% end
+ if methods["sourcecode"] then %>
<a href="#<%= methods["aref"] %>" class="method-signature">
-<% end %>
-<% if methods["callseq"] then %>
+<% end
+ if methods["callseq"] then %>
<span class="method-name"><%= methods["callseq"] %></span>
-<% end %>
-<% unless methods["callseq"] then %>
+<% end
+ unless methods["callseq"] then %>
<span class="method-name"><%= methods["name"] %></span><span class="method-args"><%= methods["params"] %></span>
-<% end %>
-<% if methods["codeurl"] then %>
+<% end
+ if methods["codeurl"] then %>
</a>
-<% end %>
-<% if methods["sourcecode"] then %>
+<% end
+ if methods["sourcecode"] then %>
</a>
-<% end %>
+<% end %>
</div>
<div class="method-description">
-<% if methods["m_desc"] then %>
+<% if methods["m_desc"] then %>
<%= methods["m_desc"] %>
-<% end %>
-<% if methods["sourcecode"] then %>
+<% 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">
@@ -589,17 +583,17 @@ EOF
<%= methods["sourcecode"] %>
</pre>
</div>
-<% end %>
+<% end %>
</div>
</div>
-<% end # method_list["methods"] %>
-<% end %>
-<% end # sections["method_list"] %>
+<% end %><%# method_list["methods"] %><%
+ end
+ end %><%# sections["method_list"] %>
</div>
-<% end %>
-<% end # values["sections"] %>
+<% end %>
+<% end %><%# values["sections"] %>
EOF
#####################################################################
@@ -663,7 +657,7 @@ EOF
<div id="index-entries">
<% values["entries"].each do |entries| %>
<a href="<%= entries["href"] %>"><%= entries["name"] %></a><br />
-<% end # values["entries"] %>
+<% end %><%# values["entries"] %>
</div>
</div>
</body>
diff --git a/lib/rdoc/generator/html/kilmer.rb b/lib/rdoc/generator/html/kilmer.rb
index b6c9c4e339..6479abaf8b 100644
--- a/lib/rdoc/generator/html/kilmer.rb
+++ b/lib/rdoc/generator/html/kilmer.rb
@@ -119,7 +119,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<div class="name-list">
<% values["requires"].each do |requires| %>
<%= href requires["aref"], requires["name"] %>
-<% end # values["requires"] %>
+<% end %><%# values["requires"] %>
<% end %>
</div>
@@ -130,7 +130,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<div class="name-list">
<% values["methods"].each do |methods| %>
<%= href methods["aref"], methods["name"] %>,
-<% end # values["methods"] %>
+<% end %><%# values["methods"] %>
</div>
<% end %>
@@ -162,7 +162,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<td class="attr-name"><%= attributes["name"] %></td>
<td><%= attributes["a_desc"] %></td>
</tr>
-<% end # sections["attributes"] %>
+<% end %><%# sections["attributes"] %>
</table>
<% end %>
@@ -175,7 +175,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<%= template_include %> <!-- method descriptions -->
-<% end # values["sections"] %>
+<% end %><%# values["sections"] %>
</body>
</html>
@@ -221,7 +221,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<% if infiles["cvsurl"] then %>
&nbsp;(<a href="<%= infiles["cvsurl"] %>"><acronym title="Concurrent Versioning System">CVS</acronym></a>)
<% end %>
-<% end # values["infiles"] %>
+<% end %><%# values["infiles"] %>
</td>
</tr>
<% if values["parent"] then %>
@@ -250,7 +250,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
<div class="name-list">
<% values["includes"].each do |includes| %>
<span class="method-name"><%= href includes["aref"], includes["name"] %></span>
-<% end # values["includes"] %>
+<% end %><%# values["includes"] %>
</div>
<% end %>
@@ -285,7 +285,7 @@ body,td,p { font-family: <%= values["fonts"] %>;
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"] %>
+<% end %><%# values["aka"] %>
</div>
<% end %>
<% if values["sourcecode"] then %>
@@ -293,9 +293,9 @@ This method is also aliased as
<%= values["sourcecode"] %>
</pre>
<% end %>
-<% end # values["methods"] %>
+<% end %><%# values["methods"] %>
<% end %>
-<% end # values["method_list"] %>
+<% end %><%# values["method_list"] %>
<% end %>
EOF
@@ -364,7 +364,7 @@ div.banner {
<div class="banner"><%= values["list_title"] %></div>
<% values["entries"].each do |entries| %>
<a href="<%= entries["href"] %>"><%= entries["name"] %></a><br />
-<% end # values["entries"] %>
+<% end %><%# values["entries"] %>
</body></html>
EOF
diff --git a/lib/rdoc/generator/html/one_page_html.rb b/lib/rdoc/generator/html/one_page_html.rb
index 885d0dcf6b..c4dd95529d 100644
--- a/lib/rdoc/generator/html/one_page_html.rb
+++ b/lib/rdoc/generator/html/one_page_html.rb
@@ -17,7 +17,7 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
<% unless requires["aref"] then %>
<li><%= requires["name"] %></li>
<% end %>
-<% end # files["requires"] %>
+<% end %><%# files["requires"] %>
</ul>
<% end %>
@@ -31,7 +31,7 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
<% unless includes["aref"] then %>
<li><%= includes["name"] %></li>
<% end %>
-<% end # classes["includes"] %>
+<% end %><%# classes["includes"] %>
</ul>
<% end %>
@@ -42,7 +42,7 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
<table>
<% sections["attributes"].each do |attributes| %>
<tr><td><%= attributes["name"] %></td><td><%= attributes["rw"] %></td><td><%= attributes["a_desc"] %></td></tr>
-<% end # sections["attributes"] %>
+<% end %><%# sections["attributes"] %>
</table>
<% end %>
@@ -68,11 +68,11 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
<%= methods["sourcecode"] %>
</pre></blockquote>
<% end %>
-<% end # method_list["methods"] %>
+<% end %><%# method_list["methods"] %>
<% end %>
-<% end # sections["method_list"] %>
+<% end %><%# sections["method_list"] %>
<% end %>
-<% end # classes["sections"] %>
+<% end %><%# classes["sections"] %>
<% end %>
EOF
@@ -91,7 +91,7 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
<tr><td>Modified:</td><td><%= files["dtm_modified"] %></td></tr>
</table>
} + CONTENTS_XML + %{
-<% end # values["files"] %>
+<% end %><%# values["files"] %>
<% if values["classes"] then %>
<h2>Classes</h2>
@@ -107,11 +107,11 @@ module RDoc::Generator::HTML::ONE_PAGE_HTML
(in files
<% classes["infiles"].each do |infiles| %>
<%= href infiles["full_path_url"], infiles["full_path"] %>
-<% end # classes["infiles"] %>
+<% end %><%# classes["infiles"] %>
)
<% end %>
} + CONTENTS_XML + %{
-<% end # values["classes"] %>
+<% end %><%# values["classes"] %>
<% end %>
</body>
</html>
diff --git a/lib/rdoc/generator/ri.rb b/lib/rdoc/generator/ri.rb
index ea0bbeffcc..d347505e0b 100644
--- a/lib/rdoc/generator/ri.rb
+++ b/lib/rdoc/generator/ri.rb
@@ -45,7 +45,7 @@ class RDoc::Generator::RI
def process_class(from_class)
generate_class_info(from_class)
- # now recurse into this classes constituent classes
+ # now recurse into this class' constituent classes
from_class.each_classmodule do |mod|
process_class(mod)
end
diff --git a/lib/rdoc/generator/texinfo.rb b/lib/rdoc/generator/texinfo.rb
new file mode 100644
index 0000000000..0b79820228
--- /dev/null
+++ b/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/lib/rdoc/generator/texinfo/class.texinfo.erb b/lib/rdoc/generator/texinfo/class.texinfo.erb
new file mode 100644
index 0000000000..07f17eaef2
--- /dev/null
+++ b/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/lib/rdoc/generator/texinfo/file.texinfo.erb b/lib/rdoc/generator/texinfo/file.texinfo.erb
new file mode 100644
index 0000000000..b619b94bd2
--- /dev/null
+++ b/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/lib/rdoc/generator/texinfo/method.texinfo.erb b/lib/rdoc/generator/texinfo/method.texinfo.erb
new file mode 100644
index 0000000000..f5c2b73a4b
--- /dev/null
+++ b/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/lib/rdoc/generator/texinfo/texinfo.erb b/lib/rdoc/generator/texinfo/texinfo.erb
new file mode 100644
index 0000000000..235f63d73c
--- /dev/null
+++ b/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