metanorma 1.5.12 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metanorma/collection_fileparse.rb +40 -20
- data/lib/metanorma/collection_fileprocess.rb +33 -16
- data/lib/metanorma/collection_renderer.rb +19 -14
- data/lib/metanorma/compile.rb +9 -7
- data/lib/metanorma/files_lookup.rb +255 -0
- data/lib/metanorma/sectionsplit.rb +10 -9
- data/lib/metanorma/version.rb +1 -1
- data/metanorma.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 284943566222cba73b11d131aaa2ce1da77851a8ed5acd60bd11675f78c99eb3
|
4
|
+
data.tar.gz: 6cd2ed331a36e1168169e495183cf92205076b7305fa8e1383424b844f5c114e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a8d401ebdbe17ab843c6ed40113bc4a4b29f5fb78fc7ac0adfb5fb3f1e91056f892efcfb5fc5e26cf74676f0f93e23d3c5933ed88422a7b34f8bef80466ba16
|
7
|
+
data.tar.gz: 1a37a1b0598b2b20dfbbfabed2762d2e5671949f47eb7a830931ba8660edd7a4cf28b551ca42951762edaa21e1bdf5160aff3162163cdca02f3c221e1a3705a3
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Metanorma
|
2
2
|
# XML collection renderer
|
3
3
|
class CollectionRenderer
|
4
|
+
=begin
|
4
5
|
# map locality type and label (e.g. "clause" "1") to id = anchor for
|
5
6
|
# a document
|
6
7
|
# Note: will only key clauses, which have unambiguous reference label in
|
@@ -35,6 +36,7 @@ module Metanorma
|
|
35
36
|
filename = "#{id}.html"
|
36
37
|
[file, filename]
|
37
38
|
end
|
39
|
+
=end
|
38
40
|
|
39
41
|
# @param bib [Nokogiri::XML::Element]
|
40
42
|
# @param identifier [String]
|
@@ -42,8 +44,8 @@ module Metanorma
|
|
42
44
|
docid = get_bibitem_docid(bib, identifier) or return
|
43
45
|
newbib = dup_bibitem(docid, bib)
|
44
46
|
bib.replace(newbib)
|
45
|
-
_file, url = targetfile(@files[docid], relative: true, read: false,
|
46
|
-
|
47
|
+
#_file, url = targetfile(@files[docid], relative: true, read: false, doc: !@files[docid][:attachment])
|
48
|
+
_file, url = @files.targetfile_id(docid, relative: true, read: false, doc: !@files.get(docid,:attachment))
|
47
49
|
uri_node = Nokogiri::XML::Node.new "uri", newbib.document
|
48
50
|
uri_node[:type] = "citation"
|
49
51
|
uri_node.content = url
|
@@ -55,9 +57,11 @@ module Metanorma
|
|
55
57
|
docid = bib.at(ns("./docidentifier[not(@type)]")) ||
|
56
58
|
bib.at(ns("./docidentifier"))
|
57
59
|
docid &&= @c.decode(@isodoc
|
58
|
-
.docid_prefix(docid["type"], docid.children.to_xml))
|
59
|
-
if @files[docid] then docid
|
60
|
+
.docid_prefix(docid["type"], docid.children.to_xml)).gsub(/\s/, " ")
|
61
|
+
#if @files[docid] then docid
|
62
|
+
if @files.get(docid) || @files.get("X #{docid}") then docid
|
60
63
|
else
|
64
|
+
#require "debug"; binding.b
|
61
65
|
fail_update_bibitem(docid, identifier)
|
62
66
|
nil
|
63
67
|
end
|
@@ -71,7 +75,8 @@ module Metanorma
|
|
71
75
|
end
|
72
76
|
|
73
77
|
def dup_bibitem(docid, bib)
|
74
|
-
newbib = @files[docid][:bibdata].dup
|
78
|
+
#newbib = @files[docid][:bibdata].dup
|
79
|
+
newbib = @files.get(docid,:bibdata).dup
|
75
80
|
newbib.name = "bibitem"
|
76
81
|
newbib["hidden"] = "true"
|
77
82
|
newbib&.at("./*[local-name() = 'ext']")&.remove
|
@@ -93,7 +98,7 @@ module Metanorma
|
|
93
98
|
docxml = Nokogiri::XML(file) { |config| config.huge }
|
94
99
|
supply_repo_ids(docxml)
|
95
100
|
update_indirect_refs_to_docs(docxml, internal_refs)
|
96
|
-
add_document_suffix(identifier, docxml)
|
101
|
+
@files.add_document_suffix(identifier, docxml)
|
97
102
|
update_direct_refs_to_docs(docxml, identifier)
|
98
103
|
svgmap_resolve(datauri_encode(docxml))
|
99
104
|
hide_refs(docxml)
|
@@ -112,9 +117,12 @@ module Metanorma
|
|
112
117
|
next if b&.at(ns("./docidentifier[@type = 'repository']"))
|
113
118
|
|
114
119
|
b.xpath(ns("./docidentifier")).each do |docid|
|
115
|
-
id = @c.decode(@isodoc
|
116
|
-
|
117
|
-
|
120
|
+
#id = @c.decode(@isodoc
|
121
|
+
#.docid_prefix(docid["type"], docid.children.to_xml))
|
122
|
+
id = @isodoc
|
123
|
+
.docid_prefix(docid["type"], docid.children.to_xml)
|
124
|
+
#@files[id] or next
|
125
|
+
@files.get(id) or next
|
118
126
|
docid.next = "<docidentifier type='repository'>" \
|
119
127
|
"current-metanorma-collection/#{id}"
|
120
128
|
end
|
@@ -205,7 +213,8 @@ module Metanorma
|
|
205
213
|
# disambiguating document suffix on id
|
206
214
|
def update_anchors(bib, docxml, docid) # rubocop:disable Metrics/AbcSize
|
207
215
|
docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
|
208
|
-
if @files[docid] then update_anchor_loc(bib, e, docid)
|
216
|
+
#if @files[docid] then update_anchor_loc(bib, e, docid)
|
217
|
+
if @files.get(docid) then update_anchor_loc(bib, e, docid)
|
209
218
|
else
|
210
219
|
e << "<strong>** Unresolved reference to document #{docid} " \
|
211
220
|
"from eref</strong>"
|
@@ -219,7 +228,8 @@ module Metanorma
|
|
219
228
|
document_suffix = Metanorma::Utils::to_ncname(docid)
|
220
229
|
ref = loc.at(ns("./referenceFrom")) or return
|
221
230
|
anchor = "#{ref.text}_#{document_suffix}"
|
222
|
-
return unless @files[docid][:anchors].inject([]) do |m, (_, x)|
|
231
|
+
#return unless @files[docid][:anchors].inject([]) do |m, (_, x)|
|
232
|
+
return unless @files.get(docid,:anchors).inject([]) do |m, (_, x)|
|
223
233
|
m += x.values
|
224
234
|
end.include?(anchor)
|
225
235
|
|
@@ -233,16 +243,20 @@ module Metanorma
|
|
233
243
|
type = ins.at(ns("./locality/@type"))&.text
|
234
244
|
type = "clause" if type == "annex"
|
235
245
|
ref = ins.at(ns("./locality/referenceFrom"))&.text
|
236
|
-
anchor = @files[docid][:anchors].dig(type, ref) or return
|
246
|
+
#anchor = @files[docid][:anchors].dig(type, ref) or return
|
247
|
+
anchor = @files.get(docid,:anchors).dig(type, ref) or return
|
237
248
|
ins << "<locality type='anchor'><referenceFrom>#{anchor.sub(/^_/, '')}" \
|
238
249
|
"</referenceFrom></locality>"
|
239
250
|
end
|
240
251
|
|
241
252
|
# gather internal bibitem references
|
242
253
|
def gather_internal_refs
|
243
|
-
|
244
|
-
|
245
|
-
|
254
|
+
#@files.each.with_object({}) do |(_, x), refs|
|
255
|
+
@files.keys.each_with_object({}) do |i, refs|
|
256
|
+
#x[:attachment] and next
|
257
|
+
@files.get(i,:attachment) and next
|
258
|
+
#file, = targetfile(x, read: true)
|
259
|
+
file, = @files.targetfile_id(i, read: true)
|
246
260
|
Nokogiri::XML(file)
|
247
261
|
.xpath(ns("//bibitem[@type = 'internal']/" \
|
248
262
|
"docidentifier[@type = 'repository']")).each do |d|
|
@@ -256,10 +270,14 @@ module Metanorma
|
|
256
270
|
|
257
271
|
# resolve file location for the target of each internal reference
|
258
272
|
def locate_internal_refs
|
273
|
+
#require 'debug'; binding.b
|
259
274
|
refs = gather_internal_refs
|
260
|
-
|
261
|
-
|
262
|
-
|
275
|
+
#@files.keys.reject { |k| @files[k][:attachment] }.each do |identifier|
|
276
|
+
@files.keys.reject { |k| @files.get(k,:attachment) }.each do |identifier|
|
277
|
+
#id = @c.decode(@isodoc.docid_prefix("", identifier.dup))
|
278
|
+
#locate_internal_refs1(refs, identifier, @files[id])
|
279
|
+
id = @isodoc.docid_prefix("", identifier.dup)
|
280
|
+
locate_internal_refs1(refs, identifier, id)
|
263
281
|
end
|
264
282
|
refs.each do |schema, ids|
|
265
283
|
ids.each do |id, key|
|
@@ -269,8 +287,10 @@ module Metanorma
|
|
269
287
|
refs
|
270
288
|
end
|
271
289
|
|
272
|
-
def locate_internal_refs1(refs, identifier, filedesc)
|
273
|
-
|
290
|
+
#def locate_internal_refs1(refs, identifier, filedesc)
|
291
|
+
def locate_internal_refs1(refs, identifier, ident)
|
292
|
+
#file, _filename = targetfile(filedesc, read: true)
|
293
|
+
file, _filename = @files.targetfile_id(ident, read: true)
|
274
294
|
xml = Nokogiri::XML(file) { |config| config.huge }
|
275
295
|
t = xml.xpath("//*/@id").each_with_object({}) { |i, x| x[i.text] = true }
|
276
296
|
refs.each do |schema, ids|
|
@@ -7,6 +7,7 @@ require_relative "collection_fileparse"
|
|
7
7
|
module Metanorma
|
8
8
|
# XML collection renderer
|
9
9
|
class CollectionRenderer
|
10
|
+
=begin
|
10
11
|
# hash for each document in collection of document identifier to:
|
11
12
|
# document reference (fileref or id), type of document reference,
|
12
13
|
# and bibdata entry for that file
|
@@ -165,51 +166,64 @@ module Metanorma
|
|
165
166
|
filename.sub!(/\.xml$/, ".html") if doc
|
166
167
|
[file, filename]
|
167
168
|
end
|
169
|
+
=end
|
168
170
|
|
169
171
|
# compile and output individual file in collection
|
170
172
|
# warn "metanorma compile -x html #{f.path}"
|
171
173
|
def file_compile(file, filename, identifier)
|
172
|
-
return if @files[identifier][:sectionsplit] == "true"
|
174
|
+
#return if @files[identifier][:sectionsplit] == "true"
|
175
|
+
return if @files.get(identifier,:sectionsplit) == "true"
|
173
176
|
|
174
177
|
opts = {
|
175
178
|
format: :asciidoc,
|
176
179
|
extension_keys: @format,
|
177
180
|
output_dir: @outdir,
|
178
|
-
}.merge(
|
181
|
+
}.merge(compile_options_update(identifier))
|
179
182
|
|
180
183
|
@compile.compile file, opts
|
181
|
-
|
184
|
+
#@files[identifier][:outputs] = {}
|
185
|
+
@files.set(identifier,:outputs, {})
|
182
186
|
file_compile_formats(filename, identifier)
|
183
187
|
end
|
184
188
|
|
185
|
-
def
|
189
|
+
def compile_options_update(identifier)
|
186
190
|
ret = @compile_options.dup
|
187
191
|
Array(@directives).include?("presentation-xml") ||
|
188
|
-
|
192
|
+
#@files[identifier][:presentationxml] and
|
193
|
+
@files.get(identifier,:presentationxml) and
|
189
194
|
ret.merge!(passthrough_presentation_xml: true)
|
190
|
-
|
195
|
+
#@files[identifier][:sectionsplit] == "true" and
|
196
|
+
@files.get(identifier,:sectionsplit) == "true" and
|
191
197
|
ret.merge!(sectionsplit: "true")
|
192
|
-
|
198
|
+
#@files[identifier][:bare] == true and
|
199
|
+
@files.get(identifier,:bare) == true and
|
193
200
|
ret.merge!(bare: true)
|
194
201
|
ret
|
195
202
|
end
|
196
203
|
|
197
204
|
def file_compile_formats(filename, identifier)
|
198
|
-
file_id = @files[identifier]
|
205
|
+
#file_id = @files[identifier]
|
206
|
+
f = @files.get(identifier, :outputs)
|
199
207
|
@format << :presentation if @format.include?(:pdf)
|
200
208
|
@format.each do |e|
|
201
209
|
ext = @compile.processor.output_formats[e]
|
202
210
|
fn = File.basename(filename).sub(/(?<=\.)[^.]+$/, ext.to_s)
|
203
|
-
unless /html$/.match?(ext) && file_id[:sectionsplit]
|
204
|
-
|
211
|
+
#unless /html$/.match?(ext) && file_id[:sectionsplit]
|
212
|
+
unless /html$/.match?(ext) && @files.get(identifier, :sectionsplit)
|
213
|
+
#file_id[:outputs][e] = File.join(@outdir, fn)
|
214
|
+
f[e] = File.join(@outdir, fn)
|
205
215
|
end
|
206
216
|
end
|
217
|
+
@files.set(identifier,:outputs, f)
|
207
218
|
end
|
208
219
|
|
209
|
-
def copy_file_to_dest(fileref)
|
210
|
-
|
220
|
+
#def copy_file_to_dest(fileref)
|
221
|
+
def copy_file_to_dest(identifier)
|
222
|
+
dest = File.join(@outdir, @files.get(identifier,:out_path))
|
211
223
|
FileUtils.mkdir_p(File.dirname(dest))
|
212
|
-
FileUtils.cp fileref[:ref], dest
|
224
|
+
#FileUtils.cp fileref[:ref], dest
|
225
|
+
#require "debug"; binding.b
|
226
|
+
FileUtils.cp @files.get(identifier,:ref), dest
|
213
227
|
end
|
214
228
|
|
215
229
|
# process each file in the collection
|
@@ -217,12 +231,15 @@ module Metanorma
|
|
217
231
|
def files # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
218
232
|
warn "\n\n\n\n\nInternal Refs: #{DateTime.now.strftime('%H:%M:%S')}"
|
219
233
|
internal_refs = locate_internal_refs
|
220
|
-
|
234
|
+
#@files.each_with_index do |(identifier, x), i|
|
235
|
+
@files.keys.each_with_index do |identifier, i|
|
221
236
|
i.positive? && Array(@directives).include?("bare-after-first") and
|
222
237
|
@compile_options.merge!(bare: true)
|
223
|
-
if x[:attachment] then copy_file_to_dest(x)
|
238
|
+
#if x[:attachment] then copy_file_to_dest(x)
|
239
|
+
if @files.get(identifier,:attachment) then copy_file_to_dest(identifier)
|
224
240
|
else
|
225
|
-
file, filename = targetfile(x, read: true)
|
241
|
+
#file, filename = @files.targetfile(x, read: true)
|
242
|
+
file, filename = @files.targetfile_id(identifier, read: true)
|
226
243
|
warn "\n\n\n\n\nProcess #{filename}: #{DateTime.now.strftime('%H:%M:%S')}"
|
227
244
|
collection_xml = update_xrefs(file, identifier, internal_refs)
|
228
245
|
collection_filename = File.basename(filename, File.extname(filename))
|
@@ -5,6 +5,7 @@ require "htmlentities"
|
|
5
5
|
require_relative "collection_fileprocess"
|
6
6
|
require_relative "fontist_utils"
|
7
7
|
require_relative "util"
|
8
|
+
require_relative "files_lookup"
|
8
9
|
|
9
10
|
module Metanorma
|
10
11
|
# XML collection renderer
|
@@ -12,6 +13,7 @@ module Metanorma
|
|
12
13
|
FORMATS = %i[html xml doc pdf].freeze
|
13
14
|
|
14
15
|
attr_accessor :isodoc
|
16
|
+
attr_reader :xml, :compile, :compile_options, :documents
|
15
17
|
|
16
18
|
# This is only going to render the HTML collection
|
17
19
|
# @param xml [Metanorma::Collection] input XML collection
|
@@ -49,8 +51,9 @@ module Metanorma
|
|
49
51
|
@c = HTMLEntities.new
|
50
52
|
|
51
53
|
# list of files in the collection
|
52
|
-
|
53
|
-
@
|
54
|
+
#@files = read_files folder
|
55
|
+
@files = Metanorma::FileLookup.new(folder, self)
|
56
|
+
isodoc_populate
|
54
57
|
create_non_existing_directory(@outdir)
|
55
58
|
end
|
56
59
|
|
@@ -100,11 +103,14 @@ module Metanorma
|
|
100
103
|
def concatenate1(out, ext)
|
101
104
|
out.directives << "documents-inline"
|
102
105
|
out.bibdatas.each_key do |ident|
|
103
|
-
id = @c.decode(@isodoc.docid_prefix(nil, ident.dup))
|
104
|
-
|
106
|
+
#id = @c.decode(@isodoc.docid_prefix(nil, ident.dup))
|
107
|
+
#@files[id][:attachment] || @files[id][:outputs].nil? and next
|
108
|
+
id = @isodoc.docid_prefix(nil, ident.dup)
|
109
|
+
@files.get(id,:attachment) || @files.get(id,:outputs).nil? and next
|
105
110
|
|
106
111
|
out.documents[id] =
|
107
|
-
Metanorma::Document.raw_file(@files[id][:outputs][ext])
|
112
|
+
#Metanorma::Document.raw_file(@files[id][:outputs][ext])
|
113
|
+
Metanorma::Document.raw_file(@files.get(id,:outputs)[ext])
|
108
114
|
end
|
109
115
|
out
|
110
116
|
end
|
@@ -147,16 +153,14 @@ module Metanorma
|
|
147
153
|
# create the @meta class of isodoc, for populating Liquid,
|
148
154
|
# with "navigation" set to the index bar.
|
149
155
|
# extracted from the manifest
|
150
|
-
isodoc
|
151
|
-
isodoc.meta.set(:
|
152
|
-
isodoc.meta.set(:
|
153
|
-
|
154
|
-
isodoc_builder(isodoc,
|
156
|
+
@isodoc.meta.set(:navigation, indexfile(@xml.at(ns("//manifest"))))
|
157
|
+
@isodoc.meta.set(:docrefs, liquid_docrefs)
|
158
|
+
@isodoc.meta.set(:"prefatory-content",
|
159
|
+
isodoc_builder(@isodoc,
|
155
160
|
@xml.at(ns("//prefatory-content"))))
|
156
|
-
isodoc.meta.set(:"final-content",
|
161
|
+
@isodoc.meta.set(:"final-content",
|
157
162
|
isodoc_builder(isodoc, @xml.at(ns("//final-content"))))
|
158
|
-
isodoc.info(@xml, nil)
|
159
|
-
isodoc
|
163
|
+
@isodoc.info(@xml, nil)
|
160
164
|
end
|
161
165
|
|
162
166
|
def isodoc_builder(isodoc, node)
|
@@ -229,7 +233,8 @@ module Metanorma
|
|
229
233
|
|
230
234
|
def index_link(docref, ident)
|
231
235
|
if docref["fileref"]
|
232
|
-
|
236
|
+
#@files[ident][:out_path].sub(/\.xml$/, ".html")
|
237
|
+
@files.get(ident,:out_path).sub(/\.xml$/, ".html")
|
233
238
|
else "#{docref['id']}.html"
|
234
239
|
end
|
235
240
|
end
|
data/lib/metanorma/compile.rb
CHANGED
@@ -109,7 +109,7 @@ module Metanorma
|
|
109
109
|
|
110
110
|
def process_exts_run(fnames, file, isodoc, extensions, options)
|
111
111
|
Util.sort_extensions_execution(extensions).each do |ext|
|
112
|
-
process_ext(ext, file, isodoc, fnames, options)
|
112
|
+
process_ext(ext, file, isodoc, fnames, options) or break
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
@@ -124,7 +124,7 @@ module Metanorma
|
|
124
124
|
fnames[:ext] = @processor.output_formats[ext]
|
125
125
|
fnames[:out] = fnames[:f].sub(/\.[^.]+$/, ".#{fnames[:ext]}")
|
126
126
|
isodoc_options = get_isodoc_options(file, options, ext)
|
127
|
-
thread =
|
127
|
+
thread = true
|
128
128
|
unless process_ext_simple(ext, isodoc, fnames, options,
|
129
129
|
isodoc_options)
|
130
130
|
thread = process_exts1(ext, fnames, isodoc, options, isodoc_options)
|
@@ -162,28 +162,30 @@ module Metanorma
|
|
162
162
|
isodoc_options1)
|
163
163
|
wrap_html(options1, fnames1[:ext], fnames1[:out])
|
164
164
|
rescue StandardError => e
|
165
|
-
strict = ext == :presentation || isodoc_options1[:strict] ==
|
166
|
-
isodoc_error_process(e, strict)
|
165
|
+
strict = ext == :presentation || isodoc_options1[:strict] == true
|
166
|
+
isodoc_error_process(e, strict, false)
|
167
167
|
end
|
168
168
|
|
169
169
|
def process_output_unthreaded(ext, fnames, isodoc, isodoc_options)
|
170
170
|
@processor.output(isodoc, fnames[:xml], fnames[:out], ext,
|
171
171
|
isodoc_options)
|
172
|
-
|
172
|
+
true # return as Thread
|
173
173
|
rescue StandardError => e
|
174
174
|
strict = ext == :presentation || isodoc_options[:strict] == "true"
|
175
|
-
isodoc_error_process(e, strict)
|
175
|
+
isodoc_error_process(e, strict, true)
|
176
|
+
ext != :presentation
|
176
177
|
end
|
177
178
|
|
178
179
|
private
|
179
180
|
|
180
|
-
def isodoc_error_process(err, strict)
|
181
|
+
def isodoc_error_process(err, strict, must_abort)
|
181
182
|
if strict || err.message.include?("Fatal:")
|
182
183
|
@errors << err.message
|
183
184
|
else
|
184
185
|
puts err.message
|
185
186
|
end
|
186
187
|
puts err.backtrace.join("\n")
|
188
|
+
must_abort and 1
|
187
189
|
end
|
188
190
|
|
189
191
|
# @param options [Hash]
|
@@ -0,0 +1,255 @@
|
|
1
|
+
require "isodoc"
|
2
|
+
require "htmlentities"
|
3
|
+
require "metanorma-utils"
|
4
|
+
|
5
|
+
module Metanorma
|
6
|
+
# XML collection renderer
|
7
|
+
class FileLookup
|
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
|
+
def initialize(path, parent)
|
13
|
+
@c = HTMLEntities.new
|
14
|
+
@files = {}
|
15
|
+
@parent = parent
|
16
|
+
@xml = parent.xml
|
17
|
+
@isodoc = parent.isodoc
|
18
|
+
@path = path
|
19
|
+
@compile = parent.compile
|
20
|
+
@documents = parent.documents
|
21
|
+
read_files
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_files
|
25
|
+
@xml.xpath(ns("//docref")).each { |d| read_file(d) }
|
26
|
+
add_section_split
|
27
|
+
end
|
28
|
+
|
29
|
+
def read_file(docref)
|
30
|
+
ident = docref.at(ns("./identifier"))
|
31
|
+
i = key(@isodoc.docid_prefix(ident["type"], ident.children.to_xml))
|
32
|
+
entry = file_entry(docref, ident.children.to_xml)
|
33
|
+
bibdata_process(entry, i)
|
34
|
+
bibitem_process(entry)
|
35
|
+
@files[i] = entry
|
36
|
+
end
|
37
|
+
|
38
|
+
def bibdata_process(entry, identifier)
|
39
|
+
if entry[:attachment]
|
40
|
+
entry[:bibdata] = Metanorma::Document
|
41
|
+
.attachment_bibitem(identifier).root
|
42
|
+
else
|
43
|
+
file, _filename = targetfile(entry, read: true)
|
44
|
+
xml = Nokogiri::XML(file)
|
45
|
+
add_document_suffix(identifier, xml)
|
46
|
+
entry[:anchors] = read_anchors(xml)
|
47
|
+
entry[:bibdata] = xml.at(ns("//bibdata"))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def bibitem_process(entry)
|
52
|
+
entry[:bibitem] = entry[:bibdata].dup
|
53
|
+
entry[:bibitem].name = "bibitem"
|
54
|
+
entry[:bibitem]["hidden"] = "true"
|
55
|
+
entry[:bibitem].at("./*[local-name() = 'ext']")&.remove
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_section_split
|
59
|
+
#require "debug"; binding.b
|
60
|
+
ret = @files.keys.each_with_object({}) do |k, m|
|
61
|
+
if @files[k][:sectionsplit] == "true" && !@files[k]["attachment"]
|
62
|
+
s, manifest = sectionsplit(@files[k][:ref])
|
63
|
+
s.each_with_index do |f1, i|
|
64
|
+
add_section_split_instance(f1, m, k, i)
|
65
|
+
end
|
66
|
+
m["#{k}:index.html"] = add_section_split_cover(manifest, k)
|
67
|
+
end
|
68
|
+
m[k] = @files[k]
|
69
|
+
#require "debug"; binding.b
|
70
|
+
end
|
71
|
+
@files = ret
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_section_split_cover(manifest, ident)
|
75
|
+
cover = section_split_cover(manifest, @parent.dir_name_cleanse(ident))
|
76
|
+
@files[ident][:out_path] = cover
|
77
|
+
{ attachment: true, index: false, out_path: cover,
|
78
|
+
ref: File.join(File.dirname(manifest.file), cover) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def section_split_cover(col, ident)
|
82
|
+
dir = File.dirname(col.file)
|
83
|
+
@compile.collection_setup(nil, dir)
|
84
|
+
#require "debug";binding.b
|
85
|
+
CollectionRenderer.new(col, dir,
|
86
|
+
output_folder: "#{ident}_collection",
|
87
|
+
format: %i(html),
|
88
|
+
coverpage: File.join(dir, "cover.html")).coverpage
|
89
|
+
FileUtils.mv "#{ident}_collection/index.html",
|
90
|
+
File.join(dir, "#{ident}_index.html")
|
91
|
+
FileUtils.rm_rf "#{ident}_collection"
|
92
|
+
"#{ident}_index.html"
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_section_split_instance(file, manifest, key, idx)
|
96
|
+
presfile = File.join(File.dirname(@files[key][:ref]),
|
97
|
+
File.basename(file[:url]))
|
98
|
+
newkey = key("#{key.strip} #{file[:title]}")
|
99
|
+
manifest[newkey] =
|
100
|
+
{ parentid: key, presentationxml: true, type: "fileref",
|
101
|
+
rel_path: file[:url], out_path: File.basename(file[:url]),
|
102
|
+
anchors: read_anchors(Nokogiri::XML(File.read(presfile))),
|
103
|
+
bibdata: @files[key][:bibdata], ref: presfile }
|
104
|
+
manifest[newkey][:bare] = true unless idx.zero?
|
105
|
+
end
|
106
|
+
|
107
|
+
def sectionsplit(file)
|
108
|
+
#require "debug"; binding.b
|
109
|
+
@compile.compile(
|
110
|
+
file, { format: :asciidoc, extension_keys: [:presentation] }
|
111
|
+
.merge(@parent.compile_options)
|
112
|
+
)
|
113
|
+
r = file.sub(/\.xml$/, ".presentation.xml")
|
114
|
+
xml = Nokogiri::XML(File.read(r))
|
115
|
+
s = @compile.sectionsplit(xml, File.basename(r), File.dirname(r))
|
116
|
+
.sort_by { |f| f[:order] }
|
117
|
+
[s, @compile.collection_manifest(File.basename(r), s, xml, nil,
|
118
|
+
File.dirname(r))]
|
119
|
+
end
|
120
|
+
|
121
|
+
# rel_path is the source file address, determined relative to the YAML.
|
122
|
+
# out_path is the destination file address, with any references outside
|
123
|
+
# the working directory (../../...) truncated
|
124
|
+
# identifier is the id with only spaces, no nbsp
|
125
|
+
def file_entry(ref, identifier)
|
126
|
+
out = ref["attachment"] ? ref["fileref"] : File.basename(ref["fileref"])
|
127
|
+
ret = if ref["fileref"]
|
128
|
+
{ type: "fileref", ref: @documents[identifier].file,
|
129
|
+
rel_path: ref["fileref"], out_path: out }
|
130
|
+
else { type: "id", ref: ref["id"] } end
|
131
|
+
%w(attachment sectionsplit index presentation-xml
|
132
|
+
bare-after-first).each do |s|
|
133
|
+
ret[s.gsub("-", "").to_sym] = ref[s] if ref[s]
|
134
|
+
end
|
135
|
+
ret.compact
|
136
|
+
end
|
137
|
+
|
138
|
+
def add_suffix_to_attributes(doc, suffix, tag_name, attribute_name)
|
139
|
+
doc.xpath(ns("//#{tag_name}[@#{attribute_name}]")).each do |elem|
|
140
|
+
elem.attributes[attribute_name].value =
|
141
|
+
"#{elem.attributes[attribute_name].value}_#{suffix}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def add_document_suffix(identifier, doc)
|
146
|
+
document_suffix = Metanorma::Utils::to_ncname(identifier)
|
147
|
+
Metanorma::Utils::anchor_attributes.each do |(tag_name, attribute_name)|
|
148
|
+
add_suffix_to_attributes(doc, document_suffix, tag_name, attribute_name)
|
149
|
+
end
|
150
|
+
url_in_css_styles(doc, document_suffix)
|
151
|
+
end
|
152
|
+
|
153
|
+
# update relative URLs, url(#...), in CSS in @style attrs (including SVG)
|
154
|
+
def url_in_css_styles(doc, document_suffix)
|
155
|
+
doc.xpath("//*[@style]").each do |s|
|
156
|
+
s["style"] = s["style"]
|
157
|
+
.gsub(%r{url\(#([^)]+)\)}, "url(#\\1_#{document_suffix})")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# return file contents + output filename for each file in the collection,
|
162
|
+
# given a docref entry
|
163
|
+
# @param data [Hash] docref entry
|
164
|
+
# @param read [Boolean] read the file in and return it
|
165
|
+
# @param doc [Boolean] I am a Metanorma document,
|
166
|
+
# so my URL should end with html or pdf or whatever
|
167
|
+
# @param relative [Boolean] Return output path,
|
168
|
+
# formed relative to YAML file, not input path, relative to calling function
|
169
|
+
# @return [Array<String, nil>]
|
170
|
+
def targetfile(data, options)
|
171
|
+
options = { read: false, doc: true, relative: false }.merge(options)
|
172
|
+
path = options[:relative] ? data[:rel_path] : data[:ref]
|
173
|
+
if data[:type] == "fileref"
|
174
|
+
ref_file path, data[:out_path], options[:read], options[:doc]
|
175
|
+
else
|
176
|
+
xml_file data[:id], options[:read]
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def targetfile_id(ident, options)
|
181
|
+
targetfile(get(ident), options)
|
182
|
+
end
|
183
|
+
|
184
|
+
def ref_file(ref, out, read, doc)
|
185
|
+
file = File.read(ref, encoding: "utf-8") if read
|
186
|
+
filename = out.dup
|
187
|
+
filename.sub!(/\.xml$/, ".html") if doc
|
188
|
+
[file, filename]
|
189
|
+
end
|
190
|
+
|
191
|
+
def xml_file(id, read)
|
192
|
+
file = @xml.at(ns("//doc-container[@id = '#{id}']")).to_xml if read
|
193
|
+
filename = "#{id}.html"
|
194
|
+
[file, filename]
|
195
|
+
end
|
196
|
+
|
197
|
+
# map locality type and label (e.g. "clause" "1") to id = anchor for
|
198
|
+
# a document
|
199
|
+
# Note: will only key clauses, which have unambiguous reference label in
|
200
|
+
# locality. Notes, examples etc with containers are just plunked against
|
201
|
+
# UUIDs, so that their IDs can at least be registered to be tracked
|
202
|
+
# as existing.
|
203
|
+
def read_anchors(xml)
|
204
|
+
xrefs = @isodoc.xref_init(@lang, @script, @isodoc, @isodoc.i18n,
|
205
|
+
{ locale: @locale })
|
206
|
+
xrefs.parse xml
|
207
|
+
xrefs.get.each_with_object({}) do |(k, v), ret|
|
208
|
+
read_anchors1(k, v, ret)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def read_anchors1(key, val, ret)
|
213
|
+
val[:type] ||= "clause"
|
214
|
+
ret[val[:type]] ||= {}
|
215
|
+
index = if val[:container] || val[:label].nil? || val[:label].empty?
|
216
|
+
UUIDTools::UUID.random_create.to_s
|
217
|
+
else val[:label]
|
218
|
+
end
|
219
|
+
ret[val[:type]][index] = key
|
220
|
+
ret[val[:type]][val[:value]] = key if val[:value]
|
221
|
+
end
|
222
|
+
|
223
|
+
def key(ident)
|
224
|
+
@c.decode(ident).gsub(/(\s|[ ])+/, " ")
|
225
|
+
end
|
226
|
+
|
227
|
+
def keys
|
228
|
+
@files.keys
|
229
|
+
end
|
230
|
+
|
231
|
+
def get(ident, attr = nil)
|
232
|
+
if attr
|
233
|
+
@files[key(ident)][attr]
|
234
|
+
else
|
235
|
+
@files[key(ident)]
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def set(ident, attr, value)
|
240
|
+
@files[key(ident)][attr] = value
|
241
|
+
end
|
242
|
+
|
243
|
+
def each
|
244
|
+
@files.each
|
245
|
+
end
|
246
|
+
|
247
|
+
def each_with_index
|
248
|
+
@files.each_with_index
|
249
|
+
end
|
250
|
+
|
251
|
+
def ns(xpath)
|
252
|
+
@isodoc.ns(xpath)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
@@ -50,7 +50,7 @@ module Metanorma
|
|
50
50
|
<body>
|
51
51
|
<h1>{{ doctitle }}</h1>
|
52
52
|
<h2>{{ docnumber }}</h2>
|
53
|
-
<nav>{{
|
53
|
+
<nav>{{ navigation }}</nav>
|
54
54
|
</body>
|
55
55
|
</html>
|
56
56
|
COVER
|
@@ -60,7 +60,7 @@ module Metanorma
|
|
60
60
|
[["//preface/*", "preface"], ["//sections/*", "sections"],
|
61
61
|
["//annex", nil],
|
62
62
|
["//bibliography/*[not(@hidden = 'true')]", "bibliography"],
|
63
|
-
["//indexsect", nil]].freeze
|
63
|
+
["//indexsect", nil], ["//colophon", nil]].freeze
|
64
64
|
|
65
65
|
def sectionsplit(xml, filename, dir)
|
66
66
|
@key = xref_preprocess(xml)
|
@@ -76,8 +76,9 @@ module Metanorma
|
|
76
76
|
def emptydoc(xml)
|
77
77
|
out = xml.dup
|
78
78
|
out.xpath(
|
79
|
-
ns("//preface | //sections | //annex | //bibliography/clause | "\
|
80
|
-
"//bibliography/references[not(@hidden = 'true')] | //indexsect"
|
79
|
+
ns("//preface | //sections | //annex | //bibliography/clause | " \
|
80
|
+
"//bibliography/references[not(@hidden = 'true')] | //indexsect" \
|
81
|
+
"//colophon"),
|
81
82
|
).each(&:remove)
|
82
83
|
out
|
83
84
|
end
|
@@ -123,7 +124,7 @@ module Metanorma
|
|
123
124
|
next unless /^#/.match? a["href"]
|
124
125
|
|
125
126
|
a["href"] = a["href"].sub(/^#/, "")
|
126
|
-
m << "<target href='#{a['href']}'>"\
|
127
|
+
m << "<target href='#{a['href']}'>" \
|
127
128
|
"<xref target='#{a['href']}'/></target>"
|
128
129
|
end
|
129
130
|
end
|
@@ -137,7 +138,7 @@ module Metanorma
|
|
137
138
|
end
|
138
139
|
|
139
140
|
def make_anchor(anchor)
|
140
|
-
"<localityStack><locality type='anchor'><referenceFrom>"\
|
141
|
+
"<localityStack><locality type='anchor'><referenceFrom>" \
|
141
142
|
"#{anchor}</referenceFrom></locality></localityStack>"
|
142
143
|
end
|
143
144
|
|
@@ -155,7 +156,7 @@ module Metanorma
|
|
155
156
|
def eref_to_internal_eref(section, xml, key)
|
156
157
|
eref_to_internal_eref_select(section, xml).each_with_object([]) do |x, m|
|
157
158
|
url = xml.at(ns("//bibitem[@id = '#{x}']/uri[@type = 'citation']"))
|
158
|
-
section.xpath(
|
159
|
+
section.xpath("//*[@bibitemid = '#{x}']").each do |e|
|
159
160
|
id = eref_to_internal_eref1(e, key, url)
|
160
161
|
id and m << id
|
161
162
|
end
|
@@ -176,10 +177,10 @@ module Metanorma
|
|
176
177
|
end
|
177
178
|
|
178
179
|
def eref_to_internal_eref_select(section, xml)
|
179
|
-
refs = section.xpath(
|
180
|
+
refs = section.xpath("//*/@bibitemid").map { |x| x.text } # rubocop:disable Style/SymbolProc
|
180
181
|
refs.uniq.reject do |x|
|
181
182
|
xml.at(ns("//bibitem[@id = '#{x}'][@type = 'internal']")) ||
|
182
|
-
xml.at(ns("//bibitem[@id = '#{x}']"\
|
183
|
+
xml.at(ns("//bibitem[@id = '#{x}']" \
|
183
184
|
"[docidentifier/@type = 'repository']"))
|
184
185
|
end
|
185
186
|
end
|
data/lib/metanorma/version.rb
CHANGED
data/metanorma.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_runtime_dependency "asciidoctor"
|
27
27
|
spec.add_runtime_dependency "fontist", ">= 1.14.3"
|
28
28
|
spec.add_runtime_dependency "htmlentities"
|
29
|
-
spec.add_runtime_dependency "isodoc", ">= 2.
|
29
|
+
spec.add_runtime_dependency "isodoc", ">= 2.6.1"
|
30
30
|
spec.add_runtime_dependency "mn2pdf", "~> 1"
|
31
31
|
spec.add_runtime_dependency "nokogiri"
|
32
32
|
spec.add_runtime_dependency "pry"
|
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.
|
4
|
+
version: 1.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.
|
61
|
+
version: 2.6.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 2.
|
68
|
+
version: 2.6.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mn2pdf
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -267,6 +267,7 @@ files:
|
|
267
267
|
- lib/metanorma/config.rb
|
268
268
|
- lib/metanorma/document.rb
|
269
269
|
- lib/metanorma/extract.rb
|
270
|
+
- lib/metanorma/files_lookup.rb
|
270
271
|
- lib/metanorma/fontist_utils.rb
|
271
272
|
- lib/metanorma/input.rb
|
272
273
|
- lib/metanorma/input/asciidoc.rb
|