metanorma 1.6.3 → 1.6.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca433d59b111534c114a96b7ce386ccf0267a70cedcbfbe61ef11cf2f42737d3
4
- data.tar.gz: c1a73eb056acb7910d255c8348273dd9abf79dd06ef4826ac3ab3d5474543242
3
+ metadata.gz: e4bbd3fdfd37664da0a7f9e91cbecfcb0f7cdd49c004cf75eaa122c366ea6fba
4
+ data.tar.gz: 6b61241e1010ed465995c23447b4828503495d8f4fb2366e64babe0ae6d0726e
5
5
  SHA512:
6
- metadata.gz: 2e57292cdc5217cb985be7beb617035ee8edcfb0c9ee3c38cd2c6dc49e71c63468c05d3e6c3000985e93e94a4313f7cf77b24a24c4affe80778f3727c3c7a5b8
7
- data.tar.gz: b1a33f6b99669f384af4426cf75e3052f480c0878ec9f1d5716661bc5340e228273f6993930aacba3b1bfe6da7f166791718b0c02c0c71440f83d8642e019355
6
+ metadata.gz: dc05aa1c9d8aec0e6d45b537e10a130f88e715116f0dd92820e73588ff5a6542a7f2f92099e504654d2ed21e4e95c4bd84c0b260e24f923720b38ae298455f33
7
+ data.tar.gz: 870e182c05914d484180fd19360bfe1010cb9b57ed926926d76ba6cde3d9f2adbf2cb98e5d7e44702f2024cd51b52347524b9fb0ac28c0463d01b3d1dfc9d7b6
@@ -58,10 +58,10 @@ module Metanorma
58
58
  update_indirect_refs_to_docs(docxml, internal_refs)
59
59
  ids = @files.get(identifier, :ids)
60
60
  @files.add_document_suffix(identifier, docxml)
61
- svgmap_resolve(datauri_encode(docxml), ids)
62
61
  update_direct_refs_to_docs(docxml, identifier)
63
62
  hide_refs(docxml)
64
63
  @files.get(identifier, :sectionsplit_output) and eref2link(docxml)
64
+ svgmap_resolve(datauri_encode(docxml), ids)
65
65
  docxml.to_xml
66
66
  end
67
67
 
@@ -98,12 +98,12 @@ module Metanorma
98
98
  svgmap_resolve1(e, isodoc, docxml, ids)
99
99
  end
100
100
  Metanorma::Utils::svgmap_rewrite(docxml, "")
101
+ docxml.xpath(ns("//svgmap")).each { |s| isodoc.svgmap_extract(s) }
101
102
  end
102
103
 
103
104
  def svgmap_resolve1(eref, isodoc, _docxml, ids)
104
- href = isodoc.eref_target(eref)
105
+ href = isodoc.eref_target(eref) or return
105
106
  return if href == "##{eref['bibitemid']}" ||
106
- # (href =~ /^#/ && !docxml.at("//*[@id = '#{href.sub(/^#/, '')}']"))
107
107
  (href =~ /^#/ && !ids[href.sub(/^#/, "")])
108
108
 
109
109
  eref["target"] = href.strip
@@ -119,15 +119,24 @@ module Metanorma
119
119
  def update_direct_refs_to_docs(docxml, identifier)
120
120
  @ncnames = {}
121
121
  erefs = Util::gather_citeases(docxml)
122
+ erefs1 = Util::gather_bibitemids(docxml)
122
123
  docxml.xpath(ns("//bibitem")).each do |b|
123
- docid = b.at(ns("./docidentifier[@type = 'repository']"))
124
- (docid && %r{^current-metanorma-collection/}.match(docid.text)) or next
124
+ docid = b.at(ns("./docidentifier[@type = 'repository']")) or next
125
+ unless %r{^current-metanorma-collection/}.match(docid.text)
126
+ erefs1[b["id"]]&.each { |x| strip_eref(x) }
127
+ next
128
+ end
125
129
  update_bibitem(b, identifier)
126
130
  docid = docid_to_citeas(b) or next
127
131
  erefs[docid] and update_anchors(b, docid, erefs[docid])
128
132
  end
129
133
  end
130
134
 
135
+ def strip_eref(eref)
136
+ eref.xpath(ns("./locality | ./localityStack")).each(&:remove)
137
+ eref.replace(eref.children)
138
+ end
139
+
131
140
  def docid_to_citeas(bib)
132
141
  docid = bib.at(ns("./docidentifier[@primary = 'true']")) ||
133
142
  bib.at(ns("./docidentifier")) or return
@@ -157,7 +166,6 @@ module Metanorma
157
166
 
158
167
  def update_indirect_refs_to_docs1(_docxml, key, file, bibitems, erefs)
159
168
  erefs[key]&.each do |e|
160
- # docxml.xpath(ns("//eref[@bibitemid = '#{key}']")).each do |e|
161
169
  e["citeas"] = file
162
170
  a = e.at(ns(".//locality[@type = 'anchor']/referenceFrom")) and
163
171
  a.children = "#{a.text}_#{Metanorma::Utils::to_ncname(file)}"
@@ -172,7 +180,6 @@ module Metanorma
172
180
  # update crossrefences to other documents, to include
173
181
  # disambiguating document suffix on id
174
182
  def update_anchors(bib, docid, erefs)
175
- #docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
176
183
  erefs.each do |e|
177
184
  if @files.get(docid) then update_anchor_loc(bib, e, docid)
178
185
  else
@@ -118,7 +118,7 @@ module Metanorma
118
118
  end
119
119
 
120
120
  def docref_to_xml_attrs(elem, docref)
121
- elem[:fileref] = @disambig.source2dest_filename(docref["fileref"])
121
+ elem[:fileref] = @disambig.strip_root(docref["fileref"])
122
122
  %i(attachment sectionsplit).each do |i|
123
123
  elem[i] = docref[i.to_s] if docref[i.to_s]
124
124
  end
@@ -81,25 +81,25 @@ module Metanorma
81
81
  isodoc
82
82
  end
83
83
 
84
+ # create the @meta class of isodoc, for populating Liquid,
85
+ # with "navigation" set to the index bar.
86
+ # extracted from the manifest
84
87
  def isodoc_populate
85
- # create the @meta class of isodoc, for populating Liquid,
86
- # with "navigation" set to the index bar.
87
- # extracted from the manifest
88
- @isodoc.meta.set(:navigation, indexfile(@xml.at(ns("//manifest"))))
89
- @isodoc.meta.set(:docrefs, liquid_docrefs)
90
- @isodoc.meta.set(:"prefatory-content",
91
- isodoc_builder(@isodoc,
92
- @xml.at(ns("//prefatory-content"))))
93
- @isodoc.meta.set(:"final-content",
94
- isodoc_builder(isodoc,
95
- @xml.at(ns("//final-content"))))
96
88
  @isodoc.info(@xml, nil)
89
+ m = @xml.at(ns("//manifest"))
90
+ { navigation: indexfile(m), nav_object: index_object(m),
91
+ docrefs: liquid_docrefs,
92
+ "prefatory-content": isodoc_builder(@xml.at(ns("//prefatory-content"))),
93
+ "final-content": isodoc_builder(@xml.at(ns("//final-content"))),
94
+ doctitle: m.at(ns("../bibdata/title"))&.text,
95
+ docnumber: m.at(ns("../bibdata/docidentifier"))&.text
96
+ }.each { |k, v| v and @isodoc.meta.set(k, v) }
97
97
  end
98
98
 
99
- def isodoc_builder(isodoc, node)
99
+ def isodoc_builder(node)
100
100
  Nokogiri::HTML::Builder.new(encoding: "UTF-8") do |b|
101
101
  b.div do |div|
102
- node&.children&.each { |n| isodoc.parse(n, div) }
102
+ node&.children&.each { |n| @isodoc.parse(n, div) }
103
103
  end
104
104
  end.doc.root.to_html
105
105
  end
@@ -132,9 +132,7 @@ module Metanorma
132
132
  # @param elm [Nokogiri::XML::Element]
133
133
  # @return [String]
134
134
  def indexfile_title(elm)
135
- lvl = elm.at(ns("./level"))&.text&.capitalize
136
- lbl = elm.at(ns("./title"))&.text
137
- "#{lvl}#{lvl && lbl ? ': ' : ''}#{lbl}"
135
+ elm.at(ns("./title"))&.text
138
136
  end
139
137
 
140
138
  # uses the identifier to label documents; other attributes (title) can be
@@ -172,10 +170,6 @@ module Metanorma
172
170
  end
173
171
 
174
172
  # single level navigation list, with hierarchical nesting
175
- # if multiple lists are needed as separate HTML fragments, multiple
176
- # instances of this function will be needed,
177
- # and associated to different variables in the call to @isodoc.metadata_init
178
- # (including possibly an array of HTML fragments)
179
173
  #
180
174
  # @param elm [Nokogiri::XML::Element]
181
175
  # @return [String] XML
@@ -191,6 +185,20 @@ module Metanorma
191
185
  end.doc.root.to_html
192
186
  end
193
187
 
188
+ # object to construct navigation out of in Liquid
189
+ def index_object(elm)
190
+ c = elm.xpath(ns("./manifest")).each_with_object([]) do |d, b|
191
+ b << index_object(d)
192
+ end
193
+ c.empty? and c = nil
194
+ r = Nokogiri::HTML::Builder.new do |b|
195
+ indexfile_docref(elm, b)
196
+ end
197
+ r &&= r.doc.root&.to_html&.gsub("\n", " ")
198
+ { title: indexfile_title(elm),
199
+ docrefs: r, children: c }.compact
200
+ end
201
+
194
202
  def liquid_docrefs
195
203
  @xml.xpath(ns("//docref[@index = 'true']")).each_with_object([]) do |d, m|
196
204
  ident = d.at(ns("./identifier")).children.to_xml
@@ -1,6 +1,7 @@
1
1
  require "isodoc"
2
2
  require "htmlentities"
3
3
  require "metanorma-utils"
4
+ require_relative "files_lookup_sectionsplit"
4
5
 
5
6
  module Metanorma
6
7
  # XML collection renderer
@@ -25,6 +26,7 @@ module Metanorma
25
26
  end
26
27
 
27
28
  def read_files
29
+ @disambig = Util::DisambigFiles.new
28
30
  @xml.xpath(ns("//docref")).each { |d| read_file(d) }
29
31
  end
30
32
 
@@ -58,79 +60,28 @@ module Metanorma
58
60
  entry[:bibitem].at("./*[local-name() = 'ext']")&.remove
59
61
  end
60
62
 
61
- def add_section_split
62
- ret = @files.keys.each_with_object({}) do |k, m|
63
- if @files[k][:sectionsplit] == "true" && !@files[k]["attachment"]
64
- s, manifest = sectionsplit(@files[k][:ref], k)
65
- s.each_with_index { |f1, i| add_section_split_instance(f1, m, k, i) }
66
- m["#{k}:index.html"] = add_section_split_cover(manifest, k)
67
- @files_to_delete << m["#{k}:index.html"][:ref]
68
- end
69
- m[k] = @files[k]
70
- end
71
- @files = ret
72
- end
73
-
74
- def add_section_split_cover(manifest, ident)
75
- cover = @sectionsplit.section_split_cover(manifest,
76
- @parent.dir_name_cleanse(ident))
77
- @files[ident][:out_path] = cover
78
- { attachment: true, index: false, out_path: cover,
79
- ref: File.join(File.dirname(manifest.file), cover) }
80
- end
81
-
82
- def add_section_split_instance(file, manifest, key, idx)
83
- presfile, newkey, xml =
84
- add_section_split_instance_prep(file, key)
85
- manifest[newkey] =
86
- { parentid: key, presentationxml: true, type: "fileref",
87
- rel_path: file[:url], out_path: File.basename(file[:url]),
88
- anchors: read_anchors(xml), ids: read_ids(xml),
89
- sectionsplit_output: true,
90
- bibdata: @files[key][:bibdata], ref: presfile }
91
- @files_to_delete << file[:url]
92
- manifest[newkey][:bare] = true unless idx.zero?
93
- end
94
-
95
- def add_section_split_instance_prep(file, key)
96
- presfile = File.join(File.dirname(@files[key][:ref]),
97
- File.basename(file[:url]))
98
- newkey = key("#{key.strip} #{file[:title]}")
99
- xml = Nokogiri::XML(File.read(presfile), &:huge)
100
- [presfile, newkey, xml]
101
- end
102
-
103
- def sectionsplit(file, ident)
104
- @sectionsplit =
105
- Sectionsplit.new(input: file, base: File.basename(file), dir: File.dirname(file),
106
- output: file, compile_options: @parent.compile_options,
107
- fileslookup: self, ident: ident, isodoc: @isodoc)
108
- coll = @sectionsplit.sectionsplit.sort_by { |f| f[:order] }
109
- # s = @compile.sectionsplit(file, File.basename(file), File.dirname(file),
110
- # @parent.compile_options, self, ident)
111
- # .sort_by { |f| f[:order] }
112
- # xml = Nokogiri::XML(File.read(file, encoding: "UTF-8")) { |x| x.huge }
113
- xml = Nokogiri::XML(File.read(file, encoding: "UTF-8"), &:huge)
114
- [coll, @sectionsplit
115
- .collection_manifest(File.basename(file), coll, xml, nil,
116
- File.dirname(file))]
117
- end
118
-
119
63
  # rel_path is the source file address, determined relative to the YAML.
120
64
  # out_path is the destination file address, with any references outside
121
65
  # the working directory (../../...) truncated
122
66
  # identifier is the id with only spaces, no nbsp
123
67
  def file_entry(ref, identifier)
124
68
  out = ref["attachment"] ? ref["fileref"] : File.basename(ref["fileref"])
69
+ out1 = @disambig.source2dest_filename(out)
125
70
  ret = if ref["fileref"]
126
71
  { type: "fileref", ref: @documents[identifier].file,
127
- rel_path: ref["fileref"], out_path: out }
128
- else { type: "id", ref: ref["id"] } end
72
+ rel_path: ref["fileref"],
73
+ out_path: out1 } # @disambig.source2dest_filename(out) }
74
+ else { type: "id", ref: ref["id"] }
75
+ end
76
+ file_entry_copy(ref, ret)
77
+ ret.compact
78
+ end
79
+
80
+ def file_entry_copy(ref, ret)
129
81
  %w(attachment sectionsplit index presentation-xml
130
82
  bare-after-first).each do |s|
131
83
  ret[s.gsub("-", "").to_sym] = ref[s] if ref[s]
132
84
  end
133
- ret.compact
134
85
  end
135
86
 
136
87
  def add_suffix_to_attributes(doc, suffix, tag_name, attribute_name)
@@ -0,0 +1,69 @@
1
+ module Metanorma
2
+ # XML collection renderer
3
+ class FileLookup
4
+ def add_section_split
5
+ ret = @files.keys.each_with_object({}) do |k, m|
6
+ if @files[k][:sectionsplit] == "true" && !@files[k]["attachment"]
7
+ s, manifest = sectionsplit(@files[k][:ref], @files[k][:out_path], k)
8
+ s.each_with_index { |f1, i| add_section_split_instance(f1, m, k, i) }
9
+ m["#{k}:index.html"] = add_section_split_cover(manifest, k)
10
+ @files_to_delete << m["#{k}:index.html"][:ref]
11
+ end
12
+ m[k] = @files[k]
13
+ end
14
+ @files = ret
15
+ end
16
+
17
+ def add_section_split_cover(manifest, ident)
18
+ cover = @sectionsplit
19
+ .section_split_cover(manifest, @parent.dir_name_cleanse(ident),
20
+ one_doc_collection?)
21
+ @files[ident][:out_path] = cover
22
+ { attachment: true, index: false, out_path: cover,
23
+ ref: File.join(File.dirname(manifest.file), cover) }
24
+ end
25
+
26
+ def one_doc_collection?
27
+ docs = 0
28
+ @files.each_value do |v|
29
+ v[:attachment] and next
30
+ v[:presentationxml] and next
31
+ docs += 1
32
+ end
33
+ docs > 1
34
+ end
35
+
36
+ def add_section_split_instance(file, manifest, key, idx)
37
+ presfile, newkey, xml =
38
+ add_section_split_instance_prep(file, key)
39
+ manifest[newkey] =
40
+ { parentid: key, presentationxml: true, type: "fileref",
41
+ rel_path: file[:url], out_path: File.basename(file[:url]),
42
+ anchors: read_anchors(xml), ids: read_ids(xml),
43
+ sectionsplit_output: true,
44
+ bibdata: @files[key][:bibdata], ref: presfile }
45
+ @files_to_delete << file[:url]
46
+ manifest[newkey][:bare] = true unless idx.zero?
47
+ end
48
+
49
+ def add_section_split_instance_prep(file, key)
50
+ presfile = File.join(File.dirname(@files[key][:ref]),
51
+ File.basename(file[:url]))
52
+ newkey = key("#{key.strip} #{file[:title]}")
53
+ xml = Nokogiri::XML(File.read(presfile), &:huge)
54
+ [presfile, newkey, xml]
55
+ end
56
+
57
+ def sectionsplit(file, outfile, ident)
58
+ @sectionsplit = Sectionsplit
59
+ .new(input: file, base: outfile, dir: File.dirname(file),
60
+ output: outfile, compile_options: @parent.compile_options,
61
+ fileslookup: self, ident: ident, isodoc: @isodoc)
62
+ coll = @sectionsplit.sectionsplit.sort_by { |f| f[:order] }
63
+ xml = Nokogiri::XML(File.read(file, encoding: "UTF-8"), &:huge)
64
+ [coll, @sectionsplit
65
+ .collection_manifest(File.basename(file), coll, xml, nil,
66
+ File.dirname(file))]
67
+ end
68
+ end
69
+ end
@@ -18,7 +18,8 @@ module Metanorma
18
18
  end
19
19
 
20
20
  def input_to_isodoc(file, filename, options = {})
21
- Metanorma::Input::Asciidoc.new.process(file, filename, @asciidoctor_backend, options)
21
+ Metanorma::Input::Asciidoc.new.process(file, filename,
22
+ @asciidoctor_backend, options)
22
23
  end
23
24
 
24
25
  # def input_to_isodoc(file, filename)
@@ -33,12 +34,17 @@ module Metanorma
33
34
  end
34
35
  end
35
36
 
37
+ def options_preprocess(options)
38
+ options[:output_formats] = output_formats
39
+ end
40
+
36
41
  def output(isodoc_node, _inname, outname, _format, _options = {})
37
42
  File.open(outname, "w:UTF-8") { |f| f.write(isodoc_node) }
38
43
  end
39
44
 
40
45
  def extract_options(file)
41
46
  Metanorma::Input::Asciidoc.new.extract_options(file)
47
+ .merge(output_formats: output_formats)
42
48
  end
43
49
 
44
50
  def extract_metanorma_options(file)
@@ -109,7 +109,8 @@ module Metanorma
109
109
  type = xml.root.name.sub("-standard", "").to_sym
110
110
  @fileslookup&.parent&.update_xrefs(xml, @ident, {})
111
111
  xml1 = Tempfile.open([filename, ".xml"], encoding: "utf-8") do |f|
112
- f.write(@isodoc.to_xml(svg_preprocess(xml)))
112
+ #f.write(@isodoc.to_xml(svg_preprocess(xml)))
113
+ f.write(@isodoc.to_xml((xml)))
113
114
  f
114
115
  end
115
116
  @filecache ||= []
@@ -184,17 +185,17 @@ module Metanorma
184
185
  Util::recursive_string_keys(ret).to_yaml
185
186
  end
186
187
 
187
- def section_split_cover(col, ident)
188
+ def section_split_cover(col, ident, one_doc_coll)
188
189
  dir = File.dirname(col.file)
189
190
  collection_setup(nil, dir)
190
191
  CollectionRenderer.new(col, dir,
191
192
  output_folder: "#{ident}_collection",
192
193
  format: %i(html),
193
194
  coverpage: File.join(dir, "cover.html")).coverpage
194
- FileUtils.mv "#{ident}_collection/index.html",
195
- File.join(dir, "#{ident}_index.html")
195
+ filename = one_doc_coll ? "#{ident}_index.html" : "index.html"
196
+ FileUtils.mv "#{ident}_collection/index.html", File.join(dir, filename)
196
197
  FileUtils.rm_rf "#{ident}_collection"
197
- "#{ident}_index.html"
198
+ filename
198
199
  end
199
200
  end
200
201
  end
@@ -1,12 +1,13 @@
1
1
  module Metanorma
2
2
  class Sectionsplit
3
- def xref_preprocess(xml, fileslookup, identifier)
3
+ def xref_preprocess(xml, _fileslookup, _identifier)
4
4
  key = (0...8).map { rand(65..90).chr }.join # random string
5
5
  xml.root["type"] = key # to force recognition of internal refs
6
6
  key
7
7
  end
8
8
 
9
9
  def xref_process(section, xml, key)
10
+ svg_preprocess(section, Metanorma::Utils::to_ncname(@ident))
10
11
  refs = eref_to_internal_eref(section, xml, key)
11
12
  refs += xref_to_internal_eref(section, key)
12
13
  ins = new_hidden_ref(section)
@@ -14,15 +15,14 @@ module Metanorma
14
15
  insert_indirect_biblio(ins, refs - copied_refs, key)
15
16
  end
16
17
 
17
- def svg_preprocess(xml)
18
+ def svg_preprocess(xml, document_suffix)
18
19
  xml.xpath("//m:svg", "m" => "http://www.w3.org/2000/svg").each do |s|
19
20
  m = svgmap_wrap(s)
20
21
  s.xpath(".//m:a", "m" => "http://www.w3.org/2000/svg").each do |a|
21
- next unless /^#/.match? a["href"]
22
-
22
+ /^#/.match? a["href"] or next
23
23
  a["href"] = a["href"].sub(/^#/, "")
24
24
  m << "<target href='#{a['href']}'>" \
25
- "<xref target='#{a['href']}'/></target>"
25
+ "<xref target='#{a['href']}_#{document_suffix}'/></target>"
26
26
  end
27
27
  end
28
28
  xml
@@ -65,8 +65,12 @@ module Metanorma
65
65
  @seen_filenames = []
66
66
  end
67
67
 
68
+ def strip_root(name)
69
+ name.sub(%r{^(\./)?(\.\./)+}, "")
70
+ end
71
+
68
72
  def source2dest_filename(name, disambig = true)
69
- n = name.sub(%r{^(\./)?(\.\./)+}, "")
73
+ n = strip_root(name)
70
74
  dir = File.dirname(n)
71
75
  base = File.basename(n)
72
76
  if disambig && @seen_filenames.include?(base)
@@ -1,3 +1,3 @@
1
1
  module Metanorma
2
- VERSION = "1.6.3".freeze
2
+ VERSION = "1.6.5".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.3
4
+ version: 1.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-25 00:00:00.000000000 Z
11
+ date: 2023-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -269,6 +269,7 @@ files:
269
269
  - lib/metanorma/document.rb
270
270
  - lib/metanorma/extract.rb
271
271
  - lib/metanorma/files_lookup.rb
272
+ - lib/metanorma/files_lookup_sectionsplit.rb
272
273
  - lib/metanorma/fontist_utils.rb
273
274
  - lib/metanorma/input.rb
274
275
  - lib/metanorma/input/asciidoc.rb