metanorma 2.0.6 → 2.0.9

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.
@@ -19,6 +19,7 @@ module Metanorma
19
19
  @nested || sso or
20
20
  Metanorma::Collection::XrefProcess::xref_process(xml, xml, nil, docid,
21
21
  @isodoc)
22
+ @ncnames = {}
22
23
  @nested or update_indirect_refs_to_docs(xml, docid, internal_refs)
23
24
  @files.add_document_suffix(docid, xml)
24
25
  @nested or update_sectionsplit_refs_to_docs(xml, internal_refs)
@@ -49,9 +50,11 @@ module Metanorma
49
50
  end
50
51
  end
51
52
 
53
+ ANCHOR_XPATH = "xmlns:locality[@type = 'anchor']/xmlns:referenceFrom"
54
+ .freeze
55
+
52
56
  def update_sectionsplit_eref_to_doc(eref, internal_refs, doclist, opts)
53
- a = eref.at(ns("./localityStack/locality[@type = 'anchor']/" \
54
- "referenceFrom")) or return
57
+ a = eref.at("./xmlns:localityStack/#{ANCHOR_XPATH}") or return
55
58
  doc = internal_refs[opts[:key]]["#{a.text}_#{opts[:target_suffix]}"]
56
59
  bibitemid = Metanorma::Utils::to_ncname("#{doc}_#{opts[:source_suffix]}")
57
60
  eref["bibitemid"] = bibitemid
@@ -59,12 +62,6 @@ module Metanorma
59
62
  doclist
60
63
  end
61
64
 
62
- def eref2link(docxml)
63
- isodoc = IsoDoc::PresentationXMLConvert.new({})
64
- isodoc.bibitem_lookup(docxml)
65
- isodoc.eref2link(docxml)
66
- end
67
-
68
65
  BIBITEM_NOT_REPO_XPATH = "//bibitem[not(ancestor::bibitem)]" \
69
66
  "[not(./docidentifier[@type = 'repository'])]".freeze
70
67
 
@@ -79,64 +76,37 @@ module Metanorma
79
76
  end
80
77
  end
81
78
 
82
- def svg_datauri(docxml, docid)
83
- rel = @files.get(docid, :rel_path)
84
- parent = @files.get(docid, :parentid) and
85
- rel = @files.get(parent, :rel_path)
86
- # if sectionsplit, use orig file dir
87
- dir = File.join(@dirname, File.dirname(rel))
88
- datauri_encode(docxml, dir)
89
- end
90
-
91
- def svgmap_resolve(docxml, docid)
92
- ids = @files.get(docid, :ids)
93
- docxml = svg_unnest(svg_datauri(docxml, docid))
94
- isodoc = IsoDoc::PresentationXMLConvert.new({})
95
- isodoc.bibitem_lookup(docxml)
96
- docxml.xpath(ns("//svgmap//eref")).each do |e|
97
- svgmap_resolve_eref(e, isodoc, docxml, ids)
98
- end
99
- Vectory::SvgMapping.new(docxml, "").call
100
- docxml.xpath(ns("//svgmap")).each { |s| isodoc.svgmap_extract(s) }
101
- end
102
-
103
- def svg_unnest(docxml)
104
- docxml.xpath(ns("//svgmap//image[.//*[name() = 'image']]")).each do |i|
105
- s = i.elements.detect { |e| e.name == "svg" } and
106
- i.replace(s)
107
- end
108
- docxml
109
- end
110
-
111
- def svgmap_resolve_eref(eref, isodoc, _docxml, ids)
112
- href = isodoc.eref_target(eref) or return
113
- href = href[:link]
114
- href == "##{eref['bibitemid']}" ||
115
- (href =~ /^#/ && !ids[href.sub(/^#/, "")]) and return
116
- eref["target"] = href.strip
117
- eref.name = "link"
118
- eref.elements&.remove
119
- end
120
-
121
79
  # repo(current-metanorma-collection/ISO 17301-1:2016)
122
80
  # replaced by bibdata of "ISO 17301-1:2016" in situ as bibitem.
123
81
  # Any erefs to that bibitem id are replaced with relative URL
124
82
  # Preferably with anchor, and is a job to realise dynamic lookup
125
83
  # of localities.
126
84
  def update_direct_refs_to_docs(docxml, identifier)
127
- erefs, erefs1 = update_direct_refs_to_docs_prep(docxml)
85
+ erefs, erefs_no_anchor, anchors, erefs1 =
86
+ update_direct_refs_to_docs_prep(docxml)
128
87
  docxml.xpath(ns("//bibitem")).each do |b|
129
88
  docid = b.at(ns("./docidentifier[@type = 'repository']")) or next
130
89
  strip_unresolved_repo_erefs(identifier, docid, erefs1, b) or next
131
90
  update_bibitem(b, identifier)
132
91
  docid = docid_to_citeas(b) or next
133
- erefs[docid] and update_anchors(b, docid, erefs[docid])
92
+ erefs[docid] and
93
+ update_anchors(b, docid, erefs[docid], erefs_no_anchor[docid],
94
+ anchors[docid])
134
95
  end
135
96
  end
136
97
 
98
+ # Hash(docid) of arrays
137
99
  def update_direct_refs_to_docs_prep(docxml)
138
- @ncnames = {}
139
- [Util::gather_citeases(docxml), Util::gather_bibitemids(docxml)]
100
+ erefs = Util::gather_citeases(docxml)
101
+ no_anchor = erefs.keys.each_with_object({}) { |k, m| m[k] = [] }
102
+ anchors = erefs.keys.each_with_object({}) { |k, m| m[k] = [] }
103
+ erefs.each do |k, v|
104
+ v.each do |e|
105
+ if loc = e.at(".//#{ANCHOR_XPATH}") then anchors[k] << loc
106
+ else no_anchor[k] << e end
107
+ end
108
+ end
109
+ [erefs, no_anchor, anchors, Util::gather_bibitemids(docxml)]
140
110
  end
141
111
 
142
112
  # strip erefs if they are repository erefs, but do not point to a document
@@ -155,56 +125,78 @@ module Metanorma
155
125
  # Resolve erefs to a container of ids in another doc,
156
126
  # to an anchor eref (direct link)
157
127
  def update_indirect_refs_to_docs(docxml, _docidentifier, internal_refs)
158
- bibitems, erefs = update_indirect_refs_to_docs_prep(docxml)
128
+ bib, erefs, doc_suffix, doc_type, f = update_indirect_refs_prep(docxml)
159
129
  internal_refs.each do |schema, ids|
160
- s = "#{schema}_"
130
+ add_suffix = doc_suffix && doc_type && doc_type != schema
161
131
  ids.each do |id, file|
162
- k = indirect_ref_key(s, schema, id, docxml)
163
- update_indirect_refs_to_docs1(docxml, k, file, bibitems, erefs)
132
+ f[file] ||= { url: @files.url?(file),
133
+ parentid: @files.get(file) && @files.get(file,
134
+ :parentid) }
135
+ k = indirect_ref_key(schema, id, doc_suffix, add_suffix)
136
+ update_indirect_refs_to_docs1(f[file], k, file, bib, erefs)
164
137
  end
165
138
  end
166
139
  end
167
140
 
168
- def update_indirect_refs_to_docs_prep(docxml)
141
+ def update_indirect_refs_prep(docxml)
169
142
  @updated_anchors = {}
170
- [Util::gather_bibitems(docxml), Util::gather_bibitemids(docxml)]
143
+ @indirect_keys = {}
144
+ [Util::gather_bibitems(docxml), Util::gather_bibitemids(docxml),
145
+ docxml.root["document_suffix"], docxml.root["type"], {}]
146
+ end
147
+
148
+ def indirect_ref_key(schema, id, doc_suffix, doc_type)
149
+ /^#{schema}_/.match?(id) and return id
150
+ key = [schema, id, doc_suffix, doc_type].join("::")
151
+ x = @indirect_keys[key] and return x
152
+ ret = "#{schema}_#{id}"
153
+ doc_suffix && doc_type && doc_type != schema and
154
+ ret = "#{ret}_#{doc_suffix}"
155
+ @indirect_keys[key] = ret
156
+ ret
171
157
  end
172
158
 
173
- def indirect_ref_key(schema_, schema, id, docxml)
174
- /^#{schema_}/.match?(id) and return id
175
- ret = schema_ + id
176
- suffix = docxml.root["document_suffix"] or return ret
177
- (k = docxml.root["type"]) && k != schema or return ret
178
- "#{ret}_#{suffix}"
159
+ def indirect_ref_key(schema, id, doc_suffix, add_suffix)
160
+ /^#{schema}_/.match?(id) and return id
161
+ #key = "#{schema}_#{id}"
162
+ x = @indirect_keys.dig(schema, id) and return x
163
+ @indirect_keys[schema] ||= {}
164
+ @indirect_keys[schema][id] = if add_suffix
165
+ "#{schema}_#{id}_#{doc_suffix}"
166
+ else
167
+ "#{schema}_#{id}"
168
+ end
179
169
  end
180
170
 
181
- #OLD
182
- def indirect_ref_key1(schema, id, docxml)
171
+ def indirect_ref_keyx(schema, id, doc_suffix, doc_type)
183
172
  /^#{schema}_/.match?(id) and return id
184
173
  ret = "#{schema}_#{id}"
185
- suffix = docxml.root["document_suffix"]
186
- (k = docxml.root["type"]) && k != schema && suffix and
187
- ret = "#{ret}_#{suffix}"
174
+ doc_suffix && doc_type && doc_type != schema and
175
+ ret = "#{ret}_#{doc_suffix}"
188
176
  ret
189
177
  end
190
178
 
191
- def update_indirect_refs_to_docs1(_docxml, key, file, bibitems, erefs)
179
+ def update_indirect_refs_to_docs1(filec, key, file, bibitems, erefs)
192
180
  erefs[key]&.each do |e|
193
181
  e["citeas"] = file
194
- update_indirect_refs_to_docs_anchor(e, file)
182
+ update_indirect_refs_to_docs_anchor(e, file, filec[:url],
183
+ filec[:parentid])
195
184
  end
196
185
  update_indirect_refs_to_docs_docid(bibitems[key], file)
197
186
  end
198
187
 
199
- def update_indirect_refs_to_docs_anchor(eref, file)
200
- a = eref.at(ns(".//locality[@type = 'anchor']/referenceFrom")) or return
201
- suffix = file
202
- @files.get(file) && p = @files.get(file, :parentid) and
203
- suffix = "#{p}_#{suffix}"
188
+ def update_indirect_refs_to_docs_anchor(eref, file, url, parentid)
189
+ a = eref.at(".//#{ANCHOR_XPATH}") or return
190
+ parentid and file = "#{parentid}_#{file}"
204
191
  existing = a.text
205
- anchor = existing
206
- @files.url?(file) or
207
- anchor = Metanorma::Utils::to_ncname("#{anchor}_#{suffix}")
192
+ anchor = if url then existing
193
+ else
194
+ #suffix_anchor_indirect(existing, suffix)
195
+ #k = "#{existing}_#{file}"
196
+ #@ncnames[k] ||= Metanorma::Utils::to_ncname(k)
197
+ @indirect_keys[existing] ||= {}
198
+ @indirect_keys[existing][file] ||= Metanorma::Utils::to_ncname("#{existing}_#{file}")
199
+ end
208
200
  @updated_anchors[existing] or a.children = anchor
209
201
  @updated_anchors[anchor] = true
210
202
  end
@@ -216,55 +208,36 @@ module Metanorma
216
208
  "<docidentifier type='metanorma-collection'>#{file}</docidentifier>"
217
209
  end
218
210
 
219
- # update crossrefences to other documents, to include
220
- # disambiguating document suffix on id
221
- def update_anchors(bib, docid, erefs)
222
- erefs.each do |e|
223
- if @files.get(docid) then update_anchor_loc(bib, e, docid)
224
- else
225
- msg = "<strong>** Unresolved reference to document #{docid} " \
226
- "from eref</strong>"
227
- e << msg
228
- strip_eref(e)
229
- @log&.add("Cross-References", e, msg)
230
- end
211
+ # bottleneck
212
+ def update_anchors(bib, docid, erefs, erefs_no_anchor, erefs_anchors)
213
+ @files.get(docid) or error_anchor(erefs, docid)
214
+ has_anchors, url, ncn_docid = update_anchors_prep(docid)
215
+ erefs_no_anchor.each do |e|
216
+ update_anchor_create_loc(bib, e, docid)
217
+ end
218
+ !url && has_anchors or return
219
+ erefs_anchors.each do |e|
220
+ update_anchors1(docid, ncn_docid, e)
231
221
  end
232
222
  end
233
223
 
234
- def update_anchor_loc(bib, eref, docid)
235
- loc = eref.at(".//xmlns:locality[@type = 'anchor']") or
236
- return update_anchor_create_loc(bib, eref, docid)
237
- a = @files.get(docid, :anchors) or return
238
- ref = loc.elements&.first or return
239
- anchor = suffix_anchor(ref.text, docid)
240
- a.values.detect { |x| x.value?(anchor) } or return
241
- ref.content = anchor
242
- end
243
-
244
- #OLD
245
- def update_anchor_loc1(bib, eref, docid)
246
- loc = eref.at(".//xmlns:locality[@type = 'anchor']") or
247
- return update_anchor_create_loc(bib, eref, docid)
248
- ref = loc.at("./xmlns:referenceFrom") or return
249
- anchor = suffix_anchor(ref, docid)
250
- a = @files.get(docid, :anchors) or return
251
- a.inject([]) { |m, (_, x)| m + x.values }
252
- .include?(anchor) or return
253
- ref.content = anchor
224
+ def update_anchors1(docid, ncn_docid, anchor)
225
+ @concat_anchors[anchor.text] ||= "#{ncn_docid}_#{anchor.text}"
226
+ if @files.get(docid).dig(:anchors_lookup, @concat_anchors[anchor.text])
227
+ anchor.content = @concat_anchors[anchor.text]
228
+ end
254
229
  end
255
230
 
256
- def suffix_anchor(ref, docid)
257
- @ncnames[docid] ||= "#{Metanorma::Utils::to_ncname(docid)}_"
258
- @files.url?(docid) or return ref
259
- @ncnames[docid] + ref
231
+ def update_anchors_prep(docid)
232
+ @concat_anchors = {}
233
+ [@files.get(docid)&.key?(:anchors_lookup), @files.url?(docid),
234
+ Metanorma::Utils::to_ncname(docid)]
260
235
  end
261
236
 
262
- #OLD
263
- def suffix_anchor1(ref, docid)
264
- @ncnames[docid] ||= Metanorma::Utils::to_ncname(docid)
265
- anchor = ref.text
266
- @files.url?(docid) or anchor = "#{@ncnames[docid]}_#{anchor}"
267
- anchor
237
+ # encode both prefix and suffix to NCName
238
+ def suffix_anchor_indirect(prefix, suffix)
239
+ k = "#{prefix}_#{suffix}"
240
+ @ncnames[k] ||= Metanorma::Utils::to_ncname(k)
268
241
  end
269
242
 
270
243
  # if there is a crossref to another document, with no anchor, retrieve the
@@ -276,7 +249,7 @@ module Metanorma
276
249
  ref = ins.at(ns("./locality/referenceFrom"))&.text
277
250
  a = @files.get(docid, :anchors).dig(type, ref) or return
278
251
  ins << "<locality type='anchor'><referenceFrom>#{a.sub(/^_/, '')}" \
279
- "</referenceFrom></locality>"
252
+ "</referenceFrom></locality>"
280
253
  end
281
254
  end
282
255
  end
@@ -114,7 +114,7 @@ module Metanorma
114
114
  files.each { |f| docrefs(f, u) }
115
115
  end
116
116
  end
117
- r.doc.root&.to_html&.gsub("\n", " ")
117
+ r.doc.root&.to_html&.tr("\n", " ")
118
118
  end
119
119
 
120
120
  def liquid_docrefs(mnfs)
@@ -8,6 +8,7 @@ require_relative "../multilingual/multilingual"
8
8
  require_relative "utils"
9
9
  require_relative "render_word"
10
10
  require_relative "navigation"
11
+ require_relative "svg"
11
12
 
12
13
  module Metanorma
13
14
  class Collection
@@ -42,7 +43,8 @@ module Metanorma
42
43
  @compile = Compile.new
43
44
  @compile.load_flavor(@flavor)
44
45
 
45
- @isodoc = isodoc_create # output processor for flavour
46
+ # output processor for flavour
47
+ @isodoc = Util::isodoc_create(@flavor, @lang, @scropt, @xml)
46
48
  @outdir = dir_name_cleanse(options[:output_folder])
47
49
  @coverpage = options[:coverpage] || collection.coverpage
48
50
  @format = ::Metanorma::Util.sort_extensions_execution(options[:format])
@@ -74,6 +76,7 @@ module Metanorma
74
76
 
75
77
  def flush_files
76
78
  warn "\n\n\n\n\nDone: #{DateTime.now.strftime('%H:%M:%S')}"
79
+ warn "\nFiles to delete:\n"
77
80
  warn @files.files_to_delete
78
81
  @files.files_to_delete.each { |f| FileUtils.rm_f(f) }
79
82
  @files_to_delete.each { |f| FileUtils.rm_f(f) }
@@ -0,0 +1,44 @@
1
+ module Metanorma
2
+ class Collection
3
+ class Renderer
4
+ def svg_datauri(docxml, docid)
5
+ rel = @files.get(docid, :rel_path)
6
+ parent = @files.get(docid, :parentid) and
7
+ rel = @files.get(parent, :rel_path)
8
+ # if sectionsplit, use orig file dir
9
+ dir = File.join(@dirname, File.dirname(rel))
10
+ datauri_encode(docxml, dir)
11
+ end
12
+
13
+ def svgmap_resolve(docxml, docid)
14
+ ids = @files.get(docid, :ids)
15
+ docxml = svg_unnest(svg_datauri(docxml, docid))
16
+ isodoc = IsoDoc::PresentationXMLConvert.new({})
17
+ isodoc.bibitem_lookup(docxml)
18
+ docxml.xpath(ns("//svgmap//eref")).each do |e|
19
+ svgmap_resolve_eref(e, isodoc, docxml, ids)
20
+ end
21
+ Vectory::SvgMapping.new(docxml, "").call
22
+ docxml.xpath(ns("//svgmap")).each { |s| isodoc.svgmap_extract(s) }
23
+ end
24
+
25
+ def svg_unnest(docxml)
26
+ docxml.xpath(ns("//svgmap//image[.//*[name() = 'image']]")).each do |i|
27
+ s = i.elements.detect { |e| e.name == "svg" } and
28
+ i.replace(s)
29
+ end
30
+ docxml
31
+ end
32
+
33
+ def svgmap_resolve_eref(eref, isodoc, _docxml, ids)
34
+ href = isodoc.eref_target(eref) or return
35
+ href = href[:link]
36
+ href == "##{eref['bibitemid']}" ||
37
+ (href =~ /^#/ && !ids[href.sub(/^#/, "")]) and return
38
+ eref["target"] = href.strip
39
+ eref.name = "link"
40
+ eref.elements&.remove
41
+ end
42
+ end
43
+ end
44
+ end
@@ -55,7 +55,7 @@ module Metanorma
55
55
  def docid_to_citeas(bib)
56
56
  docid = bib.at(ns("./docidentifier[@primary = 'true']")) ||
57
57
  bib.at(ns("./docidentifier")) or return
58
- docid_prefix(docid)
58
+ ::Metanorma::Collection::Util::key(docid_prefix(docid))
59
59
  end
60
60
 
61
61
  def collect_erefs(docxml)
@@ -168,21 +168,13 @@ module Metanorma
168
168
  end
169
169
  end
170
170
 
171
- def isodoc_create
172
- isodoc = Util::load_isodoc(@flavor)
173
- isodoc.i18n_init(@lang, @script, @locale) # read in internationalisation
174
- isodoc.metadata_init(@lang, @script, @locale, isodoc.i18n)
175
- isodoc.info(@xml, nil)
176
- isodoc
177
- end
178
-
179
171
  # create the @meta class of isodoc, for populating Liquid,
180
172
  # with "navigation" set to the index bar.
181
173
  # extracted from the manifest
182
174
  def isodoc_populate
183
175
  @isodoc.info(@xml, nil)
184
176
  { navigation: indexfile(@manifest), nav_object: index_object(@manifest),
185
- docrefs: liquid_docrefs(@manifest),
177
+ bibdata: @bibdata.to_hash, docrefs: liquid_docrefs(@manifest),
186
178
  "prefatory-content": isodoc_builder(@xml.at("//prefatory-content")),
187
179
  "final-content": isodoc_builder(@xml.at("//final-content")),
188
180
  doctitle: @bibdata.title.first.title.content,
@@ -203,6 +195,22 @@ module Metanorma
203
195
  end.doc.root.to_html
204
196
  end
205
197
 
198
+ def eref2link(docxml)
199
+ isodoc = IsoDoc::PresentationXMLConvert.new({})
200
+ isodoc.bibitem_lookup(docxml)
201
+ isodoc.eref2link(docxml)
202
+ end
203
+
204
+ def error_anchor(erefs, docid)
205
+ erefs.each do |e|
206
+ msg = "<strong>** Unresolved reference to document #{docid} " \
207
+ "from eref</strong>"
208
+ e << msg
209
+ strip_eref(e)
210
+ @log&.add("Cross-References", e, msg)
211
+ end
212
+ end
213
+
206
214
  def ns(xpath)
207
215
  @isodoc.ns(xpath)
208
216
  end
@@ -76,22 +76,22 @@ module Metanorma
76
76
  File.basename(ret)
77
77
  end
78
78
 
79
- def section_split_cover(col, ident, _one_doc_coll)
79
+ def section_split_cover(col, ident, one_doc_coll)
80
80
  dir = File.dirname(col.file)
81
81
  collection_setup(nil, dir)
82
82
  r = ::Metanorma::Collection::Renderer
83
83
  .new(col, dir, output_folder: "#{ident}_collection",
84
- format: %i(html), coverpage: File.join(dir, "cover.html"))
84
+ format: %i(html),
85
+ coverpage: File.join(dir, "cover.html"))
85
86
  r.coverpage
86
- section_split_cover1(ident, r, dir, _one_doc_coll)
87
+ section_split_cover1(ident, r, dir, one_doc_coll)
87
88
  end
88
89
 
89
90
  def section_split_cover1(ident, renderer, dir, _one_doc_coll)
90
- # filename = one_doc_coll ? "#{ident}_index.html" : "index.html"
91
91
  filename = File.basename("#{ident}_index.html")
92
92
  # ident can be a directory with YAML indirection
93
- FileUtils.mv File.join(renderer.outdir, "index.html"),
94
- File.join(dir, filename)
93
+ dest = File.join(dir, filename)
94
+ FileUtils.mv File.join(renderer.outdir, "index.html"), dest
95
95
  FileUtils.rm_rf renderer.outdir
96
96
  filename
97
97
  end
@@ -2,6 +2,7 @@ require "yaml"
2
2
  require_relative "../../util/util"
3
3
  require_relative "../xrefprocess/xrefprocess"
4
4
  require_relative "collection"
5
+ require "concurrent-ruby"
5
6
 
6
7
  module Metanorma
7
8
  class Collection
@@ -35,12 +36,32 @@ module Metanorma
35
36
  def sectionsplit
36
37
  xml = sectionsplit_prep(File.read(@input_filename), @base, @dir)
37
38
  @key = Metanorma::Collection::XrefProcess::xref_preprocess(xml, @isodoc)
38
- SPLITSECTIONS.each_with_object([]) do |n, ret|
39
+ empty = empty_doc(xml)
40
+ empty1 = empty_attachments(empty)
41
+ @mutex = Mutex.new
42
+ @pool = Concurrent::FixedThreadPool.new(4)
43
+ sectionsplit1(xml, empty, empty1, 0)
44
+ end
45
+
46
+ def sectionsplit1(xml, empty, empty1, idx)
47
+ ret = SPLITSECTIONS.each_with_object([]) do |n, m|
39
48
  conflate_floatingtitles(xml.xpath(ns(n[0]))).each do |s|
40
- ret << sectionfile(xml, emptydoc(xml, ret.size),
41
- "#{@base}.#{ret.size}", s, n[1])
49
+ sectionsplit2(xml, idx.zero? ? empty : empty1, s, n[1],
50
+ { acc: m, idx: idx })
51
+ idx += 1
42
52
  end
43
53
  end
54
+ @pool.shutdown
55
+ @pool.wait_for_termination
56
+ ret
57
+ end
58
+
59
+ def sectionsplit2(xml, empty, chunks, parentnode, opt)
60
+ @pool.post do
61
+ a = sectionfile(xml, empty, "#{@base}.#{opt[:idx]}", chunks,
62
+ parentnode)
63
+ @mutex.synchronize { opt[:acc] << a }
64
+ end
44
65
  end
45
66
 
46
67
  def block?(node)
@@ -61,13 +82,13 @@ module Metanorma
61
82
 
62
83
  def sectionsplit_prep(file, filename, dir)
63
84
  @splitdir = dir
64
- xml1, type = sectionsplit_preprocess_semxml(file, filename)
85
+ xml, type = sectionsplit_preprocess_semxml(file, filename)
65
86
  flags = { format: :asciidoc, extension_keys: [:presentation],
66
87
  type: type }.merge(@compile_opts)
67
- Compile.new.compile(xml1, flags)
68
- f = File.open(xml1.sub(/\.xml$/, ".presentation.xml"),
69
- encoding: "utf-8")
88
+ Compile.new.compile(xml, flags)
89
+ f = File.open(xml.sub(/\.xml$/, ".presentation.xml"), encoding: "utf-8")
70
90
  r = Nokogiri::XML(f, &:huge)
91
+ f.close
71
92
  r.xpath("//xmlns:svgmap1").each { |x| x.name = "svgmap" }
72
93
  r
73
94
  end
@@ -108,7 +129,25 @@ module Metanorma
108
129
  "//indexsect | //colophon"),
109
130
  ).each(&:remove)
110
131
  ordinal.zero? or out.xpath(ns("//metanorma-ext//attachment | " \
111
- "//semantic__metanorma-ext//semantic__attachment"))
132
+ "//semantic__metanorma-ext//semantic__attachment"))
133
+ .each(&:remove) # keep only one copy of attachments
134
+ out
135
+ end
136
+
137
+ def empty_doc(xml)
138
+ out = xml.dup
139
+ out.xpath(
140
+ ns("//preface | //sections | //annex | //bibliography/clause | " \
141
+ "//bibliography/references[not(@hidden = 'true')] | " \
142
+ "//indexsect | //colophon"),
143
+ ).each(&:remove)
144
+ out
145
+ end
146
+
147
+ def empty_attachments(xml)
148
+ out = xml.dup
149
+ out.xpath(ns("//metanorma-ext//attachment | " \
150
+ "//semantic__metanorma-ext//semantic__attachment"))
112
151
  .each(&:remove) # keep only one copy of attachments
113
152
  out
114
153
  end
@@ -126,7 +165,9 @@ module Metanorma
126
165
  @ident, @isodoc)
127
166
  truncate_semxml(out, chunks)
128
167
  outname = "#{file}.xml"
129
- File.open(File.join(@splitdir, outname), "w:UTF-8") { |f| f.write(out) }
168
+ File.open(File.join(@splitdir, outname), "w:UTF-8") do |f|
169
+ f.write(out)
170
+ end
130
171
  outname
131
172
  end
132
173
 
@@ -161,13 +202,11 @@ module Metanorma
161
202
  end
162
203
 
163
204
  def titlerender(section)
164
- title = section.at(ns("./title")) or return "[Untitled]"
205
+ title = section.at(ns("./fmt-title")) or return "[Untitled]"
165
206
  t = title.dup
166
207
  t.xpath(ns(".//tab | .//br")).each { |x| x.replace(" ") }
167
208
  t.xpath(ns(".//bookmark")).each(&:remove)
168
- t.xpath(ns(".//strong | .//span"))
169
- .each { |x| x.replace(x.children) }
170
- t.children.to_xml
209
+ t.xpath('.//text()').map(&:text).join
171
210
  end
172
211
  end
173
212
  end
@@ -25,8 +25,9 @@ module Metanorma
25
25
  def gather_citeases(xml)
26
26
  xml.xpath("//*[@citeas]").each_with_object({}) do |e, m|
27
27
  /^semantic__/.match?(e.name) and next
28
- m[e["citeas"]] ||= []
29
- m[e["citeas"]] << e
28
+ k = key(e["citeas"])
29
+ m[k] ||= []
30
+ m[k] << e
30
31
  end
31
32
  end
32
33
 
@@ -61,10 +62,23 @@ module Metanorma
61
62
  def attr(_key); end
62
63
  end
63
64
 
64
- def load_isodoc(flavor)
65
+ def load_isodoc(flavor, presxml: false)
65
66
  x = Asciidoctor.load nil, backend: flavor.to_sym
67
+ if presxml
68
+ x.converter.presentation_xml_converter(Dummy.new)
69
+ else
66
70
  x.converter.html_converter(Dummy.new) # to obtain Isodoc class
71
+ end
67
72
  end
73
+
74
+ def isodoc_create(flavor, lang, script, xml, presxml: false)
75
+ isodoc = Util::load_isodoc(flavor, presxml: presxml)
76
+ isodoc.i18n_init(lang, script, nil) # read in internationalisation
77
+ # TODO locale?
78
+ isodoc.metadata_init(lang, script, nil, isodoc.i18n)
79
+ isodoc.info(xml, nil)
80
+ isodoc
81
+ end
68
82
  end
69
83
  end
70
84
  end
@@ -114,6 +114,14 @@ module Metanorma
114
114
  fnames = { xml: f.sub(/\.[^.]+$/, ".xml"), f: f,
115
115
  orig_filename: File.expand_path(filename),
116
116
  presentationxml: f.sub(/\.[^.]+$/, ".presentation.xml") }
117
+ if extensions == %i(presentation)
118
+ process_ext(:presentation, file, isodoc, fnames, options)
119
+ else
120
+ process_exts_queue(fnames, extensions, file, isodoc, options)
121
+ end
122
+ end
123
+
124
+ def process_exts_queue(fnames, extensions, file, isodoc, options)
117
125
  @queue = ::Metanorma::Util::WorkersPool
118
126
  .new(ENV["METANORMA_PARALLEL"]&.to_i || 3)
119
127
  gather_and_install_fonts(file, options.dup, extensions)
@@ -1,8 +1,7 @@
1
1
  module Metanorma
2
2
  class Compile
3
3
  def relaton_export(isodoc, options)
4
- return unless options[:relaton]
5
-
4
+ options[:relaton] or return
6
5
  xml = Nokogiri::XML(isodoc, &:huge)
7
6
  bibdata = xml.at("//bibdata") || xml.at("//xmlns:bibdata")
8
7
  # docid = bibdata&.at("./xmlns:docidentifier")&.text || options[:filename]
@@ -18,8 +17,7 @@ module Metanorma
18
17
  end
19
18
 
20
19
  def extract(isodoc, dirname, extract_types)
21
- return unless dirname
22
-
20
+ dirname or return
23
21
  extract_types.nil? || extract_types.empty? and
24
22
  extract_types = %i[sourcecode image requirement]
25
23
  FileUtils.rm_rf dirname