metanorma 1.2.5 → 1.3.0

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: 66652dc0d52d85abe7e08d5804364bcc320760e292e91594ea135051d02ee92a
4
- data.tar.gz: ab9bd75163ac8b107d2833bd5719d8742ad5b2d73c438361d40da77871efb36f
3
+ metadata.gz: c6503cb40980d520fe14a15845b75b748a6cdd40c9206e2218676ac9f2500ff5
4
+ data.tar.gz: cb169e73038bae1a2c8d70170af1eb4956342056bd4d2c88341f0f08d86462ee
5
5
  SHA512:
6
- metadata.gz: '038472b6e12dbcd3caca90a5538489e531d208a7168630f987fd3a12f7590ef5e4a2bb63cbcaabd5555dcbfa9ebaccf4894fd344df4e185a2a9954049166142c'
7
- data.tar.gz: 135896ec6863c3a75cd0779957e439ebf964358bf0415ad44e74af3d0f8f729a777793d84bf23149a0309e4e70d15e5c1587eaae27f0b3744ab8c26344488a83
6
+ metadata.gz: 66fb9df1d800763aafccdbb696d755627dfda9d29530200d048f91b59f46e081ff3ffe5f5504579d54ef2667ae33d821d1642329bf21eec6b04e1503e992454c
7
+ data.tar.gz: d46d5ba951e50d47e75cd86c627c65958a490a4cb6e74ba4f61523b301caa53ae6eddc57a72dd58653b0b5a2894110ff5e0d55d795ac764ef303d0f607424667
@@ -16,35 +16,28 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.6', '2.5', '2.4' ]
19
+ ruby: [ '2.7', '2.6', '2.5', '2.4' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
22
  include:
23
- - ruby: '2.7'
23
+ - ruby: '3.0'
24
24
  os: 'ubuntu-latest'
25
25
  experimental: true
26
- - ruby: '2.7'
26
+ - ruby: '3.0'
27
27
  os: 'windows-latest'
28
28
  experimental: true
29
- - ruby: '2.7'
29
+ - ruby: '3.0'
30
30
  os: 'macos-latest'
31
31
  experimental: true
32
32
  steps:
33
- - uses: actions/checkout@master
33
+ - uses: actions/checkout@v2
34
+ with:
35
+ submodules: true
34
36
 
35
37
  - uses: ruby/setup-ruby@v1
36
38
  with:
37
39
  ruby-version: ${{ matrix.ruby }}
38
-
39
- - uses: actions/cache@v2
40
- with:
41
- path: vendor/bundle
42
- key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
43
- restore-keys: bundle-${{ matrix.os }}-${{ matrix.ruby }}
44
-
45
- - run: bundle config set path 'vendor/bundle'
46
-
47
- - run: bundle install --jobs 4 --retry 3
40
+ bundler-cache: true
48
41
 
49
42
  - run: bundle exec rake
50
43
 
@@ -54,7 +47,7 @@ jobs:
54
47
  steps:
55
48
  - uses: peter-evans/repository-dispatch@v1
56
49
  with:
57
- token: ${{ secrets.GITHUB_TOKEN }}
50
+ token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
58
51
  repository: ${{ github.repository }}
59
52
  event-type: notify
60
- client-payload: '{"ref": "${{ github.ref }}"}'
53
+ client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
data/.gitignore CHANGED
@@ -20,3 +20,5 @@
20
20
  Gemfile.lock
21
21
  relaton/
22
22
  .vscode/
23
+
24
+ .rubocop-https--*
data/.rubocop.yml CHANGED
@@ -1,6 +1,14 @@
1
1
  # This project follows the Ribose OSS style guide.
2
2
  # https://github.com/riboseinc/oss-guides
3
3
  # All project-specific additions and overrides should be specified in this file.
4
-
5
4
  inherit_from:
6
5
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
6
+
7
+ # local repo-specific modifications
8
+
9
+ AllCops:
10
+ DisplayCopNames: false
11
+ StyleGuideCopsOnly: false
12
+ TargetRubyVersion: 2.4
13
+ Rails:
14
+ Enabled: true
@@ -168,6 +168,7 @@ module Metanorma
168
168
  return unless Array(@directives).include? "documents-inline"
169
169
 
170
170
  documents.each_with_index do |(_, d), i|
171
+ next if d.attachment
171
172
  id = format("doc%<index>09d", index: i)
172
173
  builder.send("doc-container", id: id) { |b| d.to_xml b }
173
174
  end
@@ -0,0 +1,213 @@
1
+ module Metanorma
2
+ # XML collection renderer
3
+ class CollectionRenderer
4
+ # map locality type and label (e.g. "clause" "1") to id = anchor for
5
+ # a document
6
+ # Note: will only key clauses, which have unambiguous reference label in
7
+ # locality. Notes, examples etc with containers are just plunked against
8
+ # UUIDs, so that their IDs can at least be registered to be tracked
9
+ # as existing.
10
+ def read_anchors(xml)
11
+ ret = {}
12
+ xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n, {})
13
+ xrefs.parse xml
14
+ xrefs.get.each do |k, v|
15
+ ret[v[:type]] ||= {}
16
+ index = v[:container] || v[:label].nil? || v[:label].empty? ?
17
+ UUIDTools::UUID.random_create.to_s : v[:label]
18
+ ret[v[:type]][index] = k
19
+ end
20
+ ret
21
+ end
22
+
23
+ # @param id [String]
24
+ # @param read [Boolean]
25
+ # @return [Array<String, nil>]
26
+ def xml_file(id, read)
27
+ file = @xml.at(ns("//doc-container[@id = '#{id}']")).to_xml if read
28
+ filename = "#{id}.html"
29
+ [file, filename]
30
+ end
31
+
32
+ # @param bib [Nokogiri::XML::Element]
33
+ # @param identifier [String]
34
+ def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
35
+ docid = bib&.at(ns("./docidentifier"))&.text
36
+ unless @files[docid]
37
+ error = "[metanorma] Cannot find crossreference to document #{docid} "\
38
+ "in document #{identifier}."
39
+ @log.add("Cross-References", nil, error)
40
+ Util.log(error, :warning)
41
+ return
42
+ end
43
+ id = bib["id"]
44
+ newbib = bib.replace(@files[docid][:bibdata])
45
+ newbib.name = "bibitem"
46
+ newbib["id"] = id
47
+ newbib["hidden"] = "true"
48
+ newbib&.at(ns("./ext"))&.remove
49
+ _file, url = targetfile(@files[docid], false, !@files[docid][:attachment])
50
+ uri_node = Nokogiri::XML::Node.new "uri", newbib
51
+ uri_node[:type] = "citation"
52
+ uri_node.content = url
53
+ newbib.at(ns("./docidentifier")).previous = uri_node
54
+ end
55
+
56
+ # Resolves direct links to other files in collection
57
+ # (repo(current-metanorma-collection/x),
58
+ # and indirect links to other files in collection
59
+ # (bibitem[@type = 'internal'] pointing to a file anchor
60
+ # in another file in the collection)
61
+ # @param file [String] XML content
62
+ # @param identifier [String] docid
63
+ # @param internal_refs [Hash{String=>Hash{String=>String}] schema name to anchor to filename
64
+ # @return [String] XML content
65
+ def update_xrefs(file, identifier, internal_refs)
66
+ docxml = Nokogiri::XML(file)
67
+ update_indirect_refs_to_docs(docxml, internal_refs)
68
+ add_document_suffix(identifier, docxml)
69
+ update_direct_refs_to_docs(docxml, identifier)
70
+ svgmap_resolve(datauri_encode(docxml))
71
+ docxml.xpath(ns("//references[not(./bibitem[not(@hidden) or @hidden = 'false'])]")).each do |f|
72
+ f["hidden"] = "true"
73
+ end
74
+ docxml.to_xml
75
+ end
76
+
77
+ def datauri_encode(docxml)
78
+ docxml.xpath(ns("//image")).each do |i|
79
+ i["src"] = Metanorma::Utils::datauri(i["src"])
80
+ end
81
+ docxml
82
+ end
83
+
84
+ def svgmap_resolve(docxml)
85
+ isodoc = IsoDoc::Convert.new({})
86
+ docxml.xpath(ns("//svgmap//eref")).each do |e|
87
+ href = isodoc.eref_target(e)
88
+ next if href == "##{e['bibitemid']}"
89
+
90
+ if href.match(/^#/)
91
+ next unless docxml.at("//*[@id = '#{href.sub(/^#/, '')}']")
92
+ end
93
+ e["target"] = href.strip
94
+ e.name = "link"
95
+ e&.elements&.remove
96
+ end
97
+ Metanorma::Utils::svgmap_rewrite(docxml, "")
98
+ end
99
+
100
+ # repo(current-metanorma-collection/ISO 17301-1:2016)
101
+ # replaced by bibdata of "ISO 17301-1:2016" in situ as bibitem.
102
+ # Any erefs to that bibitem id are replaced with relative URL
103
+ # Preferably with anchor, and is a job to realise dynamic lookup
104
+ # of localities.
105
+ def update_direct_refs_to_docs(docxml, identifier)
106
+ docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |b|
107
+ docid = b&.at(ns("./docidentifier[@type = 'repository']"))&.text
108
+ next unless docid && %r{^current-metanorma-collection/}.match(docid)
109
+ update_bibitem(b, identifier)
110
+ update_anchors(b, docxml, docid)
111
+ end
112
+ end
113
+
114
+ # Resolve erefs to a container of ids in another doc,
115
+ # to an anchor eref (direct link)
116
+ def update_indirect_refs_to_docs(docxml, internal_refs)
117
+ internal_refs.each do |schema, ids|
118
+ ids.each do |id, file|
119
+ update_indirect_refs_to_docs1(docxml, schema, id, file)
120
+ end
121
+ end
122
+ end
123
+
124
+ def update_indirect_refs_to_docs1(docxml, schema, id, file)
125
+ docxml.xpath(ns("//eref[@bibitemid = '#{schema}_#{id}']")).each do |e|
126
+ e["citeas"] = file
127
+ end
128
+ docid = docxml.at(ns("//bibitem[@id = '#{schema}_#{id}']/"\
129
+ "docidentifier[@type = 'repository']")) or return
130
+ docid.children = "current-metanorma-collection/#{file}"
131
+ docid.previous = "<docidentifier type='X'>#{file}</docidentifier>"
132
+ end
133
+
134
+ # update crossrefences to other documents, to include disambiguating document suffix on id
135
+ def update_anchors(bib, docxml, _id) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
136
+ docid = bib&.at(ns("./docidentifier"))&.text
137
+ docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
138
+ if @files[docid]
139
+ update_anchor_loc(bib, e, docid)
140
+ else
141
+ e << "<strong>** Unresolved reference to document #{docid}, id #{e['bibitemid']}</strong>"
142
+ end
143
+ end
144
+ end
145
+
146
+ def update_anchor_loc(bib, e, docid)
147
+ loc = e.at(ns(".//locality[@type = 'anchor']")) or
148
+ return update_anchor_create_loc(bib, e, docid)
149
+ document_suffix = Metanorma::Utils::to_ncname(docid)
150
+ ref = loc.at(ns("./referenceFrom")) || return
151
+ anchor = "#{ref.text}_#{document_suffix}"
152
+ return unless @files[docid][:anchors].inject([]) do |m, (_, x)|
153
+ m+= x.values
154
+ end.include?(anchor)
155
+ ref.content = anchor
156
+ end
157
+
158
+ # if there is a crossref to another document, with no anchor, retrieve the
159
+ # anchor given the locality, and insert it into the crossref
160
+ def update_anchor_create_loc(bib, e, docid)
161
+ ins = e.at(ns("./localityStack")) || return
162
+ type = ins&.at(ns("./locality/@type"))&.text
163
+ ref = ins&.at(ns("./locality/referenceFrom"))&.text
164
+ (anchor = @files[docid][:anchors][type][ref]) || return
165
+ ref_from = Nokogiri::XML::Node.new "referenceFrom", bib
166
+ ref_from.content = anchor.sub(/^_/, "")
167
+ locality = Nokogiri::XML::Node.new "locality", bib
168
+ locality[:type] = "anchor"
169
+ locality.add_child ref_from
170
+ ins << locality
171
+ end
172
+
173
+ # gather internal bibitem references
174
+ def gather_internal_refs
175
+ @files.each_with_object({}) do |(_, x), refs|
176
+ next if x[:attachment]
177
+ file, _ = targetfile(x, true)
178
+ Nokogiri::XML(file)
179
+ .xpath(ns("//bibitem[@type = 'internal']/"\
180
+ "docidentifier[@type = 'repository']")).each do |d|
181
+ a = d.text.split(%r{/}, 2)
182
+ a.size > 1 or next
183
+ refs[a[0]] ||= {}
184
+ refs[a[0]][a[1]] = true
185
+ end
186
+ end
187
+ end
188
+
189
+ # resolve file location for the target of each internal reference
190
+ def locate_internal_refs
191
+ refs = gather_internal_refs
192
+ @files.each do |identifier, x|
193
+ next if x[:attachment]
194
+
195
+ file, _filename = targetfile(x, true)
196
+ docxml = Nokogiri::XML(file)
197
+ refs.each do |schema, ids|
198
+ ids.each_key do |id|
199
+ n = docxml.at("//*[@id = '#{id}']") and
200
+ n.at("./ancestor-or-self::*[@type = '#{schema}']") and
201
+ refs[schema][id] = identifier
202
+ end
203
+ end
204
+ end
205
+ refs.each do |schema, ids|
206
+ ids.each do |id, key|
207
+ key == true and refs[schema][id] = "Missing:#{schema}:#{id}"
208
+ end
209
+ end
210
+ refs
211
+ end
212
+ end
213
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "isodoc"
4
+ require "metanorma-utils"
5
+ require_relative "collection_fileparse"
4
6
 
5
7
  module Metanorma
6
8
  # XML collection renderer
@@ -14,11 +16,9 @@ module Metanorma
14
16
  files = {}
15
17
  @xml.xpath(ns("//docref")).each do |d|
16
18
  identifier = d.at(ns("./identifier")).text
17
- files[identifier] = if d["fileref"]
18
- { type: "fileref",
19
- ref: File.join(path, d["fileref"]) }
20
- else { type: "id", ref: d["id"] }
21
- end
19
+ files[identifier] = file_entry(d, path)
20
+ next if files[identifier][:attachment]
21
+
22
22
  file, _filename = targetfile(files[identifier], true)
23
23
  xml = Nokogiri::XML(file)
24
24
  add_document_suffix(identifier, xml)
@@ -28,6 +28,17 @@ module Metanorma
28
28
  files
29
29
  end
30
30
 
31
+ def file_entry(docref, path)
32
+ ret = if docref["fileref"]
33
+ { type: "fileref", ref: File.join(path, docref["fileref"]),
34
+ rel_path: docref["fileref"] }
35
+ else
36
+ { type: "id", ref: docref["id"] }
37
+ end
38
+ ret[:attachment] = docref["attachment"] if docref["attachment"]
39
+ ret
40
+ end
41
+
31
42
  def add_suffix_to_attributes(doc, suffix, tag_name, attribute_name)
32
43
  doc.xpath(ns("//#{tag_name}[@#{attribute_name}]")).each do |elem|
33
44
  elem.attributes[attribute_name].value =
@@ -37,178 +48,42 @@ module Metanorma
37
48
 
38
49
  def add_document_suffix(identifier, doc)
39
50
  document_suffix = Metanorma::Utils::to_ncname(identifier)
40
- [%w[* id],
41
- %w[* bibitemid],
42
- %w[review from],
43
- %w[review to],
44
- %w[index to],
45
- %w[xref target],
46
- %w[callout target]]
47
- .each do |(tag_name, attribute_name)|
51
+ [%w[* id], %w[* bibitemid], %w[review from],
52
+ %w[review to], %w[index to], %w[xref target],
53
+ %w[callout target]]
54
+ .each do |(tag_name, attribute_name)|
48
55
  add_suffix_to_attributes(doc, document_suffix, tag_name, attribute_name)
49
56
  end
50
57
  end
51
58
 
52
- # map locality type and label (e.g. "clause" "1") to id = anchor for
53
- # a document
54
- def read_anchors(xml)
55
- ret = {}
56
- xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n, {})
57
- xrefs.parse xml
58
- xrefs.get.each do |k, v|
59
- ret[v[:type]] ||= {}
60
- index = v[:container] || v[:label].nil? || v[:label].empty? ?
61
- UUIDTools::UUID.random_create.to_s : v[:label]
62
- # Note: will only key clauses, which have unambiguous reference label in locality.
63
- # Notes, examples etc with containers are just plunked agaisnt UUIDs, so that their
64
- # IDs can at least be registered to be tracked as existing.
65
- ret[v[:type]][index] = k
66
- end
67
- ret
68
- end
69
-
70
59
  # return file contents + output filename for each file in the collection,
71
60
  # given a docref entry
72
61
  # @param data [Hash]
73
62
  # @param read [Boolean]
74
63
  # @return [Array<String, nil>]
75
- def targetfile(data, read = false)
76
- if data[:type] == "fileref" then ref_file data[:ref], read
64
+ def targetfile(data, read = false, doc = true)
65
+ if data[:type] == "fileref" then ref_file data[:ref], read, doc
77
66
  else xml_file data[:id], read
78
67
  end
79
68
  end
80
69
 
81
70
  # @param ref [String]
82
71
  # @param read [Boolean]
72
+ # @param doc [Boolean]
83
73
  # @return [Array<String, nil>]
84
- def ref_file(ref, read)
74
+ def ref_file(ref, read, doc)
85
75
  file = File.read(ref, encoding: "utf-8") if read
86
- filename = ref.sub(/\.xml$/, ".html")
87
- [file, filename]
88
- end
89
-
90
- # @param id [String]
91
- # @param read [Boolean]
92
- # @return [Array<String, nil>]
93
- def xml_file(id, read)
94
- file = @xml.at(ns("//doc-container[@id = '#{id}']")).to_xml if read
95
- filename = id + ".html"
76
+ filename = ref.dup
77
+ filename.sub!(/\.xml$/, ".html") if doc
96
78
  [file, filename]
97
79
  end
98
80
 
99
- # @param bib [Nokogiri::XML::Element]
100
- # @param identifier [String]
101
- def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
102
- docid = bib&.at(ns("./docidentifier"))&.text
103
- unless @files[docid]
104
- error = "[metanorma] Cannot find crossreference to document #{docid} in document #{identifier}."
105
- @log.add("Cross-References", nil, error)
106
- Util.log(error, :warning)
107
- return
108
- end
109
- id = bib["id"]
110
- newbib = bib.replace(@files[docid][:bibdata])
111
- newbib.name = "bibitem"
112
- newbib["id"] = id
113
- newbib["hidden"] = "true"
114
- newbib&.at(ns("./ext"))&.remove
115
- _file, url = targetfile(@files[docid], false)
116
- uri_node = Nokogiri::XML::Node.new "uri", newbib
117
- uri_node[:type] = "citation"
118
- uri_node.content = url
119
- newbib.at(ns("./docidentifier")).previous = uri_node
120
- end
121
-
122
- # Resolves direct links to other files in collection (repo(current-metanorma-collection/x),
123
- # and indirect links to other files in collection (bibitem[@type = 'internal'] pointing to a file anchor
124
- # in another file in the collection)
125
- # @param file [String] XML content
126
- # @param identifier [String] docid
127
- # @param internal_refs [Hash{String=>Hash{String=>String}] schema name to anchor to filename
128
- # @return [String] XML content
129
- def update_xrefs(file, identifier, internal_refs)
130
- docxml = Nokogiri::XML(file)
131
- update_indirect_refs_to_docs(docxml, internal_refs)
132
- add_document_suffix(identifier, docxml)
133
- update_direct_refs_to_docs(docxml, identifier)
134
- docxml.xpath(ns("//references[not(./bibitem[not(@hidden) or @hidden = 'false'])]")).each do |f|
135
- f["hidden"] = "true"
136
- end
137
- docxml.to_xml
138
- end
139
-
140
- # repo(current-metanorma-collection/ISO 17301-1:2016)
141
- # replaced by bibdata of "ISO 17301-1:2016" in situ as bibitem.
142
- # Any erefs to that bibitem id are replaced with relative URL
143
- # Preferably with anchor, and is a job to realise dynamic lookup of localities.
144
- def update_direct_refs_to_docs(docxml, identifier)
145
- docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |b|
146
- docid = b&.at(ns("./docidentifier[@type = 'repository']"))&.text
147
- next unless docid && %r{^current-metanorma-collection/}.match(docid)
148
- update_bibitem(b, identifier)
149
- update_anchors(b, docxml, docid)
150
- end
151
- end
152
-
153
- # Resolve erefs to a container of ids in another doc, to an anchor eref (direct link)
154
- def update_indirect_refs_to_docs(docxml, internal_refs)
155
- internal_refs.each do |schema, ids|
156
- ids.each do |id, file|
157
- update_indirect_refs_to_docs1(docxml, schema, id, file)
158
- end
159
- end
160
- end
161
-
162
- def update_indirect_refs_to_docs1(docxml, schema, id, file)
163
- docxml.xpath(ns("//eref[@bibitemid = '#{schema}_#{id}']")).each do |e|
164
- e["citeas"] = file
165
- end
166
- docid = docxml.at(ns("//bibitem[@id = '#{schema}_#{id}']/docidentifier[@type = 'repository']")) or return
167
- docid.children = "current-metanorma-collection/#{file}"
168
- docid.previous = "<docidentifier type='X'>#{file}</docidentifier>"
169
- end
170
-
171
- # update crossrefences to other documents, to include disambiguating document suffix on id
172
- def update_anchors(bib, docxml, _id) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
173
- docid = bib&.at(ns("./docidentifier"))&.text
174
- docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
175
- if @files[docid]
176
- update_anchor_loc(bib, e, docid)
177
- else
178
- e << "<strong>** Unresolved reference to document #{docid}, id #{e['bibitemid']}</strong>"
179
- end
180
- end
181
- end
182
-
183
- def update_anchor_loc(bib, e, docid)
184
- loc = e.at(ns(".//locality[@type = 'anchor']")) or return update_anchor_create_loc(bib, e, docid)
185
- document_suffix = Metanorma::Utils::to_ncname(docid)
186
- ref = loc.at(ns("./referenceFrom")) || return
187
- anchor = "#{ref.text}_#{document_suffix}"
188
- return unless @files[docid][:anchors].inject([]) { |m, (_, x)| m+= x.values }.include?(anchor)
189
- ref.content = anchor
190
- end
191
-
192
- # if there is a crossref to another document, with no anchor, retrieve the
193
- # anchor given the locality, and insert it into the crossref
194
- def update_anchor_create_loc(bib, e, docid)
195
- ins = e.at(ns("./localityStack")) || return
196
- type = ins&.at(ns("./locality/@type"))&.text
197
- ref = ins&.at(ns("./locality/referenceFrom"))&.text
198
- (anchor = @files[docid][:anchors][type][ref]) || return
199
- ref_from = Nokogiri::XML::Node.new "referenceFrom", bib
200
- ref_from.content = anchor.sub(/^_/, "")
201
- locality = Nokogiri::XML::Node.new "locality", bib
202
- locality[:type] = "anchor"
203
- locality.add_child ref_from
204
- ins << locality
205
- end
206
-
207
81
  # compile and output individual file in collection
208
82
  def file_compile(f, filename, identifier)
209
83
  # warn "metanorma compile -x html #{f.path}"
210
84
  c = Compile.new
211
- c.compile f.path, { format: :asciidoc, extension_keys: @format }.merge(@compile_options)
85
+ c.compile f.path, { format: :asciidoc,
86
+ extension_keys: @format }.merge(@compile_options)
212
87
  @files[identifier][:outputs] = {}
213
88
  @format.each do |e|
214
89
  ext = c.processor.output_formats[e]
@@ -218,38 +93,11 @@ module Metanorma
218
93
  end
219
94
  end
220
95
 
221
- # gather internal bibitem references
222
- def gather_internal_refs
223
- @files.each_with_object({}) do |(identifier, x), refs|
224
- file, _ = targetfile(x, true)
225
- Nokogiri::XML(file).xpath(ns("//bibitem[@type = 'internal']/docidentifier[@type = 'repository']")).each do |d|
226
- a = d.text.split(%r{/}, 2)
227
- a.size > 1 or next
228
- refs[a[0]] ||= {}
229
- refs[a[0]][a[1]] = true
230
- end
231
- end
232
- end
233
-
234
- # resolve file location for the target of each internal reference
235
- def locate_internal_refs
236
- refs = gather_internal_refs
237
- @files.each do |identifier, x|
238
- file, filename = targetfile(x, true)
239
- docxml = Nokogiri::XML(file)
240
- refs.each do |schema, ids|
241
- ids.keys.each do |id|
242
- docxml.at(ns("//*[@id = '#{id}'][@type = '#{schema}']")) and
243
- refs[schema][id] = identifier
244
- end
245
- end
246
- end
247
- refs.each do |schema, ids|
248
- ids.each do |id, key|
249
- key == true and refs[schema][id] = "Missing:#{schema}:#{id}"
250
- end
251
- end
252
- refs
96
+ def copy_file_to_dest(fileref)
97
+ _file, filename = targetfile(fileref, true, false)
98
+ dest = File.join(@outdir, fileref[:rel_path])
99
+ FileUtils.mkdir_p(File.dirname(dest))
100
+ FileUtils.cp filename, dest
253
101
  end
254
102
 
255
103
  # process each file in the collection
@@ -257,12 +105,15 @@ module Metanorma
257
105
  def files # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
258
106
  internal_refs = locate_internal_refs
259
107
  @files.each do |identifier, x|
260
- file, filename = targetfile(x, true)
261
- file = update_xrefs(file, identifier, internal_refs)
262
- Tempfile.open(["collection", ".xml"], encoding: "utf-8") do |f|
263
- f.write(file)
264
- f.close
265
- file_compile(f, filename, identifier)
108
+ if x[:attachment] then copy_file_to_dest(x)
109
+ else
110
+ file, filename = targetfile(x, true)
111
+ file = update_xrefs(file, identifier, internal_refs)
112
+ Tempfile.open(["collection", ".xml"], encoding: "utf-8") do |f|
113
+ f.write(file)
114
+ f.close
115
+ file_compile(f, filename, identifier)
116
+ end
266
117
  end
267
118
  end
268
119
  end