voloko-sdoc 0.0.5 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/bin/sdoc +0 -1
- data/bin/sdoc-merge +12 -0
- data/lib/sdoc.rb +15 -7
- data/lib/sdoc/generator/shtml.rb +671 -0
- data/lib/sdoc/generator/template/shtml/_context.rhtml +163 -0
- data/lib/sdoc/generator/template/shtml/class.rhtml +46 -0
- data/lib/sdoc/generator/template/shtml/file.rhtml +37 -0
- data/lib/sdoc/generator/template/shtml/index.rhtml +14 -0
- data/lib/sdoc/generator/template/shtml/resources/css/main.css +191 -0
- data/lib/sdoc/{generators/template/shtml/resources/css/master-frameset.css → generator/template/shtml/resources/css/panel.css} +83 -2
- data/lib/sdoc/{generators → generator}/template/shtml/resources/css/reset.css +0 -0
- data/lib/sdoc/{generators → generator}/template/shtml/resources/i/arrows.png +0 -0
- data/lib/sdoc/{generators → generator}/template/shtml/resources/i/results_bg.png +0 -0
- data/lib/sdoc/{generators → generator}/template/shtml/resources/i/tree_bg.png +0 -0
- data/lib/sdoc/{generators → generator}/template/shtml/resources/js/jquery-1.3.2.min.js +0 -0
- data/lib/sdoc/generator/template/shtml/resources/js/main.js +34 -0
- data/lib/sdoc/generator/template/shtml/resources/js/searchdoc.js +600 -0
- data/lib/sdoc/{generators/template/shtml/resources/panel.html → generator/template/shtml/resources/panel/index.html} +6 -6
- data/lib/sdoc/github.rb +64 -0
- data/lib/sdoc/merge.rb +166 -0
- metadata +117 -19
- data/lib/sdoc/code_objects.rb +0 -17
- data/lib/sdoc/generators/shtml_generator.rb +0 -354
- data/lib/sdoc/generators/template/shtml/resources/js/searchdoc.js +0 -595
- data/lib/sdoc/generators/template/shtml/shtml.rb +0 -615
- data/lib/sdoc/options.rb +0 -61
- data/test/options_test.rb +0 -33
- data/test/sdoc_test.rb +0 -7
data/README
CHANGED
data/bin/sdoc
CHANGED
data/bin/sdoc-merge
ADDED
data/lib/sdoc.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
|
-
require "rdoc/rdoc"
|
2
1
|
$:.unshift File.dirname(__FILE__)
|
3
|
-
|
4
|
-
require "
|
2
|
+
$:.unshift File.join File.dirname(__FILE__), '..', 'rdoc', 'lib'
|
3
|
+
require "rdoc/rdoc"
|
5
4
|
|
6
5
|
module SDoc
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
end
|
7
|
+
|
8
|
+
require "sdoc/generator/shtml"
|
9
|
+
|
10
|
+
class RDoc::Options
|
11
|
+
alias_method :rdoc_initialize, :initialize
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
rdoc_initialize
|
15
|
+
@generator = RDoc::Generator::SHtml
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,671 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
require 'pathname'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'erb'
|
6
|
+
|
7
|
+
require 'rdoc/rdoc'
|
8
|
+
require 'rdoc/generator'
|
9
|
+
require 'rdoc/generator/markup'
|
10
|
+
|
11
|
+
require 'sdoc/github'
|
12
|
+
|
13
|
+
class RDoc::ClassModule
|
14
|
+
def with_documentation?
|
15
|
+
document_self || classes_and_modules.any?{ |c| c.with_documentation? }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class RDoc::Generator::SHtml
|
20
|
+
RDoc::RDoc.add_generator( self )
|
21
|
+
include ERB::Util
|
22
|
+
include SDoc::GitHub
|
23
|
+
|
24
|
+
GENERATOR_DIRS = [File.join('sdoc', 'generator'), File.join('rdoc', 'generator')]
|
25
|
+
|
26
|
+
# Used in js to reduce index sizes
|
27
|
+
TYPE_CLASS = 1
|
28
|
+
TYPE_METHOD = 2
|
29
|
+
TYPE_FILE = 3
|
30
|
+
|
31
|
+
TREE_FILE = File.join 'panel', 'tree.js'
|
32
|
+
SEARCH_INDEX_FILE = File.join 'panel', 'search_index.js'
|
33
|
+
|
34
|
+
FILE_DIR = 'files'
|
35
|
+
CLASS_DIR = 'classes'
|
36
|
+
|
37
|
+
RESOURCES_DIR = File.join('resources', '.')
|
38
|
+
|
39
|
+
attr_reader :basedir
|
40
|
+
|
41
|
+
def self.for(options)
|
42
|
+
self.new(options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize(options)
|
46
|
+
@options = options
|
47
|
+
@options.diagram = false
|
48
|
+
@github_url_cache = {}
|
49
|
+
|
50
|
+
template = @options.template || 'shtml'
|
51
|
+
|
52
|
+
template_dir = $LOAD_PATH.map do |path|
|
53
|
+
GENERATOR_DIRS.map do |dir|
|
54
|
+
File.join path, dir, 'template', template
|
55
|
+
end
|
56
|
+
end.flatten.find do |dir|
|
57
|
+
File.directory? dir
|
58
|
+
end
|
59
|
+
|
60
|
+
raise RDoc::Error, "could not find template #{template.inspect}" unless
|
61
|
+
template_dir
|
62
|
+
|
63
|
+
@template_dir = Pathname.new File.expand_path(template_dir)
|
64
|
+
@basedir = Pathname.pwd.expand_path
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate( top_levels )
|
68
|
+
@outputdir = Pathname.new( @options.op_dir ).expand_path( @basedir )
|
69
|
+
@files = top_levels.sort
|
70
|
+
@classes = RDoc::TopLevel.all_classes_and_modules.sort
|
71
|
+
|
72
|
+
# Now actually write the output
|
73
|
+
copy_resources
|
74
|
+
generate_class_tree
|
75
|
+
generate_search_index
|
76
|
+
generate_file_files
|
77
|
+
generate_class_files
|
78
|
+
generate_index_file
|
79
|
+
end
|
80
|
+
|
81
|
+
def class_dir
|
82
|
+
CLASS_DIR
|
83
|
+
end
|
84
|
+
|
85
|
+
def file_dir
|
86
|
+
FILE_DIR
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
protected
|
91
|
+
### Output progress information if debugging is enabled
|
92
|
+
def debug_msg( *msg )
|
93
|
+
return unless $DEBUG_RDOC
|
94
|
+
$stderr.puts( *msg )
|
95
|
+
end
|
96
|
+
|
97
|
+
### Create class tree structure and write it as json
|
98
|
+
def generate_class_tree
|
99
|
+
debug_msg "Generating class tree"
|
100
|
+
topclasses = @classes.select {|klass| !(RDoc::ClassModule === klass.parent) }
|
101
|
+
tree = generate_class_tree_level topclasses
|
102
|
+
debug_msg " writing class tree to %s" % TREE_FILE
|
103
|
+
File.open(TREE_FILE, "w") do |f|
|
104
|
+
f.write('var tree = '); f.write(tree.to_json)
|
105
|
+
end unless $dryrun
|
106
|
+
end
|
107
|
+
|
108
|
+
### Recursivly build class tree structure
|
109
|
+
def generate_class_tree_level(classes)
|
110
|
+
tree = []
|
111
|
+
classes.select{|c| c.with_documentation? }.sort.each do |klass|
|
112
|
+
item = [
|
113
|
+
klass.name,
|
114
|
+
klass.document_self ? klass.path : '',
|
115
|
+
klass.module? ? '' : (klass.superclass ? " < #{String === klass.superclass ? klass.superclass : klass.superclass.full_name}" : ''),
|
116
|
+
generate_class_tree_level(klass.classes_and_modules)
|
117
|
+
]
|
118
|
+
tree << item
|
119
|
+
end
|
120
|
+
tree
|
121
|
+
end
|
122
|
+
|
123
|
+
### Create search index for all classes, methods and files
|
124
|
+
### Wite it as json
|
125
|
+
def generate_search_index
|
126
|
+
debug_msg "Generating search index"
|
127
|
+
|
128
|
+
index = {
|
129
|
+
:searchIndex => [],
|
130
|
+
:longSearchIndex => [],
|
131
|
+
:info => []
|
132
|
+
}
|
133
|
+
|
134
|
+
add_class_search_index(index)
|
135
|
+
add_method_search_index(index)
|
136
|
+
add_file_search_index(index)
|
137
|
+
|
138
|
+
debug_msg " writing search index to %s" % SEARCH_INDEX_FILE
|
139
|
+
data = {
|
140
|
+
:index => index
|
141
|
+
}
|
142
|
+
File.open(SEARCH_INDEX_FILE, "w") do |f|
|
143
|
+
f.write('var search_data = '); f.write(data.to_json)
|
144
|
+
end unless $dryrun
|
145
|
+
end
|
146
|
+
|
147
|
+
### Add files to search +index+ array
|
148
|
+
def add_file_search_index(index)
|
149
|
+
debug_msg " generating file search index"
|
150
|
+
|
151
|
+
@files.select { |method|
|
152
|
+
method.document_self
|
153
|
+
}.sort.each do |file|
|
154
|
+
index[:searchIndex].push( search_string(file.name) )
|
155
|
+
index[:longSearchIndex].push( search_string(file.path) )
|
156
|
+
index[:info].push([
|
157
|
+
file.name,
|
158
|
+
file.path,
|
159
|
+
file.path,
|
160
|
+
'',
|
161
|
+
snippet(file.comment),
|
162
|
+
TYPE_FILE
|
163
|
+
])
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
### Add classes to search +index+ array
|
168
|
+
def add_class_search_index(index)
|
169
|
+
debug_msg " generating class search index"
|
170
|
+
|
171
|
+
@classes.select { |method|
|
172
|
+
method.document_self
|
173
|
+
}.sort.each do |klass|
|
174
|
+
index[:searchIndex].push( search_string(klass.name) )
|
175
|
+
index[:longSearchIndex].push( search_string(klass.parent.name) )
|
176
|
+
index[:info].push([
|
177
|
+
klass.name,
|
178
|
+
klass.parent.full_name,
|
179
|
+
klass.path,
|
180
|
+
klass.module? ? '' : (klass.superclass ? " < #{String === klass.superclass ? klass.superclass : klass.superclass.full_name}" : ''),
|
181
|
+
snippet(klass.comment),
|
182
|
+
TYPE_CLASS
|
183
|
+
])
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
### Add methods to search +index+ array
|
188
|
+
def add_method_search_index(index)
|
189
|
+
debug_msg " generating method search index"
|
190
|
+
|
191
|
+
list = @classes.map { |klass|
|
192
|
+
klass.method_list
|
193
|
+
}.flatten.sort{ |a, b| a.name <=> b.name }.select { |method|
|
194
|
+
method.document_self
|
195
|
+
}
|
196
|
+
unless @options.show_all
|
197
|
+
list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation }
|
198
|
+
end
|
199
|
+
|
200
|
+
list.each do |method|
|
201
|
+
index[:searchIndex].push( search_string(method.name) )
|
202
|
+
index[:longSearchIndex].push( search_string(method.parent.name) )
|
203
|
+
index[:info].push([
|
204
|
+
method.name,
|
205
|
+
method.parent.full_name,
|
206
|
+
method.path,
|
207
|
+
method.params,
|
208
|
+
snippet(method.comment),
|
209
|
+
TYPE_METHOD
|
210
|
+
])
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
### Generate a documentation file for each class
|
215
|
+
def generate_class_files
|
216
|
+
debug_msg "Generating class documentation in #@outputdir"
|
217
|
+
templatefile = @template_dir + 'class.rhtml'
|
218
|
+
|
219
|
+
@classes.each do |klass|
|
220
|
+
debug_msg " working on %s (%s)" % [ klass.full_name, klass.path ]
|
221
|
+
outfile = @outputdir + klass.path
|
222
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
223
|
+
|
224
|
+
debug_msg " rendering #{outfile}"
|
225
|
+
self.render_template( templatefile, binding(), outfile )
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
### Generate a documentation file for each file
|
230
|
+
def generate_file_files
|
231
|
+
debug_msg "Generating file documentation in #@outputdir"
|
232
|
+
templatefile = @template_dir + 'file.rhtml'
|
233
|
+
|
234
|
+
@files.each do |file|
|
235
|
+
outfile = @outputdir + file.path
|
236
|
+
debug_msg " working on %s (%s)" % [ file.full_name, outfile ]
|
237
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
238
|
+
|
239
|
+
debug_msg " rendering #{outfile}"
|
240
|
+
self.render_template( templatefile, binding(), outfile )
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
### Create index.html with frameset
|
245
|
+
def generate_index_file
|
246
|
+
debug_msg "Generating index file in #@outputdir"
|
247
|
+
templatefile = @template_dir + 'index.rhtml'
|
248
|
+
outfile = @outputdir + 'index.html'
|
249
|
+
index_path = @files.first.path
|
250
|
+
|
251
|
+
self.render_template( templatefile, binding(), outfile )
|
252
|
+
end
|
253
|
+
|
254
|
+
### Strip comments on a space after 100 chars
|
255
|
+
def snippet(str)
|
256
|
+
str ||= ''
|
257
|
+
if str =~ /^(?>\s*)[^\#]/
|
258
|
+
content = str
|
259
|
+
else
|
260
|
+
content = str.gsub(/^\s*(#+)\s*/, '')
|
261
|
+
end
|
262
|
+
content.sub(/^(.{100,}?)\s.*/m, "\\1").gsub(/\r?\n/m, ' ')
|
263
|
+
end
|
264
|
+
|
265
|
+
### Build search index key
|
266
|
+
def search_string(string)
|
267
|
+
string ||= ''
|
268
|
+
string.downcase.gsub(/\s/,'')
|
269
|
+
end
|
270
|
+
|
271
|
+
### Copy all the resource files to output dir
|
272
|
+
def copy_resources
|
273
|
+
resoureces_path = @template_dir + RESOURCES_DIR
|
274
|
+
debug_msg "Copying #{resoureces_path}/** to #{@outputdir}/**"
|
275
|
+
FileUtils.cp_r resoureces_path.to_s, @outputdir.to_s unless $dryrun
|
276
|
+
end
|
277
|
+
|
278
|
+
### Load and render the erb template in the given +templatefile+ within the
|
279
|
+
### specified +context+ (a Binding object) and return output
|
280
|
+
### Both +templatefile+ and +outfile+ should be Pathname-like objects.
|
281
|
+
def eval_template(templatefile, context)
|
282
|
+
template_src = templatefile.read
|
283
|
+
template = ERB.new( template_src, nil, '<>' )
|
284
|
+
template.filename = templatefile.to_s
|
285
|
+
|
286
|
+
begin
|
287
|
+
template.result( context )
|
288
|
+
rescue NoMethodError => err
|
289
|
+
raise RDoc::Error, "Error while evaluating %s: %s (at %p)" % [
|
290
|
+
templatefile.to_s,
|
291
|
+
err.message,
|
292
|
+
eval( "_erbout[-50,50]", context )
|
293
|
+
], err.backtrace
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
### Load and render the erb template with the given +template_name+ within
|
298
|
+
### current context. Adds all +local_assigns+ to context
|
299
|
+
def include_template(template_name, local_assigns = {})
|
300
|
+
source = local_assigns.keys.map { |key| "#{key} = local_assigns[:#{key}];" }.join
|
301
|
+
eval(source)
|
302
|
+
|
303
|
+
templatefile = @template_dir + template_name
|
304
|
+
eval_template(templatefile, binding)
|
305
|
+
end
|
306
|
+
|
307
|
+
### Load and render the erb template in the given +templatefile+ within the
|
308
|
+
### specified +context+ (a Binding object) and write it out to +outfile+.
|
309
|
+
### Both +templatefile+ and +outfile+ should be Pathname-like objects.
|
310
|
+
def render_template( templatefile, context, outfile )
|
311
|
+
output = eval_template(templatefile, context)
|
312
|
+
unless $dryrun
|
313
|
+
outfile.dirname.mkpath
|
314
|
+
outfile.open( 'w', 0644 ) do |ofh|
|
315
|
+
ofh.print( output )
|
316
|
+
end
|
317
|
+
else
|
318
|
+
debug_msg " would have written %d bytes to %s" %
|
319
|
+
[ output.length, outfile ]
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
# module Generators
|
325
|
+
# # SOURCE_DIR = 'source'
|
326
|
+
#
|
327
|
+
# module MarkUp
|
328
|
+
# def snippetize(str)
|
329
|
+
# if str =~ /^(?>\s*)[^\#]/
|
330
|
+
# content = str
|
331
|
+
# else
|
332
|
+
# content = str.gsub(/^\s*(#+)\s*/, '')
|
333
|
+
# end
|
334
|
+
# content.sub(/^(.{0,100}).*$/m, "\\1").gsub(/\r?\n/m, ' ')
|
335
|
+
# end
|
336
|
+
# end
|
337
|
+
#
|
338
|
+
# module CollectMethods
|
339
|
+
# def collect_methods
|
340
|
+
# list = @context.method_list
|
341
|
+
# unless @options.show_all
|
342
|
+
# list = list.find_all {|m| m.visibility == :public || m.visibility == :protected || m.force_documentation }
|
343
|
+
# end
|
344
|
+
# @methods = list.collect {|m| SHtmlMethod.new(m, self, @options) }
|
345
|
+
# end
|
346
|
+
# end
|
347
|
+
#
|
348
|
+
# #####################################################################
|
349
|
+
#
|
350
|
+
# class SHtmlClass < HtmlClass
|
351
|
+
# include CollectMethods
|
352
|
+
#
|
353
|
+
# attr_accessor :children
|
354
|
+
#
|
355
|
+
# def initialize(context, html_file, prefix, options)
|
356
|
+
# super(context, html_file, prefix, options)
|
357
|
+
# @children = []
|
358
|
+
# end
|
359
|
+
#
|
360
|
+
# def params
|
361
|
+
# @context.superclass ? " < #{@context.superclass}" : ''
|
362
|
+
# end
|
363
|
+
#
|
364
|
+
# def snippet
|
365
|
+
# @snippet ||= snippetize(@context.comment)
|
366
|
+
# end
|
367
|
+
#
|
368
|
+
# def namespace
|
369
|
+
# @context.parent ? @context.parent.name : ''
|
370
|
+
# end
|
371
|
+
#
|
372
|
+
# def title
|
373
|
+
# @context.name
|
374
|
+
# end
|
375
|
+
#
|
376
|
+
# def content?
|
377
|
+
# document_self || children.any?{ |c| c.content? }
|
378
|
+
# end
|
379
|
+
#
|
380
|
+
# def path_if_available
|
381
|
+
# document_self ? path : ''
|
382
|
+
# end
|
383
|
+
#
|
384
|
+
# def github_url
|
385
|
+
# @html_file.github_url
|
386
|
+
# end
|
387
|
+
# end
|
388
|
+
#
|
389
|
+
# #####################################################################
|
390
|
+
#
|
391
|
+
# class SHtmlFile < HtmlFile
|
392
|
+
# include CollectMethods
|
393
|
+
#
|
394
|
+
# attr_accessor :github_url
|
395
|
+
#
|
396
|
+
# def initialize(context, options, file_dir)
|
397
|
+
# super(context, options, file_dir)
|
398
|
+
# @github_url = SHTMLGenerator.github_url(@context.file_relative_name, @options) if (@options.github_url)
|
399
|
+
# end
|
400
|
+
#
|
401
|
+
# def params
|
402
|
+
# ''
|
403
|
+
# end
|
404
|
+
#
|
405
|
+
# def snippet
|
406
|
+
# @snippet ||= snippetize(@context.comment)
|
407
|
+
# end
|
408
|
+
#
|
409
|
+
# def namespace
|
410
|
+
# @context.file_absolute_name
|
411
|
+
# end
|
412
|
+
#
|
413
|
+
# def title
|
414
|
+
# File.basename(namespace)
|
415
|
+
# end
|
416
|
+
#
|
417
|
+
# def value_hash
|
418
|
+
# super
|
419
|
+
# @values["github_url"] = github_url if (@options.github_url)
|
420
|
+
# @values
|
421
|
+
# end
|
422
|
+
#
|
423
|
+
# def absolute_path
|
424
|
+
# @context.file_expanded_path
|
425
|
+
# end
|
426
|
+
#
|
427
|
+
# end
|
428
|
+
#
|
429
|
+
# #####################################################################
|
430
|
+
#
|
431
|
+
# class SHtmlMethod < HtmlMethod
|
432
|
+
# def snippet
|
433
|
+
# @snippet ||= snippetize(@context.comment)
|
434
|
+
# end
|
435
|
+
#
|
436
|
+
# def namespace
|
437
|
+
# @html_class.name
|
438
|
+
# end
|
439
|
+
#
|
440
|
+
# def title
|
441
|
+
# name
|
442
|
+
# end
|
443
|
+
#
|
444
|
+
# def github_url
|
445
|
+
# if @source_code =~ /File\s(\S+), line (\d+)/
|
446
|
+
# file = $1
|
447
|
+
# line = $2.to_i
|
448
|
+
# end
|
449
|
+
# url = SHTMLGenerator.github_url(file, @options)
|
450
|
+
# unless line.nil? || url.nil?
|
451
|
+
# url + "#L#{line}"
|
452
|
+
# else
|
453
|
+
# ''
|
454
|
+
# end
|
455
|
+
# end
|
456
|
+
# end
|
457
|
+
#
|
458
|
+
# #####################################################################
|
459
|
+
#
|
460
|
+
# class SHTMLGenerator < HTMLGenerator
|
461
|
+
#
|
462
|
+
# @@github_url_cache = {}
|
463
|
+
#
|
464
|
+
# def self.github_url(file_relative_name, options)
|
465
|
+
# unless @@github_url_cache.has_key? file_relative_name
|
466
|
+
# file = AllReferences[file_relative_name]
|
467
|
+
# if file.nil?
|
468
|
+
# return nil
|
469
|
+
# end
|
470
|
+
# path = file.absolute_path
|
471
|
+
# name = File.basename(file_relative_name)
|
472
|
+
#
|
473
|
+
# pwd = Dir.pwd
|
474
|
+
# Dir.chdir(File.dirname(path))
|
475
|
+
# s = `git log -1 --pretty=format:"commit %H" #{name}`
|
476
|
+
# Dir.chdir(pwd)
|
477
|
+
#
|
478
|
+
# m = s.match(/commit\s+(\S+)/)
|
479
|
+
# if m
|
480
|
+
# repository_path = path_relative_to_repository(path)
|
481
|
+
# @@github_url_cache[file_relative_name] = "#{options.github_url}/blob/#{m[1]}#{repository_path}"
|
482
|
+
# end
|
483
|
+
# end
|
484
|
+
# @@github_url_cache[file_relative_name]
|
485
|
+
# end
|
486
|
+
#
|
487
|
+
# def self.path_relative_to_repository(path)
|
488
|
+
# root = find_git_dir(path)
|
489
|
+
# path[root.size..path.size]
|
490
|
+
# end
|
491
|
+
#
|
492
|
+
# def self.find_git_dir(path)
|
493
|
+
# while !path.empty? && path != '.'
|
494
|
+
# if (File.exists? File.join(path, '.git'))
|
495
|
+
# return path
|
496
|
+
# end
|
497
|
+
# path = File.dirname(path)
|
498
|
+
# end
|
499
|
+
# ''
|
500
|
+
# end
|
501
|
+
#
|
502
|
+
#
|
503
|
+
# def SHTMLGenerator.for(options)
|
504
|
+
# AllReferences::reset
|
505
|
+
# HtmlMethod::reset
|
506
|
+
#
|
507
|
+
# SHTMLGenerator.new(options)
|
508
|
+
# end
|
509
|
+
#
|
510
|
+
# def load_html_template
|
511
|
+
# template = @options.template
|
512
|
+
# unless template =~ %r{/|\\}
|
513
|
+
# template = File.join("sdoc/generators/template",
|
514
|
+
# @options.generator.key, template)
|
515
|
+
# end
|
516
|
+
# require template
|
517
|
+
# extend RDoc::Page
|
518
|
+
# rescue LoadError
|
519
|
+
# $stderr.puts "Could not find HTML template '#{template}'"
|
520
|
+
# exit 99
|
521
|
+
# end
|
522
|
+
#
|
523
|
+
# def generate_html
|
524
|
+
# # the individual descriptions for files and classes
|
525
|
+
# gen_into(@files)
|
526
|
+
# gen_into(@classes)
|
527
|
+
# gen_search_index
|
528
|
+
# gen_tree_index
|
529
|
+
# gen_main_index
|
530
|
+
# copy_resources
|
531
|
+
#
|
532
|
+
# # this method is defined in the template file
|
533
|
+
# write_extra_pages if defined? write_extra_pages
|
534
|
+
# end
|
535
|
+
#
|
536
|
+
# def build_indices
|
537
|
+
# @toplevels.each do |toplevel|
|
538
|
+
# @files << SHtmlFile.new(toplevel, @options, FILE_DIR)
|
539
|
+
# end
|
540
|
+
# @topclasses = []
|
541
|
+
# RDoc::TopLevel.all_classes_and_modules.each do |cls|
|
542
|
+
# @topclasses << build_class_list(cls, @files[0], CLASS_DIR)
|
543
|
+
# end
|
544
|
+
# end
|
545
|
+
#
|
546
|
+
# def build_class_list(from, html_file, class_dir)
|
547
|
+
# klass = SHtmlClass.new(from, html_file, class_dir, @options)
|
548
|
+
# @classes << klass
|
549
|
+
# from.each_classmodule do |mod|
|
550
|
+
# klass.children << build_class_list(mod, html_file, class_dir)
|
551
|
+
# end
|
552
|
+
# klass
|
553
|
+
# end
|
554
|
+
#
|
555
|
+
# def copy_resources
|
556
|
+
# FileUtils.cp_r RDoc::Page::RESOURCES_PATH, '.'
|
557
|
+
# end
|
558
|
+
#
|
559
|
+
# def search_string(string)
|
560
|
+
# string.downcase.gsub(/\s/,'')
|
561
|
+
# end
|
562
|
+
#
|
563
|
+
# def gen_tree_index
|
564
|
+
# tree = gen_tree_level @topclasses
|
565
|
+
# File.open('tree.yaml', 'w') { |f| f.write(tree.to_yaml) }
|
566
|
+
# File.open('tree.js', "w") do |f|
|
567
|
+
# f.write('var tree = '); f.write(tree.to_json)
|
568
|
+
# end
|
569
|
+
# end
|
570
|
+
#
|
571
|
+
# def gen_tree_level(classes)
|
572
|
+
# tree = []
|
573
|
+
# classes.select{|c| c.content? }.sort.each do |item|
|
574
|
+
# item = [item.title, item.namespace, item.path_if_available, item.params, item.snippet, gen_tree_level(item.children)]
|
575
|
+
# tree << item
|
576
|
+
# end
|
577
|
+
# tree
|
578
|
+
# end
|
579
|
+
#
|
580
|
+
# def gen_search_index
|
581
|
+
# entries = HtmlMethod.all_methods.sort
|
582
|
+
# entries += @classes.sort
|
583
|
+
# entries += @files.sort
|
584
|
+
# entries = entries.select { |f| f.document_self }
|
585
|
+
#
|
586
|
+
# result = {
|
587
|
+
# :searchIndex => [],
|
588
|
+
# :longSearchIndex => [],
|
589
|
+
# :info => []
|
590
|
+
# }
|
591
|
+
#
|
592
|
+
# entries.each_with_index do |item, index|
|
593
|
+
# result[:searchIndex].push( search_string(item.title) )
|
594
|
+
# result[:longSearchIndex].push( search_string(item.namespace) )
|
595
|
+
# result[:info].push([item.title, item.namespace, item.path, item.params, item.snippet])
|
596
|
+
# end
|
597
|
+
#
|
598
|
+
# File.open('index.js', "w") do |f|
|
599
|
+
# f.write('var data = '); f.write(result.to_json)
|
600
|
+
# end
|
601
|
+
# File.open('index.yaml', 'w') { |f| f.write(result.to_yaml) }
|
602
|
+
# end
|
603
|
+
#
|
604
|
+
# end
|
605
|
+
#
|
606
|
+
# class ContextUser
|
607
|
+
# def build_method_detail_list(section)
|
608
|
+
# outer = []
|
609
|
+
#
|
610
|
+
# methods = @methods.sort
|
611
|
+
# for singleton in [true, false]
|
612
|
+
# for vis in [ :public, :protected, :private ]
|
613
|
+
# res = []
|
614
|
+
# methods.each do |m|
|
615
|
+
# if m.section == section and
|
616
|
+
# m.document_self and
|
617
|
+
# m.visibility == vis and
|
618
|
+
# m.singleton == singleton
|
619
|
+
# row = {}
|
620
|
+
# if m.call_seq
|
621
|
+
# row["callseq"] = m.call_seq.gsub(/->/, '→')
|
622
|
+
# else
|
623
|
+
# row["name"] = CGI.escapeHTML(m.name)
|
624
|
+
# row["params"] = m.params
|
625
|
+
# end
|
626
|
+
# desc = m.description.strip
|
627
|
+
# row["m_desc"] = desc unless desc.empty?
|
628
|
+
# row["aref"] = m.aref
|
629
|
+
# row["visibility"] = m.visibility.to_s
|
630
|
+
#
|
631
|
+
# alias_names = []
|
632
|
+
# m.aliases.each do |other|
|
633
|
+
# if other.viewer # won't be if the alias is private
|
634
|
+
# alias_names << {
|
635
|
+
# 'name' => other.name,
|
636
|
+
# 'aref' => other.viewer.as_href(path)
|
637
|
+
# }
|
638
|
+
# end
|
639
|
+
# end
|
640
|
+
# unless alias_names.empty?
|
641
|
+
# row["aka"] = alias_names
|
642
|
+
# end
|
643
|
+
#
|
644
|
+
# if @options.inline_source
|
645
|
+
# code = m.source_code
|
646
|
+
# row["sourcecode"] = code if code
|
647
|
+
# row["github_url"] = m.github_url if @options.github_url
|
648
|
+
# else
|
649
|
+
# code = m.src_url
|
650
|
+
# if code
|
651
|
+
# row["codeurl"] = code
|
652
|
+
# row["imgurl"] = m.img_url
|
653
|
+
# row["github_url"] = m.github_url if @options.github_url
|
654
|
+
# end
|
655
|
+
# end
|
656
|
+
# res << row
|
657
|
+
# end
|
658
|
+
# end
|
659
|
+
# if res.size > 0
|
660
|
+
# outer << {
|
661
|
+
# "type" => vis.to_s.capitalize,
|
662
|
+
# "category" => singleton ? "Class" : "Instance",
|
663
|
+
# "methods" => res
|
664
|
+
# }
|
665
|
+
# end
|
666
|
+
# end
|
667
|
+
# end
|
668
|
+
# outer
|
669
|
+
# end
|
670
|
+
# end
|
671
|
+
# end
|