metanorma 1.5.12 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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/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: 9926d7d441baa7f49931673ddc0091763907509e79df809fb2c5c28e14c34d3f
|
|
4
|
+
data.tar.gz: 07c227ddb3b2e1df4077852a48079779ef8fcb94ff9317c24fce9b418d892cca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6a35a864a122af1646f7e3fae80019954a629d15209c4f3ab148456f5f5f2cc4a114b0690c08bcfea968661d5a72955d0e02e0a0d07a4e7765539e90fb1bea3d
|
|
7
|
+
data.tar.gz: 2aafcfa732e718ebda4aff3ded2eef29969fe407e8c01cf4e5538072b83f08573b89f4d50740ac67a56a99b4db975672ff3c0ddac49ab15d7febdb62f2690749
|
|
@@ -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
|
|
@@ -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.0"
|
|
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.0
|
|
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-07
|
|
11
|
+
date: 2023-08-07 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.0
|
|
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.0
|
|
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
|