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/docconverter.rb
CHANGED
@@ -5,22 +5,21 @@ require "asciidoctor-pdf"
|
|
5
5
|
require_relative "utils"
|
6
6
|
|
7
7
|
module Giblish
|
8
|
-
|
9
8
|
# Base class for document converters. It contains a hash of
|
10
9
|
# conversion options used by derived classes
|
11
10
|
class DocConverter
|
12
11
|
# a common set of converter options used for all output formats
|
13
12
|
COMMON_CONVERTER_OPTS = {
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
safe: Asciidoctor::SafeMode::UNSAFE,
|
14
|
+
header_footer: true,
|
15
|
+
mkdirs: true
|
17
16
|
}.freeze
|
18
17
|
|
19
18
|
# the giblish attribute defaults used if nothing else
|
20
19
|
# is required by the user
|
21
20
|
DEFAULT_ATTRIBUTES = {
|
22
|
-
|
23
|
-
|
21
|
+
"source-highlighter" => "rouge",
|
22
|
+
"xrefstyle" => "short"
|
24
23
|
}.freeze
|
25
24
|
|
26
25
|
# setup common options that are used regardless of the
|
@@ -54,27 +53,26 @@ module Giblish
|
|
54
53
|
#
|
55
54
|
# Returns: The resulting Asciidoctor::Document object
|
56
55
|
def convert(filepath, logger: nil)
|
57
|
-
unless filepath.is_a?(Pathname)
|
58
|
-
raise ArgumentError, "Trying to invoke convert with non-pathname!"
|
59
|
-
end
|
56
|
+
raise ArgumentError, "Trying to invoke convert with non-pathname!" unless filepath.is_a?(Pathname)
|
60
57
|
|
61
|
-
Giblog.logger.info {"Processing: #{filepath}"}
|
58
|
+
Giblog.logger.info { "Processing: #{filepath}" }
|
62
59
|
|
63
60
|
# update the relevant options for each specific document
|
64
|
-
set_common_doc_specific_options(filepath,logger)
|
61
|
+
set_common_doc_specific_options(filepath, logger)
|
65
62
|
|
66
63
|
# give derived classes the opportunity to set doc specific attributes
|
67
|
-
add_doc_specific_attributes(filepath,true, @converter_options[:attributes])
|
64
|
+
add_doc_specific_attributes(filepath, true, @converter_options[:attributes])
|
68
65
|
|
69
|
-
Giblog.logger.debug {"converter_options: #{@converter_options}"}
|
66
|
+
Giblog.logger.debug { "converter_options: #{@converter_options}" }
|
70
67
|
|
71
68
|
# do the actual conversion
|
72
69
|
doc = Asciidoctor.convert_file filepath, @converter_options
|
73
70
|
|
74
71
|
# bail out if asciidoctor failed to convert the doc
|
75
|
-
if logger
|
76
|
-
raise
|
72
|
+
if logger&.max_severity && logger.max_severity > Logger::Severity::WARN
|
73
|
+
raise "Failed to convert the file #{filepath}"
|
77
74
|
end
|
75
|
+
|
78
76
|
doc
|
79
77
|
end
|
80
78
|
|
@@ -86,8 +84,7 @@ module Giblish
|
|
86
84
|
# to disk.
|
87
85
|
# Returns: whether any errors occured during conversion (true) or
|
88
86
|
# not (false).
|
89
|
-
def convert_str(src_str, dst_dir, basename,logger: nil)
|
90
|
-
|
87
|
+
def convert_str(src_str, dst_dir, basename, logger: nil)
|
91
88
|
index_opts = @converter_options.dup
|
92
89
|
|
93
90
|
# use the same options as when converting all docs
|
@@ -96,15 +93,13 @@ module Giblish
|
|
96
93
|
# necessary to change
|
97
94
|
index_opts[:to_dir] = dst_dir.to_s
|
98
95
|
index_opts[:base_dir] = dst_dir.to_s
|
99
|
-
index_opts.delete_if {|k, _v| %i[to_file].include? k}
|
96
|
+
index_opts.delete_if { |k, _v| %i[to_file].include? k }
|
100
97
|
|
101
98
|
# give derived classes the opportunity to set doc specific attributes
|
102
99
|
index_filepath = dst_dir + "#{basename}.#{index_opts[:fileext]}"
|
103
|
-
add_doc_specific_attributes(index_filepath,false, index_opts[:attributes])
|
100
|
+
add_doc_specific_attributes(index_filepath, false, index_opts[:attributes])
|
104
101
|
|
105
102
|
# load and convert the document using the converter options
|
106
|
-
doc = nil, output = nil
|
107
|
-
|
108
103
|
begin
|
109
104
|
conv_error = false
|
110
105
|
# set a specific logger instance to-be-used by asciidoctor
|
@@ -112,14 +107,16 @@ module Giblish
|
|
112
107
|
doc = Asciidoctor.load src_str, index_opts
|
113
108
|
output = doc.convert index_opts
|
114
109
|
|
115
|
-
if logger
|
116
|
-
raise
|
110
|
+
if logger&.max_severity && logger.max_severity > Logger::Severity::WARN
|
111
|
+
raise "Failed to convert string to asciidoc!! "\
|
112
|
+
"Will _not_ generate #{index_filepath}"
|
117
113
|
end
|
118
114
|
|
119
115
|
# write the converted document to an index file located at the
|
120
116
|
# destination root
|
121
117
|
doc.write output, index_filepath.to_s
|
122
|
-
rescue
|
118
|
+
rescue StandardError => e
|
119
|
+
puts e.backtrace
|
123
120
|
Giblog.logger.error(e)
|
124
121
|
conv_error = true
|
125
122
|
end
|
@@ -148,21 +145,19 @@ module Giblish
|
|
148
145
|
|
149
146
|
# Hook for specific converters to inject attributes on a per-doc
|
150
147
|
# basis
|
151
|
-
def add_doc_specific_attributes(filepath, is_src, attributes)
|
152
|
-
|
153
|
-
end
|
148
|
+
def add_doc_specific_attributes(filepath, is_src, attributes); end
|
154
149
|
|
155
150
|
private
|
156
151
|
|
157
|
-
def set_common_doc_specific_options(src_filepath,logger)
|
152
|
+
def set_common_doc_specific_options(src_filepath, logger)
|
158
153
|
# create an asciidoc doc object and convert to requested
|
159
154
|
# output using current conversion options
|
160
155
|
@converter_options[:to_dir] = @paths.adoc_output_dir(src_filepath).to_s
|
161
156
|
@converter_options[:base_dir] =
|
162
|
-
|
157
|
+
Giblish::PathManager.closest_dir(src_filepath).to_s
|
163
158
|
@converter_options[:to_file] =
|
164
|
-
|
165
|
-
|
159
|
+
Giblish::PathManager.get_new_basename(src_filepath,
|
160
|
+
@converter_options[:fileext])
|
166
161
|
@converter_options[:logger] = logger unless logger.nil?
|
167
162
|
end
|
168
163
|
end
|
@@ -178,9 +173,9 @@ module Giblish
|
|
178
173
|
validate_and_copy_resources @dst_asset_dir
|
179
174
|
|
180
175
|
# identify ourselves as an html converter
|
181
|
-
add_backend_options({backend: "html5", fileext: "html"})
|
176
|
+
add_backend_options({ backend: "html5", fileext: "html" })
|
182
177
|
# setup the attributes specific for this converter
|
183
|
-
add_backend_attributes(
|
178
|
+
add_backend_attributes(common_attributes)
|
184
179
|
end
|
185
180
|
|
186
181
|
protected
|
@@ -190,11 +185,11 @@ module Giblish
|
|
190
185
|
if @paths.resource_dir_abs
|
191
186
|
# user has given a resource dir, use the css from that dir
|
192
187
|
doc_attrib.merge!(
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
188
|
+
{
|
189
|
+
"linkcss" => 1,
|
190
|
+
"stylesheet" => @user_style ||= "giblish.css",
|
191
|
+
"copycss!" => 1
|
192
|
+
}
|
198
193
|
)
|
199
194
|
if @deployment_info.web_path.nil?
|
200
195
|
# user wants to deploy without web server, the css
|
@@ -204,8 +199,8 @@ module Giblish
|
|
204
199
|
css_rel_dir = if is_src_file
|
205
200
|
# the filepath is a src path
|
206
201
|
@paths.relpath_to_dir_after_generate(
|
207
|
-
|
208
|
-
|
202
|
+
filepath,
|
203
|
+
dst_css_dir
|
209
204
|
)
|
210
205
|
else
|
211
206
|
# the given file path is the destination path of
|
@@ -221,21 +216,20 @@ module Giblish
|
|
221
216
|
doc_attrib["stylesdir"] = @deployment_info.web_path.join("css").cleanpath.to_s
|
222
217
|
end
|
223
218
|
end
|
224
|
-
|
225
|
-
|
219
|
+
Giblog.logger.debug { "Rendered docs expect a css at: #{doc_attrib['stylesdir']}" }
|
220
|
+
Giblog.logger.debug { "The expected css is named: #{doc_attrib['stylesheet']}" }
|
226
221
|
|
227
222
|
attributes.merge!(doc_attrib)
|
228
223
|
end
|
229
224
|
|
230
225
|
private
|
231
226
|
|
232
|
-
def
|
227
|
+
def common_attributes
|
233
228
|
# Setting 'data-uri' makes asciidoctor embed images in the resulting
|
234
229
|
# html file
|
235
|
-
|
236
|
-
|
230
|
+
{
|
231
|
+
"data-uri" => 1
|
237
232
|
}
|
238
|
-
html_attrib
|
239
233
|
end
|
240
234
|
|
241
235
|
def copy_resource_dir(dst_dir)
|
@@ -263,46 +257,50 @@ module Giblish
|
|
263
257
|
if @user_style
|
264
258
|
# Make sure that a user supplied stylesheet ends with .css or .CSS
|
265
259
|
@user_style && @user_style =
|
266
|
-
|
260
|
+
/\.(css|CSS)$/ =~ @user_style ? @user_style : "#{@user_style}.css"
|
267
261
|
|
268
262
|
# bail out if we can not find the given css file
|
269
|
-
src_css_path = @paths.resource_dir_abs
|
270
|
-
|
271
|
-
|
272
|
-
|
263
|
+
src_css_path = @paths.resource_dir_abs
|
264
|
+
.join("css").join(Pathname.new(@user_style))
|
265
|
+
unless src_css_path.exist?
|
266
|
+
raise "Could not find the specified "\
|
267
|
+
"css file at: #{src_css_path}"
|
268
|
+
end
|
273
269
|
end
|
274
270
|
|
275
271
|
copy_resource_dir dst_dir
|
276
272
|
end
|
277
273
|
end
|
278
274
|
|
275
|
+
# Converts adoc into pdf
|
279
276
|
class PdfConverter < DocConverter
|
280
277
|
def initialize(paths, deployment_info, options)
|
281
278
|
super paths, deployment_info, options
|
279
|
+
require "asciidoctor-mathematical"
|
282
280
|
|
283
281
|
# identify ourselves as a pdf converter
|
284
|
-
add_backend_options({backend: "pdf", fileext: "pdf"})
|
282
|
+
add_backend_options({ backend: "pdf", fileext: "pdf" })
|
285
283
|
# setup the attributes specific for this converter
|
286
284
|
add_backend_attributes(setup_pdf_attribs)
|
287
285
|
end
|
288
286
|
|
289
287
|
private
|
290
288
|
|
291
|
-
def setup_pdf_attribs
|
289
|
+
def setup_pdf_attribs
|
292
290
|
# only set this up if user has specified a resource dir
|
293
291
|
return {} unless @paths.resource_dir_abs
|
294
292
|
|
295
293
|
pdf_attrib = {
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
294
|
+
"pdf-stylesdir" => "#{@paths.resource_dir_abs}/themes",
|
295
|
+
"pdf-style" => "giblish.yml",
|
296
|
+
"pdf-fontsdir" => "#{@paths.resource_dir_abs}/fonts",
|
297
|
+
"icons" => "font"
|
300
298
|
}
|
301
299
|
|
302
300
|
# Make sure that the stylesheet ends with .yml or YML
|
303
301
|
@user_style &&
|
304
|
-
|
305
|
-
|
302
|
+
pdf_attrib["pdf-style"] =
|
303
|
+
/\.(yml|YML)$/ =~ @user_style ? @user_style : "#{@user_style}.yml"
|
306
304
|
|
307
305
|
pdf_attrib
|
308
306
|
end
|
data/lib/giblish/docid.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
2
1
|
require_relative "./utils"
|
3
2
|
require "asciidoctor"
|
4
3
|
require "asciidoctor/extensions"
|
5
4
|
|
5
|
+
# put docid stuff in the giblish namespace
|
6
6
|
module Giblish
|
7
7
|
# Parse all adoc files for :docid: attributes
|
8
8
|
class DocidCollector < Asciidoctor::Extensions::Preprocessor
|
@@ -15,13 +15,7 @@ module Giblish
|
|
15
15
|
@docid_deps = {}
|
16
16
|
|
17
17
|
class << self
|
18
|
-
|
19
|
-
@docid_cache
|
20
|
-
end
|
21
|
-
|
22
|
-
def docid_deps
|
23
|
-
@docid_deps
|
24
|
-
end
|
18
|
+
attr_reader :docid_cache, :docid_deps
|
25
19
|
|
26
20
|
def clear_cache
|
27
21
|
@docid_cache = {}
|
@@ -64,6 +58,7 @@ module Giblish
|
|
64
58
|
# add a new source document to the docid_deps
|
65
59
|
def add_source_dep(src_path)
|
66
60
|
return if docid_deps.key? src_path
|
61
|
+
|
67
62
|
docid_deps[src_path] = []
|
68
63
|
end
|
69
64
|
|
@@ -123,9 +118,7 @@ module Giblish
|
|
123
118
|
# Get the relative path from the src doc to the
|
124
119
|
# doc with the given doc id
|
125
120
|
def get_rel_path(src_path, doc_id)
|
126
|
-
unless docid_cache.key? doc_id
|
127
|
-
raise ArgumentError("unknown doc id: #{doc_id}")
|
128
|
-
end
|
121
|
+
raise ArgumentError("unknown doc id: #{doc_id}") unless docid_cache.key? doc_id
|
129
122
|
|
130
123
|
rel_path = docid_cache[doc_id]
|
131
124
|
.dirname
|
@@ -176,7 +169,6 @@ module Giblish
|
|
176
169
|
end
|
177
170
|
end
|
178
171
|
|
179
|
-
|
180
172
|
# Helper method to register the docid preprocessor extension with
|
181
173
|
# the asciidoctor engine.
|
182
174
|
def register_docid_extension
|
data/lib/giblish/docinfo.rb
CHANGED
@@ -4,52 +4,26 @@ module Giblish
|
|
4
4
|
# Container class for bundling together the data we cache for
|
5
5
|
# each asciidoc file we come across
|
6
6
|
class DocInfo
|
7
|
-
#
|
7
|
+
# History info from git
|
8
8
|
class DocHistory
|
9
|
-
attr_accessor :date
|
10
|
-
attr_accessor :author
|
11
|
-
attr_accessor :message
|
9
|
+
attr_accessor :date, :author, :message
|
12
10
|
end
|
13
11
|
|
14
|
-
attr_accessor :converted
|
15
|
-
|
16
|
-
attr_accessor :purpose_str
|
17
|
-
attr_accessor :status
|
18
|
-
attr_accessor :history
|
19
|
-
attr_accessor :error_msg
|
20
|
-
attr_accessor :stderr
|
12
|
+
attr_accessor :converted, :doc_id, :purpose_str, :status, :history, :error_msg, :stderr
|
13
|
+
attr_reader :title, :rel_path, :src_file
|
21
14
|
|
22
15
|
# these members can have encoding issues when
|
23
16
|
# running in a mixed Windows/Linux setting.
|
24
17
|
# that is why we explicitly encodes them when
|
25
18
|
# writing to them
|
26
|
-
|
27
|
-
@title
|
28
|
-
end
|
19
|
+
|
29
20
|
def title=(rhs)
|
30
21
|
@title = rhs.nil? ? nil : rhs.encode("utf-8")
|
31
22
|
end
|
32
|
-
|
33
|
-
@rel_path
|
34
|
-
end
|
35
|
-
# attr_accessor :rel_path
|
36
|
-
def src_file
|
37
|
-
@src_file
|
38
|
-
end
|
23
|
+
|
39
24
|
def src_file=(rhs)
|
40
25
|
@src_file = rhs.nil? ? nil : rhs.encode("utf-8")
|
41
26
|
end
|
42
|
-
# attr_accessor :src_file
|
43
|
-
|
44
|
-
# def relPath_utf8
|
45
|
-
# return nil if @rel_path.nil?
|
46
|
-
# @rel_path.to_s.encode("utf-8")
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# def srcFile_utf8
|
50
|
-
# return nil if @src_file.nil?
|
51
|
-
# @src_file.to_s.encode("utf-8")
|
52
|
-
# end
|
53
27
|
|
54
28
|
def initialize(adoc: nil, dst_root_abs: nil, adoc_stderr: "")
|
55
29
|
@src_file = nil
|
@@ -63,14 +37,14 @@ module Giblish
|
|
63
37
|
|
64
38
|
# fill in doc meta data
|
65
39
|
d_attr = adoc.attributes
|
66
|
-
self.src_file=(d_attr["docfile"])
|
67
|
-
self.title=(adoc.doctitle)
|
40
|
+
self.src_file = (d_attr["docfile"])
|
41
|
+
self.title = (adoc.doctitle)
|
68
42
|
@doc_id = d_attr["docid"]
|
69
43
|
return if dst_root_abs.nil?
|
70
44
|
|
71
45
|
# Get the relative path beneath the root dir to the doc
|
72
46
|
@rel_path = Pathname.new(
|
73
|
-
|
47
|
+
"#{d_attr['outdir']}/#{d_attr['docname']}#{d_attr['docfilesuffix']}".encode("utf-8")
|
74
48
|
).relative_path_from(dst_root_abs)
|
75
49
|
end
|
76
50
|
|
@@ -82,19 +56,20 @@ module Giblish
|
|
82
56
|
|
83
57
|
def get_purpose_info(adoc)
|
84
58
|
# Get the 'Purpose' section if it exists
|
85
|
-
purpose_str = ""
|
59
|
+
purpose_str = String.new("")
|
86
60
|
adoc.blocks.each do |section|
|
87
61
|
next unless section.is_a?(Asciidoctor::Section) &&
|
88
|
-
|
89
|
-
|
62
|
+
(section.level == 1) &&
|
63
|
+
(section.name =~ /^Purpose$/)
|
90
64
|
|
91
65
|
# filter out 'odd' text, such as lists etc...
|
92
66
|
section.blocks.each do |bb|
|
93
67
|
next unless bb.is_a?(Asciidoctor::Block)
|
68
|
+
|
94
69
|
purpose_str << "#{bb.source}\n+\n"
|
95
70
|
end
|
96
71
|
end
|
97
72
|
purpose_str
|
98
73
|
end
|
99
74
|
end
|
100
|
-
end
|
75
|
+
end
|
data/lib/giblish/gititf.rb
CHANGED
@@ -5,15 +5,13 @@ module Giblish
|
|
5
5
|
# A home-grown interface class to git. Used for situations when the
|
6
6
|
# 'official' ruby git gem does not support an operation that is needed.
|
7
7
|
class GitItf
|
8
|
-
attr_reader :repo_root
|
9
|
-
attr_reader :git_dir
|
8
|
+
attr_reader :repo_root, :git_dir
|
10
9
|
|
11
10
|
def initialize(path)
|
12
11
|
@repo_root = Giblish::PathManager.find_gitrepo_root(path)
|
13
|
-
if @repo_root.nil?
|
14
|
-
|
15
|
-
|
16
|
-
@git_dir = @repo_root + ".git"
|
12
|
+
raise ArgumentError("The path: @{path} is not within a git repo!") if @repo_root.nil?
|
13
|
+
|
14
|
+
@git_dir = @repo_root / ".git"
|
17
15
|
end
|
18
16
|
|
19
17
|
# Get the log history of the supplied file as an array of
|
@@ -4,8 +4,8 @@ require "asciidoctor"
|
|
4
4
|
require "asciidoctor/extensions"
|
5
5
|
require_relative "./utils"
|
6
6
|
|
7
|
+
# put the indexing in the giblish namespace
|
7
8
|
module Giblish
|
8
|
-
|
9
9
|
# This hook is called by Asciidoctor once for each document _before_
|
10
10
|
# Asciidoctor processes the adoc content.
|
11
11
|
#
|
@@ -36,29 +36,26 @@ module Giblish
|
|
36
36
|
# }]
|
37
37
|
# }
|
38
38
|
class IndexHeadings < Asciidoctor::Extensions::Preprocessor
|
39
|
-
|
40
39
|
# Use a class-global heading_index dict since asciidoctor creates a new instance
|
41
40
|
# of this class for each processed file
|
42
|
-
@heading_index = {"file_infos" => []}
|
41
|
+
@heading_index = { "file_infos" => [] }
|
43
42
|
|
44
43
|
# prio order:
|
45
44
|
# 1. values in this hash
|
46
45
|
# 2. values taken from the document
|
47
46
|
# 3. default values
|
48
47
|
@id_elements = {
|
49
|
-
# prefix: "_",
|
50
|
-
# separator: "_"
|
48
|
+
# prefix: "_",
|
49
|
+
# separator: "_"
|
51
50
|
}
|
52
51
|
|
53
52
|
class << self
|
54
53
|
attr_accessor :id_elements
|
55
54
|
|
56
|
-
|
57
|
-
@heading_index
|
58
|
-
end
|
55
|
+
attr_reader :heading_index
|
59
56
|
|
60
57
|
def clear_index
|
61
|
-
@heading_index = {"file_infos" => []}
|
58
|
+
@heading_index = { "file_infos" => [] }
|
62
59
|
end
|
63
60
|
|
64
61
|
# write the index to a file in dst_dir and remove the base_dir
|
@@ -73,11 +70,11 @@ module Giblish
|
|
73
70
|
# remove the base_dir part of the file path
|
74
71
|
heading_index["file_infos"].each do |file_info|
|
75
72
|
file_info["filepath"] = Pathname.new(file_info["filepath"])
|
76
|
-
|
73
|
+
.relative_path_from(base_dir)
|
77
74
|
end
|
78
75
|
end
|
79
76
|
|
80
|
-
Giblog.logger.info { "writing json to #{dst_dir.join(
|
77
|
+
Giblog.logger.info { "writing json to #{dst_dir.join('heading_index.json')}" }
|
81
78
|
File.open(dst_dir.join("heading_index.json").to_s, "w") do |f|
|
82
79
|
f.write(heading_index.to_json)
|
83
80
|
end
|
@@ -100,15 +97,15 @@ module Giblish
|
|
100
97
|
|
101
98
|
# make sure we use the correct id elements when indexing
|
102
99
|
# sections
|
103
|
-
opts =
|
100
|
+
opts = find_id_attributes(reader.lines)
|
104
101
|
|
105
102
|
# Index all headings in the doc
|
106
103
|
Giblog.logger.debug { "indexing headings in #{src_path}" }
|
107
104
|
sections = []
|
108
105
|
file_info_hash = {
|
109
|
-
|
110
|
-
|
111
|
-
|
106
|
+
"filepath" => src_path,
|
107
|
+
"title" => title,
|
108
|
+
"sections" => sections
|
112
109
|
}
|
113
110
|
|
114
111
|
index_sections(reader, file_info_hash, opts)
|
@@ -152,17 +149,21 @@ module Giblish
|
|
152
149
|
m = heading_regex.match(line)
|
153
150
|
if m
|
154
151
|
# we have an anchor and got a heading as expected, index it
|
155
|
-
section = {"id" => match_str}
|
152
|
+
section = { "id" => match_str }
|
156
153
|
section["title"] = m[1].strip
|
157
154
|
section["line_no"] = line_no
|
158
155
|
sections << section
|
159
156
|
else
|
160
|
-
Giblog.logger.debug
|
157
|
+
Giblog.logger.debug do
|
158
|
+
"Did not index the anchor: #{match_str} at "\
|
159
|
+
"line #{line_no}, probably not associated "\
|
160
|
+
"with a heading."
|
161
|
+
end
|
161
162
|
end
|
162
163
|
state = :text
|
163
164
|
when :heading
|
164
165
|
# we got a heading without an accompanying anchor, index it
|
165
|
-
section = {"id" => get_unique_id(file_info_hash, match_str, opts)}
|
166
|
+
section = { "id" => get_unique_id(file_info_hash, match_str, opts) }
|
166
167
|
section["title"] = m[1].strip
|
167
168
|
section["line_no"] = line_no
|
168
169
|
sections << section
|
@@ -187,43 +188,38 @@ module Giblish
|
|
187
188
|
# 1. values in class variable
|
188
189
|
# 2. values taken from doc
|
189
190
|
# 3. default values
|
190
|
-
def
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
191
|
+
def find_id_attributes(lines)
|
192
|
+
result = {}
|
193
|
+
# prio 1
|
194
|
+
result[:id_prefix] = IndexHeadings.id_elements.fetch(:id_prefix, nil)
|
195
|
+
result[:id_separator] = IndexHeadings.id_elements.fetch(:id_separator, nil)
|
196
|
+
return result if result[:id_prefix] && result[:id_separator]
|
197
|
+
|
198
|
+
# prio 2
|
197
199
|
# check if the doc specifies id attributes
|
198
200
|
Giblish.process_header_lines(lines) do |line|
|
199
201
|
m = /^:idprefix:(.*)$/.match(line)
|
200
202
|
n = /^:idseparator:(.*)$/.match(line)
|
201
|
-
if m
|
203
|
+
if m && !result[:id_prefix]
|
202
204
|
# We found a id prefix
|
203
205
|
result[:id_prefix] = m[1].strip
|
204
206
|
end
|
205
|
-
if n
|
207
|
+
if n && !result[:id_separator]
|
206
208
|
# We found a id separator
|
207
209
|
result[:id_separator] = n[1].strip
|
208
210
|
end
|
209
211
|
end
|
210
212
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
if IndexHeadings.id_elements.has_key?(:id_separator)
|
217
|
-
result[:id_separator] = IndexHeadings.id_elements[:id_separator]
|
218
|
-
end
|
219
|
-
|
213
|
+
# prio 3
|
214
|
+
# default values
|
215
|
+
result[:id_prefix] = "_" unless result[:id_prefix]
|
216
|
+
result[:id_separator] = "_" unless result[:id_separator]
|
220
217
|
result
|
221
218
|
end
|
222
219
|
|
223
220
|
def get_unique_id(doc_heading_dict, heading_str, opts)
|
224
|
-
|
225
221
|
id_base = Giblish.to_valid_id(heading_str, opts[:id_prefix], opts[:id_separator])
|
226
|
-
return id_base
|
222
|
+
return id_base unless doc_heading_dict.key? id_base
|
227
223
|
|
228
224
|
# handle the case with several sections with the same name
|
229
225
|
idx = 1
|
@@ -234,7 +230,7 @@ module Giblish
|
|
234
230
|
# some code here
|
235
231
|
break unless doc_heading_dict.key? heading_id
|
236
232
|
end
|
237
|
-
|
233
|
+
heading_id
|
238
234
|
end
|
239
235
|
|
240
236
|
# Helper method to shorten calls to the heading_index from instance methods
|