metanorma 1.7.6 → 2.0.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/Gemfile +5 -1
- data/lib/metanorma/array_monkeypatch.rb +9 -0
- data/lib/metanorma/asciidoctor_extensions/glob_include_processor.rb +13 -11
- data/lib/metanorma/collection/collection.rb +225 -0
- data/lib/metanorma/collection/config/bibdata.rb +12 -0
- data/lib/metanorma/collection/config/compile_options.rb +13 -0
- data/lib/metanorma/collection/config/config.rb +163 -0
- data/lib/metanorma/collection/config/converters.rb +30 -0
- data/lib/metanorma/collection/config/directive.rb +10 -0
- data/lib/metanorma/collection/config/manifest.rb +88 -0
- data/lib/metanorma/collection/document/document.rb +133 -0
- data/lib/metanorma/collection/filelookup/filelookup.rb +250 -0
- data/lib/metanorma/collection/filelookup/filelookup_sectionsplit.rb +87 -0
- data/lib/metanorma/collection/manifest/manifest.rb +237 -0
- data/lib/metanorma/collection/renderer/fileparse.rb +247 -0
- data/lib/metanorma/collection/renderer/fileprocess.rb +173 -0
- data/lib/metanorma/collection/renderer/navigation.rb +133 -0
- data/lib/metanorma/collection/renderer/render_word.rb +133 -0
- data/lib/metanorma/collection/renderer/renderer.rb +157 -0
- data/lib/metanorma/collection/renderer/utils.rb +183 -0
- data/lib/metanorma/collection/sectionsplit/sectionsplit.rb +218 -0
- data/lib/metanorma/collection/util/disambig_files.rb +37 -0
- data/lib/metanorma/collection/util/util.rb +72 -0
- data/lib/metanorma/collection/xrefprocess/xrefprocess.rb +222 -0
- data/lib/metanorma/{compile.rb → compile/compile.rb} +17 -11
- data/lib/metanorma/{compile_options.rb → compile/compile_options.rb} +9 -5
- data/lib/metanorma/{compile_validate.rb → compile/compile_validate.rb} +1 -1
- data/lib/metanorma/{extract.rb → compile/extract.rb} +2 -2
- data/lib/metanorma/{config.rb → config/config.rb} +1 -1
- data/lib/metanorma/input/asciidoc.rb +3 -3
- data/lib/metanorma/input/base.rb +1 -5
- data/lib/metanorma/processor/processor.rb +54 -0
- data/lib/metanorma/processor.rb +1 -49
- data/lib/metanorma/{registry.rb → registry/registry.rb} +0 -1
- data/lib/metanorma/shale_monkeypatch.rb +15 -0
- data/lib/metanorma/util/fontist_helper.rb +130 -0
- data/lib/metanorma/util/util.rb +45 -0
- data/lib/metanorma/util/worker_pool.rb +39 -0
- data/lib/metanorma/version.rb +1 -1
- data/lib/metanorma.rb +13 -8
- data/metanorma.gemspec +2 -1
- metadata +51 -26
- data/Gemfile.devel +0 -2
- data/lib/metanorma/collection.rb +0 -243
- data/lib/metanorma/collection_fileparse.rb +0 -254
- data/lib/metanorma/collection_fileprocess.rb +0 -157
- data/lib/metanorma/collection_manifest.rb +0 -139
- data/lib/metanorma/collection_render_utils.rb +0 -169
- data/lib/metanorma/collection_render_word.rb +0 -131
- data/lib/metanorma/collection_renderer.rb +0 -230
- data/lib/metanorma/document.rb +0 -133
- data/lib/metanorma/files_lookup.rb +0 -208
- data/lib/metanorma/files_lookup_sectionsplit.rb +0 -84
- data/lib/metanorma/fontist_utils.rb +0 -122
- data/lib/metanorma/sectionsplit.rb +0 -216
- data/lib/metanorma/sectionsplit_links.rb +0 -189
- data/lib/metanorma/util.rb +0 -127
- data/lib/metanorma/worker_pool.rb +0 -29
@@ -1,189 +0,0 @@
|
|
1
|
-
module Metanorma
|
2
|
-
class Sectionsplit
|
3
|
-
def xref_preprocess(xml, _fileslookup, _identifier)
|
4
|
-
key = (0...8).map { rand(65..90).chr }.join # random string
|
5
|
-
xml.root["type"] = key # to force recognition of internal refs
|
6
|
-
# bookmarks etc as new id elements introduced in Presentation XML:
|
7
|
-
# add doc suffix
|
8
|
-
Metanorma::Utils::anchor_attributes.each do |(tag_name, attribute_name)|
|
9
|
-
Util::add_suffix_to_attributes(xml, xml.root["document_suffix"],
|
10
|
-
tag_name, attribute_name, @isodoc)
|
11
|
-
end
|
12
|
-
key
|
13
|
-
end
|
14
|
-
|
15
|
-
def xref_process(section, xml, key)
|
16
|
-
svg_preprocess(section, Metanorma::Utils::to_ncname(@ident))
|
17
|
-
refs = eref_to_internal_eref(section, xml, key)
|
18
|
-
refs += xref_to_internal_eref(section, xml, key)
|
19
|
-
ins = new_hidden_ref(section)
|
20
|
-
copied_refs = copy_repo_items_biblio(ins, section, xml)
|
21
|
-
insert_indirect_biblio(ins, refs - copied_refs, key, xml)
|
22
|
-
end
|
23
|
-
|
24
|
-
def svg_preprocess(xml, doc_suffix)
|
25
|
-
suffix = doc_suffix.nil? || doc_suffix.blank? ? "" : "_#{doc_suffix}"
|
26
|
-
xml.xpath("//m:svg", "m" => "http://www.w3.org/2000/svg").each do |s|
|
27
|
-
m = svgmap_wrap(s)
|
28
|
-
svg_xrefs(s, m, suffix)
|
29
|
-
end
|
30
|
-
xml
|
31
|
-
end
|
32
|
-
|
33
|
-
def svgmap_wrap(svg)
|
34
|
-
ret = svg.at("./ancestor::xmlns:svgmap") and return ret
|
35
|
-
ret = svg.at("./ancestor::xmlns:figure")
|
36
|
-
ret.wrap("<svgmap/>")
|
37
|
-
svg.at("./ancestor::xmlns:svgmap")
|
38
|
-
end
|
39
|
-
|
40
|
-
def svg_xrefs(svg, svgmap, suffix)
|
41
|
-
svg.xpath(".//m:a", "m" => "http://www.w3.org/2000/svg").each do |a|
|
42
|
-
/^#/.match? a["href"] or next
|
43
|
-
a["href"] = a["href"].sub(/^#/, "")
|
44
|
-
svgmap << "<target href='#{a['href']}'>" \
|
45
|
-
"<xref target='#{a['href']}#{suffix}'/></target>"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def make_anchor(anchor)
|
50
|
-
"<localityStack><locality type='anchor'><referenceFrom>" \
|
51
|
-
"#{anchor}</referenceFrom></locality></localityStack>"
|
52
|
-
end
|
53
|
-
|
54
|
-
def xref_to_internal_eref(section, xml, key)
|
55
|
-
bibitems, indirect = xref_to_internal_eref_prep(section, xml)
|
56
|
-
section.xpath(ns("//xref")).each_with_object({}) do |x, m|
|
57
|
-
xref_prefix_key(x, key, indirect)
|
58
|
-
x["bibitemid"] = x["target"]
|
59
|
-
m[x["bibitemid"]] = true
|
60
|
-
xref_to_internal_eref_anchor(x, key, bibitems, xml.root["document_suffix"])
|
61
|
-
end.keys
|
62
|
-
end
|
63
|
-
|
64
|
-
def xref_to_internal_eref_prep(section, xml)
|
65
|
-
bibitems = Util::gather_bibitems(section)
|
66
|
-
indirect_bibitems = Util::gather_bibitems(xml)
|
67
|
-
.select { |_, v| indirect_bib?(v) }
|
68
|
-
[bibitems, indirect_bibitems]
|
69
|
-
end
|
70
|
-
|
71
|
-
def xref_to_internal_eref_anchor(xref, key, bibitems, document_suffix)
|
72
|
-
t = xref["target"]
|
73
|
-
if d = bibitems[t]&.at(ns("./docidentifier[@type = 'repository']"))
|
74
|
-
m = %r{^([^/]+)}.match(d.text) and
|
75
|
-
t.sub!(%r(#{m[0]}_), "")
|
76
|
-
end
|
77
|
-
t.sub!(%r{^#{key}_}, "")
|
78
|
-
xref << make_anchor(t.sub(%r(_#{document_suffix}$), ""))
|
79
|
-
xref.delete("target")
|
80
|
-
xref.name = "eref"
|
81
|
-
end
|
82
|
-
|
83
|
-
def xref_prefix_key(xref, key, indirect)
|
84
|
-
if b = indirect[xref["target"]]
|
85
|
-
t = b.at(ns("./docidentifier[@type = 'repository']"))
|
86
|
-
xref["type"] = t.text.sub(%r{/.*$}, "")
|
87
|
-
else
|
88
|
-
xref["target"] = "#{key}_#{xref['target']}"
|
89
|
-
xref["type"] = key
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def eref_to_internal_eref(section, xml, key)
|
94
|
-
bibitems, bibitemids = eref_to_internal_eref_prep(section, xml)
|
95
|
-
eref_to_internal_eref_select(section, xml, bibitems)
|
96
|
-
.each_with_object([]) do |x, m|
|
97
|
-
url = bibitems[x]&.at(ns("./uri[@type = 'citation']"))
|
98
|
-
bibitemids[x]&.each do |e|
|
99
|
-
id = eref_to_internal_eref1(e, key, url) and m << id
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def eref_to_internal_eref_prep(section, xml)
|
105
|
-
bibitems = Util::gather_bibitems(xml)
|
106
|
-
.delete_if { |_, v| internal_bib?(v) }
|
107
|
-
bibitemids = Util::gather_bibitemids(section)
|
108
|
-
[bibitems, bibitemids]
|
109
|
-
end
|
110
|
-
|
111
|
-
def eref_to_internal_eref1(elem, key, url)
|
112
|
-
if url
|
113
|
-
elem.name = "link"
|
114
|
-
elem["target"] = url
|
115
|
-
nil
|
116
|
-
else
|
117
|
-
elem["bibitemid"] = "#{key}_#{elem['bibitemid']}"
|
118
|
-
elem << make_anchor(elem["bibitemid"])
|
119
|
-
elem["type"] = key
|
120
|
-
elem["bibitemid"]
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def eref_to_internal_eref_select(section, _xml, bibitems)
|
125
|
-
refs = Util::gather_bibitemids(section).keys
|
126
|
-
refs.uniq.reject do |x|
|
127
|
-
b = bibitems[x] and ( indirect_bib?(b) || internal_bib?(b) )
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def internal_bib?(bibitem)
|
132
|
-
bibitem["type"] == "internal" ||
|
133
|
-
bibitem.at(ns("./docidentifier[@type = 'repository']"))
|
134
|
-
end
|
135
|
-
|
136
|
-
def indirect_bib?(bibitem)
|
137
|
-
a = bibitem.at(ns("./docidentifier[@type = 'repository']")) or
|
138
|
-
return false
|
139
|
-
%r{^current-metanorma-collection/}.match?(a.text) and return false
|
140
|
-
a.text.include?("/")
|
141
|
-
end
|
142
|
-
|
143
|
-
# from standoc
|
144
|
-
def new_hidden_ref(xmldoc)
|
145
|
-
ins = xmldoc.at("bibliography") or
|
146
|
-
xmldoc.root << "<bibliography/>" and ins = xmldoc.at("bibliography")
|
147
|
-
ins.add_child("<references hidden='true' normative='false'/>").first
|
148
|
-
end
|
149
|
-
|
150
|
-
def copy_repo_items_biblio(ins, section, xml)
|
151
|
-
bibitems = Util::gather_bibitems(section)
|
152
|
-
xml.xpath(ns("//references/bibitem[docidentifier/@type = 'repository']"))
|
153
|
-
.each_with_object([]) do |b, m|
|
154
|
-
bibitems[b["id"]] or next
|
155
|
-
# section.at("//*[@bibitemid = '#{b['id']}']") or next
|
156
|
-
ins << b.dup
|
157
|
-
m << b["id"]
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def insert_indirect_biblio(ins, refs, key, xml)
|
162
|
-
refs.empty? and return
|
163
|
-
internal_bibitems, external_bibitems = insert_indirect_biblio_prep(xml)
|
164
|
-
refs.compact.reject do |x|
|
165
|
-
#external_bibitems[x.sub(/^#{key}_/, "")]
|
166
|
-
end.each do |x|
|
167
|
-
ins << if b = internal_bibitems[x.sub(/^#{key}_/, "")]
|
168
|
-
b.dup.tap { |m| m["id"] = x }
|
169
|
-
else new_indirect_bibitem(x, key)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def insert_indirect_biblio_prep(xml)
|
175
|
-
bibitems = Util::gather_bibitems(xml)
|
176
|
-
internal_bibitems = bibitems.select { |_, v| internal_bib?(v) }
|
177
|
-
external_bibitems = bibitems.reject { |_, v| internal_bib?(v) }
|
178
|
-
[internal_bibitems, external_bibitems]
|
179
|
-
end
|
180
|
-
|
181
|
-
def new_indirect_bibitem(ident, prefix)
|
182
|
-
<<~BIBENTRY
|
183
|
-
<bibitem id="#{ident}" type="internal">
|
184
|
-
<docidentifier type="repository">#{ident.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
|
185
|
-
</bibitem>
|
186
|
-
BIBENTRY
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
data/lib/metanorma/util.rb
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
module Metanorma
|
2
|
-
module Util
|
3
|
-
def self.log(message, type = :info)
|
4
|
-
log_types = Metanorma.configuration.logs.map(&:to_s) || []
|
5
|
-
|
6
|
-
if log_types.include?(type.to_s)
|
7
|
-
puts(message)
|
8
|
-
end
|
9
|
-
|
10
|
-
if type == :fatal
|
11
|
-
exit(1)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
# dependency ordering
|
16
|
-
def self.sort_extensions_execution_ord(ext)
|
17
|
-
case ext
|
18
|
-
when :xml then 0
|
19
|
-
when :rxl then 1
|
20
|
-
when :presentation then 2
|
21
|
-
else
|
22
|
-
99
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.sort_extensions_execution(ext)
|
27
|
-
ext.sort do |a, b|
|
28
|
-
sort_extensions_execution_ord(a) <=> sort_extensions_execution_ord(b)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.recursive_string_keys(hash)
|
33
|
-
case hash
|
34
|
-
when Hash then hash.map { |k, v| [k.to_s, recursive_string_keys(v)] }.to_h
|
35
|
-
when Enumerable then hash.map { |v| recursive_string_keys(v) }
|
36
|
-
else
|
37
|
-
hash
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.gather_bibitems(xml)
|
42
|
-
xml.xpath("//xmlns:bibitem[@id]").each_with_object({}) do |b, m|
|
43
|
-
if m[b["id"]]
|
44
|
-
b.remove
|
45
|
-
next # we can't update duplicate bibitem, processing updates wrong one
|
46
|
-
else
|
47
|
-
m[b["id"]] = b
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.gather_bibitemids(xml)
|
53
|
-
xml.xpath("//*[@bibitemid]").each_with_object({}) do |e, m|
|
54
|
-
/^semantic__/.match?(e.name) and next
|
55
|
-
m[e["bibitemid"]] ||= []
|
56
|
-
m[e["bibitemid"]] << e
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.gather_citeases(xml)
|
61
|
-
xml.xpath("//*[@citeas]").each_with_object({}) do |e, m|
|
62
|
-
/^semantic__/.match?(e.name) and next
|
63
|
-
m[e["citeas"]] ||= []
|
64
|
-
m[e["citeas"]] << e
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.add_suffix_to_attributes(doc, suffix, tag_name, attr_name, isodoc)
|
69
|
-
(suffix.nil? || suffix.empty?) and return
|
70
|
-
doc.xpath(isodoc.ns("//#{tag_name}[@#{attr_name}]")).each do |elem|
|
71
|
-
a = elem.attributes[attr_name].value
|
72
|
-
/_#{suffix}$/.match?(a) or
|
73
|
-
elem.attributes[attr_name].value = "#{a}_#{suffix}"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def self.hash_key_detect(directives, key, variable)
|
78
|
-
c = directives.detect { |x| x.is_a?(Hash) && x.has_key?(key) } or
|
79
|
-
return variable
|
80
|
-
c[key]
|
81
|
-
end
|
82
|
-
|
83
|
-
def self.rel_path_resolve(dir, path)
|
84
|
-
path.nil? and return path
|
85
|
-
path.empty? and return path
|
86
|
-
p = Pathname.new(path)
|
87
|
-
p.absolute? ? path : File.join(dir, path)
|
88
|
-
end
|
89
|
-
|
90
|
-
def self.key(ident)
|
91
|
-
@c ||= HTMLEntities.new
|
92
|
-
@c.decode(ident).gsub(/(\p{Zs})+/, " ")
|
93
|
-
end
|
94
|
-
|
95
|
-
class DisambigFiles
|
96
|
-
def initialize
|
97
|
-
@seen_filenames = []
|
98
|
-
end
|
99
|
-
|
100
|
-
def strip_root(name)
|
101
|
-
name.sub(%r{^(\./)?(\.\./)+}, "")
|
102
|
-
end
|
103
|
-
|
104
|
-
def source2dest_filename(name, disambig = true)
|
105
|
-
n = strip_root(name)
|
106
|
-
dir = File.dirname(n)
|
107
|
-
base = File.basename(n)
|
108
|
-
if disambig && @seen_filenames.include?(base)
|
109
|
-
base = disambiguate_filename(base)
|
110
|
-
end
|
111
|
-
@seen_filenames << base
|
112
|
-
dir == "." ? base : File.join(dir, base)
|
113
|
-
end
|
114
|
-
|
115
|
-
def disambiguate_filename(base)
|
116
|
-
m = /^(?<start>.+\.)(?!0)(?<num>\d+)\.(?<suff>[^.]*)$/.match(base) ||
|
117
|
-
/^(?<start>.+\.)(?<suff>[^.]*)/.match(base) ||
|
118
|
-
/^(?<start>.+)$/.match(base)
|
119
|
-
i = m.names.include?("num") ? m["num"].to_i + 1 : 1
|
120
|
-
while @seen_filenames.include? base = "#{m['start']}#{i}.#{m['suff']}"
|
121
|
-
i += 1
|
122
|
-
end
|
123
|
-
base
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Metanorma
|
2
|
-
class WorkersPool
|
3
|
-
def initialize(workers)
|
4
|
-
@workers = workers
|
5
|
-
@queue = SizedQueue.new(@workers)
|
6
|
-
@threads = Array.new(@workers) do
|
7
|
-
Thread.new do
|
8
|
-
catch(:exit) do
|
9
|
-
loop do
|
10
|
-
job, args = @queue.pop
|
11
|
-
job.call *args
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def schedule(*args, &block)
|
19
|
-
@queue << [block, args]
|
20
|
-
end
|
21
|
-
|
22
|
-
def shutdown
|
23
|
-
@workers.times do
|
24
|
-
schedule { throw :exit }
|
25
|
-
end
|
26
|
-
@threads.map(&:join)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|