metanorma 1.2.4 → 1.2.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: bf7d6f99cb5eec27df20786b79a6932eb9e339c49072f4183b5cf9cb2ff747a3
4
- data.tar.gz: '049577c6c56eb8092765b8e3679ac7f0c8362f9129e787e4e7b923f5b3b61734'
3
+ metadata.gz: 66652dc0d52d85abe7e08d5804364bcc320760e292e91594ea135051d02ee92a
4
+ data.tar.gz: ab9bd75163ac8b107d2833bd5719d8742ad5b2d73c438361d40da77871efb36f
5
5
  SHA512:
6
- metadata.gz: 7de4db35db282e2ec0665d79533885c31fd8a1b46493177d47a48920ab685e20d2f5a74e473b11d0dfa54b357b8d4e0be15d2908885a770b4e3ec518dd427975
7
- data.tar.gz: 8ef45f441c0129920575751b10bf3d86b132395d020794d39e69429e099ba6bcde65f1d5930dca240ad07209e12eddada6926bf56ec54322674ef8f47e07cedc
6
+ metadata.gz: '038472b6e12dbcd3caca90a5538489e531d208a7168630f987fd3a12f7590ef5e4a2bb63cbcaabd5555dcbfa9ebaccf4894fd344df4e185a2a9954049166142c'
7
+ data.tar.gz: 135896ec6863c3a75cd0779957e439ebf964358bf0415ad44e74af3d0f8f729a777793d84bf23149a0309e4e70d15e5c1587eaae27f0b3744ab8c26344488a83
@@ -3,16 +3,16 @@
3
3
  name: notify
4
4
 
5
5
  on:
6
- push:
7
- branches: [ master ]
8
- tags:
9
- - '*'
6
+ repository_dispatch:
7
+ types: [ notify ]
10
8
 
11
9
  jobs:
12
10
  notify:
13
11
  name: Notify dependent repos
14
12
  runs-on: ubuntu-latest
15
13
  steps:
14
+ - uses: actions/checkout@v2
15
+
16
16
  - name: Trigger repositories
17
17
  env:
18
18
  GH_USERNAME: metanorma-ci
@@ -21,7 +21,7 @@ jobs:
21
21
  curl -LO --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/trigger-gh-actions.sh
22
22
  [[ -f ".github/workflows/dependent_repos.env" ]] && source .github/workflows/dependent_repos.env
23
23
  CLIENT_PAYLOAD=$(cat <<EOF
24
- "{ "ref": "${GITHUB_REF}", "repo": "${GITHUB_REPOSITORY}" }"
24
+ "{ "ref": "${{ github.event.client_payload.ref }}", "repo": "${GITHUB_REPOSITORY}" }"
25
25
  EOF
26
26
  )
27
27
  for repo in $TEMPLATE_REPOS" $SAMPLES_REPOS"
@@ -30,7 +30,7 @@ jobs:
30
30
  done
31
31
 
32
32
  - name: Trigger release repositories
33
- if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
33
+ if: github.event.client_payload.ref == 'refs/heads/master' || startsWith(github.event.client_payload.ref, 'refs/tags/v')
34
34
  env:
35
35
  GH_USERNAME: metanorma-ci
36
36
  GH_ACCESS_TOKEN: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -38,7 +38,7 @@ jobs:
38
38
  curl -LO --retry 3 https://raw.githubusercontent.com/metanorma/metanorma-build-scripts/master/trigger-gh-actions.sh
39
39
  [[ -f ".github/workflows/dependent_repos.env" ]] && source .github/workflows/dependent_repos.env
40
40
  CLIENT_PAYLOAD=$(cat <<EOF
41
- "{ "ref": "${GITHUB_REF}", "repo": "${GITHUB_REPOSITORY}" }"
41
+ "{ "ref": "${{ github.event.client_payload.ref }}", "repo": "${GITHUB_REPOSITORY}" }"
42
42
  EOF
43
43
  )
44
44
  for repo in $DEPENDENT_REPOS
@@ -4,7 +4,7 @@ name: rake
4
4
 
5
5
  on:
6
6
  push:
7
- branches: [ master, main ]
7
+ branches: [ master, main ]
8
8
  tags: [ v* ]
9
9
  pull_request:
10
10
 
@@ -36,9 +36,6 @@ jobs:
36
36
  with:
37
37
  ruby-version: ${{ matrix.ruby }}
38
38
 
39
- - if: matrix.os == 'macos-latest'
40
- run: brew install autoconf automake libtool
41
-
42
39
  - uses: actions/cache@v2
43
40
  with:
44
41
  path: vendor/bundle
@@ -55,11 +52,9 @@ jobs:
55
52
  needs: rake
56
53
  runs-on: ubuntu-latest
57
54
  steps:
58
- - name: Trigger tests passed event
59
- uses: Sibz/github-status-action@v1
55
+ - uses: peter-evans/repository-dispatch@v1
60
56
  with:
61
- authToken: ${{ secrets.GITHUB_TOKEN }}
62
- context: 'tests-passed-successfully'
63
- description: 'Tests passed successfully'
64
- state: 'success'
65
- sha: ${{ github.event.pull_request.head.sha || github.sha }}
57
+ token: ${{ secrets.GITHUB_TOKEN }}
58
+ repository: ${{ github.repository }}
59
+ event-type: notify
60
+ client-payload: '{"ref": "${{ github.ref }}"}'
@@ -3,6 +3,7 @@
3
3
  require "relaton"
4
4
  require "relaton/cli"
5
5
  require "metanorma/collection_manifest"
6
+ require "metanorma-utils"
6
7
 
7
8
  module Metanorma
8
9
  # Metanorma collection of documents
@@ -39,8 +40,13 @@ module Metanorma
39
40
  @documents.merge! @manifest.documents(File.dirname(@file))
40
41
  @prefatory = args[:prefatory]
41
42
  @final = args[:final]
43
+ @log = Metanorma::Utils::Log.new
42
44
  end
45
+
43
46
  # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
47
+ def clean_exit
48
+ @log.write(File.join(File.dirname(@file), File.basename(@file, ".*") + ".err"))
49
+ end
44
50
 
45
51
  # @return [String] XML
46
52
  def to_xml
@@ -57,7 +63,8 @@ module Metanorma
57
63
  end
58
64
 
59
65
  def render(opts)
60
- CollectionRenderer.render self, opts
66
+ CollectionRenderer.render self, opts.merge(log: @log)
67
+ clean_exit
61
68
  end
62
69
 
63
70
  class << self
@@ -0,0 +1,270 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "isodoc"
4
+
5
+ module Metanorma
6
+ # XML collection renderer
7
+ class CollectionRenderer
8
+ # hash for each document in collection of document identifier to:
9
+ # document reference (fileref or id), type of document reference,
10
+ # and bibdata entry for that file
11
+ # @param path [String] path to collection
12
+ # @return [Hash{String=>Hash}]
13
+ def read_files(path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
14
+ files = {}
15
+ @xml.xpath(ns("//docref")).each do |d|
16
+ 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
22
+ file, _filename = targetfile(files[identifier], true)
23
+ xml = Nokogiri::XML(file)
24
+ add_document_suffix(identifier, xml)
25
+ files[identifier][:anchors] = read_anchors(xml)
26
+ files[identifier][:bibdata] = xml.at(ns("//bibdata"))
27
+ end
28
+ files
29
+ end
30
+
31
+ def add_suffix_to_attributes(doc, suffix, tag_name, attribute_name)
32
+ doc.xpath(ns("//#{tag_name}[@#{attribute_name}]")).each do |elem|
33
+ elem.attributes[attribute_name].value =
34
+ "#{elem.attributes[attribute_name].value}_#{suffix}"
35
+ end
36
+ end
37
+
38
+ def add_document_suffix(identifier, doc)
39
+ 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)|
48
+ add_suffix_to_attributes(doc, document_suffix, tag_name, attribute_name)
49
+ end
50
+ end
51
+
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
+ # return file contents + output filename for each file in the collection,
71
+ # given a docref entry
72
+ # @param data [Hash]
73
+ # @param read [Boolean]
74
+ # @return [Array<String, nil>]
75
+ def targetfile(data, read = false)
76
+ if data[:type] == "fileref" then ref_file data[:ref], read
77
+ else xml_file data[:id], read
78
+ end
79
+ end
80
+
81
+ # @param ref [String]
82
+ # @param read [Boolean]
83
+ # @return [Array<String, nil>]
84
+ def ref_file(ref, read)
85
+ 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"
96
+ [file, filename]
97
+ end
98
+
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
+ # compile and output individual file in collection
208
+ def file_compile(f, filename, identifier)
209
+ # warn "metanorma compile -x html #{f.path}"
210
+ c = Compile.new
211
+ c.compile f.path, { format: :asciidoc, extension_keys: @format }.merge(@compile_options)
212
+ @files[identifier][:outputs] = {}
213
+ @format.each do |e|
214
+ ext = c.processor.output_formats[e]
215
+ fn = File.basename(filename).sub(/(?<=\.)[^\.]+$/, ext.to_s)
216
+ FileUtils.mv f.path.sub(/\.xml$/, ".#{ext}"), File.join(@outdir, fn)
217
+ @files[identifier][:outputs][e] = File.join(@outdir, fn)
218
+ end
219
+ end
220
+
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
253
+ end
254
+
255
+ # process each file in the collection
256
+ # files are held in memory, and altered as postprocessing
257
+ def files # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
258
+ internal_refs = locate_internal_refs
259
+ @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)
266
+ end
267
+ end
268
+ end
269
+ end
270
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "isodoc"
4
+ require_relative "./collection_fileprocess"
4
5
 
5
6
  module Metanorma
6
7
  # XML collection renderer
@@ -34,6 +35,7 @@ module Metanorma
34
35
  @coverpage = options[:coverpage]
35
36
  @format = options[:format]
36
37
  @compile_options = options[:compile] || {}
38
+ @log = options[:log]
37
39
 
38
40
  # list of files in the collection
39
41
  @files = read_files folder
@@ -114,68 +116,6 @@ module Metanorma
114
116
  IsoDoc::Convert.new({}).ns(xpath)
115
117
  end
116
118
 
117
- # hash for each document in collection of document identifier to:
118
- # document reference (fileref or id), type of document reference,
119
- # and bibdata entry for that file
120
- # @param path [String] path to collection
121
- # @return [Hash{String=>Hash}]
122
- def read_files(path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
123
- files = {}
124
- @xml.xpath(ns("//docref")).each do |d|
125
- identifier = d.at(ns("./identifier")).text
126
- files[identifier] = if d["fileref"]
127
- { type: "fileref",
128
- ref: File.join(path, d["fileref"]) }
129
- else { type: "id", ref: d["id"] }
130
- end
131
- file, _filename = targetfile(files[identifier], true)
132
- xml = Nokogiri::XML(file)
133
- add_document_suffix(identifier, xml)
134
- files[identifier][:anchors] = read_anchors(xml)
135
- files[identifier][:bibdata] = xml.at(ns("//bibdata"))
136
- end
137
- files
138
- end
139
-
140
- def add_suffix_to_attributes(doc, suffix, tag_name, attribute_name)
141
- doc.xpath(ns("//#{tag_name}[@#{attribute_name}]")).each do |elem|
142
- elem.attributes[attribute_name].value =
143
- "#{elem.attributes[attribute_name].value}_#{suffix}"
144
- end
145
- end
146
-
147
- def add_document_suffix(identifier, doc)
148
- document_suffix = Asciidoctor::Standoc::Cleanup.to_ncname(identifier)
149
- [%w[* id],
150
- %w[* bibitemid],
151
- %w[review from],
152
- %w[review to],
153
- %w[index to],
154
- %w[xref target],
155
- %w[callout target]]
156
- .each do |(tag_name, attribute_name)|
157
- add_suffix_to_attributes(doc, document_suffix, tag_name, attribute_name)
158
- end
159
- end
160
-
161
- # map locality type and label (e.g. "clause" "1") to id = anchor for
162
- # a document
163
- def read_anchors(xml)
164
- ret = {}
165
- xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n, {})
166
- xrefs.parse xml
167
- xrefs.get.each do |k, v|
168
- ret[v[:type]] ||= {}
169
- index = v[:container] || v[:label].nil? || v[:label].empty? ?
170
- UUIDTools::UUID.random_create.to_s : v[:label]
171
- # Note: will only key clauses, which have unambiguous reference label in locality.
172
- # Notes, examples etc with containers are just plunked agaisnt UUIDs, so that their
173
- # IDs can at least be registered to be tracked as existing.
174
- ret[v[:type]][index] = k
175
- end
176
- ret
177
- end
178
-
179
119
  # populate liquid template of ARGV[1] with metadata extracted from
180
120
  # collection manifest
181
121
  def coverpage
@@ -235,132 +175,6 @@ module Metanorma
235
175
  end.doc.root.to_html
236
176
  end
237
177
 
238
- # return file contents + output filename for each file in the collection,
239
- # given a docref entry
240
- # @param data [Hash]
241
- # @param read [Boolean]
242
- # @return [Array<String, nil>]
243
- def targetfile(data, read = false)
244
- if data[:type] == "fileref" then ref_file data[:ref], read
245
- else xml_file data[:id], read
246
- end
247
- end
248
-
249
- # @param ref [String]
250
- # @param read [Boolean]
251
- # @return [Array<String, nil>]
252
- def ref_file(ref, read)
253
- file = File.read(ref, encoding: "utf-8") if read
254
- filename = ref.sub(/\.xml$/, ".html")
255
- [file, filename]
256
- end
257
-
258
- # @param id [String]
259
- # @param read [Boolean]
260
- # @return [Array<String, nil>]
261
- def xml_file(id, read)
262
- file = @xml.at(ns("//doc-container[@id = '#{id}']")).to_xml if read
263
- filename = id + ".html"
264
- [file, filename]
265
- end
266
-
267
- # @param bib [Nokogiri::XML::Element]
268
- # @param identifier [String]
269
- def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
270
- docid = bib&.at(ns("./docidentifier"))&.text
271
- unless @files[docid]
272
- warn "Cannot find crossreference to document #{docid} in document "\
273
- "#{identifier}!"
274
- abort
275
- end
276
- id = bib["id"]
277
- newbib = bib.replace(@files[docid][:bibdata])
278
- newbib.name = "bibitem"
279
- newbib["id"] = id
280
- newbib["hidden"] = "true"
281
- newbib&.at(ns("./ext"))&.remove
282
- _file, url = targetfile(@files[docid], false)
283
- uri_node = Nokogiri::XML::Node.new "uri", newbib
284
- uri_node[:type] = "citation"
285
- uri_node.content = url
286
- newbib.at(ns("./docidentifier")).previous = uri_node
287
- end
288
-
289
- # TODO: update crossreferences to other files in the selection
290
- # repo(current-metanorma-collection/ISO 17301-1:2016)
291
- # replaced by
292
- # bibdata of "ISO 17301-1:2016" in situ as bibitem
293
- # Any erefs to that bibitem id are replaced with relative URL
294
- # Preferably with anchor, and is a job to realise dynamic lookup of
295
- # localities
296
- # @param file [String] XML content
297
- # @param identifier [String] docid
298
- # @return [String] XML content
299
- def update_xrefs(file, identifier)
300
- docxml = Nokogiri::XML(file)
301
- add_document_suffix(identifier, docxml)
302
- docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |b|
303
- docid = b&.at(ns("./docidentifier[@type = 'repository']"))&.text
304
- next unless docid && %r{^current-metanorma-collection/}.match(docid)
305
- update_bibitem(b, identifier)
306
- update_anchors(b, docxml, docid)
307
- end
308
- docxml.xpath(ns("//references[not(./bibitem[not(@hidden) or @hidden = 'false'])]")).each do |f|
309
- f["hidden"] = "true"
310
- end
311
- docxml.to_xml
312
- end
313
-
314
- # if there is a crossref to another document, with no anchor, retrieve the
315
- # anchor given the locality, and insert it into the crossref
316
- def update_anchors(bib, docxml, _id) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
317
- docid = bib&.at(ns("./docidentifier"))&.text
318
- document_suffix = Asciidoctor::Standoc::Cleanup.to_ncname(docid)
319
- docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
320
- if loc = e.at(ns(".//locality[@type = 'anchor']"))
321
- ref = loc.at(ns("./referenceFrom")) || next
322
- anchor = "#{ref.text}_#{document_suffix}"
323
- next unless @files[docid][:anchors].inject([]) { |m, (_, x)| m+= x.values }.include?(anchor)
324
- ref.content = anchor
325
- else
326
- ins = e.at(ns("./localityStack")) || next
327
- type = ins&.at(ns("./locality/@type"))&.text
328
- ref = ins&.at(ns("./locality/referenceFrom"))&.text
329
- (anchor = @files[docid][:anchors][type][ref]) || next
330
- ref_from = Nokogiri::XML::Node.new "referenceFrom", bib
331
- ref_from.content = anchor.sub(/^_/, "")
332
- locality = Nokogiri::XML::Node.new "locality", bib
333
- locality[:type] = "anchor"
334
- locality.add_child ref_from
335
- ins << locality
336
- end
337
- end
338
- end
339
-
340
- # process each file in the collection
341
- # files are held in memory, and altered as postprocessing
342
- def files # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
343
- @files.each do |identifier, x|
344
- file, filename = targetfile(x, true)
345
- file = update_xrefs(file, identifier)
346
- Tempfile.open(["collection", ".xml"], encoding: "utf-8") do |f|
347
- f.write(file)
348
- f.close
349
- # warn "metanorma compile -x html #{f.path}"
350
- c = Compile.new
351
- options = { format: :asciidoc, extension_keys: @format }.merge @compile_options
352
- c.compile f.path, options
353
- @files[identifier][:outputs] = {}
354
- @format.each do |e|
355
- ext = c.processor.output_formats[e]
356
- fn = File.basename(filename).sub(/(?<=\.)[^\.]+$/, ext.to_s)
357
- FileUtils.mv f.path.sub(/\.xml$/, ".#{ext}"), File.join(@outdir, fn)
358
- @files[identifier][:outputs][e] = File.join(@outdir, fn)
359
- end
360
- end
361
- end
362
- end
363
-
364
178
  private
365
179
 
366
180
  # @param options [Hash]
@@ -370,7 +184,6 @@ module Metanorma
370
184
  raise ArgumentError, "Need to specify formats (xml,html,pdf,doc)"
371
185
  end
372
186
  return if !options[:format].include?(:html) || options[:coverpage]
373
-
374
187
  raise ArgumentError, "Need to specify a coverpage to render HTML"
375
188
  end
376
189
  end
@@ -269,7 +269,7 @@ module Metanorma
269
269
  end
270
270
 
271
271
  def install_fonts(options)
272
- if options[:"no-install-fonts"]
272
+ if options[:no_install_fonts]
273
273
  Util.log("[fontist] Skip font installation because" \
274
274
  " --no-install-fonts argument passed", :debug)
275
275
  return
@@ -280,9 +280,11 @@ module Metanorma
280
280
  return
281
281
  end
282
282
 
283
+ @updated_formulas_repo = false
284
+
283
285
  manifest = @processor.fonts_manifest
284
- agree_to_terms = options[:"agree-to-terms"] || false
285
- continue_without_fonts = options[:"continue-without-fonts"] || false
286
+ agree_to_terms = options[:agree_to_terms] || false
287
+ continue_without_fonts = options[:continue_without_fonts] || false
286
288
 
287
289
  install_fonts_safe(manifest, agree_to_terms, continue_without_fonts)
288
290
  end
@@ -299,13 +301,16 @@ module Metanorma
299
301
  " make sure that you have set option --agree-to-terms", :fatal)
300
302
  end
301
303
  rescue Fontist::Errors::FontError => e
304
+ log_level = continue ? :warning : :fatal
302
305
  Util.log("[fontist] '#{e.font}' font is not supported. " \
303
306
  "Please report this issue at github.com/metanorma/metanorma-#{@processor.short}/issues" \
304
- " to report this issue.", :info)
307
+ " to report this issue.", log_level)
305
308
  rescue Fontist::Errors::FormulaIndexNotFoundError
309
+ Util.log("[fontist] Bug: formula index not found after 'fontist update'", :fatal) if @updated_formulas_repo
306
310
  Util.log("[fontist] Missing formula index. Fetching it...", :debug)
307
311
  Fontist::Formula.update_formulas_repo
308
- fontist_install(manifest, agree)
312
+ @updated_formulas_repo = true
313
+ install_fonts_safe(manifest, agree, continue)
309
314
  end
310
315
 
311
316
  def fontist_install(manifest, agree)
@@ -318,8 +323,8 @@ module Metanorma
318
323
  # @param options [Hash]
319
324
  # @return [String]
320
325
  def change_output_dir(options)
321
- if options[:"output-dir"]
322
- File.join options[:"output-dir"], File.basename(options[:filename])
326
+ if options[:output_dir]
327
+ File.join options[:output_dir], File.basename(options[:filename])
323
328
  else options[:filename]
324
329
  end
325
330
  end
@@ -14,7 +14,7 @@ module Metanorma
14
14
  header_footer: true,
15
15
  attributes: [
16
16
  "nodoc", "stem", "xrefstyle=short", "docfile=#{filename}",
17
- "output_dir=#{options[:"output-dir"]}"
17
+ "output_dir=#{options[:output_dir]}"
18
18
  ]
19
19
  }
20
20
  unless asciidoctor_validate(file, filename, out_opts)
@@ -1,3 +1,3 @@
1
1
  module Metanorma
2
- VERSION = "1.2.4"
2
+ VERSION = "1.2.5"
3
3
  end
@@ -27,19 +27,19 @@ Gem::Specification.new do |spec|
27
27
  spec.add_runtime_dependency 'htmlentities'
28
28
  spec.add_runtime_dependency 'nokogiri'
29
29
  spec.add_runtime_dependency 'mn2pdf', "~> 1"
30
+ spec.add_runtime_dependency 'metanorma-utils', "~> 1"
30
31
  spec.add_runtime_dependency 'pry'
31
32
  spec.add_runtime_dependency 'fontist', '~> 1.8'
32
33
 
33
- # get relaton-cli to avoic circular reference with metanorma-standoc
34
+ # get relaton-cli to avoid circular reference with metanorma-standoc
34
35
  #spec.add_dependency "relaton-cli"
35
- #spec.add_dependency "metanorma-standoc", "~> 1.5.3"
36
+ #spec.add_dependency "metanorma-standoc"
36
37
 
37
38
  spec.add_development_dependency "rake", "~> 12.0"
38
39
  spec.add_development_dependency "rspec", "~> 3.0"
39
40
  spec.add_development_dependency "byebug", "~> 10.0"
40
41
  spec.add_development_dependency "rspec-command", "~> 1.0"
41
42
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
42
- spec.add_development_dependency "metanorma-iso", "~> 1.6.0"
43
+ spec.add_development_dependency "metanorma-iso", "~> 1.7.0"
43
44
  spec.add_development_dependency "sassc", "~> 2.4.0"
44
- #spec.add_development_dependency "isodoc", "~> 1.2.1"
45
45
  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.2.4
4
+ version: 1.2.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: 2021-01-14 00:00:00.000000000 Z
11
+ date: 2021-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: metanorma-utils
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +184,14 @@ dependencies:
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: 1.6.0
187
+ version: 1.7.0
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 1.6.0
194
+ version: 1.7.0
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: sassc
183
197
  requirement: !ruby/object:Gem::Requirement
@@ -224,6 +238,7 @@ files:
224
238
  - lib/metanorma/asciidoctor_extensions.rb
225
239
  - lib/metanorma/asciidoctor_extensions/glob_include_processor.rb
226
240
  - lib/metanorma/collection.rb
241
+ - lib/metanorma/collection_fileprocess.rb
227
242
  - lib/metanorma/collection_manifest.rb
228
243
  - lib/metanorma/collection_renderer.rb
229
244
  - lib/metanorma/compile.rb