giblish 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/README.adoc +32 -11
- data/Rakefile +3 -1
- data/giblish.gemspec +1 -1
- data/lib/giblish-search.rb +444 -0
- data/lib/giblish/buildgraph.rb +1 -1
- data/lib/giblish/buildindex.rb +58 -31
- data/lib/giblish/cmdline.rb +27 -0
- data/lib/giblish/core.rb +66 -7
- data/lib/giblish/docid.rb +3 -27
- data/lib/giblish/docinfo.rb +32 -17
- data/lib/giblish/indexheadings.rb +163 -0
- data/lib/giblish/utils.rb +59 -3
- data/lib/giblish/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6a7fc123856a6321bbad8b7f8f527490a09faa9df0ebeeb1a984bbda4b22d78
|
4
|
+
data.tar.gz: 2788cc7789ed4046307d9d4a7ad75be7f7b0f12c30a1b559500b18166602e966
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ea03abe46dd0e23c06266e8b1a9bc444811931825a2155e9545ae911d9527fd7ad993d18287fd2ad5b7ce6a0e51ce40421d2c01454ec357161300969d7bdf57
|
7
|
+
data.tar.gz: 308d7306d39641442e17fa7b5a1687e8f7ae473e438c6eabf3ffbb3650521b091e15a8b0ed36700cb41cad917fbcd9c3f95646b38d2d4199c112eaa75b00ca7b
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.6.1
|
data/README.adoc
CHANGED
@@ -7,17 +7,31 @@ image::https://travis-ci.com/rillbert/giblish.svg?branch=master[build status]
|
|
7
7
|
|
8
8
|
giblish is used to convert a source directory tree containing AsciiDoc files to
|
9
9
|
a destination directory tree containing the corresponding html or pdf files
|
10
|
-
and add
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
and add some handy tools for easier navigation of the resulting files.
|
11
|
+
|
12
|
+
The tools include:
|
13
|
+
|
14
|
+
* An index page listing all rendered documents with clickable links
|
15
|
+
* Document ids - Note: the implementation of this is giblish-specific and thus
|
16
|
+
you need to render your adoc files using giblish to make this work as intended.
|
17
|
+
You can use document ids to:
|
18
|
+
** Reference one doc in the source tree from another doc without depending on file
|
19
|
+
names or relative paths. The referenced doc can thus be moved within the sourc
|
20
|
+
tree or change its file name and the reference will still be valid.
|
21
|
+
** Validate doc id references during document rendering and thus be alerted to
|
22
|
+
any invalid doc id references.
|
23
|
+
** Let giblish generate a clickable graph of all document references (requires
|
24
|
+
graphviz and the 'dot' tool).
|
25
|
+
* A (stripped-down but nonetheless useful) text-search of your documents (requires
|
26
|
+
that you view your docs via a web-server.
|
27
|
+
* If the source directory tree is part of a git repository, giblish can generate
|
28
|
+
separate html/pdf trees for branches and/or tags that match a user specified
|
29
|
+
regexp (see examples below).
|
15
30
|
|
16
31
|
== Dependencies and credits
|
17
32
|
|
18
|
-
Giblish
|
19
|
-
|
20
|
-
making these brilliant tools available!!
|
33
|
+
Giblish uses the awesome *asciidoctor* and *asciidoctor-pdf* projects under the hood.
|
34
|
+
Thank you @mojavelinux and others for making these brilliant tools available!!
|
21
35
|
|
22
36
|
== Installation
|
23
37
|
|
@@ -119,13 +133,14 @@ A summary page containing links to all branches will be generated directly in
|
|
119
133
|
the `my_dst_root` dir.
|
120
134
|
====
|
121
135
|
|
122
|
-
.Advanced usage; Publish a static html site from a git repo
|
136
|
+
.Advanced usage; Publish a static html site from a git repo with search capabilities
|
123
137
|
====
|
124
138
|
giblish can be used to inject a tree of html docs suitable for serving via a web
|
125
139
|
server (e.g. Apache). Below is an example how to create such a tree. If you
|
126
140
|
combine this with a server side git hook that invokes this script after push,
|
127
141
|
you will have a way of auto publish your latest documents and/or documents at
|
128
|
-
specific git tags.
|
142
|
+
specific git tags. A document management system including nice index pages and
|
143
|
+
text search capabilities
|
129
144
|
|
130
145
|
Assumptions:
|
131
146
|
|
@@ -142,7 +157,7 @@ Assumptions:
|
|
142
157
|
* You want to publish the documentation as it looked for your release tags
|
143
158
|
myprod-v1.0-final, myprod-v2.0-final, ...
|
144
159
|
|
145
|
-
giblish -t "-final$" -r ~/gh/myrepo/common/resources -s mylayout -w /var/www/html ~/gh/myrepo/common/Documents /var/www/html/proddocs
|
160
|
+
giblish -m -t "-final$" -r ~/gh/myrepo/common/resources -s mylayout -w /var/www/html ~/gh/myrepo/common/Documents /var/www/html/proddocs
|
146
161
|
|
147
162
|
The above will create a tree of html docs under `/var/www/html/proddocs`. Each
|
148
163
|
tag will get its own subdir (e.g. `/var/www/html/proddocs/myprod_v1.0_final`).
|
@@ -152,4 +167,10 @@ subdir and also to the .../proddocs dir.
|
|
152
167
|
The `-w` switch above will strip the `/var/www/html` from the css link so that
|
153
168
|
the paths to the css will be correct in the context of the serving of the
|
154
169
|
pages via the web server.
|
170
|
+
|
171
|
+
The `-m` switch above will build a database (JSON file) with enough information
|
172
|
+
to enable a cgi-script to provide a text-search capability for your users. The
|
173
|
+
cgi-script must be located at http://your_web_site.com/cgi-bin/giblish-search.cgi
|
174
|
+
and this gem provides a default implementation that you can copy from the .../lib
|
175
|
+
folder to the correct destination.
|
155
176
|
====
|
data/Rakefile
CHANGED
@@ -10,7 +10,9 @@ end
|
|
10
10
|
Rake::TestTask.new(:current) do |t|
|
11
11
|
t.libs << "test"
|
12
12
|
t.libs << "lib"
|
13
|
-
t.test_files = FileList["test/**/
|
13
|
+
t.test_files = FileList["test/**/docid_test.rb"]
|
14
|
+
# t.test_files = FileList["test/**/index_heading_test.rb"]
|
15
|
+
# t.test_files = FileList["test/**/depgraph_test.rb"]
|
14
16
|
end
|
15
17
|
|
16
18
|
Rake::TestTask.new(:sandbox) do |t|
|
data/giblish.gemspec
CHANGED
@@ -35,7 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_development_dependency "rake", "~> 10.0"
|
36
36
|
|
37
37
|
# Usage: spec.add_runtime_dependency "[gem name]", [[version]]
|
38
|
-
spec.add_runtime_dependency "asciidoctor", "~>1.5", ">= 1.5.
|
38
|
+
spec.add_runtime_dependency "asciidoctor", "~>1.5", ">= 1.5.8"
|
39
39
|
spec.add_runtime_dependency "asciidoctor-diagram", ["~> 1.5"]
|
40
40
|
spec.add_runtime_dependency "asciidoctor-pdf", [">= 1.5.0.alpha.16"]
|
41
41
|
spec.add_runtime_dependency "asciidoctor-rouge", ["~> 0.3"]
|
@@ -0,0 +1,444 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
require "json"
|
5
|
+
require "asciidoctor"
|
6
|
+
require "open3"
|
7
|
+
require "cgi"
|
8
|
+
require "uri/generic"
|
9
|
+
|
10
|
+
class GrepDocTree
|
11
|
+
Line_info = Struct.new(:line, :line_no) {
|
12
|
+
def initialize(line,line_no)
|
13
|
+
self.line = line
|
14
|
+
self.line_no = Integer(line_no)
|
15
|
+
end
|
16
|
+
}
|
17
|
+
|
18
|
+
# grep_opts:
|
19
|
+
# :search_top
|
20
|
+
# :search_phrase
|
21
|
+
# :ignorecase
|
22
|
+
# :useregexp
|
23
|
+
def initialize(grep_opts)
|
24
|
+
@grep_opts = "-nHr --include '*.adoc' "
|
25
|
+
@grep_opts += "-i " if grep_opts.has_key? :ignorecase
|
26
|
+
@grep_opts += "-F " unless grep_opts.has_key? :useregexp
|
27
|
+
|
28
|
+
@search_root = grep_opts[:search_top]
|
29
|
+
@input = grep_opts[:search_phrase]
|
30
|
+
|
31
|
+
@output = ""
|
32
|
+
@error = ""
|
33
|
+
@status = 0
|
34
|
+
@match_index = {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def grep
|
38
|
+
# This console code sequence will only show the matching word in bold ms=01:mc=:sl=:cx=:fn=:ln=:bn=:se=
|
39
|
+
grep_env="GREP_COLORS=\"ms=01:mc=:sl=:cx=:fn=:ln=:bn=:se=\""
|
40
|
+
@grep_opts += " --color=always"
|
41
|
+
|
42
|
+
|
43
|
+
@output, @error, @status = Open3.capture3("#{grep_env} grep #{@grep_opts} \"#{@input}\" #{@search_root}")
|
44
|
+
|
45
|
+
begin
|
46
|
+
@output.force_encoding(Encoding::UTF_8)
|
47
|
+
@output.gsub!(/\x1b\[01m\x1b\[K/,"##")
|
48
|
+
@output.gsub!(/\x1b\[m\x1b\[K/,"##")
|
49
|
+
rescue StandardError => e
|
50
|
+
print e.message
|
51
|
+
print e.backtrace.inspect
|
52
|
+
exit 0
|
53
|
+
end
|
54
|
+
|
55
|
+
grep2hash @search_root
|
56
|
+
end
|
57
|
+
|
58
|
+
# returns an indexed output where each match from the search is associated with the
|
59
|
+
# corresponding src file's closest heading.
|
60
|
+
# the format of the output:
|
61
|
+
# {html_filename#heading : [line_1, line_2, ...], ...}
|
62
|
+
#
|
63
|
+
# The heading_db has the following JSON format
|
64
|
+
# {
|
65
|
+
# file_infos : [{
|
66
|
+
# filepath : filepath_1,
|
67
|
+
# title : Title,
|
68
|
+
# sections : [{
|
69
|
+
# id : section_id_1,
|
70
|
+
# title : section_title_1,
|
71
|
+
# line_no : line_no
|
72
|
+
# },
|
73
|
+
# {
|
74
|
+
# id : section_id_1,
|
75
|
+
# title : section_title_1,
|
76
|
+
# line_no : line_no
|
77
|
+
# },
|
78
|
+
# ...
|
79
|
+
# ]
|
80
|
+
# },
|
81
|
+
# {
|
82
|
+
# filepath : filepath_1,
|
83
|
+
# ...
|
84
|
+
# }]
|
85
|
+
# }
|
86
|
+
def match_with_headings heading_db
|
87
|
+
matches = []
|
88
|
+
|
89
|
+
# for each file with at least one match
|
90
|
+
@match_index.each do |file_path,match_infos|
|
91
|
+
# assume that max one file with the specified path
|
92
|
+
# exists
|
93
|
+
files = heading_db["file_infos"].select do |fi|
|
94
|
+
fi["filepath"] == file_path.to_s
|
95
|
+
end
|
96
|
+
next if files.empty?
|
97
|
+
|
98
|
+
file_anchors = construct_user_info files.first, match_infos
|
99
|
+
matches << file_anchors
|
100
|
+
end
|
101
|
+
matches
|
102
|
+
end
|
103
|
+
|
104
|
+
# Produce a hash with all info needed for the user to navigate to the
|
105
|
+
# matching html section for all matches to the file in the supplied file
|
106
|
+
# info hash.
|
107
|
+
#
|
108
|
+
# format of the resulting hash:
|
109
|
+
# {
|
110
|
+
# filepath : Filepath,
|
111
|
+
# title : Title,
|
112
|
+
# matches : {
|
113
|
+
# section_id :
|
114
|
+
# {
|
115
|
+
# section_title : Section Title,
|
116
|
+
# location : Location,
|
117
|
+
# lines : [line_1, line_2, ...]
|
118
|
+
# }
|
119
|
+
# }
|
120
|
+
# ]
|
121
|
+
# }
|
122
|
+
#
|
123
|
+
def construct_user_info file_info, match_infos
|
124
|
+
matches = {}
|
125
|
+
file_anchors = {
|
126
|
+
"filepath" => file_info["filepath"],
|
127
|
+
"title" => file_info["title"],
|
128
|
+
"matches" => matches
|
129
|
+
}
|
130
|
+
|
131
|
+
match_infos.each do |match_info|
|
132
|
+
match_line_nr = match_info.line_no
|
133
|
+
|
134
|
+
# find section with closest lower line_no to line_info
|
135
|
+
best_so_far = 0
|
136
|
+
chosen_section_info = {}
|
137
|
+
file_info["sections"].each do |section_info|
|
138
|
+
l = Integer(section_info["line_no"])
|
139
|
+
if l <= match_line_nr && l > best_so_far
|
140
|
+
chosen_section_info = section_info
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
matches[chosen_section_info["id"]] =
|
145
|
+
{
|
146
|
+
"section_title" => chosen_section_info["title"],
|
147
|
+
"location" => "#{Pathname.new(file_info["filepath"]).sub_ext(".html").to_s}##{chosen_section_info["id"]}",
|
148
|
+
"lines" => []
|
149
|
+
} unless matches.key?(chosen_section_info["id"])
|
150
|
+
matches[chosen_section_info["id"]]["lines"] << match_info.line
|
151
|
+
end
|
152
|
+
file_anchors
|
153
|
+
end
|
154
|
+
|
155
|
+
def formatted_output
|
156
|
+
# assume we have an updated index
|
157
|
+
adoc_str = ""
|
158
|
+
@match_index.each do |k,v|
|
159
|
+
adoc_str += "#{k}::\n"
|
160
|
+
v.each { |line_info|
|
161
|
+
adoc_str += "#{line_info.line_no} : #{line_info.line}\n"
|
162
|
+
}
|
163
|
+
end
|
164
|
+
adoc_str
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
# converts the 'raw' matches from grep into a hash.
|
170
|
+
# i.e. from:
|
171
|
+
# <filename>:<line_no>:<line>
|
172
|
+
# <filename>:<line_no>:<line>
|
173
|
+
# ...
|
174
|
+
#
|
175
|
+
# to
|
176
|
+
# {file_path : [line_info1, line_info2, ...], ...}
|
177
|
+
def grep2hash(base_dir)
|
178
|
+
@match_index = {}
|
179
|
+
@output.split("\n").each do |line|
|
180
|
+
tokens = line.split(":",3)
|
181
|
+
|
182
|
+
# remove all lines starting with :<attrib>:
|
183
|
+
tokens[2].gsub!(/^:[[:graph:]]+:.*$/,"")
|
184
|
+
next if tokens[2].empty?
|
185
|
+
|
186
|
+
# remove everything above the repo root from the filepath
|
187
|
+
file_path = Pathname.new(tokens[0]).relative_path_from Pathname.new(base_dir)
|
188
|
+
@match_index[file_path] = [] unless @match_index.key? file_path
|
189
|
+
@match_index[file_path] << Line_info.new(tokens[2], tokens[1])
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class SearchDocTree
|
195
|
+
def initialize(input_data)
|
196
|
+
@input_data = input_data
|
197
|
+
end
|
198
|
+
|
199
|
+
def search
|
200
|
+
# read the heading_db from file
|
201
|
+
jsonpath = @input_data[:search_top].join("heading_index.json")
|
202
|
+
src_index = {}
|
203
|
+
json = File.read(jsonpath.to_s)
|
204
|
+
src_index = JSON.parse(json)
|
205
|
+
|
206
|
+
# search the doc tree for regex
|
207
|
+
gt = GrepDocTree.new @input_data
|
208
|
+
gt.grep
|
209
|
+
|
210
|
+
matches = gt.match_with_headings src_index
|
211
|
+
|
212
|
+
format_search_adoc matches, get_uri_top
|
213
|
+
end
|
214
|
+
|
215
|
+
private
|
216
|
+
|
217
|
+
def get_uri_top
|
218
|
+
if @input_data[:gitbranch]
|
219
|
+
return @input_data[:referer][0,@input_data[:referer].rindex('/')]
|
220
|
+
end
|
221
|
+
return @input_data[:referer].chomp('/')
|
222
|
+
end
|
223
|
+
|
224
|
+
def wash_line line
|
225
|
+
# remove any '::'
|
226
|
+
result = line.gsub(/::*/,"")
|
227
|
+
# remove =,| at the start of a line
|
228
|
+
result.gsub!(/^[=|]+/,"")
|
229
|
+
result
|
230
|
+
end
|
231
|
+
|
232
|
+
# index is an array of file_info, see construct_user_info
|
233
|
+
# for format per file
|
234
|
+
# == Title (filename)
|
235
|
+
#
|
236
|
+
# <<location,section_title>>::
|
237
|
+
# line_1
|
238
|
+
# line_2
|
239
|
+
# ...
|
240
|
+
def format_search_adoc index,uri_top
|
241
|
+
str = ""
|
242
|
+
index.each do |file_info|
|
243
|
+
filename = Pathname.new(file_info["filepath"]).basename
|
244
|
+
str << "== #{file_info["title"]}\n\n"
|
245
|
+
file_info["matches"].each do |section_id, info |
|
246
|
+
str << "#{uri_top}/#{info["location"]}[#{info["section_title"]}]::\n\n"
|
247
|
+
# str << "<<#{info["location"]},#{info["section_title"]}>>::\n\n"
|
248
|
+
str << "[subs=\"quotes\"]\n"
|
249
|
+
str << "----\n"
|
250
|
+
info["lines"].each do | line |
|
251
|
+
str << "-- #{wash_line(line)}\n"
|
252
|
+
end.join("\n\n")
|
253
|
+
str << "----\n"
|
254
|
+
end
|
255
|
+
str << "\n"
|
256
|
+
end
|
257
|
+
|
258
|
+
<<~ADOC
|
259
|
+
= Search Result
|
260
|
+
|
261
|
+
#{str}
|
262
|
+
ADOC
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def init_web_server web_root
|
267
|
+
require 'webrick'
|
268
|
+
|
269
|
+
root = File.expand_path web_root
|
270
|
+
puts "Trying to start a WEBrick instance at port 8000 serving files from #{web_root}..."
|
271
|
+
|
272
|
+
server = WEBrick::HTTPServer.new(
|
273
|
+
:Port => 8000,
|
274
|
+
:DocumentRoot => root,
|
275
|
+
:Logger => WEBrick::Log.new("webrick.log",WEBrick::Log::DEBUG)
|
276
|
+
)
|
277
|
+
|
278
|
+
puts "WEBrick instance now listening to localhost:8000"
|
279
|
+
|
280
|
+
trap 'INT' do server.shutdown end
|
281
|
+
|
282
|
+
server.start
|
283
|
+
end
|
284
|
+
|
285
|
+
def hello_world
|
286
|
+
require "pp"
|
287
|
+
|
288
|
+
# init a new cgi 'connection'
|
289
|
+
cgi = CGI.new
|
290
|
+
print cgi.header
|
291
|
+
print "<br>"
|
292
|
+
print "Useful cgi parameters and variables."
|
293
|
+
print "<br>"
|
294
|
+
print cgi.public_methods(false).sort
|
295
|
+
print "<br>"
|
296
|
+
print "<br>"
|
297
|
+
print "referer: #{cgi.referer}<br>"
|
298
|
+
print "path: #{URI(cgi.referer).path}<br>"
|
299
|
+
print "host: #{cgi.host}<br>"
|
300
|
+
print "client_sent_topdir: #{cgi["topdir"]}<br>"
|
301
|
+
print "<br>"
|
302
|
+
print "client_sent_reldir: #{cgi["reltop"]}<br>"
|
303
|
+
print "<br>"
|
304
|
+
print "ENV: "
|
305
|
+
pp ENV
|
306
|
+
print "<br>"
|
307
|
+
end
|
308
|
+
|
309
|
+
def cgi_main cgi
|
310
|
+
# retrieve the form data supplied by user
|
311
|
+
input_data = {
|
312
|
+
search_phrase: cgi["searchphrase"],
|
313
|
+
ignorecase: cgi.has_key?("ignorecase"),
|
314
|
+
useregexp: cgi.has_key?("useregexp"),
|
315
|
+
doc_root_abs: Pathname.new(cgi["topdir"]),
|
316
|
+
referer_rel_top: Pathname.new("/#{cgi["reltop"]}"),
|
317
|
+
referer: cgi.referer,
|
318
|
+
uri_path: URI(cgi.referer).path,
|
319
|
+
client_css: cgi["css"],
|
320
|
+
search_top: nil,
|
321
|
+
styles_top: nil
|
322
|
+
}
|
323
|
+
|
324
|
+
# fixup paths depending on git branch or not
|
325
|
+
#
|
326
|
+
# search_assets is an absolute path
|
327
|
+
# styles_top is a relative path
|
328
|
+
#
|
329
|
+
# if the source was rendered from a git branch, the paths
|
330
|
+
# search_assets = <index_dir>/../search_assets/<branch_name>/
|
331
|
+
# styles_dir = ../web_assets/css
|
332
|
+
#
|
333
|
+
# and if not, the path is
|
334
|
+
# search_assets = <index_dir>/search_assets
|
335
|
+
# styles_dir = ./web_assets/css
|
336
|
+
#
|
337
|
+
# The styles dir shall be a relative path
|
338
|
+
if input_data[:doc_root_abs].join("./search_assets").exist?
|
339
|
+
# this is not from a git branch
|
340
|
+
input_data[:search_top] = input_data[:doc_root_abs].join("./search_assets")
|
341
|
+
# input_data[:styles_top] = Pathname.new(input_data[:uri_path]).join("./web_assets/css")
|
342
|
+
input_data[:styles_top] = Pathname.new(input_data[:referer_rel_top]).join("web_assets/css")
|
343
|
+
input_data[:gitbranch] = false
|
344
|
+
elsif input_data[:doc_root_abs].join("../search_assets").exist?
|
345
|
+
# this is from a git branch
|
346
|
+
input_data[:search_top] = input_data[:doc_root_abs].join("../search_assets").join(input_data[:doc_root_abs].basename)
|
347
|
+
input_data[:styles_top] = Pathname.new(input_data[:referer_rel_top]).join("../web_assets/css")
|
348
|
+
input_data[:gitbranch] = true
|
349
|
+
else
|
350
|
+
raise ScriptError, "Could not find search_assets dir!"
|
351
|
+
end
|
352
|
+
|
353
|
+
# use a relative stylesheet (same as the index page was rendered with)
|
354
|
+
adoc_options = {
|
355
|
+
"data-uri" => 1,
|
356
|
+
"linkcss" => 1,
|
357
|
+
"stylesdir" => input_data[:styles_top].to_s,
|
358
|
+
"stylesheet" => input_data[:client_css],
|
359
|
+
"copycss!" => 1
|
360
|
+
}
|
361
|
+
|
362
|
+
# search the docs and render html
|
363
|
+
sdt = SearchDocTree.new(input_data)
|
364
|
+
docstr = sdt.search
|
365
|
+
|
366
|
+
# send the result back to the client
|
367
|
+
print Asciidoctor.convert docstr, header_footer: true, attributes: adoc_options
|
368
|
+
end
|
369
|
+
|
370
|
+
# assume that the file tree looks like this when running
|
371
|
+
# on a git branch:
|
372
|
+
#
|
373
|
+
# dst_root_dir
|
374
|
+
# |- branch_1_top_dir
|
375
|
+
# | |- index.html
|
376
|
+
# | |- file_1.html
|
377
|
+
# | |- dir_1
|
378
|
+
# | | |- file2.html
|
379
|
+
# |- branch_2_top_dir
|
380
|
+
# |- branch_x_...
|
381
|
+
# |- web_assets
|
382
|
+
# |- search_assets
|
383
|
+
# | |- branch_1_top_dir
|
384
|
+
# | |- heading_index.json
|
385
|
+
# | |- file1.adoc
|
386
|
+
# | |- dir_1
|
387
|
+
# | | |- file2.html
|
388
|
+
# | |- ...
|
389
|
+
# | |- branch_2_top_dir
|
390
|
+
# | | ...
|
391
|
+
|
392
|
+
# assume that the file tree looks like this when not
|
393
|
+
# rendering a git branch:
|
394
|
+
#
|
395
|
+
# dst_root_dir
|
396
|
+
# |- index.html
|
397
|
+
# |- file_1.html
|
398
|
+
# |- dir_1
|
399
|
+
# | |- file2.html
|
400
|
+
# |...
|
401
|
+
# |- web_assets (only if a custom stylesheet is used...)
|
402
|
+
# |- search_assets
|
403
|
+
# | |- heading_index.json
|
404
|
+
# | |- file1.adoc
|
405
|
+
# | |- dir_1
|
406
|
+
# | | |- file2.html
|
407
|
+
# | |- ...
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
# Usage:
|
412
|
+
# to start a local web server for development work
|
413
|
+
# giblish-giblish-search.rb <web_root>
|
414
|
+
#
|
415
|
+
# to run as a cgi script via a previously setup web server:
|
416
|
+
# giblish-giblish-search.rb
|
417
|
+
#
|
418
|
+
if __FILE__ == $PROGRAM_NAME
|
419
|
+
|
420
|
+
STDOUT.sync = true
|
421
|
+
if ARGV.length == 0
|
422
|
+
# 'Normal' cgi usage, as called from a web server
|
423
|
+
|
424
|
+
# init a new cgi 'connection' and print headers
|
425
|
+
cgi = CGI.new
|
426
|
+
print cgi.header
|
427
|
+
begin
|
428
|
+
# hello_world
|
429
|
+
cgi_main cgi
|
430
|
+
rescue Exception => e
|
431
|
+
print e.message
|
432
|
+
exit 1
|
433
|
+
end
|
434
|
+
exit 0
|
435
|
+
end
|
436
|
+
|
437
|
+
if ARGV.length == 1
|
438
|
+
# Run a simple web server to test this locally..
|
439
|
+
# and then create the html docs using:
|
440
|
+
# giblish -c -m -w <web_root> -r <resource_dir> -s <style_name> -g <git_branch> <src_root> <web_root>
|
441
|
+
init_web_server ARGV[0]
|
442
|
+
exit 0
|
443
|
+
end
|
444
|
+
end
|