giblish 0.7.6 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -2
- data/.ruby-version +1 -1
- data/giblish.gemspec +8 -7
- data/lib/giblish/application.rb +27 -24
- data/lib/giblish/buildgraph.rb +37 -39
- data/lib/giblish/buildindex.rb +96 -101
- data/lib/giblish/cmdline.rb +68 -68
- data/lib/giblish/core.rb +89 -80
- data/lib/giblish/docconverter.rb +57 -59
- data/lib/giblish/docid.rb +4 -12
- data/lib/giblish/docinfo.rb +14 -39
- data/lib/giblish/gititf.rb +4 -6
- data/lib/giblish/indexheadings.rb +35 -39
- data/lib/giblish/pathtree.rb +2 -5
- data/lib/giblish/utils.rb +73 -75
- data/lib/giblish/version.rb +1 -1
- metadata +32 -18
data/lib/giblish/pathtree.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
1
|
# This class can convert the following paths:
|
4
2
|
# basedir/file_1
|
5
3
|
# basedir/file_2
|
@@ -19,8 +17,7 @@
|
|
19
17
|
# dir3
|
20
18
|
# file_5
|
21
19
|
class PathTree
|
22
|
-
attr_reader :name
|
23
|
-
attr_reader :data
|
20
|
+
attr_reader :name, :data
|
24
21
|
|
25
22
|
def initialize(tail = nil, data = nil)
|
26
23
|
@children = []
|
@@ -37,7 +34,7 @@ class PathTree
|
|
37
34
|
end
|
38
35
|
end
|
39
36
|
|
40
|
-
def add_path(tail,data = nil)
|
37
|
+
def add_path(tail, data = nil)
|
41
38
|
tail = tail.split("/") unless tail.is_a?(Array)
|
42
39
|
return if tail.empty?
|
43
40
|
|
data/lib/giblish/utils.rb
CHANGED
@@ -2,22 +2,24 @@ require "logger"
|
|
2
2
|
require "pathname"
|
3
3
|
require "fileutils"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
# The logger used from within giblish
|
6
|
+
class Giblog
|
7
|
+
# Defines the format for log messages from giblish.
|
8
|
+
class GiblogFormatter
|
9
|
+
def call(severity, datetime, _progname, msg)
|
10
|
+
"#{datetime.strftime('%H:%M:%S')} #{severity} - #{msg}\n"
|
11
|
+
end
|
8
12
|
end
|
9
|
-
end
|
10
13
|
|
11
|
-
|
14
|
+
# bootstrap the application-wide logger object
|
12
15
|
def self.setup
|
13
16
|
return if defined? @logger
|
14
|
-
|
17
|
+
|
18
|
+
@logger = Logger.new($stdout)
|
15
19
|
@logger.formatter = GiblogFormatter.new
|
16
|
-
# @logger.formatter = proc do |severity, datetime, _progname, msg|
|
17
|
-
# "#{datetime.strftime('%H:%M:%S')} #{severity} - #{msg}\n"
|
18
|
-
# end
|
19
20
|
end
|
20
21
|
|
22
|
+
# returns the application-wide logger instance.
|
21
23
|
def self.logger
|
22
24
|
unless defined? @logger
|
23
25
|
puts "!!!! Error: Trying to access logger before setup !!!!"
|
@@ -28,76 +30,81 @@ class Giblog
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
|
32
|
-
|
33
33
|
# Public: Contains a number of generic utility methods.
|
34
34
|
module Giblish
|
35
|
-
|
36
|
-
|
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
|
35
|
+
# a logger customized to process info received from asciidoctors
|
36
|
+
# stdout.
|
63
37
|
class AsciidoctorLogger < ::Logger
|
38
|
+
# log formatter specialized for formatting messages from
|
39
|
+
# asciidoctor's stdout
|
40
|
+
class UserInfoFormatter
|
41
|
+
SEVERITY_LABELS = { "WARN" => "WARNING", "FATAL" => "FAILED" }.freeze
|
42
|
+
|
43
|
+
# The hash that can be emitted as the msg from asciidoctor have the
|
44
|
+
# following format:
|
45
|
+
# {:text=>"...",
|
46
|
+
# :source_location=>#<Asciidoctor::Reader::Cursor:0x000055e65a8729e0
|
47
|
+
# @file="<full adoc filename>",
|
48
|
+
# @dir="<full src dir>",
|
49
|
+
# @path="<only file name>",
|
50
|
+
# @lineno=<src line no>
|
51
|
+
# }
|
52
|
+
def call(severity, datetime, progname, msg)
|
53
|
+
message = case msg
|
54
|
+
when ::String
|
55
|
+
msg
|
56
|
+
when ::Hash
|
57
|
+
# asciidoctor seem to emit a hash with error text and source location info
|
58
|
+
# for warnings and errors
|
59
|
+
str = String.new("")
|
60
|
+
src_loc = msg.fetch(:source_location, nil)
|
61
|
+
err_txt = msg.fetch(:text, nil)
|
62
|
+
str << "Line #{src_loc.lineno} - " if src_loc
|
63
|
+
str << err_txt.to_s if err_txt
|
64
|
+
str
|
65
|
+
else
|
66
|
+
msg.inspect
|
67
|
+
end
|
68
|
+
%(#{datetime.strftime('%H:%M:%S')} #{progname}: #{SEVERITY_LABELS[severity] || severity}: #{message}\n)
|
69
|
+
end
|
70
|
+
end
|
64
71
|
|
65
|
-
attr_reader :max_severity
|
66
|
-
attr_reader :user_info_str
|
72
|
+
attr_reader :max_severity, :user_info_str
|
67
73
|
|
68
|
-
def initialize
|
69
|
-
super(
|
74
|
+
def initialize(user_info_log_level)
|
75
|
+
super($stdout, progname: "(from asciidoctor)", formatter: UserInfoFormatter.new)
|
70
76
|
@user_info_str = StringIO.new
|
71
77
|
@user_info_logger = ::Logger.new(@user_info_str, formatter: UserInfoFormatter.new, level: user_info_log_level)
|
72
78
|
end
|
73
79
|
|
74
|
-
def add
|
80
|
+
def add(severity, message = nil, progname = nil)
|
75
81
|
if (severity ||= UNKNOWN) > (@max_severity ||= severity)
|
76
82
|
@max_severity = severity
|
77
83
|
end
|
78
|
-
@user_info_logger.add(severity,message,progname)
|
84
|
+
@user_info_logger.add(severity, message, progname)
|
79
85
|
super
|
80
86
|
end
|
81
87
|
end
|
82
88
|
|
89
|
+
# returns the paths to the search assets and web assets
|
90
|
+
# in the deployment machine's file system.
|
83
91
|
class DeploymentPaths
|
84
|
-
|
85
92
|
attr_reader :web_path
|
86
93
|
|
87
94
|
def initialize(web_path, search_asset_path)
|
88
95
|
@search_assets_path = if search_asset_path.nil?
|
89
96
|
nil
|
90
97
|
else
|
91
|
-
Pathname.new("/#{search_asset_path
|
98
|
+
Pathname.new("/#{search_asset_path}").cleanpath
|
92
99
|
end
|
93
100
|
@web_path = if web_path.nil?
|
94
101
|
nil
|
95
102
|
else
|
96
|
-
Pathname.new("/#{web_path
|
103
|
+
Pathname.new("/#{web_path}/web_assets").cleanpath
|
97
104
|
end
|
98
105
|
end
|
99
106
|
|
100
|
-
def search_assets_path(branch_dir=nil)
|
107
|
+
def search_assets_path(branch_dir = nil)
|
101
108
|
if branch_dir.nil?
|
102
109
|
@search_assets_path
|
103
110
|
else
|
@@ -105,18 +112,13 @@ module Giblish
|
|
105
112
|
end
|
106
113
|
end
|
107
114
|
|
108
|
-
|
109
|
-
@search_assets_path = path
|
110
|
-
end
|
115
|
+
attr_writer :search_assets_path
|
111
116
|
end
|
112
117
|
|
113
118
|
# Helper class to ease construction of different paths for input and output
|
114
119
|
# files and directories
|
115
120
|
class PathManager
|
116
|
-
attr_reader :src_root_abs
|
117
|
-
attr_reader :dst_root_abs
|
118
|
-
attr_reader :resource_dir_abs
|
119
|
-
attr_reader :search_assets_abs
|
121
|
+
attr_reader :src_root_abs, :dst_root_abs, :resource_dir_abs, :search_assets_abs
|
120
122
|
|
121
123
|
# Public:
|
122
124
|
#
|
@@ -128,13 +130,12 @@ module Giblish
|
|
128
130
|
# resources
|
129
131
|
# create_search_asset_dir - true if this instance shall create a dir for storing
|
130
132
|
# search artefacts, false otherwise
|
131
|
-
def initialize(src_root, dst_root, resource_dir = nil,create_search_asset_dir=false)
|
133
|
+
def initialize(src_root, dst_root, resource_dir = nil, create_search_asset_dir = false)
|
132
134
|
# Make sure that the source root exists in the file system
|
133
135
|
@src_root_abs = Pathname.new(src_root).realpath
|
134
136
|
self.dst_root_abs = dst_root
|
135
137
|
|
136
|
-
self.search_assets_abs = create_search_asset_dir
|
137
|
-
@dst_root_abs.join("search_assets") : nil
|
138
|
+
self.search_assets_abs = (@dst_root_abs.join("search_assets") if create_search_asset_dir)
|
138
139
|
|
139
140
|
# Make sure that the resource dir exists if user gives a path to it
|
140
141
|
resource_dir && (@resource_dir_abs = Pathname.new(resource_dir).realpath)
|
@@ -208,7 +209,7 @@ module Giblish
|
|
208
209
|
# return the relative path from a generated document to
|
209
210
|
# the supplied folder given the corresponding absolute source
|
210
211
|
# file path
|
211
|
-
def relpath_to_dir_after_generate(src_filepath,dir_path)
|
212
|
+
def relpath_to_dir_after_generate(src_filepath, dir_path)
|
212
213
|
dst_abs = dst_abs_from_src_abs(src_filepath)
|
213
214
|
dir = self.class.to_pathname(dir_path)
|
214
215
|
dir.relative_path_from(dst_abs)
|
@@ -281,7 +282,7 @@ module Giblish
|
|
281
282
|
# - the directory itself when called with an existing directory
|
282
283
|
# - the parent dir when called with a non-existing file/directory
|
283
284
|
def self.closest_dir(in_path)
|
284
|
-
sr =
|
285
|
+
sr = to_pathname(in_path)
|
285
286
|
if sr.exist?
|
286
287
|
sr.directory? ? sr.realpath : sr.dirname.realpath
|
287
288
|
else
|
@@ -303,7 +304,7 @@ module Giblish
|
|
303
304
|
return p if git_dir.directory?
|
304
305
|
end
|
305
306
|
end
|
306
|
-
end
|
307
|
+
end
|
307
308
|
|
308
309
|
# Helper method that provides the user with a way of processing only the
|
309
310
|
# lines within the asciidoc header block.
|
@@ -345,7 +346,7 @@ module Giblish
|
|
345
346
|
# end
|
346
347
|
def process_header_lines_from_file(path)
|
347
348
|
lines = File.readlines(path)
|
348
|
-
process_header_lines(lines
|
349
|
+
process_header_lines(lines, &Proc.new)
|
349
350
|
end
|
350
351
|
module_function :process_header_lines_from_file
|
351
352
|
|
@@ -362,8 +363,8 @@ module Giblish
|
|
362
363
|
module_function :with_captured_stderr
|
363
364
|
|
364
365
|
# transforms strings to valid asciidoctor id strings
|
365
|
-
def to_valid_id(input_str,id_prefix="_", id_separator="_")
|
366
|
-
id_str = input_str.strip.downcase.gsub(
|
366
|
+
def to_valid_id(input_str, id_prefix = "_", id_separator = "_")
|
367
|
+
id_str = input_str.strip.downcase.gsub(/[^a-z0-9]+/, id_separator)
|
367
368
|
id_str = "#{id_prefix}#{id_str}"
|
368
369
|
id_str.chomp(id_separator)
|
369
370
|
end
|
@@ -375,18 +376,17 @@ module Giblish
|
|
375
376
|
# Ex
|
376
377
|
# which('ruby') #=> /usr/bin/ruby
|
377
378
|
def which(cmd)
|
378
|
-
exts = ENV[
|
379
|
-
ENV[
|
380
|
-
exts.each
|
379
|
+
exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
|
380
|
+
ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
|
381
|
+
exts.each do |ext|
|
381
382
|
exe = File.join(path, "#{cmd}#{ext}")
|
382
383
|
return exe if File.executable?(exe) && !File.directory?(exe)
|
383
|
-
|
384
|
+
end
|
384
385
|
end
|
385
|
-
|
386
|
+
nil
|
386
387
|
end
|
387
388
|
module_function :which
|
388
389
|
|
389
|
-
|
390
390
|
# returns raw html that displays a search box to let the user
|
391
391
|
# acces the text search functionality.
|
392
392
|
#
|
@@ -401,14 +401,13 @@ module Giblish
|
|
401
401
|
# as seen from the local file system on the machine that
|
402
402
|
# runs the search script)
|
403
403
|
def generate_search_box_html(css, cgi_path, opts)
|
404
|
-
|
405
404
|
# Replace the button with the below to use a text-only version of the btn
|
406
405
|
# <button id="search" type="submit">Search</button>
|
407
406
|
<<~SEARCH_INFO
|
408
407
|
++++
|
409
408
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
410
409
|
<form class="example" action="#{cgi_path}" style="margin:20px 0px 20px 0px;max-width:790px">
|
411
|
-
Search all documents:
|
410
|
+
Search all documents:
|
412
411
|
<input id="searchphrase" type="text" placeholder="Search.." name="searchphrase"/>
|
413
412
|
<button id="search" type="submit"><i class="fa fa-search"></i></button>
|
414
413
|
<br>
|
@@ -421,12 +420,11 @@ module Giblish
|
|
421
420
|
|
422
421
|
<input type="hidden" name="searchassetstop" value="#{opts[:search_assets_top]}"</input>
|
423
422
|
<input type="hidden" name="webassetstop" value="#{opts[:web_assets_top]}"</input>
|
424
|
-
#{
|
423
|
+
#{%(<input type="hidden" name="css" value="#{css}"</input>) unless css.nil?}
|
425
424
|
</form>
|
426
425
|
++++
|
427
426
|
|
428
427
|
SEARCH_INFO
|
429
428
|
end
|
430
429
|
module_function :generate_search_box_html
|
431
|
-
|
432
430
|
end
|
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.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anders Rillbert
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.20.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: asciidoctor-mathematical
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.3.5
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.3.5
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: asciidoctor
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,7 +103,7 @@ dependencies:
|
|
89
103
|
version: '2.0'
|
90
104
|
- - ">="
|
91
105
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2.0.
|
106
|
+
version: 2.0.16
|
93
107
|
type: :runtime
|
94
108
|
prerelease: false
|
95
109
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -99,83 +113,83 @@ dependencies:
|
|
99
113
|
version: '2.0'
|
100
114
|
- - ">="
|
101
115
|
- !ruby/object:Gem::Version
|
102
|
-
version: 2.0.
|
116
|
+
version: 2.0.16
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
118
|
name: asciidoctor-diagram
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|
106
120
|
requirements:
|
107
121
|
- - "~>"
|
108
122
|
- !ruby/object:Gem::Version
|
109
|
-
version: '1
|
123
|
+
version: '2.1'
|
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: '1
|
130
|
+
version: '2.1'
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
132
|
name: asciidoctor-pdf
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
120
134
|
requirements:
|
121
135
|
- - "~>"
|
122
136
|
- !ruby/object:Gem::Version
|
123
|
-
version: '1.
|
137
|
+
version: '1.6'
|
124
138
|
- - ">="
|
125
139
|
- !ruby/object:Gem::Version
|
126
|
-
version: 1.
|
140
|
+
version: 1.6.0
|
127
141
|
type: :runtime
|
128
142
|
prerelease: false
|
129
143
|
version_requirements: !ruby/object:Gem::Requirement
|
130
144
|
requirements:
|
131
145
|
- - "~>"
|
132
146
|
- !ruby/object:Gem::Version
|
133
|
-
version: '1.
|
147
|
+
version: '1.6'
|
134
148
|
- - ">="
|
135
149
|
- !ruby/object:Gem::Version
|
136
|
-
version: 1.
|
150
|
+
version: 1.6.0
|
137
151
|
- !ruby/object:Gem::Dependency
|
138
152
|
name: git
|
139
153
|
requirement: !ruby/object:Gem::Requirement
|
140
154
|
requirements:
|
141
155
|
- - "~>"
|
142
156
|
- !ruby/object:Gem::Version
|
143
|
-
version: '1.
|
157
|
+
version: '1.9'
|
144
158
|
type: :runtime
|
145
159
|
prerelease: false
|
146
160
|
version_requirements: !ruby/object:Gem::Requirement
|
147
161
|
requirements:
|
148
162
|
- - "~>"
|
149
163
|
- !ruby/object:Gem::Version
|
150
|
-
version: '1.
|
164
|
+
version: '1.9'
|
151
165
|
- !ruby/object:Gem::Dependency
|
152
166
|
name: rouge
|
153
167
|
requirement: !ruby/object:Gem::Requirement
|
154
168
|
requirements:
|
155
169
|
- - "~>"
|
156
170
|
- !ruby/object:Gem::Version
|
157
|
-
version: '3.
|
171
|
+
version: '3.0'
|
158
172
|
type: :runtime
|
159
173
|
prerelease: false
|
160
174
|
version_requirements: !ruby/object:Gem::Requirement
|
161
175
|
requirements:
|
162
176
|
- - "~>"
|
163
177
|
- !ruby/object:Gem::Version
|
164
|
-
version: '3.
|
178
|
+
version: '3.0'
|
165
179
|
- !ruby/object:Gem::Dependency
|
166
180
|
name: prawn-svg
|
167
181
|
requirement: !ruby/object:Gem::Requirement
|
168
182
|
requirements:
|
169
183
|
- - "~>"
|
170
184
|
- !ruby/object:Gem::Version
|
171
|
-
version: 0.
|
185
|
+
version: 0.32.0
|
172
186
|
type: :runtime
|
173
187
|
prerelease: false
|
174
188
|
version_requirements: !ruby/object:Gem::Requirement
|
175
189
|
requirements:
|
176
190
|
- - "~>"
|
177
191
|
- !ruby/object:Gem::Version
|
178
|
-
version: 0.
|
192
|
+
version: 0.32.0
|
179
193
|
description: |
|
180
194
|
giblish generates indexed and searchable documents from a tree of
|
181
195
|
asciidoc files.
|
@@ -258,14 +272,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
258
272
|
requirements:
|
259
273
|
- - ">="
|
260
274
|
- !ruby/object:Gem::Version
|
261
|
-
version: '2.
|
275
|
+
version: '2.7'
|
262
276
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
263
277
|
requirements:
|
264
278
|
- - ">="
|
265
279
|
- !ruby/object:Gem::Version
|
266
280
|
version: '0'
|
267
281
|
requirements: []
|
268
|
-
rubygems_version: 3.
|
282
|
+
rubygems_version: 3.1.6
|
269
283
|
signing_key:
|
270
284
|
specification_version: 4
|
271
285
|
summary: A tool for publishing asciidoc docs stored in git repos
|