metanorma 1.3.0 → 1.3.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: c6503cb40980d520fe14a15845b75b748a6cdd40c9206e2218676ac9f2500ff5
4
- data.tar.gz: cb169e73038bae1a2c8d70170af1eb4956342056bd4d2c88341f0f08d86462ee
3
+ metadata.gz: d4ccf8d6a09fd9345faa44ae7201b4f7ee8816a6f36245c26b2482abd3f7afa9
4
+ data.tar.gz: 7997e0bea6b752e07f7db96f19b6d136b7a9740c046a0850022b477a2223a85b
5
5
  SHA512:
6
- metadata.gz: 66fb9df1d800763aafccdbb696d755627dfda9d29530200d048f91b59f46e081ff3ffe5f5504579d54ef2667ae33d821d1642329bf21eec6b04e1503e992454c
7
- data.tar.gz: d46d5ba951e50d47e75cd86c627c65958a490a4cb6e74ba4f61523b301caa53ae6eddc57a72dd58653b0b5a2894110ff5e0d55d795ac764ef303d0f607424667
6
+ metadata.gz: 162c6e5e79ff9f7f4f41b17444c68ec23168ee593173b72c251c8623f9a16916f6ae557bc581f39d220c2c6d68d6350c2e4f4de7c000a87e90f39bed7e825609
7
+ data.tar.gz: a92a8a6ddd41e404cb6a1e00e0a0aaa2ecd645723486769b8656bb09e10f9e595a9df81231713224f6f9781d17c1c6943135d978b5865d0c02842b5e0ccbb84c
@@ -16,19 +16,9 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.7', '2.6', '2.5', '2.4' ]
19
+ ruby: [ '3.0', '2.7', '2.6', '2.5', '2.4' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
- include:
23
- - ruby: '3.0'
24
- os: 'ubuntu-latest'
25
- experimental: true
26
- - ruby: '3.0'
27
- os: 'windows-latest'
28
- experimental: true
29
- - ruby: '3.0'
30
- os: 'macos-latest'
31
- experimental: true
32
22
  steps:
33
23
  - uses: actions/checkout@v2
34
24
  with:
@@ -49,5 +39,5 @@ jobs:
49
39
  with:
50
40
  token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
51
41
  repository: ${{ github.repository }}
52
- event-type: notify
42
+ event-type: tests-passed
53
43
  client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
data/.hound.yml CHANGED
@@ -1,3 +1,5 @@
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
1
3
  ruby:
2
- Enabled: true
4
+ enabled: true
3
5
  config_file: .rubocop.yml
data/.rubocop.yml CHANGED
@@ -1,14 +1,10 @@
1
- # This project follows the Ribose OSS style guide.
2
- # https://github.com/riboseinc/oss-guides
3
- # All project-specific additions and overrides should be specified in this file.
1
+ # Auto-generated by Cimas: Do not edit it manually!
2
+ # See https://github.com/metanorma/cimas
4
3
  inherit_from:
5
4
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
6
5
 
7
6
  # local repo-specific modifications
7
+ # ...
8
8
 
9
9
  AllCops:
10
- DisplayCopNames: false
11
- StyleGuideCopsOnly: false
12
- TargetRubyVersion: 2.4
13
- Rails:
14
- Enabled: true
10
+ TargetRubyVersion: 2.5
data/Rakefile CHANGED
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
@@ -1,20 +1,18 @@
1
1
  module Metanorma::AsciidoctorExtensions
2
-
3
2
  class GlobIncludeProcessor < ::Asciidoctor::Extensions::IncludeProcessor
4
- def process doc, reader, target_glob, attributes
3
+ def process(_doc, reader, target_glob, attributes)
5
4
  Dir[File.join reader.dir, target_glob].sort.reverse_each do |target|
6
5
  content = IO.readlines target
7
- content.unshift '' unless attributes['adjoin-option']
6
+ content.unshift "" unless attributes["adjoin-option"]
8
7
  reader.push_include content, target, target, 1, attributes
9
8
  end
10
9
  reader
11
10
  end
12
11
 
13
- def handles? target
14
- target.include? '*'
12
+ def handles?(target)
13
+ target.include? "*"
15
14
  end
16
15
  end
17
-
18
16
  end
19
17
 
20
18
  Asciidoctor::Extensions.register do
@@ -4,6 +4,7 @@ require "relaton"
4
4
  require "relaton/cli"
5
5
  require "metanorma/collection_manifest"
6
6
  require "metanorma-utils"
7
+ require_relative "util"
7
8
 
8
9
  module Metanorma
9
10
  # Metanorma collection of documents
@@ -18,6 +19,8 @@ module Metanorma
18
19
  # @return [Hash<String, Metanorma::Document>]
19
20
  attr_accessor :documents
20
21
 
22
+ attr_accessor :disambig
23
+
21
24
  # @param file [String] path to source file
22
25
  # @param directives [Array<String>] documents-inline to inject the XML into
23
26
  # the collection manifest; documents-external to keeps them outside
@@ -41,25 +44,32 @@ module Metanorma
41
44
  @prefatory = args[:prefatory]
42
45
  @final = args[:final]
43
46
  @log = Metanorma::Utils::Log.new
47
+ @disambig = Util::DisambigFiles.new
44
48
  end
45
49
 
46
50
  # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
47
- def clean_exit
48
- @log.write(File.join(File.dirname(@file), File.basename(@file, ".*") + ".err"))
49
- end
51
+ def clean_exit
52
+ @log.write(File.join(File.dirname(@file),
53
+ "#{File.basename(@file, '.*')}.err"))
54
+ end
50
55
 
51
56
  # @return [String] XML
52
57
  def to_xml
53
- Nokogiri::XML::Builder.new do |xml|
58
+ b = Nokogiri::XML::Builder.new do |xml|
54
59
  xml.send("metanorma-collection",
55
60
  "xmlns" => "http://metanorma.org") do |mc|
56
- mc << @bibdata.to_xml(bibdata: true, date_format: :full)
57
- @manifest.to_xml mc
58
- content_to_xml "prefatory", mc
59
- doccontainer mc
60
- content_to_xml "final", mc
61
+ collection_body(mc)
61
62
  end
62
- end.to_xml
63
+ end
64
+ b.to_xml
65
+ end
66
+
67
+ def collection_body(coll)
68
+ coll << @bibdata.to_xml(bibdata: true, date_format: :full)
69
+ @manifest.to_xml coll
70
+ content_to_xml "prefatory", coll
71
+ doccontainer coll
72
+ content_to_xml "final", coll
63
73
  end
64
74
 
65
75
  def render(opts)
@@ -110,7 +120,7 @@ module Metanorma
110
120
  # @parma mnf [Metanorma::CollectionManifest]
111
121
  # @return [Hash{String=>Metanorma::Document}]
112
122
  def docs_from_xml(xml, mnf)
113
- xml.xpath("//xmlns:doc-container/*/xmlns:bibdata")
123
+ xml.xpath("//xmlns:doc-container//xmlns:bibdata")
114
124
  .each_with_object({}) do |b, m|
115
125
  bd = Relaton::Cli.parse_xml b
116
126
  docref = mnf.docref_by_id bd.docidentifier.first.id
@@ -127,7 +137,7 @@ module Metanorma
127
137
  <<~CONT
128
138
 
129
139
  == #{xml.at('title')&.text}
130
- #{xml.at('p')&.text}
140
+ #{xml.at('p')&.text}
131
141
  CONT
132
142
  end
133
143
  end
@@ -152,8 +162,8 @@ module Metanorma
152
162
  return unless (cnt = send(elm))
153
163
 
154
164
  require "metanorma-#{doctype}"
155
- out = sections(dummy_header + cnt)
156
- builder.send(elm + "-content") { |b| b << out }
165
+ out = sections(dummy_header + cnt.strip)
166
+ builder.send("#{elm}-content") { |b| b << out }
157
167
  end
158
168
 
159
169
  # @param cnt [String] prefatory/final content
@@ -168,9 +178,18 @@ module Metanorma
168
178
  return unless Array(@directives).include? "documents-inline"
169
179
 
170
180
  documents.each_with_index do |(_, d), i|
171
- next if d.attachment
172
- id = format("doc%<index>09d", index: i)
173
- builder.send("doc-container", id: id) { |b| d.to_xml b }
181
+ doccontainer1(builder, d, i)
182
+ end
183
+ end
184
+
185
+ def doccontainer1(builder, doc, idx)
186
+ id = format("doc%<index>09d", index: idx)
187
+ builder.send("doc-container", id: id) do |b|
188
+ if doc.attachment
189
+ doc.bibitem and b << doc.bibitem.root.to_xml
190
+ b.attachment Metanorma::Utils::datauri(doc.file)
191
+ else doc.to_xml b
192
+ end
174
193
  end
175
194
  end
176
195
 
@@ -8,16 +8,18 @@ module Metanorma
8
8
  # UUIDs, so that their IDs can at least be registered to be tracked
9
9
  # as existing.
10
10
  def read_anchors(xml)
11
- ret = {}
12
11
  xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n, {})
13
12
  xrefs.parse xml
14
- xrefs.get.each do |k, v|
13
+ xrefs.get.each_with_object({}) do |(k, v), ret|
14
+ v[:type] ||= "clause"
15
15
  ret[v[:type]] ||= {}
16
- index = v[:container] || v[:label].nil? || v[:label].empty? ?
17
- UUIDTools::UUID.random_create.to_s : v[:label]
16
+ index = if v[:container] || v[:label].nil? || v[:label].empty?
17
+ UUIDTools::UUID.random_create.to_s
18
+ else v[:label]
19
+ end
18
20
  ret[v[:type]][index] = k
21
+ ret[v[:type]][v[:value]] = k if v[:value]
19
22
  end
20
- ret
21
23
  end
22
24
 
23
25
  # @param id [String]
@@ -32,7 +34,7 @@ module Metanorma
32
34
  # @param bib [Nokogiri::XML::Element]
33
35
  # @param identifier [String]
34
36
  def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
35
- docid = bib&.at(ns("./docidentifier"))&.text
37
+ docid = bib&.at(ns("./docidentifier"))&.children&.to_xml
36
38
  unless @files[docid]
37
39
  error = "[metanorma] Cannot find crossreference to document #{docid} "\
38
40
  "in document #{identifier}."
@@ -41,12 +43,14 @@ module Metanorma
41
43
  return
42
44
  end
43
45
  id = bib["id"]
44
- newbib = bib.replace(@files[docid][:bibdata])
46
+ newbib = @files[docid][:bibdata].dup
45
47
  newbib.name = "bibitem"
46
48
  newbib["id"] = id
47
49
  newbib["hidden"] = "true"
48
- newbib&.at(ns("./ext"))&.remove
49
- _file, url = targetfile(@files[docid], false, !@files[docid][:attachment])
50
+ newbib&.at("./*[local-name() = 'ext']")&.remove
51
+ bib.replace(newbib)
52
+ _file, url = targetfile(@files[docid], relative: true, read: false,
53
+ doc: !@files[docid][:attachment])
50
54
  uri_node = Nokogiri::XML::Node.new "uri", newbib
51
55
  uri_node[:type] = "citation"
52
56
  uri_node.content = url
@@ -68,7 +72,8 @@ module Metanorma
68
72
  add_document_suffix(identifier, docxml)
69
73
  update_direct_refs_to_docs(docxml, identifier)
70
74
  svgmap_resolve(datauri_encode(docxml))
71
- docxml.xpath(ns("//references[not(./bibitem[not(@hidden) or @hidden = 'false'])]")).each do |f|
75
+ docxml.xpath(ns("//references[bibitem][not(./bibitem[not(@hidden) or "\
76
+ "@hidden = 'false'])]")).each do |f|
72
77
  f["hidden"] = "true"
73
78
  end
74
79
  docxml.to_xml
@@ -85,11 +90,9 @@ module Metanorma
85
90
  isodoc = IsoDoc::Convert.new({})
86
91
  docxml.xpath(ns("//svgmap//eref")).each do |e|
87
92
  href = isodoc.eref_target(e)
88
- next if href == "##{e['bibitemid']}"
93
+ next if href == "##{e['bibitemid']}" ||
94
+ href =~ /^#/ && !docxml.at("//*[@id = '#{href.sub(/^#/, '')}']")
89
95
 
90
- if href.match(/^#/)
91
- next unless docxml.at("//*[@id = '#{href.sub(/^#/, '')}']")
92
- end
93
96
  e["target"] = href.strip
94
97
  e.name = "link"
95
98
  e&.elements&.remove
@@ -106,6 +109,7 @@ module Metanorma
106
109
  docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |b|
107
110
  docid = b&.at(ns("./docidentifier[@type = 'repository']"))&.text
108
111
  next unless docid && %r{^current-metanorma-collection/}.match(docid)
112
+
109
113
  update_bibitem(b, identifier)
110
114
  update_anchors(b, docxml, docid)
111
115
  end
@@ -131,14 +135,16 @@ module Metanorma
131
135
  docid.previous = "<docidentifier type='X'>#{file}</docidentifier>"
132
136
  end
133
137
 
134
- # update crossrefences to other documents, to include disambiguating document suffix on id
138
+ # update crossrefences to other documents, to include
139
+ # disambiguating document suffix on id
135
140
  def update_anchors(bib, docxml, _id) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
136
- docid = bib&.at(ns("./docidentifier"))&.text
141
+ docid = bib&.at(ns("./docidentifier"))&.children.to_xml
137
142
  docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
138
143
  if @files[docid]
139
144
  update_anchor_loc(bib, e, docid)
140
145
  else
141
- e << "<strong>** Unresolved reference to document #{docid}, id #{e['bibitemid']}</strong>"
146
+ e << "<strong>** Unresolved reference to document #{docid}, "\
147
+ "id #{e['bibitemid']}</strong>"
142
148
  end
143
149
  end
144
150
  end
@@ -150,18 +156,20 @@ module Metanorma
150
156
  ref = loc.at(ns("./referenceFrom")) || return
151
157
  anchor = "#{ref.text}_#{document_suffix}"
152
158
  return unless @files[docid][:anchors].inject([]) do |m, (_, x)|
153
- m+= x.values
159
+ m += x.values
154
160
  end.include?(anchor)
161
+
155
162
  ref.content = anchor
156
163
  end
157
164
 
158
165
  # if there is a crossref to another document, with no anchor, retrieve the
159
166
  # 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
167
+ def update_anchor_create_loc(bib, eref, docid)
168
+ ins = eref.at(ns("./localityStack")) or return
162
169
  type = ins&.at(ns("./locality/@type"))&.text
170
+ type = "clause" if type == "annex"
163
171
  ref = ins&.at(ns("./locality/referenceFrom"))&.text
164
- (anchor = @files[docid][:anchors][type][ref]) || return
172
+ anchor = @files[docid][:anchors].dig(type, ref) or return
165
173
  ref_from = Nokogiri::XML::Node.new "referenceFrom", bib
166
174
  ref_from.content = anchor.sub(/^_/, "")
167
175
  locality = Nokogiri::XML::Node.new "locality", bib
@@ -174,7 +182,8 @@ module Metanorma
174
182
  def gather_internal_refs
175
183
  @files.each_with_object({}) do |(_, x), refs|
176
184
  next if x[:attachment]
177
- file, _ = targetfile(x, true)
185
+
186
+ file, = targetfile(x, read: true)
178
187
  Nokogiri::XML(file)
179
188
  .xpath(ns("//bibitem[@type = 'internal']/"\
180
189
  "docidentifier[@type = 'repository']")).each do |d|
@@ -189,18 +198,8 @@ module Metanorma
189
198
  # resolve file location for the target of each internal reference
190
199
  def locate_internal_refs
191
200
  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
201
+ @files.keys.reject { |k| @files[k][:attachment] }.each do |identifier|
202
+ locate_internal_refs1(refs, identifier, @files[identifier])
204
203
  end
205
204
  refs.each do |schema, ids|
206
205
  ids.each do |id, key|
@@ -209,5 +208,17 @@ module Metanorma
209
208
  end
210
209
  refs
211
210
  end
211
+
212
+ def locate_internal_refs1(refs, identifier, filedesc)
213
+ file, _filename = targetfile(filedesc, read: true)
214
+ docxml = Nokogiri::XML(file)
215
+ refs.each do |schema, ids|
216
+ ids.each_key do |id|
217
+ n = docxml.at("//*[@id = '#{id}']") and
218
+ n.at("./ancestor-or-self::*[@type = '#{schema}']") and
219
+ refs[schema][id] = identifier
220
+ end
221
+ end
222
+ end
212
223
  end
213
224
  end
@@ -15,27 +15,35 @@ module Metanorma
15
15
  def read_files(path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
16
16
  files = {}
17
17
  @xml.xpath(ns("//docref")).each do |d|
18
- identifier = d.at(ns("./identifier")).text
19
- files[identifier] = file_entry(d, path)
20
- next if files[identifier][:attachment]
21
-
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"))
18
+ identifier = d.at(ns("./identifier")).children.to_xml
19
+ files[identifier] = file_entry(d, identifier, path)
20
+ if files[identifier][:attachment]
21
+ files[identifier][:bibdata] = Metanorma::Document
22
+ .attachment_bibitem(identifier).root
23
+ else
24
+ file, _filename = targetfile(files[identifier], read: true)
25
+ xml = Nokogiri::XML(file)
26
+ add_document_suffix(identifier, xml)
27
+ files[identifier][:anchors] = read_anchors(xml)
28
+ files[identifier][:bibdata] = xml.at(ns("//bibdata"))
29
+ end
27
30
  end
28
31
  files
29
32
  end
30
33
 
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"] }
34
+ # rel_path is the source file address, determined relative to the YAML.
35
+ # out_path is the destination file address, with any references outside
36
+ # the working directory (../../...) truncated
37
+ def file_entry(ref, identifier, _path)
38
+ out = ref["attachment"] ? ref["fileref"] : File.basename(ref["fileref"])
39
+ ret = if ref["fileref"]
40
+ { type: "fileref", ref: @documents[identifier].file,
41
+ rel_path: ref["fileref"],
42
+ out_path: out }
35
43
  else
36
- { type: "id", ref: docref["id"] }
44
+ { type: "id", ref: ref["id"] }
37
45
  end
38
- ret[:attachment] = docref["attachment"] if docref["attachment"]
46
+ ret[:attachment] = ref["attachment"] if ref["attachment"]
39
47
  ret
40
48
  end
41
49
 
@@ -58,12 +66,20 @@ module Metanorma
58
66
 
59
67
  # return file contents + output filename for each file in the collection,
60
68
  # given a docref entry
61
- # @param data [Hash]
62
- # @param read [Boolean]
69
+ # @param data [Hash] docref entry
70
+ # @param read [Boolean] read the file in and return it
71
+ # @param doc [Boolean] I am a Metanorma document,
72
+ # so my URL should end with html or pdf or whatever
73
+ # @param relative [Boolean] Return output path,
74
+ # formed relative to YAML file, not input path, relative to calling function
63
75
  # @return [Array<String, nil>]
64
- def targetfile(data, read = false, doc = true)
65
- if data[:type] == "fileref" then ref_file data[:ref], read, doc
66
- else xml_file data[:id], read
76
+ def targetfile(data, options)
77
+ options = { read: false, doc: true, relative: false }.merge(options)
78
+ path = options[:relative] ? data[:rel_path] : data[:ref]
79
+ if data[:type] == "fileref"
80
+ ref_file path, data[:out_path], options[:read], options[:doc]
81
+ else
82
+ xml_file data[:id], options[:read]
67
83
  end
68
84
  end
69
85
 
@@ -71,43 +87,46 @@ module Metanorma
71
87
  # @param read [Boolean]
72
88
  # @param doc [Boolean]
73
89
  # @return [Array<String, nil>]
74
- def ref_file(ref, read, doc)
90
+ def ref_file(ref, out, read, doc)
75
91
  file = File.read(ref, encoding: "utf-8") if read
76
- filename = ref.dup
92
+ filename = out.dup
77
93
  filename.sub!(/\.xml$/, ".html") if doc
78
94
  [file, filename]
79
95
  end
80
96
 
81
97
  # compile and output individual file in collection
82
- def file_compile(f, filename, identifier)
98
+ def file_compile(file, filename, identifier)
83
99
  # warn "metanorma compile -x html #{f.path}"
100
+ Array(@directives).include?("presentation-xml") and
101
+ @compile_options.merge!(passthrough_presentation_xml: true)
84
102
  c = Compile.new
85
- c.compile f.path, { format: :asciidoc,
86
- extension_keys: @format }.merge(@compile_options)
103
+ c.compile file.path, { format: :asciidoc,
104
+ extension_keys: @format }.merge(@compile_options)
87
105
  @files[identifier][:outputs] = {}
88
106
  @format.each do |e|
89
107
  ext = c.processor.output_formats[e]
90
108
  fn = File.basename(filename).sub(/(?<=\.)[^\.]+$/, ext.to_s)
91
- FileUtils.mv f.path.sub(/\.xml$/, ".#{ext}"), File.join(@outdir, fn)
109
+ FileUtils.cp file.path.sub(/\.xml$/, ".#{ext}"), File.join(@outdir, fn)
92
110
  @files[identifier][:outputs][e] = File.join(@outdir, fn)
93
111
  end
94
112
  end
95
113
 
96
114
  def copy_file_to_dest(fileref)
97
- _file, filename = targetfile(fileref, true, false)
98
- dest = File.join(@outdir, fileref[:rel_path])
115
+ dest = File.join(@outdir, fileref[:out_path])
99
116
  FileUtils.mkdir_p(File.dirname(dest))
100
- FileUtils.cp filename, dest
117
+ FileUtils.cp fileref[:ref], dest
101
118
  end
102
119
 
103
120
  # process each file in the collection
104
121
  # files are held in memory, and altered as postprocessing
105
122
  def files # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
106
123
  internal_refs = locate_internal_refs
107
- @files.each do |identifier, x|
124
+ @files.each_with_index do |(identifier, x), i|
125
+ i.positive? && Array(@directives).include?("bare-after-first") and
126
+ @compile_options.merge!(bare: true)
108
127
  if x[:attachment] then copy_file_to_dest(x)
109
128
  else
110
- file, filename = targetfile(x, true)
129
+ file, filename = targetfile(x, read: true)
111
130
  file = update_xrefs(file, identifier, internal_refs)
112
131
  Tempfile.open(["collection", ".xml"], encoding: "utf-8") do |f|
113
132
  f.write(file)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require_relative "util"
2
3
 
3
4
  module Metanorma
4
5
  # Metanorma collection's manifest
@@ -15,6 +16,7 @@ module Metanorma
15
16
  @title = title
16
17
  @docref = docref
17
18
  @manifest = manifest
19
+ @disambig = Util::DisambigFiles.new
18
20
  end
19
21
 
20
22
  class << self
@@ -43,8 +45,8 @@ module Metanorma
43
45
  # @return [Hash{String=>String}]
44
46
  def parse_docref(mnf)
45
47
  mnf.xpath("xmlns:docref").map do |dr|
46
- h = { "identifier" => dr.at("identifier").text }
47
- h["fileref"] = dr[:fileref] if dr[:fileref]
48
+ h = { "identifier" => dr.at("identifier").children.to_xml }
49
+ dr[:fileref] and h["fileref"] = dr[:fileref]
48
50
  h["attachment"] = dr[:attachment] if dr[:attachment]
49
51
  h
50
52
  end
@@ -63,12 +65,13 @@ module Metanorma
63
65
  docs = @docref.each_with_object({}) do |dr, m|
64
66
  next m unless dr["fileref"]
65
67
 
66
- m[dr["identifier"]] = Document.parse_file(File.join(dir, dr["fileref"]), dr["attachment"])
68
+ m[dr["identifier"]] = Document.parse_file(
69
+ File.join(dir, dr["fileref"]),
70
+ dr["attachment"], dr["identifier"]
71
+ )
67
72
  m
68
73
  end
69
- @manifest.reduce(docs) do |mem, mnf|
70
- mem.merge mnf.documents(dir)
71
- end
74
+ @manifest.reduce(docs) { |mem, mnf| mem.merge mnf.documents(dir) }
72
75
  end
73
76
 
74
77
  # @param builder [Nokogiri::XML::Builder]
@@ -99,14 +102,25 @@ module Metanorma
99
102
 
100
103
  # @param builder [Nokogiri::XML::Builder]
101
104
  def docref_to_xml(builder)
105
+ @disambig = Util::DisambigFiles.new
102
106
  @docref.each do |dr|
103
- drf = builder.docref { |b| b.identifier dr["identifier"] }
104
- drf[:fileref] = dr["fileref"]
105
- drf[:attachment] = dr["attachment"] if dr["attachment"]
106
- if collection.directives.include?("documents-inline")
107
- id = collection.documents.find_index { |k, _| k == dr["identifier"] }
108
- drf[:id] = format("doc%<index>09d", index: id)
107
+ drf = builder.docref do |b|
108
+ b.identifier do |i|
109
+ i << dr["identifier"]
110
+ end
111
+ end
112
+ docref_to_xml_attrs(drf, dr)
113
+ end
114
+ end
115
+
116
+ def docref_to_xml_attrs(elem, docref)
117
+ elem[:fileref] = @disambig.source2dest_filename(docref["fileref"])
118
+ elem[:attachment] = docref["attachment"] if docref["attachment"]
119
+ if collection.directives.include?("documents-inline")
120
+ id = collection.documents.find_index do |k, _|
121
+ k == docref["identifier"]
109
122
  end
123
+ elem[:id] = format("doc%<index>09d", index: id)
110
124
  end
111
125
  end
112
126
  end
@@ -3,6 +3,7 @@
3
3
  require "isodoc"
4
4
  require_relative "collection_fileprocess"
5
5
  require_relative "fontist_utils"
6
+ require_relative "util"
6
7
 
7
8
  module Metanorma
8
9
  # XML collection renderer
@@ -21,9 +22,9 @@ module Metanorma
21
22
  # the collection, and that the flavour gem can sensibly process it. We may
22
23
  # need to enhance metadata in the flavour gems isodoc/metadata.rb with
23
24
  # collection metadata
24
- def initialize(xml, folder, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
25
+ def initialize(collection, folder, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
25
26
  check_options options
26
- @xml = Nokogiri::XML xml # @xml is the collection manifest
27
+ @xml = Nokogiri::XML collection.to_xml # @xml is the collection manifest
27
28
  @lang = @xml&.at(ns("//bibdata/language"))&.text || "en"
28
29
  @script = @xml&.at(ns("//bibdata/script"))&.text || "Latn"
29
30
  @doctype = doctype
@@ -37,9 +38,13 @@ module Metanorma
37
38
  @format = options[:format]
38
39
  @compile_options = options[:compile] || {}
39
40
  @log = options[:log]
41
+ @documents = collection.documents
42
+ @directives = collection.directives
43
+ @disambig = Util::DisambigFiles.new
40
44
 
41
45
  # list of files in the collection
42
46
  @files = read_files folder
47
+ isodoc_populate(@isodoc)
43
48
  FileUtils.rm_rf @outdir
44
49
  FileUtils.mkdir_p @outdir
45
50
  end
@@ -51,7 +56,7 @@ module Metanorma
51
56
  # @option options [Strong] :ourput_folder output directory
52
57
  def self.render(col, options = {})
53
58
  folder = File.dirname col.file
54
- cr = new(col.to_xml, folder, options)
59
+ cr = new(col, folder, options)
55
60
  cr.files
56
61
  cr.concatenate(col, options)
57
62
  cr.coverpage if options[:format]&.include?(:html)
@@ -61,11 +66,13 @@ module Metanorma
61
66
  options[:format] << :presentation if options[:format].include?(:pdf)
62
67
  options[:format].uniq.each do |e|
63
68
  next unless %i(presentation xml).include?(e)
69
+
64
70
  ext = e == :presentation ? "presentation.xml" : e.to_s
65
71
  out = col.clone
66
72
  out.directives << "documents-inline"
67
73
  out.documents.keys.each do |id|
68
74
  next if @files[id][:attachment]
75
+
69
76
  filename = @files[id][:outputs][e]
70
77
  out.documents[id] = Metanorma::Document.raw_file(filename)
71
78
  end
@@ -100,15 +107,21 @@ module Metanorma
100
107
  end
101
108
 
102
109
  # The isodoc class for the metanorma flavour we are using
103
- def isodoc # rubocop:disable Metrics/MethodLength
110
+ def isodoc
104
111
  x = Asciidoctor.load nil, backend: @doctype.to_sym
105
112
  isodoc = x.converter.html_converter(Dummy.new)
106
113
  isodoc.i18n_init(@lang, @script) # read in internationalisation
114
+ isodoc.metadata_init(@lang, @script, isodoc.i18n)
115
+ isodoc.info(@xml, nil)
116
+ isodoc
117
+ end
118
+
119
+ def isodoc_populate(isodoc)
107
120
  # create the @meta class of isodoc, with "navigation" set to the index bar
108
121
  # extracted from the manifest
109
122
  nav = indexfile(@xml.at(ns("//manifest")))
110
123
  i18n = isodoc.i18n
111
- i18n.set(:navigation, nav)
124
+ i18n.set("navigation", nav)
112
125
  isodoc.metadata_init(@lang, @script, i18n)
113
126
  # populate the @meta class of isodoc with the various metadata fields
114
127
  # native to the flavour; used to populate Liquid
@@ -135,6 +148,8 @@ module Metanorma
135
148
  # populate liquid template of ARGV[1] with metadata extracted from
136
149
  # collection manifest
137
150
  def coverpage
151
+ return unless @coverpage
152
+
138
153
  File.open(File.join(@outdir, "index.html"), "w:UTF-8") do |f|
139
154
  f.write @isodoc.populate_template(File.read(@coverpage))
140
155
  end
@@ -163,11 +178,19 @@ module Metanorma
163
178
  # @param builder [Nokogiri::XML::Builder]
164
179
  def docrefs(elm, builder)
165
180
  elm.xpath(ns("./docref")).each do |d|
166
- identifier = d.at(ns("./identifier")).text
167
- link = if d["fileref"] then d["fileref"].sub(/\.xml$/, ".html")
168
- else d["id"] + ".html"
169
- end
170
- builder.li { builder.a identifier, href: link }
181
+ ident = d.at(ns("./identifier")).children.to_xml
182
+ builder.li do |li|
183
+ li.a **{ href: index_link(d, ident) } do |a|
184
+ a << ident
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ def index_link(docref, ident)
191
+ if docref["fileref"]
192
+ @files[ident][:out_path].sub(/\.xml$/, ".html")
193
+ else "#{docref['id']}.html"
171
194
  end
172
195
  end
173
196
 
@@ -199,8 +222,6 @@ module Metanorma
199
222
  unless options[:format].is_a?(Array) && (FORMATS & options[:format]).any?
200
223
  raise ArgumentError, "Need to specify formats (xml,html,pdf,doc)"
201
224
  end
202
- return if !options[:format].include?(:html) || options[:coverpage]
203
- raise ArgumentError, "Need to specify a coverpage to render HTML"
204
225
  end
205
226
  end
206
227
  end
@@ -20,7 +20,7 @@ module Metanorma
20
20
  def compile(filename, options = {})
21
21
  require_libraries(options)
22
22
  options = options_extract(filename, options)
23
- validate_type(options) && validate_format(options) || (return nil)
23
+ validate_options(options)
24
24
  @processor = @registry.find_processor(options[:type].to_sym)
25
25
  extensions = get_extensions(options) or return nil
26
26
  (file, isodoc = process_input(filename, options)) or return nil
@@ -74,7 +74,9 @@ module Metanorma
74
74
  memo
75
75
  end
76
76
  end
77
- if !extensions.include?(:presentation) and extensions.any? { |e| @processor.use_presentation_xml(e) }
77
+ if !extensions.include?(:presentation) && extensions.any? do |e|
78
+ @processor.use_presentation_xml(e)
79
+ end
78
80
  extensions << :presentation
79
81
  end
80
82
  extensions
@@ -88,7 +90,7 @@ module Metanorma
88
90
  options[:asciimath] and
89
91
  file.sub!(/^(=[^\n]+\n)/, "\\1:mn-keep-asciimath:\n")
90
92
  dir = File.dirname(filename)
91
- dir != '.' and
93
+ dir != "." and
92
94
  file.gsub!(/^include::/, "include::#{dir}/")
93
95
  [file, @processor.input_to_isodoc(file, filename, options)]
94
96
  when ".xml"
@@ -108,15 +110,17 @@ module Metanorma
108
110
 
109
111
  def relaton_export(isodoc, options)
110
112
  return unless options[:relaton]
113
+
111
114
  xml = Nokogiri::XML(isodoc)
112
115
  bibdata = xml.at("//bibdata") || xml.at("//xmlns:bibdata")
113
- #docid = bibdata&.at("./xmlns:docidentifier")&.text || options[:filename]
114
- #outname = docid.sub(/^\s+/, "").sub(/\s+$/, "").gsub(/\s+/, "-") + ".xml"
116
+ # docid = bibdata&.at("./xmlns:docidentifier")&.text || options[:filename]
117
+ # outname = docid.sub(/^\s+/, "").sub(/\s+$/, "").gsub(/\s+/, "-") + ".xml"
115
118
  File.open(options[:relaton], "w:UTF-8") { |f| f.write bibdata.to_xml }
116
119
  end
117
120
 
118
121
  def clean_sourcecode(xml)
119
- xml.xpath(".//callout | .//annotation | .//xmlns:callout | .//xmlns:annotation").each do |x|
122
+ xml.xpath(".//callout | .//annotation | .//xmlns:callout | "\
123
+ ".//xmlns:annotation").each do |x|
120
124
  x.remove
121
125
  end
122
126
  xml.xpath(".//br | .//xmlns:br").each { |x| x.replace("\n") }
@@ -125,6 +129,7 @@ module Metanorma
125
129
 
126
130
  def extract(isodoc, dirname, extract_types)
127
131
  return unless dirname
132
+
128
133
  if extract_types.nil? || extract_types.empty?
129
134
  extract_types = [:sourcecode, :image, :requirement]
130
135
  end
@@ -207,6 +212,7 @@ module Metanorma
207
212
  isodoc_options = @processor.extract_options(file)
208
213
  isodoc_options[:datauriimage] = true if options[:datauriimage]
209
214
  isodoc_options[:sourcefilename] = options[:filename]
215
+ isodoc_options[:bare] = options[:bare]
210
216
  file_extension = @processor.output_formats[ext]
211
217
  outfilename = f.sub(/\.[^.]+$/, ".#{file_extension}")
212
218
  if ext == :pdf
@@ -217,19 +223,22 @@ module Metanorma
217
223
  if ext == :rxl
218
224
  options[:relaton] = outfilename
219
225
  relaton_export(isodoc, options)
226
+ elsif options[:passthrough_presentation_xml] && ext == :presentation
227
+ FileUtils.cp f, presentationxml_name
220
228
  else
221
229
  begin
222
230
  @processor.use_presentation_xml(ext) ?
223
231
  @processor.output(nil, presentationxml_name, outfilename, ext, isodoc_options) :
224
232
  @processor.output(isodoc, xml_name, outfilename, ext, isodoc_options)
225
233
  rescue StandardError => e
226
- puts e.message
227
- puts e.backtrace.join("\n")
234
+ if e.message.include? "Fatal:"
235
+ @errors << e.message
236
+ else
237
+ puts e.message
238
+ puts e.backtrace.join("\n")
239
+ end
228
240
  end
229
241
  end
230
- if ext == :pdf
231
- # font_locations.unlink
232
- end
233
242
  wrap_html(options, file_extension, outfilename)
234
243
  end
235
244
  end
@@ -1,45 +1,51 @@
1
1
  module Metanorma
2
2
  class Compile
3
+ def validate_options(options)
4
+ validate_type(options)
5
+ validate_format(options)
6
+ end
7
+
3
8
  def validate_type(options)
4
9
  unless options[:type]
5
10
  Util.log("[metanorma] Error: Please specify a standard type: "\
6
- "#{@registry.supported_backends}.", :error)
7
- return nil
11
+ "#{@registry.supported_backends}.", :fatal)
8
12
  end
9
13
  stdtype = options[:type].to_sym
10
- metanorma_flavor = "metanorma-#{stdtype}"
14
+ load_flavor(stdtype)
15
+ end
16
+
17
+ def validate_format(options)
18
+ unless options[:format] == :asciidoc
19
+ Util.log("[metanorma] Error: Only source file format currently "\
20
+ "supported is 'asciidoc'.", :fatal)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def load_flavor(stdtype)
27
+ flavor = "metanorma-#{stdtype}"
11
28
  unless @registry.supported_backends.include? stdtype
12
- Util.log("[metanorma] Info: Loading `#{metanorma_flavor}` gem "\
29
+ Util.log("[metanorma] Info: Loading `#{flavor}` gem "\
13
30
  "for standard type `#{stdtype}`.", :info)
14
31
  end
15
- begin
16
- require "metanorma-#{stdtype}"
17
- Util.log("[metanorma] Info: gem `#{metanorma_flavor}` loaded.", :info)
18
- rescue Gem::ConflictError
19
- Util.log("[metanorma] Error: Couldn't resolve dependencies for "\
20
- "`metanorma-#{stdtype}`, Please add it to your Gemfile "\
21
- "and run bundle install first", :error)
22
- return false
23
- rescue LoadError
24
- Util.log("[metanorma] Error: loading gem `#{metanorma_flavor}` "\
25
- "failed. Exiting.", :error)
26
- return false
27
- end
32
+ require_flavor(flavor, stdtype)
28
33
  unless @registry.supported_backends.include? stdtype
29
- Util.log("[metanorma] Error: The `#{metanorma_flavor}` gem "\
30
- "still doesn't support `#{stdtype}`. Exiting.", :error)
31
- return false
34
+ Util.log("[metanorma] Error: The `#{flavor}` gem "\
35
+ "still doesn't support `#{stdtype}`. Exiting.", :fatal)
32
36
  end
33
- true
34
37
  end
35
38
 
36
- def validate_format(options)
37
- unless options[:format] == :asciidoc
38
- Util.log("[metanorma] Error: Only source file format currently "\
39
- "supported is 'asciidoc'.", :error)
40
- return false
41
- end
42
- true
39
+ def require_flavor(flavor, stdtype)
40
+ require flavor
41
+ Util.log("[metanorma] Info: gem `#{flavor}` loaded.", :info)
42
+ rescue Gem::ConflictError
43
+ Util.log("[metanorma] Error: Couldn't resolve dependencies for "\
44
+ "`metanorma-#{stdtype}`, Please add it to your Gemfile "\
45
+ "and run bundle install first", :fatal)
46
+ rescue LoadError
47
+ Util.log("[metanorma] Error: loading gem `#{flavor}` "\
48
+ "failed. Exiting.", :fatal)
43
49
  end
44
50
  end
45
51
  end
@@ -15,7 +15,7 @@ module Metanorma
15
15
  attr_accessor :logs
16
16
 
17
17
  def initialize
18
- @logs ||= [:warning, :error, :fatal]
18
+ @logs ||= %i[warning error fatal]
19
19
  end
20
20
  end
21
21
 
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  class Document
3
3
  # @return [Strin]
4
- attr_reader :file, :attachment
4
+ attr_reader :file, :attachment, :bibitem
5
5
 
6
6
  # @param bibitem [RelatonBib::BibliographicItem]
7
7
  def initialize(bibitem, file, options = {})
@@ -14,9 +14,12 @@ module Metanorma
14
14
  class << self
15
15
  # @param file [String] file path
16
16
  # @param attachment [Bool] is an attachment
17
+ # @param identifier [String] is the identifier assigned the file
18
+ # in the collection file
17
19
  # @return [Metanorma::Document]
18
- def parse_file(file, attachment)
19
- new bibitem(file), file, { attachment: attachment }
20
+ def parse_file(file, attachment, identifier = nil)
21
+ new(bibitem(file, attachment, identifier), file,
22
+ { attachment: attachment })
20
23
  end
21
24
 
22
25
  # #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
@@ -31,6 +34,12 @@ module Metanorma
31
34
  new(doc, filename, raw: true)
32
35
  end
33
36
 
37
+ def attachment_bibitem(identifier)
38
+ Nokogiri::XML(
39
+ "<bibdata><docidentifier>#{identifier}</docidentifier></bibdata>",
40
+ )
41
+ end
42
+
34
43
  private
35
44
 
36
45
  # #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
@@ -51,13 +60,16 @@ module Metanorma
51
60
  # @param file [String]
52
61
  # @return [RelatonBib::BibliographicItem,
53
62
  # RelatonIso::IsoBibliographicItem]
54
- def bibitem(file)
55
- case format(file)
56
- when :xml
57
- from_xml Nokogiri::XML(File.read(file, encoding: "UTF-8"))
58
- when :yaml
59
- yaml = File.read(file, encoding: "UTF-8")
60
- Relaton::Cli::YAMLConvertor.convert_single_file(yaml)
63
+ def bibitem(file, attachment, identifier)
64
+ if attachment then attachment_bibitem(identifier)
65
+ else
66
+ case format(file)
67
+ when :xml
68
+ from_xml Nokogiri::XML(File.read(file, encoding: "UTF-8"))
69
+ when :yaml
70
+ yaml = File.read(file, encoding: "UTF-8")
71
+ Relaton::Cli::YAMLConvertor.convert_single_file(yaml)
72
+ end
61
73
  end
62
74
  end
63
75
  end
@@ -3,6 +3,5 @@ require_relative "./input/asciidoc"
3
3
 
4
4
  module Metanorma
5
5
  module Input
6
-
7
6
  end
8
7
  end
@@ -2,20 +2,14 @@ require "nokogiri"
2
2
 
3
3
  module Metanorma
4
4
  module Input
5
-
6
5
  class Asciidoc < Base
7
-
8
6
  def process(file, filename, type, options = {})
9
7
  require "asciidoctor"
10
8
  out_opts = {
11
- to_file: false,
12
- safe: :safe,
13
- backend: type,
14
- header_footer: true,
15
- attributes: [
16
- "nodoc", "stem", "xrefstyle=short", "docfile=#{filename}",
17
- "output_dir=#{options[:output_dir]}"
18
- ]
9
+ to_file: false, safe: :safe, backend: type, header_footer: true,
10
+ attributes: ["nodoc", "stem", "xrefstyle=short",
11
+ "docfile=#{filename}",
12
+ "output_dir=#{options[:output_dir]}"]
19
13
  }
20
14
  unless asciidoctor_validate(file, filename, out_opts)
21
15
  warn "Cannot continue compiling Asciidoctor document"
@@ -27,11 +21,12 @@ module Metanorma
27
21
  def asciidoctor_validate(file, filename, options)
28
22
  err = nil
29
23
  begin
30
- previous_stderr, $stderr = $stderr, StringIO.new
24
+ previous_stderr = $stderr
25
+ $stderr = StringIO.new
31
26
  ::Asciidoctor.load(file, options)
32
- %r{(\n|^)asciidoctor: ERROR: ['"]?#{Regexp.escape(filename ||
33
- "<empty>")}['"]?: line \d+: include file not found: }.match($stderr.string) and
34
- err = $stderr.string
27
+ %r{(\n|^)asciidoctor: ERROR: ['"]?#{Regexp.escape(filename ||
28
+ "<empty>")}['"]?: line \d+: include file not found: }
29
+ .match($stderr.string) and err = $stderr.string
35
30
  ensure
36
31
  $stderr = previous_stderr
37
32
  end
@@ -45,8 +40,9 @@ module Metanorma
45
40
  /\n:mn-output-extensions: (?<extensions>[^\n]+)\n/ =~ headerextract
46
41
  /\n:mn-relaton-output-file: (?<relaton>[^\n]+)\n/ =~ headerextract
47
42
  /\n(?<asciimath>:mn-keep-asciimath:[^\n]*)\n/ =~ headerextract
48
- asciimath = defined?(asciimath) ?
49
- (!asciimath.nil? && asciimath != ":mn-keep-asciimath: false") : nil
43
+ asciimath = if defined?(asciimath)
44
+ (!asciimath.nil? && asciimath != ":mn-keep-asciimath: false")
45
+ end
50
46
  asciimath = nil if asciimath == false
51
47
  {
52
48
  type: defined?(type) ? type : nil,
@@ -60,38 +56,39 @@ module Metanorma
60
56
  attr&.sub(/^#{name}:\s*$/, "#{name}: true")&.sub(/^#{name}:\s+/, "")
61
57
  end
62
58
 
59
+ ADOC_OPTIONS = %w(htmlstylesheet htmlcoverpage htmlintropage scripts
60
+ scripts-override scripts-pdf wordstylesheet bare i18nyaml
61
+ standardstylesheet header wordcoverpage wordintropage
62
+ ulstyle olstyle htmlstylesheet-override
63
+ htmltoclevels doctoclevels sectionsplit
64
+ body-font header-font monospace-font title-font
65
+ wordstylesheet-override).freeze
66
+
63
67
  def extract_options(file)
64
68
  header = file.sub(/\n\n.*$/m, "\n")
65
- ret = %w(htmlstylesheet htmlcoverpage htmlintropage scripts
66
- scripts-pdf wordstylesheet
67
- standardstylesheet header wordcoverpage wordintropage i18nyaml
68
- ulstyle olstyle htmlstylesheet-override
69
- htmltoclevels doctoclevels sectionsplit
70
- body-font header-font monospace-font title-font
71
- wordstylesheet-override).each_with_object({}) do |w, acc|
69
+ ret = ADOC_OPTIONS.each_with_object({}) do |w, acc|
72
70
  m = /\n:#{w}: ([^\n]+)\n/.match(header) or next
73
71
  acc[w.gsub(/-/, "").sub(/override$/, "_override")
74
72
  .sub(/pdf$/, "_pdf").to_sym] = m[1]
75
73
  end
76
74
  /\n:data-uri-image: (?<datauriimage>[^\n]+)\n/ =~ header
77
- /\n:(?<hierarchical_assets>hierarchical-assets:[^\n]*)\n/ =~ header
75
+ /\n:(?<hier_assets>hierarchical-assets:[^\n]*)\n/ =~ header
78
76
  /\n:(?<use_xinclude>use-xinclude:[^\n]*)\n/ =~ header
79
77
  /\n:(?<break_up>break-up-urls-in-tables:[^\n]*)\n/ =~ header
80
78
 
81
- defined?(hierarchical_assets) and
82
- hierarchical_assets = empty_attr(hierarchical_assets, "hierarchical-assets")
79
+ defined?(hier_assets) and
80
+ hier_assets = empty_attr(hier_assets, "hierarchical-assets")
83
81
  defined?(use_xinclude) and
84
82
  use_xinclude = empty_attr(use_xinclude, "use-xinclude")
85
83
  defined?(break_up) and
86
84
  break_up = empty_attr(break_up, "break-up-urls-in-tables")
87
- ret.merge({
85
+ ret.merge(
88
86
  datauriimage: defined?(datauriimage) ? datauriimage != "false" : nil,
89
- hierarchical_assets: defined?(hierarchical_assets) ? hierarchical_assets : nil,
87
+ hierarchical_assets: defined?(hier_assets) ? hier_assets : nil,
90
88
  use_xinclude: defined?(use_xinclude) ? use_xinclude : nil,
91
89
  break_up_urls_in_tables: defined?(break_up) ? break_up : nil,
92
- }).reject { |_, val| val.nil? }
90
+ ).reject { |_, val| val.nil? }
93
91
  end
94
-
95
92
  end
96
93
  end
97
94
  end
@@ -4,7 +4,5 @@ require_relative "./output/xslfo"
4
4
 
5
5
  module Metanorma
6
6
  module Output
7
-
8
7
  end
9
8
  end
10
-
@@ -7,7 +7,8 @@ module Metanorma
7
7
  def file_path(url_path)
8
8
  file_url = url_path
9
9
  file_url = "file://#{url_path}" if Pathname.new(file_url).absolute?
10
- file_url = "file://#{Dir.pwd}/#{url_path}" unless %r{^file://} =~ file_url
10
+ %r{^file://}.match?(file_url) or
11
+ file_url = "file://#{Dir.pwd}/#{url_path}"
11
12
  file_url
12
13
  end
13
14
  end
@@ -11,5 +11,33 @@ module Metanorma
11
11
  exit(1)
12
12
  end
13
13
  end
14
+
15
+ class DisambigFiles
16
+ def initialize
17
+ @seen_filenames = []
18
+ end
19
+
20
+ def source2dest_filename(name, disambig = true)
21
+ n = name.sub(%r{^(\./)?(\.\./)+}, "")
22
+ dir = File.dirname(n)
23
+ base = File.basename(n)
24
+ if disambig && @seen_filenames.include?(base)
25
+ base = disambiguate_filename(base)
26
+ end
27
+ @seen_filenames << base
28
+ dir == "." ? base : File.join(dir, base)
29
+ end
30
+
31
+ def disambiguate_filename(base)
32
+ m = /^(?<start>.+\.)(?!0)(?<num>\d+)\.(?<suff>[^.]*)$/.match(base) ||
33
+ /^(?<start>.+\.)(?<suff>[^.]*)/.match(base) ||
34
+ /^(?<start>.+)$/.match(base)
35
+ i = m.names.include?("num") ? m["num"].to_i + 1 : 1
36
+ while @seen_filenames.include? base = "#{m['start']}#{i}.#{m['suff']}"
37
+ i += 1
38
+ end
39
+ base
40
+ end
41
+ end
14
42
  end
15
43
  end
@@ -1,3 +1,3 @@
1
1
  module Metanorma
2
- VERSION = "1.3.0".freeze
2
+ VERSION = "1.3.5".freeze
3
3
  end
data/metanorma.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.bindir = "bin"
21
21
  # spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
- spec.required_ruby_version = ">= 2.4.0"
23
+ spec.required_ruby_version = ">= 2.5.0"
24
24
 
25
25
  spec.add_runtime_dependency "asciidoctor"
26
26
  spec.add_runtime_dependency "fontist", "~> 1.8"
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.3.0
4
+ version: 1.3.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-04-12 00:00:00.000000000 Z
11
+ date: 2021-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -286,7 +286,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
286
286
  requirements:
287
287
  - - ">="
288
288
  - !ruby/object:Gem::Version
289
- version: 2.4.0
289
+ version: 2.5.0
290
290
  required_rubygems_version: !ruby/object:Gem::Requirement
291
291
  requirements:
292
292
  - - ">="