metanorma 2.0.5 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,46 +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|
130
+ add_suffix = doc_suffix && doc_type && doc_type != schema
160
131
  ids.each do |id, file|
161
- k = indirect_ref_key(schema, id, docxml)
162
- 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)
163
137
  end
164
138
  end
165
139
  end
166
140
 
167
- def update_indirect_refs_to_docs_prep(docxml)
141
+ def update_indirect_refs_prep(docxml)
168
142
  @updated_anchors = {}
169
- [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"], {}]
170
146
  end
171
147
 
172
- def indirect_ref_key(schema, id, docxml)
148
+ def indirect_ref_key(schema, id, doc_suffix, doc_type)
173
149
  /^#{schema}_/.match?(id) and return id
150
+ key = [schema, id, doc_suffix, doc_type].join("::")
151
+ x = @indirect_keys[key] and return x
174
152
  ret = "#{schema}_#{id}"
175
- suffix = docxml.root["document_suffix"]
176
- (k = docxml.root["type"]) && k != schema && suffix and
177
- ret = "#{ret}_#{suffix}"
153
+ doc_suffix && doc_type && doc_type != schema and
154
+ ret = "#{ret}_#{doc_suffix}"
155
+ @indirect_keys[key] = ret
178
156
  ret
179
157
  end
180
158
 
181
- def update_indirect_refs_to_docs1(_docxml, key, file, bibitems, erefs)
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
169
+ end
170
+
171
+ def indirect_ref_keyx(schema, id, doc_suffix, doc_type)
172
+ /^#{schema}_/.match?(id) and return id
173
+ ret = "#{schema}_#{id}"
174
+ doc_suffix && doc_type && doc_type != schema and
175
+ ret = "#{ret}_#{doc_suffix}"
176
+ ret
177
+ end
178
+
179
+ def update_indirect_refs_to_docs1(filec, key, file, bibitems, erefs)
182
180
  erefs[key]&.each do |e|
183
181
  e["citeas"] = file
184
- update_indirect_refs_to_docs_anchor(e, file)
182
+ update_indirect_refs_to_docs_anchor(e, file, filec[:url],
183
+ filec[:parentid])
185
184
  end
186
185
  update_indirect_refs_to_docs_docid(bibitems[key], file)
187
186
  end
188
187
 
189
- def update_indirect_refs_to_docs_anchor(eref, file)
190
- a = eref.at(ns(".//locality[@type = 'anchor']/referenceFrom")) or return
191
- suffix = file
192
- @files.get(file) && p = @files.get(file, :parentid) and
193
- 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}"
194
191
  existing = a.text
195
- anchor = existing
196
- @files.url?(file) or
197
- 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
198
200
  @updated_anchors[existing] or a.children = anchor
199
201
  @updated_anchors[anchor] = true
200
202
  end
@@ -206,37 +208,36 @@ module Metanorma
206
208
  "<docidentifier type='metanorma-collection'>#{file}</docidentifier>"
207
209
  end
208
210
 
209
- # update crossrefences to other documents, to include
210
- # disambiguating document suffix on id
211
- def update_anchors(bib, docid, erefs)
212
- erefs.each do |e|
213
- if @files.get(docid) then update_anchor_loc(bib, e, docid)
214
- else
215
- msg = "<strong>** Unresolved reference to document #{docid} " \
216
- "from eref</strong>"
217
- e << msg
218
- strip_eref(e)
219
- @log&.add("Cross-References", e, msg)
220
- 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)
221
+ end
222
+ end
223
+
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]
221
228
  end
222
229
  end
223
230
 
224
- def update_anchor_loc(bib, eref, docid)
225
- loc = eref.at(".//xmlns:locality[@type = 'anchor']") or
226
- return update_anchor_create_loc(bib, eref, docid)
227
- ref = loc.at("./xmlns:referenceFrom") or return
228
- anchor = suffix_anchor(ref, docid)
229
- a = @files.get(docid, :anchors) or return
230
- a.inject([]) { |m, (_, x)| m + x.values }
231
- .include?(anchor) or return
232
- ref.content = anchor
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)]
233
235
  end
234
236
 
235
- def suffix_anchor(ref, docid)
236
- @ncnames[docid] ||= Metanorma::Utils::to_ncname(docid)
237
- anchor = ref.text
238
- @files.url?(docid) or anchor = "#{@ncnames[docid]}_#{anchor}"
239
- 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)
240
241
  end
241
242
 
242
243
  # if there is a crossref to another document, with no anchor, retrieve the
@@ -248,7 +249,7 @@ module Metanorma
248
249
  ref = ins.at(ns("./locality/referenceFrom"))&.text
249
250
  a = @files.get(docid, :anchors).dig(type, ref) or return
250
251
  ins << "<locality type='anchor'><referenceFrom>#{a.sub(/^_/, '')}" \
251
- "</referenceFrom></locality>"
252
+ "</referenceFrom></locality>"
252
253
  end
253
254
  end
254
255
  end
@@ -85,6 +85,7 @@ module Metanorma
85
85
  def gather_internal_refs
86
86
  @files.keys.each_with_object({}) do |i, refs|
87
87
  @files.get(i, :attachment) and next
88
+ @files.get(i, :sectionsplit) and next
88
89
  file, = @files.targetfile_id(i, read: true)
89
90
  gather_internal_refs1(file, i, refs)
90
91
  end
@@ -3,8 +3,8 @@ module Metanorma
3
3
  class Renderer
4
4
  def docconv
5
5
  @tempfile_cache ||= []
6
- doctype = @doctype.to_sym
7
- x = Asciidoctor.load nil, backend: doctype
6
+ flavor = @flavor.to_sym
7
+ x = Asciidoctor.load nil, backend: flavor
8
8
  x.converter.doc_converter(DocOptionsNode.new(@directives, @dirname))
9
9
  end
10
10
 
@@ -51,8 +51,8 @@ module Metanorma
51
51
  doc
52
52
  end
53
53
 
54
- SECTION_BREAK = '<p class="MsoNormal"><br clear="all" class="section"/></p>'
55
- .freeze
54
+ SECTION_BREAK =
55
+ '<p class="MsoNormal"><br clear="all" class="section"/></p>'.freeze
56
56
  DIV1 = '<div class="WordSection1">&#xa0;</div>'.freeze
57
57
  DIV2 = '<div class="WordSection2">&#xa0;</div>'.freeze
58
58
 
@@ -70,10 +70,10 @@ module Metanorma
70
70
  end
71
71
 
72
72
  def collection_coverpages(conv, docs)
73
- conv.wordintropage and [DIV2, SECTION_BREAK].reverse.each do |s|
73
+ conv.wordintropage and [DIV2, SECTION_BREAK].reverse_each do |s|
74
74
  docs.unshift(Nokogiri::XML(s).root)
75
75
  end
76
- conv.wordcoverpage and [DIV1, SECTION_BREAK].reverse.each do |s|
76
+ conv.wordcoverpage and [DIV1, SECTION_BREAK].reverse_each do |s|
77
77
  docs.unshift(Nokogiri::XML(s).root)
78
78
  end
79
79
  docs
@@ -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
@@ -38,9 +39,9 @@ module Metanorma
38
39
  @script = collection.bibdata.script.first || "Latn"
39
40
  @locale = @xml.at("//xmlns:bibdata/xmlns:locale")&.text
40
41
  @registry = Metanorma::Registry.instance
41
- @doctype = doctype
42
+ @flavor = options[:flavor] || flavor
42
43
  @compile = Compile.new
43
- @compile.load_flavor(@doctype)
44
+ @compile.load_flavor(@flavor)
44
45
 
45
46
  @isodoc = isodoc_create # output processor for flavour
46
47
  @outdir = dir_name_cleanse(options[:output_folder])
@@ -74,6 +75,7 @@ module Metanorma
74
75
 
75
76
  def flush_files
76
77
  warn "\n\n\n\n\nDone: #{DateTime.now.strftime('%H:%M:%S')}"
78
+ warn "\nFiles to delete:\n"
77
79
  warn @files.files_to_delete
78
80
  @files.files_to_delete.each { |f| FileUtils.rm_f(f) }
79
81
  @files_to_delete.each { |f| FileUtils.rm_f(f) }
@@ -136,8 +138,8 @@ module Metanorma
136
138
  @directives.detect { |d| d.key == "bilingual" } &&
137
139
  options[:format].include?(:html) and
138
140
  Metanorma::Collection::Multilingual.new(
139
- { doctype: doctype.to_sym,
140
- converter_options: PdfOptionsNode.new(doctype, @compile_options),
141
+ { flavor: flavor.to_sym,
142
+ converter_options: PdfOptionsNode.new(flavor, @compile_options),
141
143
  outdir: @outdir },
142
144
  ).to_html(pres)
143
145
  end
@@ -155,14 +157,9 @@ module Metanorma
155
157
  out
156
158
  end
157
159
 
158
- # infer the flavour from the first document identifier; relaton does that
159
- def doctype
160
- if (docid = @xml.at("//bibdata/docidentifier/@type")&.text)
161
- dt = docid.downcase
162
- elsif (docid = @xml.at("//bibdata/docidentifier")&.text)
163
- dt = docid.sub(/\s.*$/, "").lowercase
164
- else return "standoc"
165
- end
160
+ # TODO: infer flavor from publisher when available
161
+ def flavor
162
+ dt = @xml.at("//bibdata/ext/flavor")&.text or return "standoc"
166
163
  @registry.alias(dt.to_sym)&.to_s || dt
167
164
  end
168
165
 
@@ -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
@@ -111,9 +111,9 @@ module Metanorma
111
111
  end
112
112
 
113
113
  def pdfconv
114
- doctype = @doctype.to_sym
115
- x = Asciidoctor.load nil, backend: doctype
116
- x.converter.pdf_converter(PdfOptionsNode.new(doctype,
114
+ flavor = @flavor.to_sym
115
+ x = Asciidoctor.load nil, backend: flavor
116
+ x.converter.pdf_converter(PdfOptionsNode.new(flavor,
117
117
  @compile_options))
118
118
  end
119
119
 
@@ -153,8 +153,8 @@ module Metanorma
153
153
  end
154
154
 
155
155
  class PdfOptionsNode
156
- def initialize(doctype, options)
157
- p = Metanorma::Registry.instance.find_processor(doctype)
156
+ def initialize(flavor, options)
157
+ p = Metanorma::Registry.instance.find_processor(flavor)
158
158
  if ::Metanorma::Util::FontistHelper.has_custom_fonts?(p, options, {})
159
159
  @fonts_manifest =
160
160
  ::Metanorma::Util::FontistHelper.location_manifest(p, options)
@@ -169,7 +169,7 @@ module Metanorma
169
169
  end
170
170
 
171
171
  def isodoc_create
172
- isodoc = Util::load_isodoc(@doctype)
172
+ isodoc = Util::load_isodoc(@flavor)
173
173
  isodoc.i18n_init(@lang, @script, @locale) # read in internationalisation
174
174
  isodoc.metadata_init(@lang, @script, @locale, isodoc.i18n)
175
175
  isodoc.info(@xml, nil)
@@ -203,6 +203,22 @@ module Metanorma
203
203
  end.doc.root.to_html
204
204
  end
205
205
 
206
+ def eref2link(docxml)
207
+ isodoc = IsoDoc::PresentationXMLConvert.new({})
208
+ isodoc.bibitem_lookup(docxml)
209
+ isodoc.eref2link(docxml)
210
+ end
211
+
212
+ def error_anchor(erefs, docid)
213
+ erefs.each do |e|
214
+ msg = "<strong>** Unresolved reference to document #{docid} " \
215
+ "from eref</strong>"
216
+ e << msg
217
+ strip_eref(e)
218
+ @log&.add("Cross-References", e, msg)
219
+ end
220
+ end
221
+
206
222
  def ns(xpath)
207
223
  @isodoc.ns(xpath)
208
224
  end
@@ -0,0 +1,100 @@
1
+ module Metanorma
2
+ class Collection
3
+ class Sectionsplit
4
+ def build_collection
5
+ collection_setup(@base, @dir)
6
+ files = sectionsplit
7
+ input_xml = Nokogiri::XML(File.read(@input_filename,
8
+ encoding: "UTF-8"), &:huge)
9
+ collection_manifest(@base, files, input_xml, @xml, @dir).render(
10
+ { format: %i(html), output_folder: "#{@output_filename}_collection",
11
+ coverpage: File.join(@dir, "cover.html") }.merge(@compile_opts),
12
+ )
13
+ section_split_attachments(out: "#{@output_filename}_collection")
14
+ end
15
+
16
+ def collection_setup(filename, dir)
17
+ FileUtils.mkdir_p "#{filename}_collection" if filename
18
+ FileUtils.mkdir_p dir
19
+ File.open(File.join(dir, "cover.html"), "w:UTF-8") do |f|
20
+ f.write(coll_cover)
21
+ end
22
+ end
23
+
24
+ def coll_cover
25
+ <<~COVER
26
+ <html><head><meta charset="UTF-8"/></head><body>
27
+ <h1>{{ doctitle }}</h1>
28
+ <h2>{{ docnumber }}</h2>
29
+ <nav>{{ navigation }}</nav>
30
+ </body></html>
31
+ COVER
32
+ end
33
+
34
+ def collection_manifest(filename, files, origxml, _presxml, dir)
35
+ File.open(File.join(dir, "#{filename}.html.yaml"), "w:UTF-8") do |f|
36
+ f.write(collectionyaml(files, origxml))
37
+ end
38
+ Metanorma::Collection.parse File.join(dir, "#{filename}.html.yaml")
39
+ end
40
+
41
+ def collectionyaml(files, xml)
42
+ ret = {
43
+ directives: ["presentation-xml", "bare-after-first"],
44
+ bibdata: {
45
+ title: {
46
+ type: "title-main", language: @lang,
47
+ content: xml.at(ns("//bibdata/title")).text
48
+ },
49
+ type: "collection",
50
+ docid: {
51
+ type: xml.at(ns("//bibdata/docidentifier/@type")).text,
52
+ id: xml.at(ns("//bibdata/docidentifier")).text,
53
+ },
54
+ },
55
+ manifest: {
56
+ level: "collection", title: "Collection",
57
+ docref: files.sort_by { |f| f[:order] }.each.map do |f|
58
+ { fileref: f[:url], identifier: f[:title] }
59
+ end
60
+ },
61
+ }
62
+ ::Metanorma::Util::recursive_string_keys(ret).to_yaml
63
+ end
64
+
65
+ def att_dir(file)
66
+ "_#{File.basename(file, '.*')}_attachments"
67
+ end
68
+
69
+ def section_split_attachments(out: nil)
70
+ attachments = att_dir(@tmp_filename)
71
+ File.directory?(attachments) or return
72
+ dir = out || File.dirname(@input_filename)
73
+ ret = File.join(dir, att_dir(@output_filename))
74
+ FileUtils.rm_rf ret
75
+ FileUtils.mv attachments, ret
76
+ File.basename(ret)
77
+ end
78
+
79
+ def section_split_cover(col, ident, one_doc_coll)
80
+ dir = File.dirname(col.file)
81
+ collection_setup(nil, dir)
82
+ r = ::Metanorma::Collection::Renderer
83
+ .new(col, dir, output_folder: "#{ident}_collection",
84
+ format: %i(html),
85
+ coverpage: File.join(dir, "cover.html"))
86
+ r.coverpage
87
+ section_split_cover1(ident, r, dir, one_doc_coll)
88
+ end
89
+
90
+ def section_split_cover1(ident, renderer, dir, _one_doc_coll)
91
+ filename = File.basename("#{ident}_index.html")
92
+ # ident can be a directory with YAML indirection
93
+ dest = File.join(dir, filename)
94
+ FileUtils.mv File.join(renderer.outdir, "index.html"), dest
95
+ FileUtils.rm_rf renderer.outdir
96
+ filename
97
+ end
98
+ end
99
+ end
100
+ end