erlapi 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +15 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/bin/erlapi +26 -0
- data/erlapi.gemspec +140 -0
- data/lib/erlapi.rb +38 -0
- data/lib/erlapi/generator.rb +194 -0
- data/lib/erlapi/generator/shtml.rb +353 -0
- data/lib/erlapi/generator/template/direct/_context.rhtml +172 -0
- data/lib/erlapi/generator/template/direct/class.rhtml +40 -0
- data/lib/erlapi/generator/template/direct/file.rhtml +30 -0
- data/lib/erlapi/generator/template/direct/index.rhtml +14 -0
- data/lib/erlapi/generator/template/direct/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/css/main.css +263 -0
- data/lib/erlapi/generator/template/direct/resources/css/panel.css +383 -0
- data/lib/erlapi/generator/template/direct/resources/css/reset.css +53 -0
- data/lib/erlapi/generator/template/direct/resources/favicon.ico +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/arrows.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/results_bg.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/generator/template/direct/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/generator/template/direct/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/generator/template/direct/resources/js/main.js +22 -0
- data/lib/erlapi/generator/template/direct/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/generator/template/direct/resources/panel/index.html +71 -0
- data/lib/erlapi/generator/template/merge/index.rhtml +14 -0
- data/lib/erlapi/generator/template/shtml/_context.rhtml +164 -0
- data/lib/erlapi/generator/template/shtml/class.rhtml +46 -0
- data/lib/erlapi/generator/template/shtml/file.rhtml +37 -0
- data/lib/erlapi/generator/template/shtml/index.rhtml +14 -0
- data/lib/erlapi/generator/template/shtml/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/css/main.css +191 -0
- data/lib/erlapi/generator/template/shtml/resources/css/panel.css +383 -0
- data/lib/erlapi/generator/template/shtml/resources/css/reset.css +53 -0
- data/lib/erlapi/generator/template/shtml/resources/favicon.ico +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/arrows.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/results_bg.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/generator/template/shtml/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/generator/template/shtml/resources/js/main.js +34 -0
- data/lib/erlapi/generator/template/shtml/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/generator/template/shtml/resources/panel/index.html +71 -0
- data/lib/erlapi/helpers.rb +26 -0
- data/lib/erlapi/merge.rb +217 -0
- data/lib/erlapi/parser.rb +134 -0
- data/lib/erlapi/shtml.rb +351 -0
- data/lib/erlapi/templatable.rb +51 -0
- data/lib/erlapi/templates/html/direct/_context.rhtml +172 -0
- data/lib/erlapi/templates/html/direct/class.rhtml +40 -0
- data/lib/erlapi/templates/html/direct/file.rhtml +30 -0
- data/lib/erlapi/templates/html/direct/index.rhtml +14 -0
- data/lib/erlapi/templates/html/direct/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/css/main.css +263 -0
- data/lib/erlapi/templates/html/direct/resources/css/panel.css +383 -0
- data/lib/erlapi/templates/html/direct/resources/css/reset.css +53 -0
- data/lib/erlapi/templates/html/direct/resources/favicon.ico +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/direct/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/direct/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/templates/html/direct/resources/js/main.js +22 -0
- data/lib/erlapi/templates/html/direct/resources/js/searchdoc.js +628 -0
- data/lib/erlapi/templates/html/direct/resources/panel/index.html +71 -0
- data/lib/erlapi/templates/html/merge/index.rhtml +14 -0
- data/lib/erlapi/templates/html/shtml/_context.rhtml +68 -0
- data/lib/erlapi/templates/html/shtml/class.rhtml +25 -0
- data/lib/erlapi/templates/html/shtml/file.rhtml +37 -0
- data/lib/erlapi/templates/html/shtml/index.rhtml +14 -0
- data/lib/erlapi/templates/html/shtml/resources copy/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/main.css +195 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/panel.css +383 -0
- data/lib/erlapi/templates/html/shtml/resources copy/css/reset.css +53 -0
- data/lib/erlapi/templates/html/shtml/resources copy/favicon.ico +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/main.js +34 -0
- data/lib/erlapi/templates/html/shtml/resources copy/js/searchdoc.js +628 -0
- data/lib/erlapi/templates/html/shtml/resources copy/panel/index.html +71 -0
- data/lib/erlapi/templates/html/shtml/resources/apple-touch-icon.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/css/main.css +263 -0
- data/lib/erlapi/templates/html/shtml/resources/css/panel.css +383 -0
- data/lib/erlapi/templates/html/shtml/resources/css/reset.css +53 -0
- data/lib/erlapi/templates/html/shtml/resources/favicon.ico +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/arrows.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/results_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/i/tree_bg.png +0 -0
- data/lib/erlapi/templates/html/shtml/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/erlapi/templates/html/shtml/resources/js/jquery-effect.js +593 -0
- data/lib/erlapi/templates/html/shtml/resources/js/main.js +22 -0
- data/lib/erlapi/templates/html/shtml/resources/js/searchdoc.js +620 -0
- data/lib/erlapi/templates/html/shtml/resources/panel/index.html +71 -0
- data/test/erlapi_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +155 -0
@@ -0,0 +1,353 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem "rdoc", ">= 2.4.2"
|
3
|
+
if Gem.available? "json"
|
4
|
+
gem "json", ">= 1.1.3"
|
5
|
+
else
|
6
|
+
gem "json_pure", ">= 1.1.3"
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'iconv'
|
10
|
+
require 'json'
|
11
|
+
require 'pathname'
|
12
|
+
require 'fileutils'
|
13
|
+
require 'erb'
|
14
|
+
|
15
|
+
require 'rdoc/rdoc'
|
16
|
+
require 'rdoc/generator'
|
17
|
+
require 'rdoc/generator/markup'
|
18
|
+
|
19
|
+
require 'sdoc/github'
|
20
|
+
require 'sdoc/templatable'
|
21
|
+
require 'sdoc/helpers'
|
22
|
+
|
23
|
+
class RDoc::ClassModule
|
24
|
+
def document_self_or_methods
|
25
|
+
document_self || method_list.any?{ |m| m.document_self }
|
26
|
+
end
|
27
|
+
|
28
|
+
def with_documentation?
|
29
|
+
document_self_or_methods || classes_and_modules.any?{ |c| c.with_documentation? }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Erlapi::Generator::SHtml
|
34
|
+
include ERB::Util
|
35
|
+
include Erlapi::Templatable
|
36
|
+
include Erlapi::Helpers
|
37
|
+
|
38
|
+
GENERATOR_DIRS = [File.join('erlapi', 'generator')]
|
39
|
+
|
40
|
+
# Used in js to reduce index sizes
|
41
|
+
TYPE_CLASS = 1
|
42
|
+
TYPE_METHOD = 2
|
43
|
+
TYPE_FILE = 3
|
44
|
+
|
45
|
+
TREE_FILE = File.join 'panel', 'tree.js'
|
46
|
+
SEARCH_INDEX_FILE = File.join 'panel', 'search_index.js'
|
47
|
+
|
48
|
+
FILE_DIR = 'files'
|
49
|
+
CLASS_DIR = 'classes'
|
50
|
+
|
51
|
+
RESOURCES_DIR = File.join('resources', '.')
|
52
|
+
|
53
|
+
attr_reader :basedir
|
54
|
+
|
55
|
+
def self.for(options)
|
56
|
+
self.new(options)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.template_dir template
|
60
|
+
$LOAD_PATH.map do |path|
|
61
|
+
GENERATOR_DIRS.map do |dir|
|
62
|
+
File.join path, dir, 'template', template
|
63
|
+
end
|
64
|
+
end.flatten.find do |dir|
|
65
|
+
File.directory? dir
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def initialize(options)
|
70
|
+
@options = options
|
71
|
+
@options.diagram = false
|
72
|
+
@github_url_cache = {}
|
73
|
+
|
74
|
+
template = @options.template || 'direct'
|
75
|
+
|
76
|
+
templ_dir = self.class.template_dir template
|
77
|
+
|
78
|
+
raise "Could not find template #{template.inspect}" unless
|
79
|
+
templ_dir
|
80
|
+
|
81
|
+
@template_dir = Pathname.new File.expand_path(templ_dir)
|
82
|
+
@basedir = Pathname.pwd.expand_path
|
83
|
+
end
|
84
|
+
|
85
|
+
def generate( top_levels )
|
86
|
+
@outputdir = Pathname.new( @options.op_dir ).expand_path( @basedir )
|
87
|
+
@files = top_levels.sort
|
88
|
+
@classes = RDoc::TopLevel.all_classes_and_modules.sort
|
89
|
+
|
90
|
+
# Now actually write the output
|
91
|
+
copy_resources
|
92
|
+
# generate_class_tree
|
93
|
+
generate_search_index
|
94
|
+
# generate_file_files
|
95
|
+
# generate_class_files
|
96
|
+
# generate_index_file
|
97
|
+
end
|
98
|
+
|
99
|
+
def class_dir
|
100
|
+
CLASS_DIR
|
101
|
+
end
|
102
|
+
|
103
|
+
def file_dir
|
104
|
+
FILE_DIR
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
protected
|
109
|
+
### Output progress information if debugging is enabled
|
110
|
+
def debug_msg( *msg )
|
111
|
+
return unless $DEBUG_RDOC
|
112
|
+
$stderr.puts( *msg )
|
113
|
+
end
|
114
|
+
|
115
|
+
### Create class tree structure and write it as json
|
116
|
+
def generate_class_tree
|
117
|
+
debug_msg "Generating class tree"
|
118
|
+
topclasses = @classes.select {|klass| !(RDoc::ClassModule === klass.parent) }
|
119
|
+
tree = generate_file_tree + generate_class_tree_level(topclasses)
|
120
|
+
debug_msg " writing class tree to %s" % TREE_FILE
|
121
|
+
File.open(TREE_FILE, "w", 0644) do |f|
|
122
|
+
f.write('var tree = '); f.write(tree.to_json)
|
123
|
+
end unless $dryrun
|
124
|
+
end
|
125
|
+
|
126
|
+
### Recursivly build class tree structure
|
127
|
+
def generate_class_tree_level(classes)
|
128
|
+
tree = []
|
129
|
+
classes.select{|c| c.with_documentation? }.sort.each do |klass|
|
130
|
+
item = [
|
131
|
+
klass.name,
|
132
|
+
klass.document_self_or_methods ? klass.path : '',
|
133
|
+
klass.module? ? '' : (klass.superclass ? " < #{String === klass.superclass ? klass.superclass : klass.superclass.full_name}" : ''),
|
134
|
+
generate_class_tree_level(klass.classes_and_modules)
|
135
|
+
]
|
136
|
+
tree << item
|
137
|
+
end
|
138
|
+
tree
|
139
|
+
end
|
140
|
+
|
141
|
+
### Create search index for all classes, methods and files
|
142
|
+
### Wite it as json
|
143
|
+
def generate_search_index
|
144
|
+
debug_msg "Generating search index"
|
145
|
+
|
146
|
+
index = {
|
147
|
+
:searchIndex => [],
|
148
|
+
:longSearchIndex => [],
|
149
|
+
:info => []
|
150
|
+
}
|
151
|
+
|
152
|
+
add_class_search_index(index)
|
153
|
+
add_method_search_index(index)
|
154
|
+
add_file_search_index(index)
|
155
|
+
|
156
|
+
debug_msg " writing search index to %s" % SEARCH_INDEX_FILE
|
157
|
+
data = {
|
158
|
+
:index => index
|
159
|
+
}
|
160
|
+
File.open(SEARCH_INDEX_FILE, "w", 0644) do |f|
|
161
|
+
f.write('var search_data = '); f.write(data.to_json)
|
162
|
+
end unless $dryrun
|
163
|
+
end
|
164
|
+
|
165
|
+
### Add files to search +index+ array
|
166
|
+
def add_file_search_index(index)
|
167
|
+
debug_msg " generating file search index"
|
168
|
+
|
169
|
+
@files.select { |file|
|
170
|
+
file.document_self
|
171
|
+
}.sort.each do |file|
|
172
|
+
index[:searchIndex].push( search_string(file.name) )
|
173
|
+
index[:longSearchIndex].push( search_string(file.path) )
|
174
|
+
index[:info].push([
|
175
|
+
file.name,
|
176
|
+
file.path,
|
177
|
+
file.path,
|
178
|
+
'',
|
179
|
+
snippet(file.comment),
|
180
|
+
TYPE_FILE
|
181
|
+
])
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
### Add classes to search +index+ array
|
186
|
+
def add_class_search_index(index)
|
187
|
+
debug_msg " generating class search index"
|
188
|
+
|
189
|
+
@classes.select { |klass|
|
190
|
+
klass.document_self_or_methods
|
191
|
+
}.sort.each do |klass|
|
192
|
+
index[:searchIndex].push( search_string(klass.name) )
|
193
|
+
index[:longSearchIndex].push( search_string(klass.parent.name) )
|
194
|
+
index[:info].push([
|
195
|
+
klass.name,
|
196
|
+
klass.parent.full_name,
|
197
|
+
klass.path,
|
198
|
+
klass.module? ? '' : (klass.superclass ? " < #{String === klass.superclass ? klass.superclass : klass.superclass.full_name}" : ''),
|
199
|
+
snippet(klass.comment),
|
200
|
+
TYPE_CLASS
|
201
|
+
])
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
### Add methods to search +index+ array
|
206
|
+
def add_method_search_index(index)
|
207
|
+
debug_msg " generating method search index"
|
208
|
+
|
209
|
+
list = @classes.map { |klass|
|
210
|
+
klass.method_list
|
211
|
+
}.flatten.sort{ |a, b| a.name == b.name ? a.parent.full_name <=> b.parent.full_name : a.name <=> b.name }.select { |method|
|
212
|
+
method.document_self
|
213
|
+
}
|
214
|
+
unless @options.show_all
|
215
|
+
list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation }
|
216
|
+
end
|
217
|
+
|
218
|
+
list.each do |method|
|
219
|
+
index[:searchIndex].push( search_string(method.name) + '()' )
|
220
|
+
index[:longSearchIndex].push( search_string(method.parent.name) )
|
221
|
+
index[:info].push([
|
222
|
+
method.name,
|
223
|
+
method.parent.full_name,
|
224
|
+
method.path,
|
225
|
+
method.params,
|
226
|
+
snippet(method.comment),
|
227
|
+
TYPE_METHOD
|
228
|
+
])
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
### Generate a documentation file for each class
|
233
|
+
def generate_class_files
|
234
|
+
debug_msg "Generating class documentation in #@outputdir"
|
235
|
+
templatefile = @template_dir + 'class.rhtml'
|
236
|
+
|
237
|
+
@classes.each do |klass|
|
238
|
+
debug_msg " working on %s (%s)" % [ klass.full_name, klass.path ]
|
239
|
+
outfile = @outputdir + klass.path
|
240
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
241
|
+
|
242
|
+
debug_msg " rendering #{outfile}"
|
243
|
+
self.render_template( templatefile, binding(), outfile )
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
### Generate a documentation file for each file
|
248
|
+
def generate_file_files
|
249
|
+
debug_msg "Generating file documentation in #@outputdir"
|
250
|
+
templatefile = @template_dir + 'file.rhtml'
|
251
|
+
|
252
|
+
@files.each do |file|
|
253
|
+
outfile = @outputdir + file.path
|
254
|
+
debug_msg " working on %s (%s)" % [ file.full_name, outfile ]
|
255
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
256
|
+
|
257
|
+
debug_msg " rendering #{outfile}"
|
258
|
+
self.render_template( templatefile, binding(), outfile )
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def index_file
|
263
|
+
if @options.main_page && file = @files.find { |f| f.full_name == @options.main_page }
|
264
|
+
file
|
265
|
+
else
|
266
|
+
@files.first
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
### Create index.html with frameset
|
271
|
+
def generate_index_file
|
272
|
+
debug_msg "Generating index file in #@outputdir"
|
273
|
+
templatefile = @template_dir + 'index.rhtml'
|
274
|
+
outfile = @outputdir + 'index.html'
|
275
|
+
index_path = index_file.path
|
276
|
+
|
277
|
+
self.render_template( templatefile, binding(), outfile )
|
278
|
+
end
|
279
|
+
|
280
|
+
### Strip comments on a space after 100 chars
|
281
|
+
def snippet(str)
|
282
|
+
str ||= ''
|
283
|
+
if str =~ /^(?>\s*)[^\#]/
|
284
|
+
content = str
|
285
|
+
else
|
286
|
+
content = str.gsub(/^\s*(#+)\s*/, '')
|
287
|
+
end
|
288
|
+
|
289
|
+
content = content.sub(/^(.{100,}?)\s.*/m, "\\1").gsub(/\r?\n/m, ' ')
|
290
|
+
|
291
|
+
begin
|
292
|
+
content.to_json
|
293
|
+
rescue # might fail on non-unicode string
|
294
|
+
begin
|
295
|
+
content = Iconv.conv('latin1//ignore', "UTF8", content) # remove all non-unicode chars
|
296
|
+
content.to_json
|
297
|
+
rescue
|
298
|
+
content = '' # something hugely wrong happend
|
299
|
+
end
|
300
|
+
end
|
301
|
+
content
|
302
|
+
end
|
303
|
+
|
304
|
+
### Build search index key
|
305
|
+
def search_string(string)
|
306
|
+
string ||= ''
|
307
|
+
string.downcase.gsub(/\s/,'')
|
308
|
+
end
|
309
|
+
|
310
|
+
### Copy all the resource files to output dir
|
311
|
+
def copy_resources
|
312
|
+
resoureces_path = @template_dir + RESOURCES_DIR
|
313
|
+
debug_msg "Copying #{resoureces_path}/** to #{@outputdir}/**"
|
314
|
+
FileUtils.cp_r resoureces_path.to_s, @outputdir.to_s, :preserve => true unless $dryrun
|
315
|
+
end
|
316
|
+
|
317
|
+
class FilesTree
|
318
|
+
attr_reader :children
|
319
|
+
def add(path, url)
|
320
|
+
path = path.split(File::SEPARATOR) unless Array === path
|
321
|
+
@children ||= {}
|
322
|
+
if path.length == 1
|
323
|
+
@children[path.first] = url
|
324
|
+
else
|
325
|
+
@children[path.first] ||= FilesTree.new
|
326
|
+
@children[path.first].add(path[1, path.length], url)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
def generate_file_tree
|
332
|
+
if @files.length > 1
|
333
|
+
@files_tree = FilesTree.new
|
334
|
+
@files.each do |file|
|
335
|
+
@files_tree.add(file.relative_name, file.path)
|
336
|
+
end
|
337
|
+
[['', '', 'files', generate_file_tree_level(@files_tree)]]
|
338
|
+
else
|
339
|
+
[]
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
def generate_file_tree_level(tree)
|
344
|
+
tree.children.keys.sort.map do |name|
|
345
|
+
child = tree.children[name]
|
346
|
+
if String === child
|
347
|
+
[name, child, '', []]
|
348
|
+
else
|
349
|
+
['', '', name, generate_file_tree_level(child)]
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
<div id="content">
|
2
|
+
<% unless (desc = context.description).empty? %>
|
3
|
+
<div class="description">
|
4
|
+
<%= desc %>
|
5
|
+
</div>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<% unless context.requires.empty? %>
|
9
|
+
<div class="sectiontitle">Required Files</div>
|
10
|
+
<ul>
|
11
|
+
<% context.requires.each do |req| %>
|
12
|
+
<li><%= h req.name %></li>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<% sections = context.sections.select { |section| section.title } %>
|
18
|
+
<% unless sections.empty? %>
|
19
|
+
<div class="sectiontitle">Contents</div>
|
20
|
+
<ul>
|
21
|
+
<% sections.each do |section| %>
|
22
|
+
<li><a href="#<%= section.sequence %>"><%= h section.title %></a></li>
|
23
|
+
<% end %>
|
24
|
+
</ul>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
<%
|
28
|
+
list = context.method_list
|
29
|
+
unless @options.show_all
|
30
|
+
list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation }
|
31
|
+
end
|
32
|
+
%>
|
33
|
+
<% unless list.empty? %>
|
34
|
+
<div class="sectiontitle">Methods</div>
|
35
|
+
<dl class="methods">
|
36
|
+
<% each_letter_group(list) do |group| %>
|
37
|
+
<dt><%= group[:name] %></dt>
|
38
|
+
<dd>
|
39
|
+
<ul>
|
40
|
+
<% group[:methods].each_with_index do |method, i| %>
|
41
|
+
<li><a href="#<%= method.aref %>"><%= method.name %></a><%= ',' unless group[:methods].size == i+1 %></li>
|
42
|
+
<% end %>
|
43
|
+
</ul>
|
44
|
+
</dd>
|
45
|
+
<% end %>
|
46
|
+
</dl>
|
47
|
+
<% end %>
|
48
|
+
|
49
|
+
<% unless context.includes.empty? %>
|
50
|
+
<div class="sectiontitle">Included Modules</div>
|
51
|
+
<ul>
|
52
|
+
<% context.includes.each do |inc| %>
|
53
|
+
<li>
|
54
|
+
<% unless String === inc.module %>
|
55
|
+
<a href="<%= context.aref_to inc.module.path %>"><%= h inc.module.full_name %></a>
|
56
|
+
<% else %>
|
57
|
+
<span><%= h inc.name %></span>
|
58
|
+
<% end %>
|
59
|
+
START:includes
|
60
|
+
</li>
|
61
|
+
<% end %>
|
62
|
+
</ul>
|
63
|
+
<% end %>
|
64
|
+
|
65
|
+
<% sections.each do |section| %>
|
66
|
+
<div class="sectiontitle"><a name="<%= h section.sequence %>"><%= h section.title %></a></div>
|
67
|
+
<% unless (description = section.description).empty? %>
|
68
|
+
<div class="description">
|
69
|
+
<%= description %>
|
70
|
+
</div>
|
71
|
+
<% end %>
|
72
|
+
<% end %>
|
73
|
+
|
74
|
+
<% unless context.classes_and_modules.empty? %>
|
75
|
+
<div class="sectiontitle">Classes and Modules</div>
|
76
|
+
<ul>
|
77
|
+
<% (context.modules.sort + context.classes.sort).each do |mod| %>
|
78
|
+
<li><span class="type"><%= mod.type.upcase %></span> <a href="<%= context.aref_to mod.path %>"><%= mod.full_name %></a></li>
|
79
|
+
<% end %>
|
80
|
+
</ul>
|
81
|
+
<% end %>
|
82
|
+
|
83
|
+
<% unless context.constants.empty? %>
|
84
|
+
<div class="sectiontitle">Constants</div>
|
85
|
+
<table border='0' cellpadding='5'>
|
86
|
+
<% context.each_constant do |const| %>
|
87
|
+
<tr valign='top'>
|
88
|
+
<td class="attr-name"><%= h const.name %></td>
|
89
|
+
<td>=</td>
|
90
|
+
<td class="attr-value"><%= h const.value %></td>
|
91
|
+
</tr>
|
92
|
+
<% unless (description = const.description).empty? %>
|
93
|
+
<tr valign='top'>
|
94
|
+
<td> </td>
|
95
|
+
<td colspan="2" class="attr-desc"><%= description %></td>
|
96
|
+
</tr>
|
97
|
+
<% end %>
|
98
|
+
<% end %>
|
99
|
+
</table>
|
100
|
+
<% end %>
|
101
|
+
|
102
|
+
<% unless context.attributes.empty? %>
|
103
|
+
<div class="sectiontitle">Attributes</div>
|
104
|
+
<table border='0' cellpadding='5'>
|
105
|
+
<% context.each_attribute do |attrib| %>
|
106
|
+
<tr valign='top'>
|
107
|
+
<td class='attr-rw'>
|
108
|
+
[<%= attrib.rw %>]
|
109
|
+
</td>
|
110
|
+
<td class='attr-name'><%= h attrib.name %></td>
|
111
|
+
<td class='attr-desc'><%= attrib.description.strip %></td>
|
112
|
+
</tr>
|
113
|
+
<% end %>
|
114
|
+
</table>
|
115
|
+
<% end %>
|
116
|
+
|
117
|
+
<% context.methods_by_type.each do |type, visibilities|
|
118
|
+
next if visibilities.empty?
|
119
|
+
visibilities.each do |visibility, methods|
|
120
|
+
next if methods.empty?
|
121
|
+
next unless @options.show_all || visibility == :public || visibility == :protected || methods.any? {|m| m.force_documentation }
|
122
|
+
%>
|
123
|
+
<div class="sectiontitle"><%= type.capitalize %> <%= visibility.to_s.capitalize %> methods</div>
|
124
|
+
<% methods.each do |method| %>
|
125
|
+
<div class="method">
|
126
|
+
<div class="title" id="<%= method.aref %>">
|
127
|
+
<% if method.call_seq %>
|
128
|
+
<a name="<%= method.aref %>"></a><b><%= method.call_seq.gsub(/->/, '→') %></b>
|
129
|
+
<% else %>
|
130
|
+
<a name="<%= method.aref %>"></a><b><%= h method.name %></b><%= h method.params %>
|
131
|
+
<% end %>
|
132
|
+
</div>
|
133
|
+
<% unless (description = method.description).empty? %>
|
134
|
+
<div class="description">
|
135
|
+
<%= description %>
|
136
|
+
</div>
|
137
|
+
<% end %>
|
138
|
+
<% unless method.aliases.empty? %>
|
139
|
+
<div class="aka">
|
140
|
+
This method is also aliased as
|
141
|
+
<% method.aliases.each do |aka| %>
|
142
|
+
<a href="<%= context.aref_to aka.path %>"><%= h aka.name %></a>
|
143
|
+
<% end %>
|
144
|
+
</div>
|
145
|
+
<% end %>
|
146
|
+
<% if method.token_stream %>
|
147
|
+
<% markup = method.markup_code %>
|
148
|
+
<div class="sourcecode">
|
149
|
+
<p class="source-link">
|
150
|
+
Source: <a href="javascript:toggleSource('<%= method.aref %>_source')" id="l_<%= method.aref %>_source">show</a>
|
151
|
+
<%
|
152
|
+
if markup =~ /File\s(\S+), line (\d+)/
|
153
|
+
path = $1
|
154
|
+
line = $2.to_i
|
155
|
+
end
|
156
|
+
github = github_url(path)
|
157
|
+
if github
|
158
|
+
%>
|
159
|
+
| <a href="<%= "#{github}#L#{line}" %>" target="_blank" class="github_url">on GitHub</a>
|
160
|
+
<% end %>
|
161
|
+
</p>
|
162
|
+
<div id="<%= method.aref %>_source" class="dyn-source">
|
163
|
+
<pre><%= method.markup_code %></pre>
|
164
|
+
</div>
|
165
|
+
</div>
|
166
|
+
<% end %>
|
167
|
+
</div>
|
168
|
+
<% end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
%>
|
172
|
+
</div>
|