metanorma 1.3.1 → 1.3.6
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/.github/workflows/rake.yml +2 -12
- data/.hound.yml +3 -1
- data/.rubocop.yml +4 -8
- data/Gemfile +2 -2
- data/Rakefile +1 -1
- data/lib/metanorma/asciidoctor_extensions/glob_include_processor.rb +4 -6
- data/lib/metanorma/collection.rb +39 -18
- data/lib/metanorma/collection_fileparse.rb +88 -63
- data/lib/metanorma/collection_fileprocess.rb +118 -35
- data/lib/metanorma/collection_manifest.rb +33 -13
- data/lib/metanorma/collection_renderer.rb +43 -14
- data/lib/metanorma/compile.rb +42 -37
- data/lib/metanorma/compile_validate.rb +34 -28
- data/lib/metanorma/config.rb +1 -1
- data/lib/metanorma/document.rb +28 -12
- data/lib/metanorma/input.rb +0 -1
- data/lib/metanorma/input/asciidoc.rb +27 -30
- data/lib/metanorma/output.rb +0 -2
- data/lib/metanorma/output/utils.rb +2 -1
- data/lib/metanorma/util.rb +45 -0
- data/lib/metanorma/version.rb +1 -1
- data/metanorma.gemspec +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1858cecb1db05debaa3cb36f970a2bcb76b403508067ea2fa8569720fd294a98
|
4
|
+
data.tar.gz: 90f6e4bca7bd431a9d40a989c77837e6cfa47a12e436e0934624592bac0707f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8aec70e8a44751d4ab8557b793718c0bd02be3d90715a0048864257a8faf4bf23a5f4b60b780cf6d24658179eb2ecb572bf8b870ca9313b5d6f70839d2df03a5
|
7
|
+
data.tar.gz: 58814116504a8ec8c80961e836adf50b7e50bc049d2a259031e7dc92b9a8f8909ddd8bbc26219197057a6e4a9dfec4ee05cb16144f1b69fdfdc66d46d9408e9b
|
data/.github/workflows/rake.yml
CHANGED
@@ -16,19 +16,9 @@ jobs:
|
|
16
16
|
strategy:
|
17
17
|
fail-fast: false
|
18
18
|
matrix:
|
19
|
-
ruby: [ '
|
19
|
+
ruby: [ '3.0', '2.7', '2.6', '2.5' ]
|
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:
|
42
|
+
event-type: tests-passed
|
53
43
|
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
|
data/.hound.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
#
|
2
|
-
# https://github.com/
|
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
|
-
|
11
|
-
StyleGuideCopsOnly: false
|
12
|
-
TargetRubyVersion: 2.4
|
13
|
-
Rails:
|
14
|
-
Enabled: true
|
10
|
+
TargetRubyVersion: 2.5
|
data/Gemfile
CHANGED
@@ -6,6 +6,6 @@ git_source(:github) { |repo| "https://github.com/#{repo}" }
|
|
6
6
|
|
7
7
|
gemspec
|
8
8
|
|
9
|
-
if File.exist?
|
10
|
-
eval File.read(
|
9
|
+
if File.exist? "Gemfile.devel"
|
10
|
+
eval File.read("Gemfile.devel"), nil, "Gemfile.devel" # rubocop:disable Security/Eval
|
11
11
|
end
|
data/Rakefile
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
module Metanorma::AsciidoctorExtensions
|
2
|
-
|
3
2
|
class GlobIncludeProcessor < ::Asciidoctor::Extensions::IncludeProcessor
|
4
|
-
def process
|
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
|
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?
|
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
|
data/lib/metanorma/collection.rb
CHANGED
@@ -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
|
-
|
48
|
-
|
49
|
-
|
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
|
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
|
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)
|
@@ -81,7 +91,9 @@ module Metanorma
|
|
81
91
|
private
|
82
92
|
|
83
93
|
def parse_xml(file)
|
84
|
-
xml = Nokogiri::XML File.read(file, encoding: "UTF-8")
|
94
|
+
xml = Nokogiri::XML File.read(file, encoding: "UTF-8") do |config|
|
95
|
+
config.huge
|
96
|
+
end
|
85
97
|
if (b = xml.at("/xmlns:metanorma-collection/xmlns:bibdata"))
|
86
98
|
bd = Relaton::Cli.parse_xml b
|
87
99
|
end
|
@@ -110,7 +122,7 @@ module Metanorma
|
|
110
122
|
# @parma mnf [Metanorma::CollectionManifest]
|
111
123
|
# @return [Hash{String=>Metanorma::Document}]
|
112
124
|
def docs_from_xml(xml, mnf)
|
113
|
-
xml.xpath("//xmlns:doc-container
|
125
|
+
xml.xpath("//xmlns:doc-container//xmlns:bibdata")
|
114
126
|
.each_with_object({}) do |b, m|
|
115
127
|
bd = Relaton::Cli.parse_xml b
|
116
128
|
docref = mnf.docref_by_id bd.docidentifier.first.id
|
@@ -127,7 +139,7 @@ module Metanorma
|
|
127
139
|
<<~CONT
|
128
140
|
|
129
141
|
== #{xml.at('title')&.text}
|
130
|
-
|
142
|
+
#{xml.at('p')&.text}
|
131
143
|
CONT
|
132
144
|
end
|
133
145
|
end
|
@@ -152,8 +164,8 @@ module Metanorma
|
|
152
164
|
return unless (cnt = send(elm))
|
153
165
|
|
154
166
|
require "metanorma-#{doctype}"
|
155
|
-
out = sections(dummy_header + cnt)
|
156
|
-
builder.send(elm
|
167
|
+
out = sections(dummy_header + cnt.strip)
|
168
|
+
builder.send("#{elm}-content") { |b| b << out }
|
157
169
|
end
|
158
170
|
|
159
171
|
# @param cnt [String] prefatory/final content
|
@@ -168,9 +180,18 @@ module Metanorma
|
|
168
180
|
return unless Array(@directives).include? "documents-inline"
|
169
181
|
|
170
182
|
documents.each_with_index do |(_, d), i|
|
171
|
-
|
172
|
-
|
173
|
-
|
183
|
+
doccontainer1(builder, d, i)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def doccontainer1(builder, doc, idx)
|
188
|
+
id = format("doc%<index>09d", index: idx)
|
189
|
+
builder.send("doc-container", id: id) do |b|
|
190
|
+
if doc.attachment
|
191
|
+
doc.bibitem and b << doc.bibitem.root.to_xml
|
192
|
+
b.attachment Metanorma::Utils::datauri(doc.file)
|
193
|
+
else doc.to_xml b
|
194
|
+
end
|
174
195
|
end
|
175
196
|
end
|
176
197
|
|
@@ -8,16 +8,22 @@ 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.
|
15
|
-
|
16
|
-
index = v[:container] || v[:label].nil? || v[:label].empty? ?
|
17
|
-
UUIDTools::UUID.random_create.to_s : v[:label]
|
18
|
-
ret[v[:type]][index] = k
|
13
|
+
xrefs.get.each_with_object({}) do |(k, v), ret|
|
14
|
+
read_anchors1(k, v, ret)
|
19
15
|
end
|
20
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
def read_anchors1(key, val, ret)
|
19
|
+
val[:type] ||= "clause"
|
20
|
+
ret[val[:type]] ||= {}
|
21
|
+
index = if val[:container] || val[:label].nil? || val[:label].empty?
|
22
|
+
UUIDTools::UUID.random_create.to_s
|
23
|
+
else val[:label]
|
24
|
+
end
|
25
|
+
ret[val[:type]][index] = key
|
26
|
+
ret[val[:type]][val[:value]] = key if val[:value]
|
21
27
|
end
|
22
28
|
|
23
29
|
# @param id [String]
|
@@ -31,28 +37,36 @@ module Metanorma
|
|
31
37
|
|
32
38
|
# @param bib [Nokogiri::XML::Element]
|
33
39
|
# @param identifier [String]
|
34
|
-
def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize
|
35
|
-
docid = bib&.at(ns("./docidentifier"))&.
|
36
|
-
unless @files[docid]
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
43
|
-
id = bib["id"]
|
44
|
-
newbib = bib.replace(@files[docid][:bibdata])
|
45
|
-
newbib.name = "bibitem"
|
46
|
-
newbib["id"] = id
|
47
|
-
newbib["hidden"] = "true"
|
48
|
-
newbib&.at(ns("./ext"))&.remove
|
49
|
-
_file, url = targetfile(@files[docid], false, !@files[docid][:attachment])
|
40
|
+
def update_bibitem(bib, identifier) # rubocop:disable Metrics/AbcSize
|
41
|
+
docid = bib&.at(ns("./docidentifier"))&.children&.to_xml
|
42
|
+
return fail_update_bibitem(docid, identifier) unless @files[docid]
|
43
|
+
|
44
|
+
newbib = dup_bibitem(docid, bib)
|
45
|
+
bib.replace(newbib)
|
46
|
+
_file, url = targetfile(@files[docid], relative: true, read: false,
|
47
|
+
doc: !@files[docid][:attachment])
|
50
48
|
uri_node = Nokogiri::XML::Node.new "uri", newbib
|
51
49
|
uri_node[:type] = "citation"
|
52
50
|
uri_node.content = url
|
53
51
|
newbib.at(ns("./docidentifier")).previous = uri_node
|
54
52
|
end
|
55
53
|
|
54
|
+
def fail_update_bibitem(docid, identifier)
|
55
|
+
error = "[metanorma] Cannot find crossreference to document #{docid} "\
|
56
|
+
"in document #{identifier}."
|
57
|
+
@log.add("Cross-References", nil, error)
|
58
|
+
Util.log(error, :warning)
|
59
|
+
end
|
60
|
+
|
61
|
+
def dup_bibitem(docid, bib)
|
62
|
+
newbib = @files[docid][:bibdata].dup
|
63
|
+
newbib.name = "bibitem"
|
64
|
+
newbib["hidden"] = "true"
|
65
|
+
newbib&.at("./*[local-name() = 'ext']")&.remove
|
66
|
+
newbib["id"] = bib["id"]
|
67
|
+
newbib
|
68
|
+
end
|
69
|
+
|
56
70
|
# Resolves direct links to other files in collection
|
57
71
|
# (repo(current-metanorma-collection/x),
|
58
72
|
# and indirect links to other files in collection
|
@@ -63,12 +77,13 @@ module Metanorma
|
|
63
77
|
# @param internal_refs [Hash{String=>Hash{String=>String}] schema name to anchor to filename
|
64
78
|
# @return [String] XML content
|
65
79
|
def update_xrefs(file, identifier, internal_refs)
|
66
|
-
docxml = Nokogiri::XML(file)
|
80
|
+
docxml = Nokogiri::XML(file) { |config| config.huge }
|
67
81
|
update_indirect_refs_to_docs(docxml, internal_refs)
|
68
82
|
add_document_suffix(identifier, docxml)
|
69
83
|
update_direct_refs_to_docs(docxml, identifier)
|
70
84
|
svgmap_resolve(datauri_encode(docxml))
|
71
|
-
docxml.xpath(ns("//references[not(./bibitem[not(@hidden) or
|
85
|
+
docxml.xpath(ns("//references[bibitem][not(./bibitem[not(@hidden) or "\
|
86
|
+
"@hidden = 'false'])]")).each do |f|
|
72
87
|
f["hidden"] = "true"
|
73
88
|
end
|
74
89
|
docxml.to_xml
|
@@ -85,11 +100,9 @@ module Metanorma
|
|
85
100
|
isodoc = IsoDoc::Convert.new({})
|
86
101
|
docxml.xpath(ns("//svgmap//eref")).each do |e|
|
87
102
|
href = isodoc.eref_target(e)
|
88
|
-
next if href == "##{e['bibitemid']}"
|
103
|
+
next if href == "##{e['bibitemid']}" ||
|
104
|
+
href =~ /^#/ && !docxml.at("//*[@id = '#{href.sub(/^#/, '')}']")
|
89
105
|
|
90
|
-
if href.match(/^#/)
|
91
|
-
next unless docxml.at("//*[@id = '#{href.sub(/^#/, '')}']")
|
92
|
-
end
|
93
106
|
e["target"] = href.strip
|
94
107
|
e.name = "link"
|
95
108
|
e&.elements&.remove
|
@@ -103,11 +116,18 @@ module Metanorma
|
|
103
116
|
# Preferably with anchor, and is a job to realise dynamic lookup
|
104
117
|
# of localities.
|
105
118
|
def update_direct_refs_to_docs(docxml, identifier)
|
119
|
+
erefs = docxml.xpath(ns("//eref"))
|
120
|
+
.each_with_object({ citeas: {}, bibitemid: {} }) do |i, m|
|
121
|
+
m[:citeas][i["citeas"]] = true
|
122
|
+
m[:bibitemid][i["bibitemid"]] = true
|
123
|
+
end
|
106
124
|
docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |b|
|
107
125
|
docid = b&.at(ns("./docidentifier[@type = 'repository']"))&.text
|
108
126
|
next unless docid && %r{^current-metanorma-collection/}.match(docid)
|
127
|
+
|
109
128
|
update_bibitem(b, identifier)
|
110
|
-
|
129
|
+
docid = b&.at(ns("./docidentifier"))&.children&.to_xml or next
|
130
|
+
erefs[:citeas][docid] and update_anchors(b, docxml, docid)
|
111
131
|
end
|
112
132
|
end
|
113
133
|
|
@@ -124,6 +144,9 @@ module Metanorma
|
|
124
144
|
def update_indirect_refs_to_docs1(docxml, schema, id, file)
|
125
145
|
docxml.xpath(ns("//eref[@bibitemid = '#{schema}_#{id}']")).each do |e|
|
126
146
|
e["citeas"] = file
|
147
|
+
if a = e.at(ns(".//locality[@type = 'anchor']/referenceFrom"))
|
148
|
+
a.children = "#{a.text}_#{Metanorma::Utils::to_ncname(file)}"
|
149
|
+
end
|
127
150
|
end
|
128
151
|
docid = docxml.at(ns("//bibitem[@id = '#{schema}_#{id}']/"\
|
129
152
|
"docidentifier[@type = 'repository']")) or return
|
@@ -131,53 +154,52 @@ module Metanorma
|
|
131
154
|
docid.previous = "<docidentifier type='X'>#{file}</docidentifier>"
|
132
155
|
end
|
133
156
|
|
134
|
-
# update crossrefences to other documents, to include
|
135
|
-
|
136
|
-
|
157
|
+
# update crossrefences to other documents, to include
|
158
|
+
# disambiguating document suffix on id
|
159
|
+
def update_anchors(bib, docxml, docid) # rubocop:disable Metrics/AbcSize
|
137
160
|
docxml.xpath("//xmlns:eref[@citeas = '#{docid}']").each do |e|
|
138
|
-
if @files[docid]
|
139
|
-
update_anchor_loc(bib, e, docid)
|
161
|
+
if @files[docid] then update_anchor_loc(bib, e, docid)
|
140
162
|
else
|
141
|
-
e << "<strong>** Unresolved reference to document #{docid}
|
163
|
+
e << "<strong>** Unresolved reference to document #{docid} "\
|
164
|
+
"from eref</strong>"
|
142
165
|
end
|
143
166
|
end
|
144
167
|
end
|
145
168
|
|
146
|
-
def update_anchor_loc(bib,
|
147
|
-
loc =
|
148
|
-
return update_anchor_create_loc(bib,
|
169
|
+
def update_anchor_loc(bib, eref, docid)
|
170
|
+
loc = eref.at(ns(".//locality[@type = 'anchor']")) or
|
171
|
+
return update_anchor_create_loc(bib, eref, docid)
|
149
172
|
document_suffix = Metanorma::Utils::to_ncname(docid)
|
150
173
|
ref = loc.at(ns("./referenceFrom")) || return
|
151
174
|
anchor = "#{ref.text}_#{document_suffix}"
|
152
175
|
return unless @files[docid][:anchors].inject([]) do |m, (_, x)|
|
153
|
-
m+= x.values
|
176
|
+
m += x.values
|
154
177
|
end.include?(anchor)
|
178
|
+
|
155
179
|
ref.content = anchor
|
156
180
|
end
|
157
181
|
|
158
182
|
# if there is a crossref to another document, with no anchor, retrieve the
|
159
183
|
# anchor given the locality, and insert it into the crossref
|
160
|
-
def update_anchor_create_loc(
|
161
|
-
ins =
|
184
|
+
def update_anchor_create_loc(_bib, eref, docid)
|
185
|
+
ins = eref.at(ns("./localityStack")) or return
|
162
186
|
type = ins&.at(ns("./locality/@type"))&.text
|
187
|
+
type = "clause" if type == "annex"
|
163
188
|
ref = ins&.at(ns("./locality/referenceFrom"))&.text
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
locality = Nokogiri::XML::Node.new "locality", bib
|
168
|
-
locality[:type] = "anchor"
|
169
|
-
locality.add_child ref_from
|
170
|
-
ins << locality
|
189
|
+
anchor = @files[docid][:anchors].dig(type, ref) or return
|
190
|
+
ins << "<locality type='anchor'><referenceFrom>#{anchor.sub(/^_/, '')}"\
|
191
|
+
"</referenceFrom></locality>"
|
171
192
|
end
|
172
193
|
|
173
194
|
# gather internal bibitem references
|
174
195
|
def gather_internal_refs
|
175
196
|
@files.each_with_object({}) do |(_, x), refs|
|
176
197
|
next if x[:attachment]
|
177
|
-
|
198
|
+
|
199
|
+
file, = targetfile(x, read: true)
|
178
200
|
Nokogiri::XML(file)
|
179
201
|
.xpath(ns("//bibitem[@type = 'internal']/"\
|
180
|
-
|
202
|
+
"docidentifier[@type = 'repository']")).each do |d|
|
181
203
|
a = d.text.split(%r{/}, 2)
|
182
204
|
a.size > 1 or next
|
183
205
|
refs[a[0]] ||= {}
|
@@ -189,18 +211,8 @@ module Metanorma
|
|
189
211
|
# resolve file location for the target of each internal reference
|
190
212
|
def locate_internal_refs
|
191
213
|
refs = gather_internal_refs
|
192
|
-
@files.each do |identifier
|
193
|
-
|
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
|
214
|
+
@files.keys.reject { |k| @files[k][:attachment] }.each do |identifier|
|
215
|
+
locate_internal_refs1(refs, identifier, @files[identifier])
|
204
216
|
end
|
205
217
|
refs.each do |schema, ids|
|
206
218
|
ids.each do |id, key|
|
@@ -209,5 +221,18 @@ module Metanorma
|
|
209
221
|
end
|
210
222
|
refs
|
211
223
|
end
|
224
|
+
|
225
|
+
def locate_internal_refs1(refs, identifier, filedesc)
|
226
|
+
file, _filename = targetfile(filedesc, read: true)
|
227
|
+
xml = Nokogiri::XML(file) { |config| config.huge }
|
228
|
+
t = xml.xpath("//*/@id").each_with_object({}) { |i, x| x[i.text] = true }
|
229
|
+
refs.each do |schema, ids|
|
230
|
+
ids.keys.select { |id| t[id] }.each do |id|
|
231
|
+
n = xml.at("//*[@id = '#{id}']") and
|
232
|
+
n.at("./ancestor-or-self::*[@type = '#{schema}']") and
|
233
|
+
refs[schema][id] = identifier
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
212
237
|
end
|
213
238
|
end
|