metanorma 1.7.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -1
  3. data/lib/metanorma/array_monkeypatch.rb +9 -0
  4. data/lib/metanorma/asciidoctor_extensions/glob_include_processor.rb +13 -11
  5. data/lib/metanorma/collection/collection.rb +225 -0
  6. data/lib/metanorma/collection/config/bibdata.rb +12 -0
  7. data/lib/metanorma/collection/config/compile_options.rb +13 -0
  8. data/lib/metanorma/collection/config/config.rb +163 -0
  9. data/lib/metanorma/collection/config/converters.rb +30 -0
  10. data/lib/metanorma/collection/config/directive.rb +10 -0
  11. data/lib/metanorma/collection/config/manifest.rb +88 -0
  12. data/lib/metanorma/collection/document/document.rb +133 -0
  13. data/lib/metanorma/collection/filelookup/filelookup.rb +250 -0
  14. data/lib/metanorma/collection/filelookup/filelookup_sectionsplit.rb +87 -0
  15. data/lib/metanorma/collection/manifest/manifest.rb +237 -0
  16. data/lib/metanorma/collection/renderer/fileparse.rb +247 -0
  17. data/lib/metanorma/collection/renderer/fileprocess.rb +173 -0
  18. data/lib/metanorma/collection/renderer/navigation.rb +133 -0
  19. data/lib/metanorma/collection/renderer/render_word.rb +133 -0
  20. data/lib/metanorma/collection/renderer/renderer.rb +157 -0
  21. data/lib/metanorma/collection/renderer/utils.rb +183 -0
  22. data/lib/metanorma/collection/sectionsplit/sectionsplit.rb +218 -0
  23. data/lib/metanorma/collection/util/disambig_files.rb +37 -0
  24. data/lib/metanorma/collection/util/util.rb +72 -0
  25. data/lib/metanorma/collection/xrefprocess/xrefprocess.rb +222 -0
  26. data/lib/metanorma/{compile.rb → compile/compile.rb} +17 -11
  27. data/lib/metanorma/{compile_options.rb → compile/compile_options.rb} +9 -5
  28. data/lib/metanorma/{compile_validate.rb → compile/compile_validate.rb} +1 -1
  29. data/lib/metanorma/{extract.rb → compile/extract.rb} +2 -2
  30. data/lib/metanorma/{config.rb → config/config.rb} +1 -1
  31. data/lib/metanorma/input/asciidoc.rb +3 -3
  32. data/lib/metanorma/input/base.rb +1 -5
  33. data/lib/metanorma/processor/processor.rb +54 -0
  34. data/lib/metanorma/processor.rb +1 -49
  35. data/lib/metanorma/{registry.rb → registry/registry.rb} +0 -1
  36. data/lib/metanorma/shale_monkeypatch.rb +15 -0
  37. data/lib/metanorma/util/fontist_helper.rb +130 -0
  38. data/lib/metanorma/util/util.rb +45 -0
  39. data/lib/metanorma/util/worker_pool.rb +39 -0
  40. data/lib/metanorma/version.rb +1 -1
  41. data/lib/metanorma.rb +13 -8
  42. data/metanorma.gemspec +2 -1
  43. metadata +50 -24
  44. data/lib/metanorma/collection.rb +0 -244
  45. data/lib/metanorma/collection_fileparse.rb +0 -257
  46. data/lib/metanorma/collection_fileprocess.rb +0 -168
  47. data/lib/metanorma/collection_manifest.rb +0 -168
  48. data/lib/metanorma/collection_render_utils.rb +0 -169
  49. data/lib/metanorma/collection_render_word.rb +0 -131
  50. data/lib/metanorma/collection_renderer.rb +0 -237
  51. data/lib/metanorma/collection_xref_process.rb +0 -217
  52. data/lib/metanorma/document.rb +0 -133
  53. data/lib/metanorma/files_lookup.rb +0 -224
  54. data/lib/metanorma/files_lookup_sectionsplit.rb +0 -84
  55. data/lib/metanorma/fontist_utils.rb +0 -122
  56. data/lib/metanorma/sectionsplit.rb +0 -216
  57. data/lib/metanorma/util.rb +0 -127
  58. data/lib/metanorma/worker_pool.rb +0 -29
@@ -1,217 +0,0 @@
1
- module Metanorma
2
- module XrefProcess
3
- class << self
4
- def xref_preprocess(xml, isodoc)
5
- @isodoc = isodoc
6
- key = (0...8).map { rand(65..90).chr }.join # random string
7
- xml.root["type"] = key # to force recognition of internal refs
8
- # bookmarks etc as new id elements introduced in Presentation XML:
9
- # add doc suffix
10
- Metanorma::Utils::anchor_attributes.each do |(tag_name, attribute_name)|
11
- Util::add_suffix_to_attributes(xml, xml.root["document_suffix"],
12
- tag_name, attribute_name, isodoc)
13
- end
14
- key
15
- end
16
-
17
- def ns(xpath)
18
- @isodoc.ns(xpath)
19
- end
20
-
21
- def xref_process(section, xml, key, ident, isodoc)
22
- @isodoc ||= isodoc
23
- svg_preprocess(section, Metanorma::Utils::to_ncname(ident))
24
- refs = eref_to_internal_eref(section, xml, key)
25
- refs += xref_to_internal_eref(section, xml, key)
26
- ins = new_hidden_ref(section)
27
- copied_refs = copy_repo_items_biblio(ins, section, xml)
28
- insert_indirect_biblio(ins, refs - copied_refs, key, xml)
29
- end
30
-
31
- def svg_preprocess(xml, doc_suffix)
32
- suffix = doc_suffix.nil? || doc_suffix.blank? ? "" : "_#{doc_suffix}"
33
- xml.xpath("//m:svg", "m" => "http://www.w3.org/2000/svg").each do |s|
34
- m = svgmap_wrap(s)
35
- svg_xrefs(s, m, suffix)
36
- end
37
- xml
38
- end
39
-
40
- def svgmap_wrap(svg)
41
- ret = svg.at("./ancestor::xmlns:svgmap") and return ret
42
- ret = svg.at("./ancestor::xmlns:figure")
43
- ret.wrap("<svgmap/>")
44
- svg.at("./ancestor::xmlns:svgmap")
45
- end
46
-
47
- def svg_xrefs(svg, svgmap, suffix)
48
- svg.xpath(".//m:a", "m" => "http://www.w3.org/2000/svg").each do |a|
49
- /^#/.match? a["href"] or next
50
- a["href"] = a["href"].sub(/^#/, "")
51
- svgmap << "<target href='#{a['href']}'>" \
52
- "<xref target='#{a['href']}#{suffix}'/></target>"
53
- end
54
- end
55
-
56
- def make_anchor(elem, anchor)
57
- elem.at(ns("./localityStack | ./locality")) and return
58
- elem.text.strip.empty? and elem << anchor
59
- elem <<
60
- "<localityStack><locality type='anchor'><referenceFrom>" \
61
- "#{anchor}</referenceFrom></locality></localityStack>"
62
- end
63
-
64
- def xref_to_internal_eref(section, xml, key)
65
- key or return [] # no sectionsplit, no playing with xrefs
66
- bibitems, indirect = xref_to_internal_eref_prep(section, xml)
67
- section.xpath(ns("//xref")).each_with_object({}) do |x, m|
68
- xref_prefix_key(x, key, indirect)
69
- x["bibitemid"] = x["target"]
70
- m[x["bibitemid"]] = true
71
- xref_to_internal_eref_anchor(x, key, bibitems,
72
- xml.root["document_suffix"])
73
- end.keys
74
- end
75
-
76
- def xref_to_internal_eref_prep(section, xml)
77
- bibitems = Util::gather_bibitems(section)
78
- indirect_bibitems = Util::gather_bibitems(xml)
79
- .select { |_, v| indirect_bib?(v) }
80
- [bibitems, indirect_bibitems]
81
- end
82
-
83
- def xref_to_internal_eref_anchor(xref, key, bibitems, document_suffix)
84
- t = xref["target"]
85
- if d = bibitems[t]&.at(ns("./docidentifier[@type = 'repository']"))
86
- m = %r{^([^/]+)}.match(d.text) and
87
- t.sub!(%r(#{m[0]}_), "")
88
- end
89
- key and t.sub!(%r{^#{key}_}, "")
90
- make_anchor(xref, t.sub(%r(_#{document_suffix}$), ""))
91
- xref.delete("target")
92
- xref.name = "eref"
93
- end
94
-
95
- def xref_prefix_key(xref, key, indirect)
96
- if b = indirect[xref["target"]]
97
- t = b.at(ns("./docidentifier[@type = 'repository']"))
98
- xref["type"] = t.text.sub(%r{/.*$}, "")
99
- elsif key
100
- xref["target"] = "#{key}_#{xref['target']}"
101
- xref["type"] = key
102
- end
103
- end
104
-
105
- def eref_to_internal_eref(section, xml, key)
106
- bibitems, indirect, bibids = eref_to_internal_eref_prep(section, xml)
107
- eref_to_internal_eref_select(section, xml, bibitems)
108
- .each_with_object([]) do |x, m|
109
- url = bibitems[x]&.at(ns("./uri[@type = 'citation']"))&.text
110
- bibids[x]&.each do |e|
111
- e.at(ns("./localityStack | ./locality")) and next
112
- id = eref_to_internal_eref1(e, key, url, indirect) and m << id
113
- end
114
- end
115
- end
116
-
117
- def eref_to_internal_eref_prep(section, xml)
118
- bibitems = Util::gather_bibitems(xml)
119
- .delete_if { |_, v| internal_bib?(v) }
120
- indirect = Util::gather_bibitems(xml)
121
- .select { |_, v| indirect_bib?(v) }
122
- bibitemids = Util::gather_bibitemids(section)
123
- [bibitems, indirect, bibitemids]
124
- end
125
-
126
- def eref_to_internal_eref1(elem, key, url, indirect)
127
- if url
128
- elem.name = "link"
129
- elem["target"] = url
130
- nil
131
- elsif !indirect[elem["bibitemid"]]
132
- nil
133
- else
134
- eref_to_internal_eref1_internal(elem, key, indirect)
135
- end
136
- end
137
-
138
- def eref_to_internal_eref1_internal(elem, key, indirect)
139
- t = elem["bibitemid"]
140
- if key
141
- t = "#{key}_#{t}"
142
- elem["type"] = key
143
- elsif d = indirect[t]&.at(ns("./docidentifier[@type = 'repository']"))
144
- m = %r{^([^/]+)}.match(d.text) and
145
- t.sub!(%r(#{m[0]}_), "")
146
- end
147
- make_anchor(elem, t)
148
- elem["bibitemid"]
149
- end
150
-
151
- def eref_to_internal_eref_select(section, _xml, bibitems)
152
- refs = Util::gather_bibitemids(section).keys
153
- refs.uniq.reject do |x|
154
- b = bibitems[x] and (indirect_bib?(b) || internal_bib?(b))
155
- end
156
- end
157
-
158
- def internal_bib?(bibitem)
159
- bibitem["type"] == "internal" ||
160
- bibitem.at(ns("./docidentifier[@type = 'repository']"))
161
- end
162
-
163
- def indirect_bib?(bibitem)
164
- a = bibitem.at(ns("./docidentifier[@type = 'repository']")) or
165
- return false
166
- %r{^current-metanorma-collection/}.match?(a.text) and return false
167
- a.text.include?("/")
168
- end
169
-
170
- # from standoc
171
- def new_hidden_ref(xmldoc)
172
- ins = xmldoc.at("bibliography") or
173
- xmldoc.root << "<bibliography/>" and ins = xmldoc.at("bibliography")
174
- ins.add_child("<references hidden='true' normative='false'/>").first
175
- end
176
-
177
- def copy_repo_items_biblio(ins, section, xml)
178
- bibitems = Util::gather_bibitems(section)
179
- xml.xpath(ns("//references/bibitem[docidentifier/@type = 'repository']"))
180
- .each_with_object([]) do |b, m|
181
- bibitems[b["id"]] or next
182
- # section.at("//*[@bibitemid = '#{b['id']}']") or next
183
- ins << b.dup
184
- m << b["id"]
185
- end
186
- end
187
-
188
- def insert_indirect_biblio(ins, refs, key, xml)
189
- refs.empty? and return
190
- internal_bibitems, external_bibitems = insert_indirect_biblio_prep(xml)
191
- refs.compact.reject do |x|
192
- # external_bibitems[x.sub(/^#{key}_/, "")]
193
- end.each do |x|
194
- ins << if b = internal_bibitems[x.sub(/^#{key}_/, "")]
195
- b.dup.tap { |m| m["id"] = x }
196
- else new_indirect_bibitem(x, key)
197
- end
198
- end
199
- end
200
-
201
- def insert_indirect_biblio_prep(xml)
202
- bibitems = Util::gather_bibitems(xml)
203
- internal_bibitems = bibitems.select { |_, v| internal_bib?(v) }
204
- external_bibitems = bibitems.reject { |_, v| internal_bib?(v) }
205
- [internal_bibitems, external_bibitems]
206
- end
207
-
208
- def new_indirect_bibitem(ident, prefix)
209
- <<~BIBENTRY
210
- <bibitem id="#{ident}" type="internal">
211
- <docidentifier type="repository">#{ident.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
212
- </bibitem>
213
- BIBENTRY
214
- end
215
- end
216
- end
217
- end
@@ -1,133 +0,0 @@
1
- module Metanorma
2
- class Document
3
- # @return [Strin]
4
- attr_reader :file, :attachment, :bibitem, :index
5
-
6
- # @param bibitem [RelatonBib::BibliographicItem]
7
- def initialize(bibitem, file, options = {})
8
- @bibitem = bibitem
9
- @file = file
10
- @attachment = options[:attachment]
11
- @index = options[:index]
12
- @index = true if @index.nil?
13
- @raw = options[:raw]
14
- end
15
-
16
- class << self
17
- # @param file [String] file path
18
- # @param attachment [Bool] is an attachment
19
- # @param identifier [String] is the identifier assigned the file
20
- # in the collection file
21
- # @param index [Bool] is indication on whether to index this file in coverpage
22
- # @return [Metanorma::Document]
23
- def parse_file(file, attachment, identifier = nil, index = true)
24
- new(bibitem(file, attachment, identifier), file,
25
- { attachment: attachment, index: index })
26
- end
27
-
28
- # #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
29
- # @return [Metanorma::Document]
30
- def parse_xml(xml)
31
- new from_xml(xml)
32
- end
33
-
34
- # raw XML file, can be used to put in entire file instead of just bibitem
35
- def raw_file(filename)
36
- doc = Nokogiri::XML(File.read(filename, encoding: "UTF-8")) do |config|
37
- config.huge
38
- end
39
- new(doc, filename, raw: true)
40
- end
41
-
42
- def attachment_bibitem(identifier)
43
- Nokogiri::XML <<~DOCUMENT
44
- <bibdata><docidentifier>#{identifier}</docidentifier></bibdata>
45
- DOCUMENT
46
- end
47
-
48
- private
49
-
50
- def mn2relaton_parser(tag)
51
- case tag.sub(/-standard/, "")
52
- when "bipm" then RelatonBipm::XMLParser
53
- when "bsi" then RelatonBsi::XMLParser
54
- when "ietf" then RelatonIetf::XMLParser
55
- when "iho" then RelatonIho::XMLParser
56
- when "itu" then RelatonItu::XMLParser
57
- when "iec" then RelatonIec::XMLParser
58
- when "iso" then RelatonIsoBib::XMLParser
59
- when "nist" then RelatonNist::XMLParser
60
- when "ogc" then RelatonOgc::XMLParser
61
- else RelatonBib::XMLParser
62
- end
63
- end
64
-
65
- # #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
66
- # @return [RelatonBib::BibliographicItem,RelatonIso::IsoBibliographicItem]
67
- def from_xml(xml)
68
- b = xml.at("//xmlns:bibitem|//xmlns:bibdata")
69
- r = mn2relaton_parser(xml.root.name)
70
- r.from_xml(b.to_xml)
71
- end
72
-
73
- # @param file [String]
74
- # @return [Symbol] file type
75
- def format(file)
76
- case file
77
- when /\.xml$/ then :xml
78
- when /.ya?ml$/ then :yaml
79
- end
80
- end
81
-
82
- # @param file [String]
83
- # @return [RelatonBib::BibliographicItem,
84
- # RelatonIso::IsoBibliographicItem]
85
- def bibitem(file, attachment, identifier)
86
- if attachment then attachment_bibitem(identifier)
87
- else
88
- case format(file)
89
- when :xml
90
- from_xml (Nokogiri::XML(File.read(file, encoding: "UTF-8")) { |x| x.huge })
91
- when :yaml
92
- yaml = File.read(file, encoding: "UTF-8")
93
- Relaton::Cli::YAMLConvertor.convert_single_file(yaml)
94
- end
95
- end
96
- end
97
- end
98
-
99
- # @param builder [Nokogiri::XML::Builder, nil]
100
- # @return [Nokogiri::XML::Builder, String]
101
- def to_xml(builder = nil)
102
- if builder
103
- render_xml builder
104
- else
105
- Nokogiri::XML::Builder.new do |b|
106
- root = render_xml b
107
- root["xmlns"] = "http://metanorma.org"
108
- end.to_xml
109
- end
110
- end
111
-
112
- # @return [String]
113
- def type
114
- first = @bibitem.docidentifier.first
115
- @type ||= (first&.type&.downcase ||
116
- first&.id&.match(/^[^\s]+/)&.to_s)&.downcase ||
117
- "standoc"
118
- end
119
-
120
- private
121
-
122
- def render_xml(builder)
123
- if @raw
124
- #builder << @bibitem.root.to_xml
125
- builder.parent.add_child(@bibitem.root)
126
- else
127
- builder.send("#{type}-standard") do |b|
128
- b << @bibitem.to_xml(bibdata: true)
129
- end
130
- end
131
- end
132
- end
133
- end
@@ -1,224 +0,0 @@
1
- require "isodoc"
2
- require "htmlentities"
3
- require "metanorma-utils"
4
- require_relative "files_lookup_sectionsplit"
5
-
6
- module Metanorma
7
- # XML collection renderer
8
- class FileLookup
9
- attr_accessor :files_to_delete, :parent
10
-
11
- # hash for each document in collection of document identifier to:
12
- # document reference (fileref or id), type of document reference,
13
- # and bibdata entry for that file
14
- # @param path [String] path to collection
15
- def initialize(path, parent)
16
- @c = HTMLEntities.new
17
- @files = {}
18
- @parent = parent
19
- @xml = parent.xml
20
- @isodoc = parent.isodoc
21
- @path = path
22
- @compile = parent.compile
23
- @documents = parent.documents
24
- @files_to_delete = []
25
- read_files
26
- end
27
-
28
- def read_files
29
- @disambig = Util::DisambigFiles.new
30
- @xml.xpath(ns("//docref")).each { |d| read_file(d) }
31
- end
32
-
33
- def read_file(docref)
34
- ident = docref.at(ns("./identifier"))
35
- i = key(@isodoc.docid_prefix(ident["type"], ident.children.to_xml))
36
- entry = file_entry(docref, ident.children.to_xml) or return
37
- bibdata_process(entry, i)
38
- bibitem_process(entry)
39
- @files[i] = entry
40
- end
41
-
42
- def bibdata_process(entry, ident)
43
- if entry[:attachment]
44
- entry[:bibdata] = Metanorma::Document.attachment_bibitem(ident).root
45
- else
46
- file, _filename = targetfile(entry, read: true)
47
- xml = Nokogiri::XML(file, &:huge)
48
- add_document_suffix(ident, xml)
49
- entry.merge!(anchors: read_anchors(xml), ids: read_ids(xml),
50
- bibdata: xml.at(ns("//bibdata")),
51
- document_suffix: xml.root["document_suffix"])
52
- end
53
- end
54
-
55
- def bibitem_process(entry)
56
- entry[:bibitem] = entry[:bibdata].dup
57
- entry[:bibitem].name = "bibitem"
58
- entry[:bibitem]["hidden"] = "true"
59
- entry[:bibitem].at("./*[local-name() = 'ext']")&.remove
60
- end
61
-
62
- # rel_path is the source file address, determined relative to the YAML.
63
- # out_path is the destination file address, with any references outside
64
- # the working directory (../../...) truncated
65
- # identifier is the id with only spaces, no nbsp
66
- def file_entry(ref, identifier)
67
- ref["fileref"] or return
68
- out = ref["attachment"] ? ref["fileref"] : File.basename(ref["fileref"])
69
- out1 = @disambig.source2dest_filename(out)
70
- ret = if ref["fileref"]
71
- { type: "fileref", ref: @documents[Util::key identifier].file,
72
- rel_path: ref["fileref"], url: ref["url"],
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)
81
- %w(attachment sectionsplit index presentation-xml url
82
- bare-after-first).each do |s|
83
- ret[s.gsub("-", "").to_sym] = ref[s] if ref[s]
84
- end
85
- end
86
-
87
- def add_document_suffix(identifier, doc)
88
- document_suffix = Metanorma::Utils::to_ncname(identifier)
89
- Metanorma::Utils::anchor_attributes.each do |(tag_name, attribute_name)|
90
- Util::add_suffix_to_attributes(doc, document_suffix, tag_name,
91
- attribute_name, @isodoc)
92
- end
93
- url_in_css_styles(doc, document_suffix)
94
- doc.root["document_suffix"] ||= ""
95
- doc.root["document_suffix"] += document_suffix
96
- end
97
-
98
- # update relative URLs, url(#...), in CSS in @style attrs (including SVG)
99
- def url_in_css_styles(doc, document_suffix)
100
- doc.xpath("//*[@style]").each do |s|
101
- s["style"] = s["style"]
102
- .gsub(%r{url\(#([^)]+)\)}, "url(#\\1_#{document_suffix})")
103
- end
104
- end
105
-
106
- # return citation url for file
107
- # @param doc [Boolean] I am a Metanorma document,
108
- # so my URL should end with html or pdf or whatever
109
- def url(ident, options)
110
- data = get(ident)
111
- data[:url] || targetfile(data, options)[1]
112
- end
113
-
114
- # are references to the file to be linked to a file in the collection,
115
- # or externally? Determines whether file suffix anchors are to be used
116
- def url?(ident)
117
- data = get(ident) or return false
118
- data[:url]
119
- end
120
-
121
- # return file contents + output filename for each file in the collection,
122
- # given a docref entry
123
- # @param data [Hash] docref entry
124
- # @param read [Boolean] read the file in and return it
125
- # @param doc [Boolean] I am a Metanorma document,
126
- # so my URL should end with html or pdf or whatever
127
- # @param relative [Boolean] Return output path,
128
- # formed relative to YAML file, not input path, relative to calling function
129
- # @return [Array<String, nil>]
130
- def targetfile(data, options)
131
- options = { read: false, doc: true, relative: false }.merge(options)
132
- path = options[:relative] ? data[:rel_path] : data[:ref]
133
- if data[:type] == "fileref"
134
- ref_file path, data[:out_path], options[:read], options[:doc]
135
- else
136
- xml_file data[:id], options[:read]
137
- end
138
- end
139
-
140
- def targetfile_id(ident, options)
141
- targetfile(get(ident), options)
142
- end
143
-
144
- def ref_file(ref, out, read, doc)
145
- file = File.read(ref, encoding: "utf-8") if read
146
- filename = out.dup
147
- filename.sub!(/\.xml$/, ".html") if doc
148
- [file, filename]
149
- end
150
-
151
- def xml_file(id, read)
152
- file = @xml.at(ns("//doc-container[@id = '#{id}']")).to_xml if read
153
- filename = "#{id}.html"
154
- [file, filename]
155
- end
156
-
157
- # map locality type and label (e.g. "clause" "1") to id = anchor for
158
- # a document
159
- # Note: will only key clauses, which have unambiguous reference label in
160
- # locality. Notes, examples etc with containers are just plunked against
161
- # UUIDs, so that their IDs can at least be registered to be tracked
162
- # as existing.
163
- def read_anchors(xml)
164
- xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n,
165
- { locale: @locale })
166
- xrefs.parse xml
167
- xrefs.get.each_with_object({}) do |(k, v), ret|
168
- read_anchors1(k, v, ret)
169
- end
170
- end
171
-
172
- def read_anchors1(key, val, ret)
173
- val[:type] ||= "clause"
174
- ret[val[:type]] ||= {}
175
- index = if val[:container] || val[:label].nil? || val[:label].empty?
176
- UUIDTools::UUID.random_create.to_s
177
- else val[:label]
178
- end
179
- ret[val[:type]][index] = key
180
- ret[val[:type]][val[:value]] = key if val[:value]
181
- end
182
-
183
- # Also parse all ids in doc (including ones which won't be xref targets)
184
- def read_ids(xml)
185
- ret = {}
186
- xml.traverse do |x|
187
- x.text? and next
188
- /^semantic__/.match?(x.name) and next
189
- x["id"] and ret[x["id"]] = true
190
- end
191
- ret
192
- end
193
-
194
- def key(ident)
195
- @c.decode(ident).gsub(/(\p{Zs})+/, " ").sub(/^metanorma-collection /, "")
196
- end
197
-
198
- def keys
199
- @files.keys
200
- end
201
-
202
- def get(ident, attr = nil)
203
- if attr then @files[key(ident)][attr]
204
- else @files[key(ident)]
205
- end
206
- end
207
-
208
- def set(ident, attr, value)
209
- @files[key(ident)][attr] = value
210
- end
211
-
212
- def each
213
- @files.each
214
- end
215
-
216
- def each_with_index
217
- @files.each_with_index
218
- end
219
-
220
- def ns(xpath)
221
- @isodoc.ns(xpath)
222
- end
223
- end
224
- end
@@ -1,84 +0,0 @@
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
- process_section_split_instance(k, m)
8
- cleanup_section_split_instance(k, m)
9
- end
10
- m[k] = @files[k]
11
- end
12
- @files = ret
13
- end
14
-
15
- def process_section_split_instance(key, manifest)
16
- s, sectionsplit_manifest = sectionsplit(@files[key][:ref],
17
- @files[key][:out_path], key)
18
- s.each_with_index do |f1, i|
19
- add_section_split_instance(f1, manifest, key, i)
20
- end
21
- manifest["#{key}:index.html"] =
22
- add_section_split_cover(sectionsplit_manifest, key)
23
- end
24
-
25
- def cleanup_section_split_instance(key, manifest)
26
- @files_to_delete << manifest["#{key}:index.html"][:ref]
27
- #@files[key].delete(:ids).delete(:anchors)
28
- @files[key][:indirect_key] = @sectionsplit.key
29
- end
30
-
31
- def add_section_split_cover(manifest, ident)
32
- cover = @sectionsplit
33
- .section_split_cover(manifest, @parent.dir_name_cleanse(ident),
34
- one_doc_collection?)
35
- @files[ident][:out_path] = cover
36
- { attachment: true, index: false, out_path: cover,
37
- ref: File.join(File.dirname(manifest.file), cover) }
38
- end
39
-
40
- def one_doc_collection?
41
- return false
42
- docs = 0
43
- @files.each_value do |v|
44
- v[:attachment] and next
45
- v[:presentationxml] and next
46
- docs += 1
47
- end
48
- docs > 1
49
- end
50
-
51
- def add_section_split_instance(file, manifest, key, idx)
52
- presfile, newkey, xml =
53
- add_section_split_instance_prep(file, key)
54
- manifest[newkey] =
55
- { parentid: key, presentationxml: true, type: "fileref",
56
- rel_path: file[:url], out_path: File.basename(file[:url]),
57
- anchors: read_anchors(xml), ids: read_ids(xml),
58
- sectionsplit_output: true,
59
- bibdata: @files[key][:bibdata], ref: presfile }
60
- @files_to_delete << file[:url]
61
- manifest[newkey][:bare] = true unless idx.zero?
62
- end
63
-
64
- def add_section_split_instance_prep(file, key)
65
- presfile = File.join(File.dirname(@files[key][:ref]),
66
- File.basename(file[:url]))
67
- newkey = key("#{key.strip} #{file[:title]}")
68
- xml = Nokogiri::XML(File.read(presfile), &:huge)
69
- [presfile, newkey, xml]
70
- end
71
-
72
- def sectionsplit(file, outfile, ident)
73
- @sectionsplit = Sectionsplit
74
- .new(input: file, base: outfile, dir: File.dirname(file),
75
- output: outfile, compile_opts: @parent.compile_options,
76
- fileslookup: self, ident: ident, isodoc: @isodoc)
77
- coll = @sectionsplit.sectionsplit.sort_by { |f| f[:order] }
78
- xml = Nokogiri::XML(File.read(file, encoding: "UTF-8"), &:huge)
79
- [coll, @sectionsplit
80
- .collection_manifest(File.basename(file), coll, xml, nil,
81
- File.dirname(file))]
82
- end
83
- end
84
- end