iownbey-rdoc 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +13 -0
- data/Manifest.txt +61 -0
- data/README.txt +34 -0
- data/bin/rdoc +22 -0
- data/bin/ri +6 -0
- data/lib/rdoc.rb +277 -0
- data/lib/rdoc/code_objects.rb +776 -0
- data/lib/rdoc/diagram.rb +338 -0
- data/lib/rdoc/dot.rb +249 -0
- data/lib/rdoc/generator.rb +1050 -0
- data/lib/rdoc/generator/chm.rb +113 -0
- data/lib/rdoc/generator/chm/chm.rb +98 -0
- data/lib/rdoc/generator/html.rb +370 -0
- data/lib/rdoc/generator/html/hefss.rb +414 -0
- data/lib/rdoc/generator/html/html.rb +704 -0
- data/lib/rdoc/generator/html/kilmer.rb +418 -0
- data/lib/rdoc/generator/html/one_page_html.rb +121 -0
- data/lib/rdoc/generator/ri.rb +229 -0
- data/lib/rdoc/generator/texinfo.rb +84 -0
- data/lib/rdoc/generator/texinfo/class.texinfo.erb +44 -0
- data/lib/rdoc/generator/texinfo/file.texinfo.erb +6 -0
- data/lib/rdoc/generator/texinfo/method.texinfo.erb +6 -0
- data/lib/rdoc/generator/texinfo/texinfo.erb +28 -0
- data/lib/rdoc/generator/xml.rb +120 -0
- data/lib/rdoc/generator/xml/rdf.rb +113 -0
- data/lib/rdoc/generator/xml/xml.rb +111 -0
- data/lib/rdoc/markup.rb +473 -0
- data/lib/rdoc/markup/attribute_manager.rb +274 -0
- data/lib/rdoc/markup/formatter.rb +14 -0
- data/lib/rdoc/markup/fragments.rb +337 -0
- data/lib/rdoc/markup/inline.rb +101 -0
- data/lib/rdoc/markup/lines.rb +152 -0
- data/lib/rdoc/markup/preprocess.rb +71 -0
- data/lib/rdoc/markup/to_flow.rb +185 -0
- data/lib/rdoc/markup/to_html.rb +354 -0
- data/lib/rdoc/markup/to_html_crossref.rb +86 -0
- data/lib/rdoc/markup/to_latex.rb +328 -0
- data/lib/rdoc/markup/to_test.rb +50 -0
- data/lib/rdoc/markup/to_texinfo.rb +69 -0
- data/lib/rdoc/options.rb +621 -0
- data/lib/rdoc/parsers/parse_c.rb +775 -0
- data/lib/rdoc/parsers/parse_f95.rb +1841 -0
- data/lib/rdoc/parsers/parse_rb.rb +2584 -0
- data/lib/rdoc/parsers/parse_simple.rb +40 -0
- data/lib/rdoc/parsers/parserfactory.rb +99 -0
- data/lib/rdoc/rdoc.rb +277 -0
- data/lib/rdoc/ri.rb +4 -0
- data/lib/rdoc/ri/cache.rb +188 -0
- data/lib/rdoc/ri/descriptions.rb +150 -0
- data/lib/rdoc/ri/display.rb +274 -0
- data/lib/rdoc/ri/driver.rb +452 -0
- data/lib/rdoc/ri/formatter.rb +616 -0
- data/lib/rdoc/ri/paths.rb +102 -0
- data/lib/rdoc/ri/reader.rb +106 -0
- data/lib/rdoc/ri/util.rb +81 -0
- data/lib/rdoc/ri/writer.rb +68 -0
- data/lib/rdoc/stats.rb +25 -0
- data/lib/rdoc/template.rb +64 -0
- data/lib/rdoc/tokenstream.rb +33 -0
- data/test/test_rdoc_c_parser.rb +261 -0
- data/test/test_rdoc_info_formatting.rb +179 -0
- data/test/test_rdoc_info_sections.rb +93 -0
- data/test/test_rdoc_markup.rb +613 -0
- data/test/test_rdoc_markup_attribute_manager.rb +224 -0
- data/test/test_rdoc_ri_attribute_formatter.rb +42 -0
- data/test/test_rdoc_ri_default_display.rb +295 -0
- data/test/test_rdoc_ri_formatter.rb +318 -0
- data/test/test_rdoc_ri_overstrike_formatter.rb +69 -0
- metadata +142 -0
@@ -0,0 +1,229 @@
|
|
1
|
+
require 'rdoc/generator'
|
2
|
+
require 'rdoc/markup/to_flow'
|
3
|
+
|
4
|
+
require 'rdoc/ri/cache'
|
5
|
+
require 'rdoc/ri/reader'
|
6
|
+
require 'rdoc/ri/writer'
|
7
|
+
require 'rdoc/ri/descriptions'
|
8
|
+
|
9
|
+
class RDoc::Generator::RI
|
10
|
+
|
11
|
+
##
|
12
|
+
# Generator may need to return specific subclasses depending on the
|
13
|
+
# options they are passed. Because of this we create them using a factory
|
14
|
+
|
15
|
+
def self.for(options)
|
16
|
+
new(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
protected :new
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Set up a new RDoc::Generator::RI.
|
25
|
+
|
26
|
+
def initialize(options) #:not-new:
|
27
|
+
@options = options
|
28
|
+
@ri_writer = RDoc::RI::Writer.new "."
|
29
|
+
@markup = RDoc::Markup.new
|
30
|
+
@to_flow = RDoc::Markup::ToFlow.new
|
31
|
+
|
32
|
+
@generated = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Build the initial indices and output objects based on an array of
|
37
|
+
# TopLevel objects containing the extracted information.
|
38
|
+
|
39
|
+
def generate(toplevels)
|
40
|
+
RDoc::TopLevel.all_classes_and_modules.each do |cls|
|
41
|
+
process_class cls
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def process_class(from_class)
|
46
|
+
generate_class_info(from_class)
|
47
|
+
|
48
|
+
# now recure into this classes constituent classess
|
49
|
+
from_class.each_classmodule do |mod|
|
50
|
+
process_class(mod)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def generate_class_info(cls)
|
55
|
+
if cls === RDoc::NormalModule
|
56
|
+
cls_desc = RDoc::RI::ModuleDescription.new
|
57
|
+
else
|
58
|
+
cls_desc = RDoc::RI::ClassDescription.new
|
59
|
+
cls_desc.superclass = cls.superclass
|
60
|
+
end
|
61
|
+
|
62
|
+
cls_desc.name = cls.name
|
63
|
+
cls_desc.full_name = cls.full_name
|
64
|
+
cls_desc.comment = markup(cls.comment)
|
65
|
+
|
66
|
+
cls_desc.attributes = cls.attributes.sort.map do |a|
|
67
|
+
RDoc::RI::Attribute.new(a.name, a.rw, markup(a.comment))
|
68
|
+
end
|
69
|
+
|
70
|
+
cls_desc.constants = cls.constants.map do |c|
|
71
|
+
RDoc::RI::Constant.new(c.name, c.value, markup(c.comment))
|
72
|
+
end
|
73
|
+
|
74
|
+
cls_desc.includes = cls.includes.map do |i|
|
75
|
+
RDoc::RI::IncludedModule.new(i.name)
|
76
|
+
end
|
77
|
+
|
78
|
+
class_methods, instance_methods = method_list(cls)
|
79
|
+
|
80
|
+
cls_desc.class_methods = class_methods.map do |m|
|
81
|
+
RDoc::RI::MethodSummary.new(m.name)
|
82
|
+
end
|
83
|
+
|
84
|
+
cls_desc.instance_methods = instance_methods.map do |m|
|
85
|
+
RDoc::RI::MethodSummary.new(m.name)
|
86
|
+
end
|
87
|
+
|
88
|
+
update_or_replace(cls_desc)
|
89
|
+
|
90
|
+
class_methods.each do |m|
|
91
|
+
generate_method_info(cls_desc, m)
|
92
|
+
end
|
93
|
+
|
94
|
+
instance_methods.each do |m|
|
95
|
+
generate_method_info(cls_desc, m)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def generate_method_info(cls_desc, method)
|
100
|
+
meth_desc = RDoc::RI::MethodDescription.new
|
101
|
+
meth_desc.name = method.name
|
102
|
+
meth_desc.full_name = cls_desc.full_name
|
103
|
+
if method.singleton
|
104
|
+
meth_desc.full_name += "::"
|
105
|
+
else
|
106
|
+
meth_desc.full_name += "#"
|
107
|
+
end
|
108
|
+
meth_desc.full_name << method.name
|
109
|
+
|
110
|
+
meth_desc.comment = markup(method.comment)
|
111
|
+
meth_desc.params = params_of(method)
|
112
|
+
meth_desc.visibility = method.visibility.to_s
|
113
|
+
meth_desc.is_singleton = method.singleton
|
114
|
+
meth_desc.block_params = method.block_params
|
115
|
+
|
116
|
+
meth_desc.aliases = method.aliases.map do |a|
|
117
|
+
RDoc::RI::AliasName.new(a.name)
|
118
|
+
end
|
119
|
+
|
120
|
+
@ri_writer.add_method(cls_desc, meth_desc)
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
##
|
126
|
+
# Returns a list of class and instance methods that we'll be documenting
|
127
|
+
|
128
|
+
def method_list(cls)
|
129
|
+
list = cls.method_list
|
130
|
+
unless @options.show_all
|
131
|
+
list = list.find_all do |m|
|
132
|
+
m.visibility == :public || m.visibility == :protected || m.force_documentation
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
c = []
|
137
|
+
i = []
|
138
|
+
list.sort.each do |m|
|
139
|
+
if m.singleton
|
140
|
+
c << m
|
141
|
+
else
|
142
|
+
i << m
|
143
|
+
end
|
144
|
+
end
|
145
|
+
return c,i
|
146
|
+
end
|
147
|
+
|
148
|
+
def params_of(method)
|
149
|
+
if method.call_seq
|
150
|
+
method.call_seq
|
151
|
+
else
|
152
|
+
params = method.params || ""
|
153
|
+
|
154
|
+
p = params.gsub(/\s*\#.*/, '')
|
155
|
+
p = p.tr("\n", " ").squeeze(" ")
|
156
|
+
p = "(" + p + ")" unless p[0] == ?(
|
157
|
+
|
158
|
+
if (block = method.block_params)
|
159
|
+
block.gsub!(/\s*\#.*/, '')
|
160
|
+
block = block.tr("\n", " ").squeeze(" ")
|
161
|
+
if block[0] == ?(
|
162
|
+
block.sub!(/^\(/, '').sub!(/\)/, '')
|
163
|
+
end
|
164
|
+
p << " {|#{block.strip}| ...}"
|
165
|
+
end
|
166
|
+
p
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def markup(comment)
|
171
|
+
return nil if !comment || comment.empty?
|
172
|
+
|
173
|
+
# Convert leading comment markers to spaces, but only
|
174
|
+
# if all non-blank lines have them
|
175
|
+
|
176
|
+
if comment =~ /^(?>\s*)[^\#]/
|
177
|
+
content = comment
|
178
|
+
else
|
179
|
+
content = comment.gsub(/^\s*(#+)/) { $1.tr('#',' ') }
|
180
|
+
end
|
181
|
+
@markup.convert(content, @to_flow)
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# By default we replace existing classes with the same name. If the
|
186
|
+
# --merge option was given, we instead merge this definition into an
|
187
|
+
# existing class. We add our methods, aliases, etc to that class, but do
|
188
|
+
# not change the class's description.
|
189
|
+
|
190
|
+
def update_or_replace(cls_desc)
|
191
|
+
old_cls = nil
|
192
|
+
|
193
|
+
if @options.merge
|
194
|
+
rdr = RDoc::RI::Reader.new RDoc::RI::Cache.new(@options.op_dir)
|
195
|
+
|
196
|
+
namespace = rdr.top_level_namespace
|
197
|
+
namespace = rdr.lookup_namespace_in(cls_desc.name, namespace)
|
198
|
+
if namespace.empty?
|
199
|
+
$stderr.puts "You asked me to merge this source into existing "
|
200
|
+
$stderr.puts "documentation. This file references a class or "
|
201
|
+
$stderr.puts "module called #{cls_desc.name} which I don't"
|
202
|
+
$stderr.puts "have existing documentation for."
|
203
|
+
$stderr.puts
|
204
|
+
$stderr.puts "Perhaps you need to generate its documentation first"
|
205
|
+
exit 1
|
206
|
+
else
|
207
|
+
old_cls = namespace[0]
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
prev_cls = @generated[cls_desc.full_name]
|
212
|
+
|
213
|
+
if old_cls and not prev_cls then
|
214
|
+
old_desc = rdr.get_class old_cls
|
215
|
+
cls_desc.merge_in old_desc
|
216
|
+
end
|
217
|
+
|
218
|
+
if prev_cls then
|
219
|
+
cls_desc.merge_in prev_cls
|
220
|
+
end
|
221
|
+
|
222
|
+
@generated[cls_desc.full_name] = cls_desc
|
223
|
+
|
224
|
+
@ri_writer.remove_class cls_desc
|
225
|
+
@ri_writer.add_class cls_desc
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rdoc/rdoc'
|
2
|
+
require 'rdoc/generator'
|
3
|
+
require 'rdoc/markup/to_texinfo'
|
4
|
+
|
5
|
+
module RDoc
|
6
|
+
RDoc::GENERATORS['texinfo'] = RDoc::Generator.new("rdoc/generator/texinfo",
|
7
|
+
:Texinfo,
|
8
|
+
'texinfo')
|
9
|
+
module Generator
|
10
|
+
# This generates Texinfo files for viewing with GNU Info or Emacs
|
11
|
+
# from RDoc extracted from Ruby source files.
|
12
|
+
class Texinfo
|
13
|
+
# What should the .info file be named by default?
|
14
|
+
DEFAULT_INFO_FILENAME = 'rdoc.info'
|
15
|
+
|
16
|
+
include Generator::MarkUp
|
17
|
+
|
18
|
+
# Accept some options
|
19
|
+
def initialize(options)
|
20
|
+
@options = options
|
21
|
+
@options.inline_source = true
|
22
|
+
@options.op_name ||= 'rdoc.texinfo'
|
23
|
+
@options.formatter = ::RDoc::Markup::ToTexInfo.new
|
24
|
+
end
|
25
|
+
|
26
|
+
# Generate the +texinfo+ files
|
27
|
+
def generate(toplevels)
|
28
|
+
@toplevels = toplevels
|
29
|
+
@files, @classes = ::RDoc::Generator::Context.build_indicies(@toplevels,
|
30
|
+
@options)
|
31
|
+
|
32
|
+
(@files + @classes).each { |x| x.value_hash }
|
33
|
+
|
34
|
+
open(@options.op_name, 'w') do |f|
|
35
|
+
f.puts TexinfoTemplate.new('files' => @files,
|
36
|
+
'classes' => @classes,
|
37
|
+
'filename' => @options.op_name.gsub(/texinfo/, 'info'),
|
38
|
+
'title' => @options.title).render
|
39
|
+
end
|
40
|
+
# TODO: create info files and install?
|
41
|
+
end
|
42
|
+
|
43
|
+
class << self
|
44
|
+
# Factory? We don't need no stinkin' factory!
|
45
|
+
alias_method :for, :new
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Basically just a wrapper around ERB.
|
50
|
+
# Should probably use RDoc::TemplatePage instead
|
51
|
+
class TexinfoTemplate
|
52
|
+
BASE_DIR = ::File.expand_path(::File.dirname(__FILE__)) # have to calculate this when the file's loaded.
|
53
|
+
|
54
|
+
def initialize(values, file = 'texinfo.erb')
|
55
|
+
@v, @file = [values, file]
|
56
|
+
end
|
57
|
+
|
58
|
+
def template
|
59
|
+
::File.read(::File.join(BASE_DIR, 'texinfo', @file))
|
60
|
+
end
|
61
|
+
|
62
|
+
# Go!
|
63
|
+
def render
|
64
|
+
ERB.new(template).result binding
|
65
|
+
end
|
66
|
+
|
67
|
+
def href(location, text)
|
68
|
+
text # TODO: how does texinfo do hyperlinks?
|
69
|
+
end
|
70
|
+
|
71
|
+
def target(name, text)
|
72
|
+
text # TODO: how do hyperlink targets work?
|
73
|
+
end
|
74
|
+
|
75
|
+
# TODO: this is probably implemented elsewhere?
|
76
|
+
def method_prefix(section)
|
77
|
+
{ 'Class' => '.',
|
78
|
+
'Module' => '::',
|
79
|
+
'Instance' => '#',
|
80
|
+
}[section['category']]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
@node <%= @v['class']['full_name'].gsub(/::/, '-') %>
|
2
|
+
@chapter <%= @v['class']["classmod"] %> <%= @v['class']['full_name'] %>
|
3
|
+
|
4
|
+
<% if @v['class']["parent"] and @v['class']['par_url'] %>
|
5
|
+
Inherits <%= href @v['class']["par_url"], @v['class']["parent"] %><% end %>
|
6
|
+
|
7
|
+
<%= @v['class']["description"] %>
|
8
|
+
|
9
|
+
<% if @v['class']["includes"] %>
|
10
|
+
Includes
|
11
|
+
<% @v['class']["includes"].each do |include| %>
|
12
|
+
* <%= href include["aref"], include["name"] %>
|
13
|
+
<% end # @v['class']["includes"] %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<% if @v['class']["sections"] %>
|
17
|
+
<% @v['class']["sections"].each do |section| %>
|
18
|
+
<% if section["attributes"] %>
|
19
|
+
Attributes
|
20
|
+
<% section["attributes"].each do |attributes| %>
|
21
|
+
* <%= attributes["name"] %> <%= attributes["rw"] %> <%= attributes["a_desc"] %>
|
22
|
+
<% end # section["attributes"] %>
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
<% @v['class']["sections"].each do |section| %>
|
27
|
+
<% if section["method_list"] %>
|
28
|
+
Methods
|
29
|
+
@menu
|
30
|
+
<% section["method_list"].each_with_index do |method_list, i| %>
|
31
|
+
<%= i %>
|
32
|
+
<% (method_list["methods"] || []).each do |method| %>
|
33
|
+
* <%= @v['class']['full_name'].gsub(/::/, '-') %><%= method_prefix method_list %><%= method['name'] %>::<% end %>
|
34
|
+
<% end %>
|
35
|
+
@end menu
|
36
|
+
|
37
|
+
<% section["method_list"].each do |method_list| %>
|
38
|
+
<% (method_list["methods"] || []).uniq.each do |method| %>
|
39
|
+
<%= TexinfoTemplate.new(@v.merge({'method' => method, 'list' => method_list}),
|
40
|
+
'method.texinfo.erb').render %><% end %>
|
41
|
+
<% end # section["method_list"] %>
|
42
|
+
<% end %>
|
43
|
+
<% end # @v['class']["sections"] %>
|
44
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
@node <%= @v['class']['full_name'].gsub(/::/, '-') %><%= method_prefix @v['list'] %><%= @v['method']['name'] %>
|
2
|
+
@section <%= @v['class']["classmod"] %> <%= @v['class']['full_name'] %><%= method_prefix @v['list'] %><%= @v['method']['name'] %>
|
3
|
+
<%= @v['method']["type"] %> <%= @v['method']["category"] %> method:
|
4
|
+
<%= target @v['method']["aref"], @v['method']['callseq'] ||
|
5
|
+
@v['method']["name"] + @v['method']["params"] %>
|
6
|
+
<%= @v['method']["m_desc"] %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
\input texinfo @c -*-texinfo-*-
|
2
|
+
@c %**start of header
|
3
|
+
@setfilename <%= @v['filename'] %>
|
4
|
+
@settitle <%= @v['title'] %>
|
5
|
+
@c %**end of header
|
6
|
+
|
7
|
+
@contents @c TODO: whitespace is a mess... =\
|
8
|
+
|
9
|
+
@ifnottex
|
10
|
+
@node Top
|
11
|
+
|
12
|
+
@top <%= @v['title'] %>
|
13
|
+
@end ifnottex
|
14
|
+
|
15
|
+
<% if @f = @v['files'].detect { |f| f.name =~ /Readme/i } %>
|
16
|
+
<%= @f.values['description'] %><% end %>
|
17
|
+
|
18
|
+
@menu
|
19
|
+
<% @v['classes'].each do |klass| %>
|
20
|
+
* <%= klass.name.gsub(/::/, '-') %>::<% end %>
|
21
|
+
@c TODO: add files
|
22
|
+
@end menu
|
23
|
+
|
24
|
+
<% (@v['classes'] || []).each_with_index do |klass, i| %>
|
25
|
+
<%= TexinfoTemplate.new(@v.merge('class' => klass.values),
|
26
|
+
'class.texinfo.erb').render %><% end %>
|
27
|
+
|
28
|
+
@bye
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'rdoc/generator/html'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Generate XML output as one big file
|
5
|
+
|
6
|
+
class RDoc::Generator::XML < RDoc::Generator::HTML
|
7
|
+
|
8
|
+
##
|
9
|
+
# Standard generator factory
|
10
|
+
|
11
|
+
def self.for(options)
|
12
|
+
new(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Build the initial indices and output objects
|
21
|
+
# based on an array of TopLevel objects containing
|
22
|
+
# the extracted information.
|
23
|
+
|
24
|
+
def generate(info)
|
25
|
+
@info = info
|
26
|
+
@files = []
|
27
|
+
@classes = []
|
28
|
+
@hyperlinks = {}
|
29
|
+
|
30
|
+
build_indices
|
31
|
+
generate_xml
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Generate:
|
36
|
+
#
|
37
|
+
# * a list of HtmlFile objects for each TopLevel object.
|
38
|
+
# * a list of HtmlClass objects for each first level
|
39
|
+
# class or module in the TopLevel objects
|
40
|
+
# * a complete list of all hyperlinkable terms (file,
|
41
|
+
# class, module, and method names)
|
42
|
+
|
43
|
+
def build_indices
|
44
|
+
@info.each do |toplevel|
|
45
|
+
@files << RDoc::Generator::HtmlFile.new(toplevel, @options, RDoc::Generator::FILE_DIR)
|
46
|
+
end
|
47
|
+
|
48
|
+
RDoc::TopLevel.all_classes_and_modules.each do |cls|
|
49
|
+
build_class_list(cls, @files[0], RDoc::Generator::CLASS_DIR)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def build_class_list(from, html_file, class_dir)
|
54
|
+
@classes << RDoc::Generator::HtmlClass.new(from, html_file, class_dir, @options)
|
55
|
+
from.each_classmodule do |mod|
|
56
|
+
build_class_list(mod, html_file, class_dir)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Generate all the HTML. For the one-file case, we generate
|
62
|
+
# all the information in to one big hash
|
63
|
+
|
64
|
+
def generate_xml
|
65
|
+
values = {
|
66
|
+
'charset' => @options.charset,
|
67
|
+
'files' => gen_into(@files),
|
68
|
+
'classes' => gen_into(@classes)
|
69
|
+
}
|
70
|
+
|
71
|
+
# this method is defined in the template file
|
72
|
+
write_extra_pages if defined? write_extra_pages
|
73
|
+
|
74
|
+
template = RDoc::TemplatePage.new @template::ONE_PAGE
|
75
|
+
|
76
|
+
if @options.op_name
|
77
|
+
opfile = File.open(@options.op_name, "w")
|
78
|
+
else
|
79
|
+
opfile = $stdout
|
80
|
+
end
|
81
|
+
template.write_html_on(opfile, values)
|
82
|
+
end
|
83
|
+
|
84
|
+
def gen_into(list)
|
85
|
+
res = []
|
86
|
+
list.each do |item|
|
87
|
+
res << item.value_hash
|
88
|
+
end
|
89
|
+
res
|
90
|
+
end
|
91
|
+
|
92
|
+
def gen_file_index
|
93
|
+
gen_an_index(@files, 'Files')
|
94
|
+
end
|
95
|
+
|
96
|
+
def gen_class_index
|
97
|
+
gen_an_index(@classes, 'Classes')
|
98
|
+
end
|
99
|
+
|
100
|
+
def gen_method_index
|
101
|
+
gen_an_index(RDoc::Generator::HtmlMethod.all_methods, 'Methods')
|
102
|
+
end
|
103
|
+
|
104
|
+
def gen_an_index(collection, title)
|
105
|
+
res = []
|
106
|
+
collection.sort.each do |f|
|
107
|
+
if f.document_self
|
108
|
+
res << { "href" => f.path, "name" => f.index_name }
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
return {
|
113
|
+
"entries" => res,
|
114
|
+
'list_title' => title,
|
115
|
+
'index_url' => main_url,
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|