metanorma 1.6.3 → 1.6.5

Sign up to get free protection for your applications and to get access to all the features.
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