giblish 0.4.0 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/README.adoc +1 -1
- data/Rakefile +1 -3
- data/data/testdocs/wellformed/docidtest/docid_1.adoc +4 -5
- data/giblish.gemspec +8 -6
- data/lib/giblish/application.rb +5 -4
- data/lib/giblish/buildindex.rb +5 -6
- data/lib/giblish/cmdline.rb +40 -21
- data/lib/giblish/core.rb +62 -35
- data/lib/giblish/docconverter.rb +32 -19
- data/lib/giblish/indexheadings.rb +53 -14
- data/lib/giblish/utils.rb +61 -4
- data/lib/giblish/version.rb +1 -1
- metadata +34 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d917c8b6c513f7759aecbbdb5a93a7cb13cb5774d66ccf0d602a615248723f76
|
4
|
+
data.tar.gz: b94be771b19dd5890e238ffc0ee0ee5af361919c0e526d63ac4f380b4f6698a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c9f6b75a6266c65baf0e7876016139703b7b46677fea2dcee54b9ad95b23c04756c8b9383398cdd8055c91e78ea3d275c7968eeabf1154478a44b76faf6c27c
|
7
|
+
data.tar.gz: c7cb03e7fe95cdf3a13a74c36f0d5efbb06e49828ff04db05b5d231f098bb411ab34584067e03b7a3b93c025224d3d93ccd13366e951fe93826cfdafeaae1bd9
|
data/.gitignore
CHANGED
data/README.adoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= giblish
|
2
2
|
Generate docs from asciidoc files in a git repo
|
3
3
|
|
4
|
-
image::https://travis-ci.
|
4
|
+
image::https://travis-ci.org/rillbert/giblish.svg?branch=master["Build Status", link="https://travis-ci.org/rillbert/giblish"]
|
5
5
|
|
6
6
|
== Purpose
|
7
7
|
|
data/Rakefile
CHANGED
@@ -10,9 +10,7 @@ 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/**/
|
14
|
-
# t.test_files = FileList["test/**/index_heading_test.rb"]
|
15
|
-
# t.test_files = FileList["test/**/depgraph_test.rb"]
|
13
|
+
t.test_files = FileList["test/**/index_heading_test.rb"]
|
16
14
|
end
|
17
15
|
|
18
16
|
Rake::TestTask.new(:sandbox) do |t|
|
@@ -5,14 +5,13 @@
|
|
5
5
|
== Purpose
|
6
6
|
|
7
7
|
To test the basic functionality of document id references.
|
8
|
-
This paragraph can be referenced as <<:docid:WF-013#Purpose,This paragraph>>.
|
9
8
|
|
10
9
|
Other valid docid references::
|
11
10
|
|
12
|
-
* << :docid:WF-
|
13
|
-
* << :docid: WF-
|
14
|
-
* <<:docid:WF-
|
15
|
-
* <<:docid:WF-
|
11
|
+
* << :docid:WF-022,Using space before>>
|
12
|
+
* << :docid: WF-022,Using space and tabs>>
|
13
|
+
* <<:docid:WF-022#Testing Document ids>> No title but hash and section.
|
14
|
+
* <<:docid:WF-022>> No title and no hash
|
16
15
|
* <<:docid:WF-022,docid_2 adoc>> Another document within the tree.
|
17
16
|
* <<:docid:WF-022#Purpose, Purpose in WF-022>> Reference a section in another document
|
18
17
|
* <<:docid:WF-022>> Two references on the same line <<:docid:WF-013>>.
|
data/giblish.gemspec
CHANGED
@@ -30,17 +30,19 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ["lib"]
|
32
32
|
|
33
|
-
spec.add_development_dependency "bundler", "~>
|
33
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
34
34
|
spec.add_development_dependency "minitest", "~> 5.0"
|
35
|
-
spec.add_development_dependency "rake", "~>
|
35
|
+
spec.add_development_dependency "rake", "~> 11.0"
|
36
|
+
spec.add_development_dependency "oga", "~> 2.15"
|
36
37
|
|
37
38
|
# Usage: spec.add_runtime_dependency "[gem name]", [[version]]
|
38
|
-
spec.add_runtime_dependency "asciidoctor", "~>
|
39
|
+
spec.add_runtime_dependency "asciidoctor", "~>2.0", ">= 2.0.10"
|
39
40
|
spec.add_runtime_dependency "asciidoctor-diagram", ["~> 1.5"]
|
40
|
-
spec.add_runtime_dependency "asciidoctor-pdf", [">= 1.5.0.alpha.
|
41
|
-
spec.add_runtime_dependency "asciidoctor-rouge", ["~> 0.3"]
|
41
|
+
spec.add_runtime_dependency "asciidoctor-pdf", [">= 1.5.0.alpha.18"]
|
42
42
|
spec.add_runtime_dependency "git", "~> 1.3"
|
43
|
+
spec.add_runtime_dependency "rouge", "~> 3.3"
|
43
44
|
# needed by asciidoctor-pdf, see instructions at
|
44
45
|
# https://github.com/asciidoctor/asciidoctor-pdf/releases
|
45
|
-
spec.add_runtime_dependency "prawn-svg", "~> 0.27.1"
|
46
|
+
# spec.add_runtime_dependency "prawn-svg", "~> 0.27.1"
|
47
|
+
spec.add_runtime_dependency "prawn-svg", "~> 0.29.1"
|
46
48
|
end
|
data/lib/giblish/application.rb
CHANGED
@@ -31,21 +31,22 @@ module Giblish
|
|
31
31
|
Giblog.logger.debug { "cmd line args: #{cmdline.args}" }
|
32
32
|
|
33
33
|
# Convert using given args
|
34
|
+
conv_error = false
|
34
35
|
begin
|
35
36
|
if cmdline.args[:gitRepoRoot]
|
36
37
|
Giblog.logger.info { "User asked to parse a git repo" }
|
37
38
|
gc = GitRepoConverter.new cmdline.args
|
38
|
-
gc.convert
|
39
|
+
conv_error = gc.convert
|
39
40
|
else
|
40
41
|
tc = FileTreeConverter.new cmdline.args
|
41
|
-
tc.convert
|
42
|
+
conv_error = tc.convert
|
42
43
|
end
|
43
44
|
Giblog.logger.info { "Giblish is done!" }
|
44
|
-
0
|
45
45
|
rescue Exception => e
|
46
46
|
log_error e
|
47
|
-
|
47
|
+
conv_error = true
|
48
48
|
end
|
49
|
+
conv_error ? 1 : 0
|
49
50
|
end
|
50
51
|
|
51
52
|
private
|
data/lib/giblish/buildindex.rb
CHANGED
@@ -172,12 +172,11 @@ module Giblish
|
|
172
172
|
def generate_conversion_info(d)
|
173
173
|
return "" if d.stderr.empty?
|
174
174
|
# extract conversion warnings from asciddoctor std err
|
175
|
-
conv_warnings = d.stderr.gsub(
|
176
|
-
Giblog.logger.warn {"Conversion warnings: #{conv_warnings}"}
|
175
|
+
conv_warnings = d.stderr.gsub(/^/, " * ")
|
177
176
|
|
178
177
|
# assemble info to index page
|
179
178
|
<<~CONV_INFO
|
180
|
-
Conversion
|
179
|
+
Conversion issues::
|
181
180
|
|
182
181
|
#{conv_warnings}
|
183
182
|
CONV_INFO
|
@@ -205,15 +204,15 @@ module Giblish
|
|
205
204
|
end
|
206
205
|
|
207
206
|
# Generate an adoc string that will display as
|
208
|
-
# DocTitle (
|
207
|
+
# DocTitle (conv issues) details
|
209
208
|
# Where the DocTitle and details are links to the doc itself and a section
|
210
209
|
# identified with the doc's title respectively.
|
211
210
|
def tree_entry_converted(prefix_str, doc_info)
|
212
211
|
# Get the elements of the entry
|
213
212
|
doc_title, doc_link, doc_details = format_title_and_ref doc_info
|
214
|
-
warning_label = doc_info.stderr.empty? ? "" : "(
|
213
|
+
warning_label = doc_info.stderr.empty? ? "" : "(conv issues)"
|
215
214
|
|
216
|
-
# Calculate padding to get (
|
215
|
+
# Calculate padding to get (conv issues) and details aligned between entries
|
217
216
|
padding = 70
|
218
217
|
[doc_title, prefix_str, warning_label].each {|p| padding -= p.length}
|
219
218
|
padding = 0 unless padding.positive?
|
data/lib/giblish/cmdline.rb
CHANGED
@@ -34,11 +34,11 @@ class CmdLineParser
|
|
34
34
|
-i --include <regexp> include only files with a filename that matches the supplied
|
35
35
|
regexp (defaults to '.*\.(?i)adoc$' meaning it matches all
|
36
36
|
files ending in .adoc case-insensitive). The matching is made
|
37
|
-
on the _file name only_, not the full path (i.e. for the full
|
37
|
+
on the _file name only_, not the full path (i.e. for the full
|
38
38
|
path /my/file.adoc, only file.adoc is used in the matching).
|
39
|
-
-j --exclude <regexp> exclude files with filenames matching the supplied
|
39
|
+
-j --exclude <regexp> exclude files with filenames matching the supplied
|
40
40
|
regexp (no files are excluded by default). The matching is made
|
41
|
-
on the _file name only_, not the full path (i.e. for the full
|
41
|
+
on the _file name only_, not the full path (i.e. for the full
|
42
42
|
path /my/file.adoc, only file.adoc is used in the matching).
|
43
43
|
-w --web-root <path> Specifies the top dir (DirectoryRoot) of a file system
|
44
44
|
tree published by a web server. This switch is only used
|
@@ -57,13 +57,18 @@ class CmdLineParser
|
|
57
57
|
branch on origin_.
|
58
58
|
NOTE 2: In bash, use double quotes around your regexp if
|
59
59
|
you need to quote it. Single quotes are treated as part
|
60
|
-
of the regexp itself.
|
60
|
+
of the regexp itself.
|
61
61
|
-t --git-tags <regExp> if the source_dir_top is located within a git repo,
|
62
62
|
generate docs for all tags that matches the given
|
63
63
|
regular expression. Each tag will be generated to
|
64
64
|
a separate subdir under the destination root dir.
|
65
|
-
-c --local-only do not try to fetch git info from any remotes of
|
66
|
-
repo before generating documents.
|
65
|
+
-c --local-only do not try to fetch git info from any remotes of
|
66
|
+
the repo before generating documents.
|
67
|
+
-a --attribute <key>=<value> set a document or asciidoctor attribute.
|
68
|
+
The contents of this flag is passed directly to the
|
69
|
+
underlying asciidoctor tool, for details above the
|
70
|
+
syntax and available attributes, see the documentation for
|
71
|
+
asciidoctor. This option can be specified more than once.
|
67
72
|
-d --resolve-docid use two passes, the first to collect :docid:
|
68
73
|
attributes in the doc headers, the second to
|
69
74
|
generate the documents and use the collected
|
@@ -71,26 +76,26 @@ class CmdLineParser
|
|
71
76
|
generated documents
|
72
77
|
-m --make-searchable (only supported for html generation)
|
73
78
|
take steps to make it possible to
|
74
|
-
search the published content via a cgi-script. This
|
79
|
+
search the published content via a cgi-script. This
|
75
80
|
flag will do the following:
|
76
81
|
1. index all headings in all source files and store
|
77
82
|
the result in a JSON file
|
78
83
|
2. copy the JSON file and all source (adoc) files to
|
79
84
|
a 'search_assets' folder in the top-level dir of
|
80
85
|
the destination.
|
81
|
-
3. add html code that displays a search field in the
|
86
|
+
3. add html code that displays a search field in the
|
82
87
|
index page that will try to call the cgi-script
|
83
|
-
'giblish-search' when the user inputs some text.
|
84
|
-
To actually provide search functionality for a user, you
|
88
|
+
'giblish-search' when the user inputs some text.
|
89
|
+
To actually provide search functionality for a user, you
|
85
90
|
need to provide the cgi-script and configure your web-server
|
86
|
-
to invoke it when needed. NOTE: The generated search box cgi
|
87
|
-
is currently hard-coded to look for the cgi script at the URL:
|
91
|
+
to invoke it when needed. NOTE: The generated search box cgi
|
92
|
+
is currently hard-coded to look for the cgi script at the URL:
|
88
93
|
http://<your-web-domain>/cgi-bin/giblish-search.cgi
|
89
94
|
E.g.
|
90
95
|
http://example.com/cgi-bin/giblish-search.cgi
|
91
96
|
An implementation of the giblish-search cgi-script is found
|
92
|
-
within the lib folder of this gem, you can copy that to your
|
93
|
-
cgi-bin dir in your webserver and rename it from .rb to .cgi
|
97
|
+
within the lib folder of this gem, you can copy that to your
|
98
|
+
cgi-bin dir in your webserver and rename it from .rb to .cgi
|
94
99
|
--log-level set the log level explicitly. Must be one of
|
95
100
|
debug, info (default), warn, error or fatal.
|
96
101
|
ENDHELP
|
@@ -110,15 +115,10 @@ ENDHELP
|
|
110
115
|
exit 0
|
111
116
|
end
|
112
117
|
|
113
|
-
#
|
118
|
+
# act on the parsed cmd line args
|
114
119
|
set_log_level
|
115
120
|
sanity_check_input
|
116
121
|
set_gitrepo_root
|
117
|
-
# if @args[:logfile]
|
118
|
-
# $stdout.reopen( ARGS[:logfile], "w" )
|
119
|
-
# $stdout.sync = true
|
120
|
-
# $stderr.reopen( $stdout )
|
121
|
-
# end
|
122
122
|
end
|
123
123
|
|
124
124
|
def usage
|
@@ -185,6 +185,7 @@ ENDHELP
|
|
185
185
|
when "-g", "--git-branches" then next_arg = :gitBranchRegexp
|
186
186
|
when "-t", "--git-tags" then next_arg = :gitTagRegexp
|
187
187
|
when "-c", "--local-only" then @args[:localRepoOnly] = true
|
188
|
+
when "-a", "--attribute" then next_arg = :attributes
|
188
189
|
when "-d", "--resolve-docid" then @args[:resolveDocid] = true
|
189
190
|
when "-m", "--make-searchable" then @args[:make_searchable] = true
|
190
191
|
when "-s", "--style" then next_arg = :userStyle
|
@@ -192,7 +193,12 @@ ENDHELP
|
|
192
193
|
when "--log-level" then next_arg = :logLevel
|
193
194
|
else
|
194
195
|
if next_arg
|
195
|
-
|
196
|
+
if next_arg == :attributes
|
197
|
+
# support multiple invocations of -a
|
198
|
+
add_attribute arg
|
199
|
+
else
|
200
|
+
@args[next_arg] = arg
|
201
|
+
end
|
196
202
|
unflagged_args.delete(next_arg)
|
197
203
|
end
|
198
204
|
next_arg = unflagged_args.first
|
@@ -200,6 +206,19 @@ ENDHELP
|
|
200
206
|
end
|
201
207
|
end
|
202
208
|
|
209
|
+
# adds the str (must be in key=value format) to the
|
210
|
+
# user defined attributes
|
211
|
+
def add_attribute(attrib_str)
|
212
|
+
kv = attrib_str.split('=')
|
213
|
+
if kv.length != 2
|
214
|
+
puts "Invalid attribute format: #{attrib_str} Must be <key>=<value>"
|
215
|
+
exit 1
|
216
|
+
end
|
217
|
+
|
218
|
+
@args[:attributes] ||= {}
|
219
|
+
@args[:attributes][kv[0]] = kv[1]
|
220
|
+
end
|
221
|
+
|
203
222
|
def prevent_invalid_combos
|
204
223
|
# Prevent contradicting options
|
205
224
|
if !@args[:resourceDir] && @args[:userStyle]
|
data/lib/giblish/core.rb
CHANGED
@@ -36,6 +36,10 @@ module Giblish
|
|
36
36
|
@search_assets_path = @paths.dst_root_abs.realpath.join("search_assets")
|
37
37
|
end
|
38
38
|
|
39
|
+
|
40
|
+
# convert all adoc files
|
41
|
+
# return true if all conversions went ok, false if at least one
|
42
|
+
# failed
|
39
43
|
def convert
|
40
44
|
# collect all doc ids and enable replacement of known doc ids with
|
41
45
|
# valid references to adoc files
|
@@ -46,38 +50,53 @@ module Giblish
|
|
46
50
|
|
47
51
|
# traverse the src file tree and convert all files deemed as
|
48
52
|
# adoc files
|
53
|
+
conv_error = false
|
49
54
|
Find.find(@paths.src_root_abs) do |path|
|
50
55
|
p = Pathname.new(path)
|
51
|
-
|
56
|
+
begin
|
57
|
+
to_asciidoc(p) if adocfile? p
|
58
|
+
rescue Exception => e
|
59
|
+
str = "Error when converting file #{path.to_s}: #{e.message}\nBacktrace:\n"
|
60
|
+
e.backtrace.each {|l| str << " #{l}\n"}
|
61
|
+
Giblog.logger.error {str}
|
62
|
+
conv_error = true
|
63
|
+
end
|
52
64
|
end if @paths.src_root_abs.directory?
|
53
65
|
|
54
66
|
# create necessary search assets if needed
|
55
67
|
create_search_assets if @options[:make_searchable]
|
56
68
|
|
57
|
-
#
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
69
|
+
# build index and other fancy stuff if not suppressed
|
70
|
+
unless @options[:suppressBuildRef]
|
71
|
+
# build a dependency graph (only if we resolve docids...)
|
72
|
+
dep_graph_exist = if @options[:resolveDocid]
|
73
|
+
if Giblish::GraphBuilderGraphviz.supported
|
74
|
+
gb = Giblish::GraphBuilderGraphviz.new @processed_docs, @paths, {extension: @converter.converter_options[:fileext]}
|
75
|
+
@converter.convert_str(gb.source, @paths.dst_root_abs, "graph")
|
76
|
+
else
|
77
|
+
Giblog.logger.warn { "Lacking access to needed tools for generating a visual dependency graph." }
|
78
|
+
Giblog.logger.warn { "The dependency graph will not be generated !!" }
|
79
|
+
false
|
80
|
+
end
|
65
81
|
else
|
66
|
-
Giblog.logger.warn { "Lacking access to needed tools for generating a visual dependency graph." }
|
67
|
-
Giblog.logger.warn { "The dependency graph will not be generated !!" }
|
68
82
|
false
|
69
83
|
end
|
70
|
-
else
|
71
|
-
false
|
72
|
-
end
|
73
84
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
85
|
+
# build a reference index
|
86
|
+
adoc_logger = Giblish::AsciidoctorLogger.new Logger::Severity::WARN
|
87
|
+
ib = index_factory
|
88
|
+
@converter.convert_str(
|
89
|
+
ib.source(
|
90
|
+
dep_graph_exist,@options[:make_searchable]
|
91
|
+
),
|
92
|
+
@paths.dst_root_abs, "index",
|
93
|
+
logger: adoc_logger)
|
94
|
+
|
95
|
+
# clean up cached files and adoc resources
|
96
|
+
remove_diagram_temps if dep_graph_exist
|
97
|
+
GC.start
|
98
|
+
end
|
99
|
+
conv_error
|
81
100
|
end
|
82
101
|
|
83
102
|
protected
|
@@ -148,19 +167,13 @@ module Giblish
|
|
148
167
|
def to_asciidoc(filepath)
|
149
168
|
adoc = nil
|
150
169
|
begin
|
151
|
-
|
152
|
-
|
153
|
-
adoc_stderr = Giblish.with_captured_stderr do
|
154
|
-
adoc = @converter.convert filepath
|
155
|
-
end
|
170
|
+
adoc_logger = Giblish::AsciidoctorLogger.new Logger::Severity::WARN
|
171
|
+
adoc = @converter.convert(filepath,logger: adoc_logger)
|
156
172
|
|
157
|
-
add_doc(adoc,
|
173
|
+
add_doc(adoc, adoc_logger.user_info_str.string)
|
158
174
|
rescue Exception => e
|
159
|
-
str = "Error when converting doc: #{e.message}\n"
|
160
|
-
e.backtrace.each {|l| str << "#{l}\n"}
|
161
|
-
Giblog.logger.error {str}
|
162
|
-
|
163
175
|
add_doc_fail(filepath, e)
|
176
|
+
raise
|
164
177
|
end
|
165
178
|
end
|
166
179
|
|
@@ -258,20 +271,31 @@ module Giblish
|
|
258
271
|
@user_tags = select_user_tags(options[:gitTagRegexp])
|
259
272
|
end
|
260
273
|
|
261
|
-
#
|
262
|
-
# summary page
|
274
|
+
# Convert the docs from each branch/tag and add info to the
|
275
|
+
# summary page.
|
276
|
+
# return true if all conversions went ok, false if at least one
|
277
|
+
# failed
|
263
278
|
def convert
|
279
|
+
conv_error = false
|
264
280
|
(@user_branches + @user_tags).each do |co|
|
265
|
-
convert_one_checkout
|
281
|
+
conv_error = conv_error || convert_one_checkout(co)
|
266
282
|
end
|
267
283
|
|
268
284
|
# Render the summary page
|
269
285
|
index_builder = GitSummaryIndexBuilder.new @git_repo,
|
270
286
|
@user_branches,
|
271
287
|
@user_tags
|
272
|
-
|
288
|
+
|
289
|
+
conv_error = conv_error || @converter.convert_str(
|
290
|
+
index_builder.source,
|
291
|
+
@master_paths.dst_root_abs,
|
292
|
+
"index"
|
293
|
+
)
|
294
|
+
|
273
295
|
# clean up
|
274
296
|
GC.start
|
297
|
+
|
298
|
+
conv_error
|
275
299
|
end
|
276
300
|
|
277
301
|
protected
|
@@ -345,6 +369,9 @@ module Giblish
|
|
345
369
|
tags
|
346
370
|
end
|
347
371
|
|
372
|
+
# convert all docs from one particular git commit
|
373
|
+
# returns true if at least one doc failed to convert
|
374
|
+
# and false if everything went ok.
|
348
375
|
def convert_one_checkout(co)
|
349
376
|
# determine if we are called with a tag or a branch
|
350
377
|
is_tag = (co.respond_to?(:tag?) && co.tag?)
|
data/lib/giblish/docconverter.rb
CHANGED
@@ -31,13 +31,15 @@ module Giblish
|
|
31
31
|
attr_accessor :paths
|
32
32
|
|
33
33
|
def initialize(paths, options)
|
34
|
-
# access the source highlight module
|
35
|
-
require "asciidoctor-rouge"
|
36
|
-
|
37
34
|
@paths = paths
|
38
35
|
@user_style = options[:userStyle]
|
39
36
|
@converter_options = COMMON_CONVERTER_OPTS.dup
|
37
|
+
|
38
|
+
# use the default options and override them with options set by
|
39
|
+
# the user if applicable
|
40
40
|
@converter_options[:attributes] = DEFAULT_ATTRIBUTES.dup
|
41
|
+
@converter_options[:attributes].merge!(options[:attributes]) unless options[:attributes].nil?
|
42
|
+
|
41
43
|
@converter_options[:backend] = options[:backend]
|
42
44
|
end
|
43
45
|
|
@@ -47,7 +49,7 @@ module Giblish
|
|
47
49
|
# filepath - a pathname with the absolute path to the input file to convert
|
48
50
|
#
|
49
51
|
# Returns: The resulting Asciidoctor::Document object
|
50
|
-
def convert(filepath)
|
52
|
+
def convert(filepath, logger: nil)
|
51
53
|
unless filepath.is_a?(Pathname)
|
52
54
|
raise ArgumentError, "Trying to invoke convert with non-pathname!"
|
53
55
|
end
|
@@ -63,10 +65,18 @@ module Giblish
|
|
63
65
|
Giblish::PathManager.get_new_basename(filepath,
|
64
66
|
@converter_options[:fileext])
|
65
67
|
|
68
|
+
# set a specific logger instance to-be-used by asciidoctor
|
69
|
+
@converter_options[:logger] = logger unless logger.nil?
|
70
|
+
|
66
71
|
Giblog.logger.debug {"converter_options: #{@converter_options}"}
|
67
72
|
|
68
73
|
# do the actual conversion
|
69
|
-
Asciidoctor.convert_file filepath, @converter_options
|
74
|
+
doc = Asciidoctor.convert_file filepath, @converter_options
|
75
|
+
|
76
|
+
if logger && logger.max_severity && logger.max_severity > Logger::Severity::WARN
|
77
|
+
raise RuntimeError, "Failed to convert the file #{filepath}"
|
78
|
+
end
|
79
|
+
doc
|
70
80
|
end
|
71
81
|
|
72
82
|
# converts the supplied string to the file
|
@@ -75,8 +85,9 @@ module Giblish
|
|
75
85
|
# the supplied string must pass asciidoctor without
|
76
86
|
# any error to stderr, otherwise, nothing will be written
|
77
87
|
# to disk.
|
78
|
-
#
|
79
|
-
|
88
|
+
# Returns: whether any errors occured during conversion (true) or
|
89
|
+
# not (false).
|
90
|
+
def convert_str(src_str, dst_dir, basename,logger: nil)
|
80
91
|
index_opts = @converter_options.dup
|
81
92
|
|
82
93
|
# use the same options as when converting all docs
|
@@ -89,27 +100,29 @@ module Giblish
|
|
89
100
|
|
90
101
|
# load and convert the document using the converter options
|
91
102
|
doc = nil, output = nil
|
92
|
-
|
103
|
+
|
104
|
+
begin
|
105
|
+
conv_error = false
|
106
|
+
# set a specific logger instance to-be-used by asciidoctor
|
107
|
+
index_opts[:logger] = logger unless logger.nil?
|
93
108
|
doc = Asciidoctor.load src_str, index_opts
|
94
109
|
output = doc.convert index_opts
|
95
|
-
end
|
96
110
|
|
97
|
-
|
111
|
+
index_filepath = dst_dir + "#{basename}.#{index_opts[:fileext]}"
|
98
112
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
Giblog.logger.error
|
104
|
-
|
105
|
-
Giblog.logger.error {adoc_stderr}
|
106
|
-
return false
|
113
|
+
if logger && logger.max_severity && logger.max_severity > Logger::Severity::WARN
|
114
|
+
raise RuntimeError, "Failed to convert string to asciidoc!! Will _not_ generate #{index_filepath.to_s}"
|
115
|
+
end
|
116
|
+
rescue Exception => e
|
117
|
+
Giblog.logger.error(e)
|
118
|
+
conv_error = true
|
107
119
|
end
|
108
120
|
|
121
|
+
|
109
122
|
# write the converted document to an index file located at the
|
110
123
|
# destination root
|
111
124
|
doc.write output, index_filepath.to_s
|
112
|
-
|
125
|
+
conv_error
|
113
126
|
end
|
114
127
|
|
115
128
|
protected
|
@@ -10,7 +10,7 @@ module Giblish
|
|
10
10
|
# Asciidoctor processes the adoc content.
|
11
11
|
#
|
12
12
|
# It indexes all headings found in all documents in the tree.
|
13
|
-
# The resulting index can be serialized to a JSON file
|
13
|
+
# The resulting index can be serialized to a JSON file
|
14
14
|
# with the following format:
|
15
15
|
#
|
16
16
|
# {
|
@@ -96,27 +96,66 @@ module Giblish
|
|
96
96
|
"sections" => sections
|
97
97
|
}
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
index_sections(reader,file_info_hash)
|
100
|
+
|
101
|
+
heading_index["file_infos"] << file_info_hash
|
102
|
+
reader
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
# build the 'sections' array
|
108
|
+
def index_sections(reader, file_info_hash)
|
109
|
+
sections = file_info_hash["sections"]
|
110
|
+
|
111
|
+
heading_regex = Regexp.new(/^=+\s+(.*)$/)
|
112
|
+
anchor_regex = Regexp.new(/^\[\[(\w+)\]\]\s*$/)
|
113
|
+
|
114
|
+
line_no = 0
|
115
|
+
m = nil
|
116
|
+
match_str = ""
|
117
|
+
state = :text
|
102
118
|
reader.lines.each do |line|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
119
|
+
line_no += 1
|
120
|
+
# implement a state machine that supports both custom
|
121
|
+
# anchors for a heading and the default heading ids generated
|
122
|
+
# by asciidoctor
|
123
|
+
case state
|
124
|
+
when :text
|
125
|
+
m = heading_regex.match(line)
|
126
|
+
if m
|
127
|
+
state = :heading
|
128
|
+
match_str = m[1]
|
129
|
+
else
|
130
|
+
m = anchor_regex.match(line)
|
131
|
+
if m
|
132
|
+
state = :expecting_heading
|
133
|
+
match_str = m[1]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
when :expecting_heading
|
137
|
+
m = heading_regex.match(line)
|
138
|
+
if m
|
139
|
+
# we have an anchor and got a heading as expected, index it
|
140
|
+
section = { "id" => match_str }
|
141
|
+
section["title"] = m[1].strip
|
142
|
+
section["line_no"] = line_no
|
143
|
+
sections << section
|
144
|
+
else
|
145
|
+
Giblog.logger.debug {"Did not index the anchor: #{match_str} at line #{line_no}, probably not associated with a heading."}
|
146
|
+
end
|
147
|
+
state = :text
|
148
|
+
when :heading
|
149
|
+
# we got a heading without an accompanying anchor, index it
|
150
|
+
section = { "id" => get_unique_id(file_info_hash, match_str) }
|
107
151
|
section["title"] = m[1].strip
|
108
152
|
section["line_no"] = line_no
|
109
153
|
sections << section
|
154
|
+
state = :text
|
110
155
|
end
|
111
|
-
line_no += 1
|
112
156
|
end
|
113
|
-
|
114
|
-
heading_index["file_infos"] << file_info_hash
|
115
|
-
reader
|
116
157
|
end
|
117
158
|
|
118
|
-
private
|
119
|
-
|
120
159
|
def find_title(lines)
|
121
160
|
title = "No title Found!"
|
122
161
|
Giblish.process_header_lines(lines) do |line|
|
data/lib/giblish/utils.rb
CHANGED
@@ -2,13 +2,20 @@ require "logger"
|
|
2
2
|
require "pathname"
|
3
3
|
require "fileutils"
|
4
4
|
|
5
|
+
class GiblogFormatter
|
6
|
+
def call severity, datetime, progname, msg
|
7
|
+
"#{datetime.strftime('%H:%M:%S')} #{severity} - #{msg}\n"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
class Giblog
|
6
12
|
def self.setup
|
7
13
|
return if defined? @logger
|
8
14
|
@logger = Logger.new(STDOUT)
|
9
|
-
@logger.formatter =
|
10
|
-
|
11
|
-
|
15
|
+
@logger.formatter = GiblogFormatter.new
|
16
|
+
# @logger.formatter = proc do |severity, datetime, _progname, msg|
|
17
|
+
# "#{datetime.strftime('%H:%M:%S')} #{severity} - #{msg}\n"
|
18
|
+
# end
|
12
19
|
end
|
13
20
|
|
14
21
|
def self.logger
|
@@ -21,8 +28,58 @@ class Giblog
|
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
31
|
+
|
32
|
+
|
24
33
|
# Public: Contains a number of generic utility methods.
|
25
34
|
module Giblish
|
35
|
+
|
36
|
+
class UserInfoFormatter
|
37
|
+
SEVERITY_LABELS = { 'WARN' => 'WARNING', 'FATAL' => 'FAILED' }
|
38
|
+
|
39
|
+
# {:text=>"...",
|
40
|
+
# :source_location=>#<Asciidoctor::Reader::Cursor:0x000055e65a8729e0
|
41
|
+
# @file="<full adoc filename>",
|
42
|
+
# @dir="<full src dir>",
|
43
|
+
# @path="<only file name>",
|
44
|
+
# @lineno=<src line no>
|
45
|
+
# }
|
46
|
+
def call severity, datetime, progname, msg
|
47
|
+
message = case msg
|
48
|
+
when ::String
|
49
|
+
msg
|
50
|
+
when ::Hash
|
51
|
+
# asciidoctor seem to emit a hash with error text and source location info
|
52
|
+
# for warnings and errors
|
53
|
+
str = ""
|
54
|
+
str << "Line #{msg[:source_location].lineno.to_s} - " if msg[:source_location]
|
55
|
+
str << "#{msg[:text].to_s}" if msg[:text]
|
56
|
+
str
|
57
|
+
else
|
58
|
+
msg.inspect
|
59
|
+
end
|
60
|
+
%(#{datetime.strftime('%H:%M:%S')} #{progname}: #{SEVERITY_LABELS[severity] || severity}: #{message}\n)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
class AsciidoctorLogger < ::Logger
|
64
|
+
|
65
|
+
attr_reader :max_severity
|
66
|
+
attr_reader :user_info_str
|
67
|
+
|
68
|
+
def initialize user_info_log_level
|
69
|
+
super(STDOUT,progname: "(from asciidoctor)", formatter: UserInfoFormatter.new)
|
70
|
+
@user_info_str = StringIO.new
|
71
|
+
@user_info_logger = ::Logger.new(@user_info_str, formatter: UserInfoFormatter.new, level: user_info_log_level)
|
72
|
+
end
|
73
|
+
|
74
|
+
def add severity, message = nil, progname = nil
|
75
|
+
if (severity ||= UNKNOWN) > (@max_severity ||= severity)
|
76
|
+
@max_severity = severity
|
77
|
+
end
|
78
|
+
@user_info_logger.add(severity,message,progname)
|
79
|
+
super
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
26
83
|
# Helper class to ease construction of different paths for input and output
|
27
84
|
# files and directories
|
28
85
|
class PathManager
|
@@ -161,7 +218,7 @@ module Giblish
|
|
161
218
|
return p if git_dir.directory?
|
162
219
|
end
|
163
220
|
end
|
164
|
-
end
|
221
|
+
end # end of PathManager
|
165
222
|
|
166
223
|
# Helper method that provides the user with a way of processing only the
|
167
224
|
# lines within the asciidoc header block.
|
data/lib/giblish/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: giblish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anders Rillbert
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,34 +44,48 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '11.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '11.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: oga
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.15'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.15'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: asciidoctor
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '2.0'
|
62
76
|
- - ">="
|
63
77
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
78
|
+
version: 2.0.10
|
65
79
|
type: :runtime
|
66
80
|
prerelease: false
|
67
81
|
version_requirements: !ruby/object:Gem::Requirement
|
68
82
|
requirements:
|
69
83
|
- - "~>"
|
70
84
|
- !ruby/object:Gem::Version
|
71
|
-
version: '
|
85
|
+
version: '2.0'
|
72
86
|
- - ">="
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
88
|
+
version: 2.0.10
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: asciidoctor-diagram
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,56 +106,56 @@ dependencies:
|
|
92
106
|
requirements:
|
93
107
|
- - ">="
|
94
108
|
- !ruby/object:Gem::Version
|
95
|
-
version: 1.5.0.alpha.
|
109
|
+
version: 1.5.0.alpha.18
|
96
110
|
type: :runtime
|
97
111
|
prerelease: false
|
98
112
|
version_requirements: !ruby/object:Gem::Requirement
|
99
113
|
requirements:
|
100
114
|
- - ">="
|
101
115
|
- !ruby/object:Gem::Version
|
102
|
-
version: 1.5.0.alpha.
|
116
|
+
version: 1.5.0.alpha.18
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
118
|
+
name: git
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|
106
120
|
requirements:
|
107
121
|
- - "~>"
|
108
122
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
123
|
+
version: '1.3'
|
110
124
|
type: :runtime
|
111
125
|
prerelease: false
|
112
126
|
version_requirements: !ruby/object:Gem::Requirement
|
113
127
|
requirements:
|
114
128
|
- - "~>"
|
115
129
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
130
|
+
version: '1.3'
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
132
|
+
name: rouge
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
120
134
|
requirements:
|
121
135
|
- - "~>"
|
122
136
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
137
|
+
version: '3.3'
|
124
138
|
type: :runtime
|
125
139
|
prerelease: false
|
126
140
|
version_requirements: !ruby/object:Gem::Requirement
|
127
141
|
requirements:
|
128
142
|
- - "~>"
|
129
143
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
144
|
+
version: '3.3'
|
131
145
|
- !ruby/object:Gem::Dependency
|
132
146
|
name: prawn-svg
|
133
147
|
requirement: !ruby/object:Gem::Requirement
|
134
148
|
requirements:
|
135
149
|
- - "~>"
|
136
150
|
- !ruby/object:Gem::Version
|
137
|
-
version: 0.
|
151
|
+
version: 0.29.1
|
138
152
|
type: :runtime
|
139
153
|
prerelease: false
|
140
154
|
version_requirements: !ruby/object:Gem::Requirement
|
141
155
|
requirements:
|
142
156
|
- - "~>"
|
143
157
|
- !ruby/object:Gem::Version
|
144
|
-
version: 0.
|
158
|
+
version: 0.29.1
|
145
159
|
description: A tool for publishing asciidoc docs stored in git repos
|
146
160
|
email:
|
147
161
|
- anders.rillbert@kutso.se
|