metanorma 2.0.5 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metanorma/collection/collection.rb +32 -12
- data/lib/metanorma/collection/config/manifest.rb +2 -2
- data/lib/metanorma/collection/document/document.rb +12 -10
- data/lib/metanorma/collection/filelookup/filelookup.rb +19 -7
- data/lib/metanorma/collection/filelookup/filelookup_sectionsplit.rb +46 -20
- data/lib/metanorma/collection/manifest/manifest.rb +13 -8
- data/lib/metanorma/collection/multilingual/multilingual.rb +2 -2
- data/lib/metanorma/collection/renderer/fileparse.rb +98 -97
- data/lib/metanorma/collection/renderer/fileprocess.rb +1 -0
- data/lib/metanorma/collection/renderer/render_word.rb +6 -6
- data/lib/metanorma/collection/renderer/renderer.rb +9 -12
- data/lib/metanorma/collection/renderer/svg.rb +44 -0
- data/lib/metanorma/collection/renderer/utils.rb +22 -6
- data/lib/metanorma/collection/sectionsplit/collection.rb +100 -0
- data/lib/metanorma/collection/sectionsplit/sectionsplit.rb +73 -101
- data/lib/metanorma/collection/util/util.rb +3 -4
- data/lib/metanorma/collection/xrefprocess/xrefprocess.rb +3 -3
- data/lib/metanorma/compile/compile.rb +9 -0
- data/lib/metanorma/compile/compile_validate.rb +4 -4
- data/lib/metanorma/compile/extract.rb +2 -4
- data/lib/metanorma/input/asciidoc.rb +11 -30
- data/lib/metanorma/version.rb +1 -1
- data/metanorma.gemspec +2 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cf068df8203ed463672bcbef38ca1f5f1483ac2e08c9c37ee2236777dc86fad
|
4
|
+
data.tar.gz: 67c17ad923912cdf66f69b539691525a60751725e8f3d918fca5030d858661c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b33588bb9dbd2f0e63c7438bf3739e3c46698be76566d4430658f12284c8221bd0c2532ae86318dcae0a4b1df90e7e270b12405e120bdd076ee18e4f85933820
|
7
|
+
data.tar.gz: 186204d57aa31ab72ea3454ea5e20b9d7b3506bcbe501c6e0c44312e22d26e83cfd1fd7b355ac3358b15cba24d234c55cbd2af369343974a34ac7cfef262c3a6
|
@@ -28,11 +28,16 @@ module Metanorma
|
|
28
28
|
def initialize(**args)
|
29
29
|
@file = args[:file]
|
30
30
|
@dirname = File.expand_path(File.dirname(@file)) # feeds @manifest
|
31
|
-
@documents = args[:documents] || {} # feeds initialize_directives
|
31
|
+
@documents = args[:documents] || {} # feeds initialize_directives, initialize_docs
|
32
32
|
@bibdatas = args[:documents] || {}
|
33
33
|
initialize_vars
|
34
34
|
initialize_config(args[:config])
|
35
35
|
initialize_directives
|
36
|
+
initialize_docs
|
37
|
+
validate_flavor(flavor)
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize_docs
|
36
41
|
@documents.merge! @manifest.documents
|
37
42
|
@bibdatas.merge! @manifest.documents
|
38
43
|
@documents.transform_keys { |k| Util::key(k) }
|
@@ -53,12 +58,15 @@ module Metanorma
|
|
53
58
|
@final = config.final_content
|
54
59
|
@manifest = ::Metanorma::Collection::Manifest
|
55
60
|
.new(config.manifest, self, @dirname) # feeds initialize_directives
|
61
|
+
@format = config.format.map(&:to_sym)
|
62
|
+
@format&.empty? and @format = nil
|
56
63
|
end
|
57
64
|
|
58
65
|
def initialize_directives
|
59
66
|
d = @directives.each_with_object({}) { |x, m| m[x.key] = x.value }
|
60
67
|
@coverpage = d["coverpage"]
|
61
68
|
@coverpage_style = d["coverpage-style"]
|
69
|
+
@flavor = d["flavor"]
|
62
70
|
if (@documents.any? || @manifest) && !d.key?("documents-inline") &&
|
63
71
|
!d.key?("documents-external")
|
64
72
|
@directives << ::Metanorma::Collection::Config::Directive
|
@@ -66,6 +74,10 @@ module Metanorma
|
|
66
74
|
end
|
67
75
|
end
|
68
76
|
|
77
|
+
def validate_flavor(flavor)
|
78
|
+
::Metanorma::Compile.new.load_flavor(flavor)
|
79
|
+
end
|
80
|
+
|
69
81
|
def clean_exit
|
70
82
|
@log.write(File.join(@dirname,
|
71
83
|
"#{File.basename(@file, '.*')}.err.html"))
|
@@ -82,8 +94,12 @@ module Metanorma
|
|
82
94
|
end
|
83
95
|
|
84
96
|
def render(opts)
|
85
|
-
opts[:format].nil? || opts[:format].empty?
|
86
|
-
|
97
|
+
if opts[:format].nil? || opts[:format].empty?
|
98
|
+
opts[:format] = @format || [:html]
|
99
|
+
end
|
100
|
+
opts[:log] = @log
|
101
|
+
opts[:flavor] = @flavor
|
102
|
+
::Metanorma::Collection::Renderer.render self, opts
|
87
103
|
clean_exit
|
88
104
|
end
|
89
105
|
|
@@ -103,7 +119,7 @@ module Metanorma
|
|
103
119
|
# @param builder [Nokogiri::XML::Builder]
|
104
120
|
def content_to_xml(elm, builder)
|
105
121
|
(cnt = send(elm)) or return
|
106
|
-
@compile.load_flavor(
|
122
|
+
@compile.load_flavor(flavor)
|
107
123
|
out = sections(dummy_header + cnt.strip)
|
108
124
|
builder.send("#{elm}-content") { |b| b << out }
|
109
125
|
end
|
@@ -111,13 +127,12 @@ module Metanorma
|
|
111
127
|
# @param cnt [String] prefatory/final content
|
112
128
|
# @return [String] XML
|
113
129
|
def sections(cnt)
|
114
|
-
c = Asciidoctor.convert(cnt, backend:
|
130
|
+
c = Asciidoctor.convert(cnt, backend: flavor.to_sym, header_footer: true)
|
115
131
|
Nokogiri::XML(c, &:huge).at("//xmlns:sections").children.to_xml
|
116
132
|
end
|
117
133
|
|
118
134
|
# @param builder [Nokogiri::XML::Builder]
|
119
135
|
def doccontainer(builder)
|
120
|
-
# Array(@directives).include? "documents-inline" or return
|
121
136
|
@directives.detect { |d| d.key == "documents-inline" } or return
|
122
137
|
documents.each_with_index do |(_, d), i|
|
123
138
|
doccontainer1(builder, d, i)
|
@@ -136,14 +151,19 @@ module Metanorma
|
|
136
151
|
end
|
137
152
|
end
|
138
153
|
|
139
|
-
def
|
140
|
-
@
|
154
|
+
def flavor
|
155
|
+
@flavor ||= fetch_flavor || "standoc"
|
141
156
|
end
|
142
157
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
docid
|
158
|
+
# TODO: retrieve flavor based on @bibdata publisher when lookup implemented
|
159
|
+
# Will still infer based on docid, but will validate it before proceeding
|
160
|
+
def fetch_flavor
|
161
|
+
docid = @bibdata.docidentifier.first or return
|
162
|
+
f = docid.type.downcase || docid.id.sub(/\s.*$/, "").downcase or return
|
163
|
+
require ::Metanorma::Compile.new.stdtype2flavor(f)
|
164
|
+
f
|
165
|
+
rescue LoadError
|
166
|
+
nil
|
147
167
|
end
|
148
168
|
|
149
169
|
class << self
|
@@ -44,7 +44,7 @@ module Metanorma
|
|
44
44
|
|
45
45
|
xml do
|
46
46
|
root "entry"
|
47
|
-
map_attribute "
|
47
|
+
map_attribute "target", to: :id
|
48
48
|
map_attribute "attachment", to: :attachment
|
49
49
|
map_attribute "sectionsplit", to: :sectionsplit
|
50
50
|
map_attribute "index", to: :index
|
@@ -55,7 +55,7 @@ module Metanorma
|
|
55
55
|
map_element "title", to: :title
|
56
56
|
map_element "bibdata", using: { from: :bibdata_from_xml,
|
57
57
|
to: :bibdata_to_xml }
|
58
|
-
map_element "entry", to: :entry
|
58
|
+
map_element "entry", to: :entry
|
59
59
|
end
|
60
60
|
|
61
61
|
def entry_from_xml(model, node)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "relaton-cli"
|
2
|
+
|
1
3
|
module Metanorma
|
2
4
|
class Collection
|
3
5
|
class Document
|
@@ -48,16 +50,16 @@ module Metanorma
|
|
48
50
|
|
49
51
|
def mn2relaton_parser(tag)
|
50
52
|
case tag.sub(/-standard/, "")
|
51
|
-
when "bipm" then RelatonBipm::XMLParser
|
52
|
-
when "bsi" then RelatonBsi::XMLParser
|
53
|
-
when "ietf" then RelatonIetf::XMLParser
|
54
|
-
when "iho" then RelatonIho::XMLParser
|
55
|
-
when "itu" then RelatonItu::XMLParser
|
56
|
-
when "iec" then RelatonIec::XMLParser
|
57
|
-
when "iso" then RelatonIsoBib::XMLParser
|
58
|
-
when "nist" then RelatonNist::XMLParser
|
59
|
-
when "ogc" then RelatonOgc::XMLParser
|
60
|
-
else RelatonBib::XMLParser
|
53
|
+
when "bipm" then ::RelatonBipm::XMLParser
|
54
|
+
when "bsi" then ::RelatonBsi::XMLParser
|
55
|
+
when "ietf" then ::RelatonIetf::XMLParser
|
56
|
+
when "iho" then ::RelatonIho::XMLParser
|
57
|
+
when "itu" then ::RelatonItu::XMLParser
|
58
|
+
when "iec" then ::RelatonIec::XMLParser
|
59
|
+
when "iso" then ::RelatonIsoBib::XMLParser
|
60
|
+
when "nist" then ::RelatonNist::XMLParser
|
61
|
+
when "ogc" then ::RelatonOgc::XMLParser
|
62
|
+
else ::RelatonBib::XMLParser
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
@@ -62,12 +62,24 @@ module Metanorma
|
|
62
62
|
file, _filename = targetfile(entry, read: true)
|
63
63
|
xml = Nokogiri::XML(file, &:huge)
|
64
64
|
add_document_suffix(ident, xml)
|
65
|
-
entry.merge!(
|
66
|
-
bibdata: xml.at(ns("//bibdata")),
|
67
|
-
document_suffix: xml.root["document_suffix"])
|
65
|
+
entry.merge!(bibdata_extract(xml))
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
69
|
+
def anchors_lookup(anchors)
|
70
|
+
anchors.values.each_with_object({}) do |v, m|
|
71
|
+
v.each_value { |v1| m[v1] = true }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def bibdata_extract(xml)
|
76
|
+
anchors = read_anchors(xml)
|
77
|
+
{ anchors: anchors, anchors_lookup: anchors_lookup(anchors),
|
78
|
+
ids: read_ids(xml),
|
79
|
+
bibdata: xml.at(ns("//bibdata")),
|
80
|
+
document_suffix: xml.root["document_suffix"] }
|
81
|
+
end
|
82
|
+
|
71
83
|
def bibitem_process(entry)
|
72
84
|
entry[:bibitem] = entry[:bibdata].dup
|
73
85
|
entry[:bibitem].name = "bibitem"
|
@@ -76,7 +88,7 @@ module Metanorma
|
|
76
88
|
end
|
77
89
|
|
78
90
|
# ref is the absolute source file address
|
79
|
-
# rel_path is the relative source file address, relative to the YAML
|
91
|
+
# rel_path is the relative source file address, relative to the YAML location
|
80
92
|
# out_path is the destination file address, with any references outside
|
81
93
|
# the working directory (../../...) truncated, and based on relative path
|
82
94
|
# identifier is the id with only spaces, no nbsp
|
@@ -110,9 +122,9 @@ module Metanorma
|
|
110
122
|
|
111
123
|
def add_document_suffix(identifier, doc)
|
112
124
|
document_suffix = Metanorma::Utils::to_ncname(identifier)
|
113
|
-
Metanorma::Utils::anchor_attributes.each do |(tag_name,
|
114
|
-
Util::
|
115
|
-
|
125
|
+
Metanorma::Utils::anchor_attributes.each do |(tag_name, attr_name)|
|
126
|
+
Util::add_suffix_to_attrs(doc, document_suffix, tag_name, attr_name,
|
127
|
+
@isodoc)
|
116
128
|
end
|
117
129
|
url_in_css_styles(doc, document_suffix)
|
118
130
|
doc.root["document_suffix"] ||= ""
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "../sectionsplit/sectionsplit"
|
2
|
+
# require "concurrent-ruby"
|
2
3
|
|
3
4
|
module Metanorma
|
4
5
|
class Collection
|
@@ -16,13 +17,25 @@ module Metanorma
|
|
16
17
|
|
17
18
|
def process_section_split_instance(key, manifest)
|
18
19
|
s, sectionsplit_manifest = sectionsplit(key)
|
20
|
+
# section_split_instance_threads(s, manifest, key)
|
19
21
|
s.each_with_index do |f1, i|
|
20
22
|
add_section_split_instance(f1, manifest, key, i)
|
21
23
|
end
|
22
24
|
a = add_section_split_attachments(sectionsplit_manifest, key) and
|
23
25
|
manifest["#{key}:attachments"] = a
|
24
|
-
manifest
|
25
|
-
|
26
|
+
add_section_split_cover(manifest, sectionsplit_manifest, key)
|
27
|
+
end
|
28
|
+
|
29
|
+
def section_split_instance_threads(s, manifest, key)
|
30
|
+
@mutex = Mutex.new
|
31
|
+
pool = Concurrent::FixedThreadPool.new(4)
|
32
|
+
s.each_with_index do |f1, i|
|
33
|
+
pool.post do
|
34
|
+
add_section_split_instance(f1, manifest, key, i)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
pool.shutdown
|
38
|
+
pool.wait_for_termination
|
26
39
|
end
|
27
40
|
|
28
41
|
def cleanup_section_split_instance(key, manifest)
|
@@ -31,24 +44,34 @@ module Metanorma
|
|
31
44
|
@files[key][:indirect_key] = @sectionsplit.key
|
32
45
|
end
|
33
46
|
|
34
|
-
def add_section_split_cover(manifest, ident)
|
47
|
+
def add_section_split_cover(manifest, sectionsplit_manifest, ident)
|
35
48
|
cover = @sectionsplit
|
36
|
-
.section_split_cover(
|
49
|
+
.section_split_cover(sectionsplit_manifest,
|
50
|
+
@parent.dir_name_cleanse(ident),
|
37
51
|
one_doc_collection?)
|
38
52
|
@files[ident][:out_path] = cover
|
39
|
-
|
40
|
-
|
53
|
+
src = File.join(File.dirname(sectionsplit_manifest.file), cover)
|
54
|
+
m = { attachment: true, index: false, out_path: cover, ref: src }
|
55
|
+
manifest["#{ident}:index.html"] = m
|
56
|
+
one_doc_collection? and
|
57
|
+
add_cover_one_doc_coll(manifest, sectionsplit_manifest, ident, m)
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_cover_one_doc_coll(manifest, sectionsplit_manifest, key, entry)
|
61
|
+
idx = File.join(File.dirname(sectionsplit_manifest.file), "index.html")
|
62
|
+
FileUtils.cp entry[:ref], idx
|
63
|
+
manifest["#{key}:index1.html"] =
|
64
|
+
entry.merge(out_path: "index.html", ref: idx)
|
41
65
|
end
|
42
66
|
|
43
67
|
def one_doc_collection?
|
44
|
-
return false
|
45
68
|
docs = 0
|
46
69
|
@files.each_value do |v|
|
47
70
|
v[:attachment] and next
|
48
71
|
v[:presentationxml] and next
|
49
72
|
docs += 1
|
50
73
|
end
|
51
|
-
docs
|
74
|
+
docs <= 1
|
52
75
|
end
|
53
76
|
|
54
77
|
def add_section_split_attachments(manifest, ident)
|
@@ -61,16 +84,17 @@ module Metanorma
|
|
61
84
|
end
|
62
85
|
|
63
86
|
def add_section_split_instance(file, manifest, key, idx)
|
64
|
-
presfile, newkey, xml =
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
87
|
+
presfile, newkey, xml = add_section_split_instance_prep(file, key)
|
88
|
+
anchors = read_anchors(xml)
|
89
|
+
m = { parentid: key, presentationxml: true, type: "fileref",
|
90
|
+
rel_path: file[:url], out_path: File.basename(file[:url]),
|
91
|
+
anchors: anchors, anchors_lookup: anchors_lookup(anchors),
|
92
|
+
ids: read_ids(xml),
|
93
|
+
sectionsplit_output: true, indirect_key: @sectionsplit.key,
|
94
|
+
bibdata: @files[key][:bibdata], ref: presfile }
|
95
|
+
m[:bare] = true unless idx.zero?
|
96
|
+
manifest[newkey] = m
|
72
97
|
@files_to_delete << file[:url]
|
73
|
-
manifest[newkey][:bare] = true unless idx.zero?
|
74
98
|
end
|
75
99
|
|
76
100
|
def add_section_split_instance_prep(file, key)
|
@@ -84,9 +108,11 @@ module Metanorma
|
|
84
108
|
def sectionsplit(ident)
|
85
109
|
file = @files[ident][:ref]
|
86
110
|
@sectionsplit = ::Metanorma::Collection::Sectionsplit
|
87
|
-
.new(input: file, base: @files[ident][:out_path],
|
88
|
-
output: @files[ident][:out_path],
|
89
|
-
|
111
|
+
.new(input: file, base: @files[ident][:out_path],
|
112
|
+
dir: File.dirname(file), output: @files[ident][:out_path],
|
113
|
+
compile_opts: @parent.compile_options,
|
114
|
+
fileslookup: self, ident: ident, isodoc: @isodoc,
|
115
|
+
document_suffix: @files[ident][:document_suffix])
|
90
116
|
coll = @sectionsplit.sectionsplit.sort_by { |f| f[:order] }
|
91
117
|
xml = Nokogiri::XML(File.read(file, encoding: "UTF-8"), &:huge)
|
92
118
|
[coll, @sectionsplit
|
@@ -67,15 +67,15 @@ module Metanorma
|
|
67
67
|
i = x.at("//xmlns:bibdata/xmlns:docidentifier[@primary = 'true']") ||
|
68
68
|
x.at("//xmlns:bibdata/xmlns:docidentifier")
|
69
69
|
i or return nil
|
70
|
-
@
|
70
|
+
@flavor = @collection.flavor
|
71
71
|
load_isodoc
|
72
72
|
Util::key(@isodoc.docid_prefix(i["type"], i.text))
|
73
73
|
end
|
74
74
|
|
75
75
|
def load_isodoc
|
76
76
|
@isodoc and return
|
77
|
-
@collection.compile.load_flavor(@
|
78
|
-
@isodoc = Util::load_isodoc(@
|
77
|
+
@collection.compile.load_flavor(@flavor)
|
78
|
+
@isodoc = Util::load_isodoc(@flavor)
|
79
79
|
@isodoc.i18n_init(@lang, @script, nil) # for @i18n.all_parts in docid
|
80
80
|
end
|
81
81
|
|
@@ -153,7 +153,7 @@ module Metanorma
|
|
153
153
|
def set_adoc2xml(fileref)
|
154
154
|
File.join(
|
155
155
|
File.dirname(fileref),
|
156
|
-
File.basename(fileref).gsub(
|
156
|
+
File.basename(fileref).gsub(/\.adoc$/, ".xml"),
|
157
157
|
)
|
158
158
|
end
|
159
159
|
|
@@ -161,10 +161,8 @@ module Metanorma
|
|
161
161
|
# @raise [AdocFileNotFoundException]
|
162
162
|
def compile_adoc_file(file)
|
163
163
|
f = (Pathname.new file).absolute? ? file : File.join(@dir, file)
|
164
|
-
|
165
|
-
|
166
|
-
end
|
167
|
-
|
164
|
+
File.exist?(f) or raise AdocFileNotFoundException.new "#{f} not found!"
|
165
|
+
compile_adoc_file?(file) or return
|
168
166
|
::Metanorma::Util.log("[metanorma] Info: Compiling #{f}...", :info)
|
169
167
|
::Metanorma::Compile.new
|
170
168
|
.compile(f, agree_to_terms: true, install_fonts: false,
|
@@ -172,6 +170,13 @@ module Metanorma
|
|
172
170
|
::Metanorma::Util.log("[metanorma] Info: Compiling #{f}...done!", :info)
|
173
171
|
end
|
174
172
|
|
173
|
+
def compile_adoc_file?(file)
|
174
|
+
@collection.directives.detect do |d|
|
175
|
+
d.key == "recompile-xml"
|
176
|
+
end and return true
|
177
|
+
!File.exist?(file.sub(/\.adoc$/, ".xml"))
|
178
|
+
end
|
179
|
+
|
175
180
|
def documents(mnf = @config)
|
176
181
|
Array(mnf.entry).each_with_object({}) do |dr, m|
|
177
182
|
if dr.file
|
@@ -611,13 +611,13 @@ module Metanorma
|
|
611
611
|
def initialize(options)
|
612
612
|
options[:align_cross_elements] ||= %w(note p)
|
613
613
|
@align_cross_elements = " #{options[:align_cross_elements].join(' ')} "
|
614
|
-
@
|
614
|
+
@flavor = options[:flavor]
|
615
615
|
@outdir = options[:outdir]
|
616
616
|
@converter_opt = options[:converter_options]
|
617
617
|
end
|
618
618
|
|
619
619
|
def htmlconv
|
620
|
-
x = Asciidoctor.load nil, backend: @
|
620
|
+
x = Asciidoctor.load nil, backend: @flavor
|
621
621
|
x.converter.html_converter(@converter_opt)
|
622
622
|
end
|
623
623
|
|