sdoc_local_editor 0.3.17
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rake_tasks~ +20 -0
- data/LICENSE +110 -0
- data/README.rdoc +37 -0
- data/Rakefile +12 -0
- data/bin/sdoc_local_editor +27 -0
- data/bin/sdoc_local_editor_merge +24 -0
- data/lib/rdoc/discover.rb +5 -0
- data/lib/rdoc/generator/template/merge/index.rhtml +14 -0
- data/lib/rdoc/generator/template/rails/_context.rhtml +210 -0
- data/lib/rdoc/generator/template/rails/_head.rhtml +7 -0
- data/lib/rdoc/generator/template/rails/class.rhtml +39 -0
- data/lib/rdoc/generator/template/rails/file.rhtml +37 -0
- data/lib/rdoc/generator/template/rails/index.rhtml +13 -0
- data/lib/rdoc/generator/template/rails/resources/apple-touch-icon.png +0 -0
- data/lib/rdoc/generator/template/rails/resources/css/github.css +129 -0
- data/lib/rdoc/generator/template/rails/resources/css/main.css +346 -0
- data/lib/rdoc/generator/template/rails/resources/css/panel.css +389 -0
- data/lib/rdoc/generator/template/rails/resources/css/reset.css +48 -0
- data/lib/rdoc/generator/template/rails/resources/favicon.ico +0 -0
- data/lib/rdoc/generator/template/rails/resources/i/arrows.png +0 -0
- data/lib/rdoc/generator/template/rails/resources/i/results_bg.png +0 -0
- data/lib/rdoc/generator/template/rails/resources/i/tree_bg.png +0 -0
- data/lib/rdoc/generator/template/rails/resources/js/highlight.pack.js +1 -0
- data/lib/rdoc/generator/template/rails/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/rdoc/generator/template/rails/resources/js/jquery-effect.js +593 -0
- data/lib/rdoc/generator/template/rails/resources/js/main.js +20 -0
- data/lib/rdoc/generator/template/rails/resources/js/searchdoc.js +441 -0
- data/lib/rdoc/generator/template/rails/resources/panel/index.html +73 -0
- data/lib/rdoc/generator/template/rails/se_index.rhtml +8 -0
- data/lib/rdoc/generator/template/sdoc/_context.rhtml +221 -0
- data/lib/rdoc/generator/template/sdoc/_head.rhtml +7 -0
- data/lib/rdoc/generator/template/sdoc/class.rhtml +39 -0
- data/lib/rdoc/generator/template/sdoc/file.rhtml +29 -0
- data/lib/rdoc/generator/template/sdoc/index.rhtml +13 -0
- data/lib/rdoc/generator/template/sdoc/resources/apple-touch-icon.png +0 -0
- data/lib/rdoc/generator/template/sdoc/resources/css/github.css +129 -0
- data/lib/rdoc/generator/template/sdoc/resources/css/main.css +333 -0
- data/lib/rdoc/generator/template/sdoc/resources/css/panel.css +384 -0
- data/lib/rdoc/generator/template/sdoc/resources/css/reset.css +48 -0
- data/lib/rdoc/generator/template/sdoc/resources/favicon.ico +0 -0
- data/lib/rdoc/generator/template/sdoc/resources/i/arrows.png +0 -0
- data/lib/rdoc/generator/template/sdoc/resources/i/results_bg.png +0 -0
- data/lib/rdoc/generator/template/sdoc/resources/i/tree_bg.png +0 -0
- data/lib/rdoc/generator/template/sdoc/resources/js/highlight.pack.js +1 -0
- data/lib/rdoc/generator/template/sdoc/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/rdoc/generator/template/sdoc/resources/js/jquery-effect.js +593 -0
- data/lib/rdoc/generator/template/sdoc/resources/js/main.js +24 -0
- data/lib/rdoc/generator/template/sdoc/resources/js/searchdoc.js +442 -0
- data/lib/rdoc/generator/template/sdoc/resources/panel/index.html +73 -0
- data/lib/rdoc/generator/template/sdoc/se_index.rhtml +8 -0
- data/lib/sdoc_local_editor.rb +9 -0
- data/lib/sdoc_local_editor/generator.rb +418 -0
- data/lib/sdoc_local_editor/github.rb +61 -0
- data/lib/sdoc_local_editor/helpers.rb +26 -0
- data/lib/sdoc_local_editor/merge.rb +223 -0
- data/lib/sdoc_local_editor/templatable.rb +60 -0
- data/sdoc_local_editor.gemspec +31 -0
- metadata +139 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
6
|
+
<head>
|
7
|
+
<title>search index</title>
|
8
|
+
<link rel="stylesheet" href="../css/reset.css" type="text/css" media="screen" charset="utf-8" />
|
9
|
+
<link rel="stylesheet" href="../css/panel.css" type="text/css" media="screen" charset="utf-8" />
|
10
|
+
<script src="../js/search_index.js" type="text/javascript" charset="utf-8"></script>
|
11
|
+
<script src="../js/searcher.js" type="text/javascript" charset="utf-8"></script>
|
12
|
+
<script src="tree.js" type="text/javascript" charset="utf-8"></script>
|
13
|
+
<script src="../js/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8"></script>
|
14
|
+
<script src="../js/searchdoc.js" type="text/javascript" charset="utf-8"></script>
|
15
|
+
<script type="text/javascript" charset="utf-8">
|
16
|
+
function placeholder() {
|
17
|
+
if ($('<input type="text">')[0].placeholder !== undefined) return;
|
18
|
+
|
19
|
+
$('#search-label').click(function() {
|
20
|
+
$('#search').focus();
|
21
|
+
$('#search-label').hide();
|
22
|
+
});
|
23
|
+
|
24
|
+
$('#search').focus(function() {
|
25
|
+
$('#search-label').hide();
|
26
|
+
});
|
27
|
+
$('#search').blur(function() {
|
28
|
+
this.value == '' && $('#search-label').show()
|
29
|
+
});
|
30
|
+
|
31
|
+
$('#search')[0].value == '' && $('#search-label').show();
|
32
|
+
}
|
33
|
+
$(function() {
|
34
|
+
placeholder();
|
35
|
+
$('#links').hide();
|
36
|
+
var panel = new Searchdoc.Panel($('#panel'), search_data, tree, top.frames[1]);
|
37
|
+
$('#search').focus();
|
38
|
+
|
39
|
+
var s = window.parent.location.search.match(/\?q=([^&]+)/);
|
40
|
+
if (s) {
|
41
|
+
s = decodeURIComponent(s[1]).replace(/\+/g, ' ');
|
42
|
+
if (s.length > 0)
|
43
|
+
{
|
44
|
+
$('#search').val(s);
|
45
|
+
panel.search(s, true);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
})
|
49
|
+
</script>
|
50
|
+
</head>
|
51
|
+
<body>
|
52
|
+
<div class="panel panel_tree" id="panel">
|
53
|
+
<div class="header">
|
54
|
+
<div>
|
55
|
+
<label for="search" id="search-label" style="display: none">Search</label>
|
56
|
+
<table>
|
57
|
+
<tr><td>
|
58
|
+
<input type="Search" placeholder="Search" autosave="searchdoc" results="10" id="search" autocomplete="off"/>
|
59
|
+
</td></tr>
|
60
|
+
</table></div>
|
61
|
+
</div>
|
62
|
+
<div class="tree">
|
63
|
+
<ul>
|
64
|
+
</ul>
|
65
|
+
</div>
|
66
|
+
<div class="result">
|
67
|
+
<ul>
|
68
|
+
</ul>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
<a href="links.html" id="links">index</a>
|
72
|
+
</body>
|
73
|
+
</html>
|
@@ -0,0 +1,418 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'erb'
|
3
|
+
require 'pathname'
|
4
|
+
require 'fileutils'
|
5
|
+
if Gem::Specification.respond_to?(:find_by_name) ? Gem::Specification::find_by_name("json") : Gem.available?("json")
|
6
|
+
gem "json", ">= 1.1.3"
|
7
|
+
else
|
8
|
+
gem "json_pure", ">= 1.1.3"
|
9
|
+
end
|
10
|
+
require 'json'
|
11
|
+
|
12
|
+
require 'sdoc_local_editor/github'
|
13
|
+
require 'sdoc_local_editor/templatable'
|
14
|
+
require 'sdoc_local_editor/helpers'
|
15
|
+
require 'rdoc'
|
16
|
+
|
17
|
+
class RDoc::ClassModule
|
18
|
+
def with_documentation?
|
19
|
+
document_self_or_methods || classes_and_modules.any?{ |c| c.with_documentation? }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class RDoc::Options
|
24
|
+
attr_accessor :github, :se_index, :local_editor
|
25
|
+
end
|
26
|
+
|
27
|
+
class RDoc::AnyMethod
|
28
|
+
|
29
|
+
TITLE_AFTER = %w(def class module)
|
30
|
+
|
31
|
+
##
|
32
|
+
# Turns the method's token stream into HTML.
|
33
|
+
#
|
34
|
+
# Prepends line numbers if +add_line_numbers+ is true.
|
35
|
+
|
36
|
+
def sdoc_markup_code
|
37
|
+
return '' unless @token_stream
|
38
|
+
|
39
|
+
src = ""
|
40
|
+
starting_title = false
|
41
|
+
|
42
|
+
@token_stream.each do |t|
|
43
|
+
next unless t
|
44
|
+
|
45
|
+
style = case t
|
46
|
+
when RDoc::RubyToken::TkFLOAT then 'ruby-number'
|
47
|
+
when RDoc::RubyToken::TkINTEGER then 'ruby-number'
|
48
|
+
when RDoc::RubyToken::TkCONSTANT then 'ruby-constant'
|
49
|
+
when RDoc::RubyToken::TkKW then 'ruby-keyword'
|
50
|
+
when RDoc::RubyToken::TkIVAR then 'ruby-ivar'
|
51
|
+
when RDoc::RubyToken::TkOp then 'ruby-operator'
|
52
|
+
when RDoc::RubyToken::TkId then 'ruby-identifier'
|
53
|
+
when RDoc::RubyToken::TkNode then 'ruby-node'
|
54
|
+
when RDoc::RubyToken::TkCOMMENT then 'ruby-comment'
|
55
|
+
when RDoc::RubyToken::TkREGEXP then 'ruby-regexp'
|
56
|
+
when RDoc::RubyToken::TkSTRING then 'ruby-string'
|
57
|
+
when RDoc::RubyToken::TkVal then 'ruby-value'
|
58
|
+
end
|
59
|
+
|
60
|
+
if RDoc::RubyToken::TkId === t && starting_title
|
61
|
+
starting_title = false
|
62
|
+
style = 'ruby-keyword ruby-title'
|
63
|
+
end
|
64
|
+
|
65
|
+
if RDoc::RubyToken::TkKW === t && TITLE_AFTER.include?(t.text)
|
66
|
+
starting_title = true
|
67
|
+
end
|
68
|
+
|
69
|
+
text = CGI.escapeHTML t.text
|
70
|
+
|
71
|
+
if style then
|
72
|
+
src << "<span class=\"#{style}\">#{text}</span>"
|
73
|
+
else
|
74
|
+
src << text
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# dedent the source
|
79
|
+
indent = src.length
|
80
|
+
lines = src.lines.to_a
|
81
|
+
lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment
|
82
|
+
lines.each do |line|
|
83
|
+
if line =~ /^ *(?=\S)/
|
84
|
+
n = $&.length
|
85
|
+
indent = n if n < indent
|
86
|
+
break if n == 0
|
87
|
+
end
|
88
|
+
end
|
89
|
+
src.gsub!(/^#{' ' * indent}/, '') if indent > 0
|
90
|
+
|
91
|
+
add_line_numbers(src) if self.class.add_line_numbers
|
92
|
+
|
93
|
+
src
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
class RDoc::Generator::SDoc
|
99
|
+
RDoc::RDoc.add_generator self
|
100
|
+
|
101
|
+
DESCRIPTION = 'Searchable HTML documentation'
|
102
|
+
|
103
|
+
include ERB::Util
|
104
|
+
include SDoc::GitHub
|
105
|
+
include SDoc::Templatable
|
106
|
+
include SDoc::Helpers
|
107
|
+
|
108
|
+
GENERATOR_DIRS = [File.join('sdoc_local_editor', 'generator')]
|
109
|
+
|
110
|
+
TREE_FILE = File.join 'panel', 'tree.js'
|
111
|
+
SEARCH_INDEX_FILE = File.join 'js', 'search_index.js'
|
112
|
+
|
113
|
+
FILE_DIR = 'files'
|
114
|
+
CLASS_DIR = 'classes'
|
115
|
+
|
116
|
+
RESOURCES_DIR = File.join('resources', '.')
|
117
|
+
|
118
|
+
attr_reader :base_dir
|
119
|
+
|
120
|
+
attr_reader :options
|
121
|
+
|
122
|
+
def self.setup_options(options)
|
123
|
+
@github = false
|
124
|
+
options.se_index = true
|
125
|
+
options.local_editor = true
|
126
|
+
|
127
|
+
opt = options.option_parser
|
128
|
+
opt.separator nil
|
129
|
+
opt.separator "SDoc generator options:"
|
130
|
+
opt.separator nil
|
131
|
+
opt.on("--github", "-g",
|
132
|
+
"Generate links to github.") do |value|
|
133
|
+
options.github = true
|
134
|
+
end
|
135
|
+
opt.separator nil
|
136
|
+
|
137
|
+
opt.on("--no-se-index", "-ns",
|
138
|
+
"Do not generated index file for search engines.",
|
139
|
+
"SDoc uses javascript to refrence individual documentation pages.",
|
140
|
+
"Search engine crawlers are not smart enough to find all the",
|
141
|
+
"referenced pages.",
|
142
|
+
"To help them SDoc generates a static file with links to every",
|
143
|
+
"documentation page. This file is not shown to the user."
|
144
|
+
) do |value|
|
145
|
+
options.se_index = false
|
146
|
+
end
|
147
|
+
opt.separator nil
|
148
|
+
|
149
|
+
opt.on("--local-editor", "-L",
|
150
|
+
"Generate links to open file in local editor.",
|
151
|
+
"The server serving this documentation should respond to",
|
152
|
+
"a POST request to /open_editor/. The request will contain",
|
153
|
+
"the following query parameters:",
|
154
|
+
" * file -- the file path, relative to your code directory",
|
155
|
+
" * line -- the line number in the file."
|
156
|
+
) do |value|
|
157
|
+
options.local_editor = true
|
158
|
+
end
|
159
|
+
opt.separator nil
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
def initialize(options)
|
164
|
+
@options = options
|
165
|
+
if @options.respond_to?('diagram=')
|
166
|
+
@options.diagram = false
|
167
|
+
end
|
168
|
+
@github_url_cache = {}
|
169
|
+
|
170
|
+
@template_dir = Pathname.new(options.template_dir)
|
171
|
+
@base_dir = Pathname.pwd.expand_path
|
172
|
+
|
173
|
+
@json_index = RDoc::Generator::JsonIndex.new self, options
|
174
|
+
end
|
175
|
+
|
176
|
+
def generate(top_levels)
|
177
|
+
@outputdir = Pathname.new(@options.op_dir).expand_path(@base_dir)
|
178
|
+
@files = top_levels.sort
|
179
|
+
@classes = RDoc::TopLevel.all_classes_and_modules.sort
|
180
|
+
|
181
|
+
# Now actually write the output
|
182
|
+
copy_resources
|
183
|
+
generate_class_tree
|
184
|
+
@json_index.generate top_levels
|
185
|
+
generate_file_files
|
186
|
+
generate_class_files
|
187
|
+
generate_index_file
|
188
|
+
generate_se_index if @options.se_index
|
189
|
+
end
|
190
|
+
|
191
|
+
def class_dir
|
192
|
+
CLASS_DIR
|
193
|
+
end
|
194
|
+
|
195
|
+
def file_dir
|
196
|
+
FILE_DIR
|
197
|
+
end
|
198
|
+
|
199
|
+
protected
|
200
|
+
### Output progress information if debugging is enabled
|
201
|
+
def debug_msg( *msg )
|
202
|
+
return unless $DEBUG_RDOC
|
203
|
+
$stderr.puts( *msg )
|
204
|
+
end
|
205
|
+
|
206
|
+
### Create class tree structure and write it as json
|
207
|
+
def generate_class_tree
|
208
|
+
debug_msg "Generating class tree"
|
209
|
+
topclasses = @classes.select {|klass| !(RDoc::ClassModule === klass.parent) }
|
210
|
+
tree = generate_file_tree + generate_class_tree_level(topclasses)
|
211
|
+
debug_msg " writing class tree to %s" % TREE_FILE
|
212
|
+
File.open(TREE_FILE, "w", 0644) do |f|
|
213
|
+
f.write('var tree = '); f.write(tree.to_json(:max_nesting => 0))
|
214
|
+
end unless $dryrun
|
215
|
+
end
|
216
|
+
|
217
|
+
### Recursivly build class tree structure
|
218
|
+
def generate_class_tree_level(classes, visited = {})
|
219
|
+
tree = []
|
220
|
+
classes.select do |klass|
|
221
|
+
!visited[klass] && klass.with_documentation?
|
222
|
+
end.sort.each do |klass|
|
223
|
+
visited[klass] = true
|
224
|
+
item = [
|
225
|
+
klass.name,
|
226
|
+
klass.document_self_or_methods ? klass.path : '',
|
227
|
+
klass.module? ? '' : (klass.superclass ? " < #{String === klass.superclass ? klass.superclass : klass.superclass.full_name}" : ''),
|
228
|
+
generate_class_tree_level(klass.classes_and_modules, visited)
|
229
|
+
]
|
230
|
+
tree << item
|
231
|
+
end
|
232
|
+
tree
|
233
|
+
end
|
234
|
+
|
235
|
+
### Add files to search +index+ array
|
236
|
+
def add_file_search_index(index)
|
237
|
+
debug_msg " generating file search index"
|
238
|
+
|
239
|
+
@files.select { |file|
|
240
|
+
file.document_self
|
241
|
+
}.sort.each do |file|
|
242
|
+
debug_msg " #{file.path}"
|
243
|
+
index[:searchIndex].push( search_string(file.name) )
|
244
|
+
index[:longSearchIndex].push( search_string(file.path) )
|
245
|
+
index[:info].push([
|
246
|
+
file.name,
|
247
|
+
file.path,
|
248
|
+
file.path,
|
249
|
+
'',
|
250
|
+
snippet(file.comment),
|
251
|
+
TYPE_FILE
|
252
|
+
])
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
### Add classes to search +index+ array
|
257
|
+
def add_class_search_index(index)
|
258
|
+
debug_msg " generating class search index"
|
259
|
+
@classes.uniq.select { |klass|
|
260
|
+
klass.document_self_or_methods
|
261
|
+
}.sort.each do |klass|
|
262
|
+
modulename = klass.module? ? '' : (klass.superclass ? (String === klass.superclass ? klass.superclass : klass.superclass.full_name) : '')
|
263
|
+
debug_msg " #{klass.parent.full_name}::#{klass.name}"
|
264
|
+
index[:searchIndex].push( search_string(klass.name) )
|
265
|
+
index[:longSearchIndex].push( search_string(klass.parent.full_name) )
|
266
|
+
files = klass.in_files.map{ |file| file.absolute_name }
|
267
|
+
index[:info].push([
|
268
|
+
klass.name,
|
269
|
+
files.include?(klass.parent.full_name) ? files.first : klass.parent.full_name,
|
270
|
+
klass.path,
|
271
|
+
modulename ? " < #{modulename}" : '',
|
272
|
+
snippet(klass.comment),
|
273
|
+
TYPE_CLASS
|
274
|
+
])
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
### Add methods to search +index+ array
|
279
|
+
def add_method_search_index(index)
|
280
|
+
debug_msg " generating method search index"
|
281
|
+
|
282
|
+
list = @classes.uniq.map do |klass|
|
283
|
+
klass.method_list
|
284
|
+
end.flatten.sort do |a, b|
|
285
|
+
a.name == b.name ?
|
286
|
+
a.parent.full_name <=> b.parent.full_name :
|
287
|
+
a.name <=> b.name
|
288
|
+
end.select do |method|
|
289
|
+
method.document_self
|
290
|
+
end.find_all do |m|
|
291
|
+
m.visibility == :public || m.visibility == :protected ||
|
292
|
+
m.force_documentation
|
293
|
+
end
|
294
|
+
|
295
|
+
list.each do |method|
|
296
|
+
debug_msg " #{method.full_name}"
|
297
|
+
index[:searchIndex].push( search_string(method.name) + '()' )
|
298
|
+
index[:longSearchIndex].push( search_string(method.parent.full_name) )
|
299
|
+
index[:info].push([
|
300
|
+
method.name,
|
301
|
+
method.parent.full_name,
|
302
|
+
method.path,
|
303
|
+
method.params,
|
304
|
+
snippet(method.comment),
|
305
|
+
TYPE_METHOD
|
306
|
+
])
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
### Generate a documentation file for each class
|
311
|
+
def generate_class_files
|
312
|
+
debug_msg "Generating class documentation in #@outputdir"
|
313
|
+
templatefile = @template_dir + 'class.rhtml'
|
314
|
+
|
315
|
+
@classes.each do |klass|
|
316
|
+
debug_msg " working on %s (%s)" % [ klass.full_name, klass.path ]
|
317
|
+
outfile = @outputdir + klass.path
|
318
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
319
|
+
|
320
|
+
debug_msg " rendering #{outfile}"
|
321
|
+
self.render_template( templatefile, binding(), outfile )
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
### Generate a documentation file for each file
|
326
|
+
def generate_file_files
|
327
|
+
debug_msg "Generating file documentation in #@outputdir"
|
328
|
+
templatefile = @template_dir + 'file.rhtml'
|
329
|
+
|
330
|
+
@files.each do |file|
|
331
|
+
outfile = @outputdir + file.path
|
332
|
+
debug_msg " working on %s (%s)" % [ file.full_name, outfile ]
|
333
|
+
rel_prefix = @outputdir.relative_path_from( outfile.dirname )
|
334
|
+
|
335
|
+
debug_msg " rendering #{outfile}"
|
336
|
+
self.render_template( templatefile, binding(), outfile )
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
### Determines index path based on @options.main_page (or lack thereof)
|
341
|
+
def index_path
|
342
|
+
# Break early to avoid a big if block when no main page is specified
|
343
|
+
default = @files.first.path
|
344
|
+
return default unless @options.main_page
|
345
|
+
|
346
|
+
# Transform class name to file path
|
347
|
+
if @options.main_page.include?("::")
|
348
|
+
slashed = @options.main_page.sub(/^::/, "").gsub("::", "/")
|
349
|
+
"%s/%s.html" % [ class_dir, slashed ]
|
350
|
+
elsif file = @files.find { |f| f.full_name == @options.main_page }
|
351
|
+
file.path
|
352
|
+
else
|
353
|
+
default
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
### Create index.html with frameset
|
358
|
+
def generate_index_file
|
359
|
+
debug_msg "Generating index file in #@outputdir"
|
360
|
+
templatefile = @template_dir + 'index.rhtml'
|
361
|
+
outfile = @outputdir + 'index.html'
|
362
|
+
|
363
|
+
self.render_template( templatefile, binding(), outfile )
|
364
|
+
end
|
365
|
+
|
366
|
+
### Generate file with links for the search engine
|
367
|
+
def generate_se_index
|
368
|
+
debug_msg "Generating search engine index in #@outputdir"
|
369
|
+
templatefile = @template_dir + 'se_index.rhtml'
|
370
|
+
outfile = @outputdir + 'panel/links.html'
|
371
|
+
|
372
|
+
self.render_template( templatefile, binding(), outfile )
|
373
|
+
end
|
374
|
+
|
375
|
+
### Copy all the resource files to output dir
|
376
|
+
def copy_resources
|
377
|
+
resoureces_path = @template_dir + RESOURCES_DIR
|
378
|
+
debug_msg "Copying #{resoureces_path}/** to #{@outputdir}/**"
|
379
|
+
FileUtils.cp_r resoureces_path.to_s, @outputdir.to_s, :preserve => true unless $dryrun
|
380
|
+
end
|
381
|
+
|
382
|
+
class FilesTree
|
383
|
+
attr_reader :children
|
384
|
+
def add(path, url)
|
385
|
+
path = path.split(File::SEPARATOR) unless Array === path
|
386
|
+
@children ||= {}
|
387
|
+
if path.length == 1
|
388
|
+
@children[path.first] = url
|
389
|
+
else
|
390
|
+
@children[path.first] ||= FilesTree.new
|
391
|
+
@children[path.first].add(path[1, path.length], url)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def generate_file_tree
|
397
|
+
if @files.length > 1
|
398
|
+
@files_tree = FilesTree.new
|
399
|
+
@files.each do |file|
|
400
|
+
@files_tree.add(file.relative_name, file.path)
|
401
|
+
end
|
402
|
+
[['', '', 'files', generate_file_tree_level(@files_tree)]]
|
403
|
+
else
|
404
|
+
[]
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
def generate_file_tree_level(tree)
|
409
|
+
tree.children.keys.sort.map do |name|
|
410
|
+
child = tree.children[name]
|
411
|
+
if String === child
|
412
|
+
[name, child, '', []]
|
413
|
+
else
|
414
|
+
['', '', name, generate_file_tree_level(child)]
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|