metanorma-un 0.3.8 → 0.3.9
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/macos.yml +8 -0
- data/.github/workflows/ubuntu.yml +10 -0
- data/.github/workflows/windows.yml +8 -0
- data/lib/asciidoctor/un/biblio.rng +22 -2
- data/lib/asciidoctor/un/converter.rb +17 -2
- data/lib/asciidoctor/un/un.rng +103 -0
- data/lib/isodoc/un/base_convert.rb +1 -178
- data/lib/isodoc/un/html/scripts.html +10 -7
- data/lib/isodoc/un/xref.rb +188 -0
- data/lib/metanorma/un/processor.rb +5 -1
- data/lib/metanorma/un/version.rb +1 -1
- metadata +3 -3
- data/lib/isodoc/un/html/scripts.pdf.html +0 -72
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 165a43762ea2750902fa7087fef248e5afc750cf880d99d39e308126aa7803f1
|
4
|
+
data.tar.gz: bbd3152032b437081396591891a0c7ec467c665c7affd7cafacaa065c4477290
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c28260f9ba2ec03524ece04bfb721be2a8a4bad1818026f360ee7bd3c08c167cd672da66b6a2337fa4fbe3af79fbb8cd22585db93e0a60d84850c1d4dd42327
|
7
|
+
data.tar.gz: d4a0e0de49f6fec3b23a37fdd2abdffaff38cc3b247fad27fd036be4a2255faf3bc26ae03d9162c9474abfe7cbbfa8fa45665b5ca7412ea3cb28075d058420b0
|
data/.github/workflows/macos.yml
CHANGED
@@ -6,15 +6,23 @@ on:
|
|
6
6
|
push:
|
7
7
|
branches: [ master ]
|
8
8
|
pull_request:
|
9
|
+
paths-ignore:
|
10
|
+
- .github/workflows/ubuntu.yml
|
11
|
+
- .github/workflows/windows.yml
|
9
12
|
|
10
13
|
jobs:
|
11
14
|
test-macos:
|
12
15
|
name: Test on Ruby ${{ matrix.ruby }} macOS
|
13
16
|
runs-on: macos-latest
|
17
|
+
continue-on-error: ${{ matrix.experimental }}
|
14
18
|
strategy:
|
15
19
|
fail-fast: false
|
16
20
|
matrix:
|
17
21
|
ruby: [ '2.6', '2.5', '2.4' ]
|
22
|
+
experimental: [false]
|
23
|
+
include:
|
24
|
+
- ruby: '2.7'
|
25
|
+
experimental: true
|
18
26
|
steps:
|
19
27
|
- uses: actions/checkout@master
|
20
28
|
- name: Use Ruby
|
@@ -5,16 +5,26 @@ name: ubuntu
|
|
5
5
|
on:
|
6
6
|
push:
|
7
7
|
branches: [ master ]
|
8
|
+
tags:
|
9
|
+
- '*'
|
8
10
|
pull_request:
|
11
|
+
paths-ignore:
|
12
|
+
- .github/workflows/macos.yml
|
13
|
+
- .github/workflows/windows.yml
|
9
14
|
|
10
15
|
jobs:
|
11
16
|
test-linux:
|
12
17
|
name: Test on Ruby ${{ matrix.ruby }} Ubuntu
|
13
18
|
runs-on: ubuntu-latest
|
19
|
+
continue-on-error: ${{ matrix.experimental }}
|
14
20
|
strategy:
|
15
21
|
fail-fast: false
|
16
22
|
matrix:
|
17
23
|
ruby: [ '2.6', '2.5', '2.4' ]
|
24
|
+
experimental: [false]
|
25
|
+
include:
|
26
|
+
- ruby: '2.7'
|
27
|
+
experimental: true
|
18
28
|
steps:
|
19
29
|
- uses: actions/checkout@master
|
20
30
|
- name: Use Ruby
|
@@ -6,15 +6,23 @@ on:
|
|
6
6
|
push:
|
7
7
|
branches: [ master ]
|
8
8
|
pull_request:
|
9
|
+
paths-ignore:
|
10
|
+
- .github/workflows/macos.yml
|
11
|
+
- .github/workflows/ubuntu.yml
|
9
12
|
|
10
13
|
jobs:
|
11
14
|
test-windows:
|
12
15
|
name: Test on Ruby ${{ matrix.ruby }} Windows
|
13
16
|
runs-on: windows-latest
|
17
|
+
continue-on-error: ${{ matrix.experimental }}
|
14
18
|
strategy:
|
15
19
|
fail-fast: false
|
16
20
|
matrix:
|
17
21
|
ruby: [ '2.6', '2.5', '2.4' ]
|
22
|
+
experimental: [false]
|
23
|
+
include:
|
24
|
+
- ruby: '2.7'
|
25
|
+
experimental: true
|
18
26
|
steps:
|
19
27
|
- uses: actions/checkout@master
|
20
28
|
- name: Use Ruby
|
@@ -88,7 +88,7 @@
|
|
88
88
|
<text/>
|
89
89
|
</element>
|
90
90
|
</define>
|
91
|
-
<define name="
|
91
|
+
<define name="LocalizedString1">
|
92
92
|
<optional>
|
93
93
|
<!-- multiple languages and scripts possible: comma delimit them if so -->
|
94
94
|
<attribute name="language"/>
|
@@ -98,6 +98,16 @@
|
|
98
98
|
</optional>
|
99
99
|
<text/>
|
100
100
|
</define>
|
101
|
+
<define name="LocalizedString">
|
102
|
+
<choice>
|
103
|
+
<ref name="LocalizedString1"/>
|
104
|
+
<oneOrMore>
|
105
|
+
<element name="variant">
|
106
|
+
<ref name="LocalizedString1"/>
|
107
|
+
</element>
|
108
|
+
</oneOrMore>
|
109
|
+
</choice>
|
110
|
+
</define>
|
101
111
|
<!--
|
102
112
|
Unlike UML, change type to format: type is overloaded
|
103
113
|
Would be need if plain were default value and could omit the attribute
|
@@ -121,7 +131,7 @@
|
|
121
131
|
</optional>
|
122
132
|
<ref name="LocalizedStringOrXsAny"/>
|
123
133
|
</define>
|
124
|
-
<define name="
|
134
|
+
<define name="LocalizedStringOrXsAny1">
|
125
135
|
<optional>
|
126
136
|
<!-- multiple languages and scripts possible: comma delimit them if so -->
|
127
137
|
<attribute name="language"/>
|
@@ -136,6 +146,16 @@
|
|
136
146
|
</choice>
|
137
147
|
</oneOrMore>
|
138
148
|
</define>
|
149
|
+
<define name="LocalizedStringOrXsAny">
|
150
|
+
<choice>
|
151
|
+
<ref name="LocalizedStringOrXsAny1"/>
|
152
|
+
<oneOrMore>
|
153
|
+
<element name="variant">
|
154
|
+
<ref name="LocalizedStringOrXsAny1"/>
|
155
|
+
</element>
|
156
|
+
</oneOrMore>
|
157
|
+
</choice>
|
158
|
+
</define>
|
139
159
|
<define name="contributor">
|
140
160
|
<element name="contributor">
|
141
161
|
<zeroOrMore>
|
@@ -124,6 +124,7 @@ module Asciidoctor
|
|
124
124
|
|
125
125
|
def makexml(node)
|
126
126
|
@draft = node.attributes.has_key?("draft")
|
127
|
+
@no_number_subheadings = node.attributes.has_key?("do-not-number-subheadings")
|
127
128
|
super
|
128
129
|
end
|
129
130
|
|
@@ -187,12 +188,26 @@ module Asciidoctor
|
|
187
188
|
|
188
189
|
def sections_cleanup(xmldoc)
|
189
190
|
super
|
191
|
+
no_number_subheadings(xmldoc) if @no_number_subheadings
|
192
|
+
para_to_clause(xmldoc)
|
193
|
+
end
|
194
|
+
|
195
|
+
def no_number_subheadings(xmldoc)
|
196
|
+
xmldoc.xpath("//sections/clause | "\
|
197
|
+
"//sections/definitions | //annex").each do |s|
|
198
|
+
s.xpath(".//clause | .//definitions").each do |c|
|
199
|
+
c["unnumbered"] = true
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def para_to_clause(xmldoc)
|
190
205
|
doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
|
191
206
|
%w(plenary agenda budgetary).include?(doctype) or
|
192
|
-
|
207
|
+
para_to_clause1(xmldoc)
|
193
208
|
end
|
194
209
|
|
195
|
-
def
|
210
|
+
def para_to_clause1(xmldoc)
|
196
211
|
xmldoc.xpath("//clause/p | //annex/p").each do |p|
|
197
212
|
cl = Nokogiri::XML::Node.new("clause", xmldoc)
|
198
213
|
cl["id"] = p["id"]
|
data/lib/asciidoctor/un/un.rng
CHANGED
@@ -138,6 +138,109 @@
|
|
138
138
|
<ref name="Basic-Section"/>
|
139
139
|
</element>
|
140
140
|
</define>
|
141
|
+
<define name="Clause-Section">
|
142
|
+
<optional>
|
143
|
+
<attribute name="id">
|
144
|
+
<data type="ID"/>
|
145
|
+
</attribute>
|
146
|
+
</optional>
|
147
|
+
<optional>
|
148
|
+
<attribute name="language"/>
|
149
|
+
</optional>
|
150
|
+
<optional>
|
151
|
+
<attribute name="script"/>
|
152
|
+
</optional>
|
153
|
+
<optional>
|
154
|
+
<attribute name="inline-header">
|
155
|
+
<data type="boolean"/>
|
156
|
+
</attribute>
|
157
|
+
</optional>
|
158
|
+
<optional>
|
159
|
+
<attribute name="obligation">
|
160
|
+
<choice>
|
161
|
+
<value>normative</value>
|
162
|
+
<value>informative</value>
|
163
|
+
</choice>
|
164
|
+
</attribute>
|
165
|
+
</optional>
|
166
|
+
<optional>
|
167
|
+
<attribute name="unnumbered">
|
168
|
+
<data type="boolean"/>
|
169
|
+
</attribute>
|
170
|
+
</optional>
|
171
|
+
<optional>
|
172
|
+
<ref name="section-title"/>
|
173
|
+
</optional>
|
174
|
+
<group>
|
175
|
+
<group>
|
176
|
+
<zeroOrMore>
|
177
|
+
<ref name="BasicBlock"/>
|
178
|
+
</zeroOrMore>
|
179
|
+
<zeroOrMore>
|
180
|
+
<ref name="note"/>
|
181
|
+
</zeroOrMore>
|
182
|
+
</group>
|
183
|
+
<zeroOrMore>
|
184
|
+
<choice>
|
185
|
+
<ref name="clause-subsection"/>
|
186
|
+
<ref name="terms"/>
|
187
|
+
<ref name="definitions"/>
|
188
|
+
</choice>
|
189
|
+
</zeroOrMore>
|
190
|
+
</group>
|
191
|
+
</define>
|
192
|
+
<define name="Annex-Section">
|
193
|
+
<optional>
|
194
|
+
<attribute name="id">
|
195
|
+
<data type="ID"/>
|
196
|
+
</attribute>
|
197
|
+
</optional>
|
198
|
+
<optional>
|
199
|
+
<attribute name="language"/>
|
200
|
+
</optional>
|
201
|
+
<optional>
|
202
|
+
<attribute name="script"/>
|
203
|
+
</optional>
|
204
|
+
<optional>
|
205
|
+
<attribute name="inline-header">
|
206
|
+
<data type="boolean"/>
|
207
|
+
</attribute>
|
208
|
+
</optional>
|
209
|
+
<optional>
|
210
|
+
<attribute name="obligation">
|
211
|
+
<choice>
|
212
|
+
<value>normative</value>
|
213
|
+
<value>informative</value>
|
214
|
+
</choice>
|
215
|
+
</attribute>
|
216
|
+
</optional>
|
217
|
+
<optional>
|
218
|
+
<attribute name="unnumbered">
|
219
|
+
<data type="boolean"/>
|
220
|
+
</attribute>
|
221
|
+
</optional>
|
222
|
+
<optional>
|
223
|
+
<ref name="section-title"/>
|
224
|
+
</optional>
|
225
|
+
<group>
|
226
|
+
<group>
|
227
|
+
<zeroOrMore>
|
228
|
+
<ref name="BasicBlock"/>
|
229
|
+
</zeroOrMore>
|
230
|
+
<zeroOrMore>
|
231
|
+
<ref name="note"/>
|
232
|
+
</zeroOrMore>
|
233
|
+
</group>
|
234
|
+
<zeroOrMore>
|
235
|
+
<choice>
|
236
|
+
<ref name="annex-subsection"/>
|
237
|
+
<ref name="terms"/>
|
238
|
+
<ref name="definitions"/>
|
239
|
+
<ref name="references"/>
|
240
|
+
</choice>
|
241
|
+
</zeroOrMore>
|
242
|
+
</group>
|
243
|
+
</define>
|
141
244
|
</include>
|
142
245
|
<define name="session">
|
143
246
|
<element name="session">
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative "metadata"
|
2
|
+
require_relative "xref"
|
2
3
|
require "fileutils"
|
3
|
-
require "roman-numerals"
|
4
4
|
|
5
5
|
module IsoDoc
|
6
6
|
module UN
|
@@ -30,183 +30,6 @@ module IsoDoc
|
|
30
30
|
File.join(File.dirname(__FILE__), loc)
|
31
31
|
end
|
32
32
|
|
33
|
-
MIDDLE_CLAUSE = "//clause[parent::sections]".freeze
|
34
|
-
|
35
|
-
def initial_anchor_names(d)
|
36
|
-
preface_names(d.at(ns("//preface/abstract")))
|
37
|
-
preface_names(d.at(ns("//foreword")))
|
38
|
-
preface_names(d.at(ns("//introduction")))
|
39
|
-
d.xpath(ns("//preface/clause")).each do |c|
|
40
|
-
preface_names(c)
|
41
|
-
end
|
42
|
-
preface_names(d.at(ns("//acknowledgements")))
|
43
|
-
sequential_asset_names(
|
44
|
-
d.xpath(ns("//preface/abstract | //foreword | //introduction | "\
|
45
|
-
"//preface/clause | //acknowledgements")))
|
46
|
-
middle_section_asset_names(d)
|
47
|
-
clause_names(d, 0)
|
48
|
-
termnote_anchor_names(d)
|
49
|
-
termexample_anchor_names(d)
|
50
|
-
end
|
51
|
-
|
52
|
-
def clause_names(docxml, sect_num)
|
53
|
-
q = "//clause[parent::sections]"
|
54
|
-
@paranumber = 0
|
55
|
-
docxml.xpath(ns(q)).each_with_index do |c, i|
|
56
|
-
section_names(c, (i + sect_num), 1)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def levelnumber(num, lvl)
|
61
|
-
case lvl % 3
|
62
|
-
when 1 then RomanNumerals.to_roman(num)
|
63
|
-
when 2 then ("A".ord + num - 1).chr
|
64
|
-
when 0 then num.to_s
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def annex_levelnum(num, lvl)
|
69
|
-
case lvl % 3
|
70
|
-
when 0 then RomanNumerals.to_roman(num)
|
71
|
-
when 1 then ("A".ord + num - 1).chr
|
72
|
-
when 2 then num.to_s
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
NONTERMINAL =
|
77
|
-
"./clause | ./term | ./terms | ./definitions | ./references".freeze
|
78
|
-
|
79
|
-
def leaf_section?(clause)
|
80
|
-
!clause.at(ns(NONTERMINAL)) &&
|
81
|
-
!%w(definitions annex terms).include?(clause.name) &&
|
82
|
-
clause.at(ns("./p | ./bibitem"))
|
83
|
-
end
|
84
|
-
|
85
|
-
def label_leaf_section(clause, lvl)
|
86
|
-
@paranumber += 1
|
87
|
-
@anchors[clause["id"]] = {label: @paranumber.to_s,
|
88
|
-
xref: "paragraph #{@paranumber}",
|
89
|
-
level: lvl, type: "paragraph" }
|
90
|
-
end
|
91
|
-
|
92
|
-
def label_annex_leaf_section(clause, num, lvl)
|
93
|
-
@paranumber += 1
|
94
|
-
@anchors[clause["id"]] = {label: @paranumber.to_s,
|
95
|
-
xref: "paragraph #{num}.#{@paranumber}",
|
96
|
-
level: lvl, type: "paragraph" }
|
97
|
-
end
|
98
|
-
|
99
|
-
def section_names(clause, num, lvl)
|
100
|
-
return num if clause.nil?
|
101
|
-
leaf_section?(clause) and label_leaf_section(clause, lvl) and return
|
102
|
-
num = num + 1
|
103
|
-
lbl = levelnumber(num, 1)
|
104
|
-
@anchors[clause["id"]] = { label: lbl, level: lvl, type: "clause",
|
105
|
-
xref: l10n("#{@clause_lbl} #{lbl}") }
|
106
|
-
i = 1
|
107
|
-
clause.xpath(ns(NONTERMINAL)).each do |c|
|
108
|
-
section_names1(c, "#{lbl}.#{levelnumber(i, lvl + 1)}", lvl + 1)
|
109
|
-
i += 1 if !leaf_section?(c)
|
110
|
-
end
|
111
|
-
num
|
112
|
-
end
|
113
|
-
|
114
|
-
def section_names1(clause, num, level)
|
115
|
-
leaf_section?(clause) and label_leaf_section(clause, level) and return
|
116
|
-
/\.(?<leafnum>[^.]+$)/ =~ num
|
117
|
-
@anchors[clause["id"]] = { label: leafnum, level: level, type: "clause",
|
118
|
-
xref: l10n("#{@clause_lbl} #{num}") }
|
119
|
-
i = 1
|
120
|
-
clause.xpath(ns(NONTERMINAL)).each do |c|
|
121
|
-
section_names1(c, "#{num}.#{levelnumber(i, level + 1)}", level + 1)
|
122
|
-
i += 1 if !leaf_section?(c)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def annex_name_lbl(clause, num)
|
127
|
-
l10n("<b>#{@annex_lbl} #{num}</b>")
|
128
|
-
end
|
129
|
-
|
130
|
-
SUBCLAUSES =
|
131
|
-
"./clause | ./references | ./term | ./terms | ./definitions".freeze
|
132
|
-
|
133
|
-
|
134
|
-
def annex_names(clause, num)
|
135
|
-
hierarchical_asset_names(clause, num)
|
136
|
-
leaf_section?(clause) and
|
137
|
-
label_annex_leaf_section(clause, num, 1) and return
|
138
|
-
@anchors[clause["id"]] = { label: annex_name_lbl(clause, num),
|
139
|
-
type: "clause",
|
140
|
-
xref: "#{@annex_lbl} #{num}", level: 1 }
|
141
|
-
if a = single_annex_special_section(clause)
|
142
|
-
annex_names1(a, "#{num}", 1)
|
143
|
-
else
|
144
|
-
i = 1
|
145
|
-
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
146
|
-
annex_names1(c, "#{num}.#{annex_levelnum(i, 2)}", 2)
|
147
|
-
i += 1 if !leaf_section?(c)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def annex_names1(clause, num, level)
|
153
|
-
leaf_section?(clause) and
|
154
|
-
label_annex_leaf_section(clause, num, level) and return
|
155
|
-
/\.(?<leafnum>[^.]+$)/ =~ num
|
156
|
-
@anchors[clause["id"]] = { label: leafnum, xref: "#{@annex_lbl} #{num}",
|
157
|
-
level: level, type: "clause" }
|
158
|
-
i = 1
|
159
|
-
clause.xpath(ns("./clause | ./references")).each do |c|
|
160
|
-
annex_names1(c, "#{num}.#{annex_levelnum(i, level + 1)}", level + 1)
|
161
|
-
i += 1 if !leaf_section?(c)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def back_anchor_names(docxml)
|
166
|
-
docxml.xpath(ns("//annex")).each_with_index do |c, i|
|
167
|
-
@paranumber = 0
|
168
|
-
annex_names(c, RomanNumerals.to_roman(i + 1))
|
169
|
-
end
|
170
|
-
docxml.xpath(ns("//bibliography/clause |"\
|
171
|
-
"//bibliography/references")).each do |b|
|
172
|
-
preface_names(b)
|
173
|
-
end
|
174
|
-
docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |ref|
|
175
|
-
reference_names(ref)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def sequential_admonition_names(clause)
|
180
|
-
i = 0
|
181
|
-
clause.xpath(ns(".//admonition")).each do |t|
|
182
|
-
i += 1 unless t["unnumbered"]
|
183
|
-
next if t["id"].nil? || t["id"].empty?
|
184
|
-
@anchors[t["id"]] = anchor_struct(i.to_s, nil, @admonition_lbl,
|
185
|
-
"box", t["unnumbered"])
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
def hierarchical_admonition_names(clause, num)
|
190
|
-
i = 0
|
191
|
-
clause.xpath(ns(".//admonition")).each do |t|
|
192
|
-
i += 1 unless t["unnumbered"]
|
193
|
-
next if t["id"].nil? || t["id"].empty?
|
194
|
-
@anchors[t["id"]] =
|
195
|
-
anchor_struct("#{num}.#{i}", nil, @admonition_lbl, "box",
|
196
|
-
t["unnumbered"])
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def sequential_asset_names(clause)
|
201
|
-
super
|
202
|
-
sequential_admonition_names(clause)
|
203
|
-
end
|
204
|
-
|
205
|
-
def hierarchical_asset_names(clause, num)
|
206
|
-
super
|
207
|
-
hierarchical_admonition_names(clause, num)
|
208
|
-
end
|
209
|
-
|
210
33
|
def admonition_name_parse(node, div, name)
|
211
34
|
div.p **{ class: "AdmonitionTitle", style: "text-align:center;" } do |p|
|
212
35
|
lbl = anchor(node['id'], :label)
|
@@ -42,13 +42,16 @@ $('#toggle').on('click', function(){
|
|
42
42
|
</script>
|
43
43
|
|
44
44
|
<script>
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
45
|
+
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
|
46
|
+
//
|
47
|
+
// AnchorJS - v4.2.2 - 2020-04-20
|
48
|
+
// https://www.bryanbraun.com/anchorjs/
|
49
|
+
// Copyright (c) 2020 Bryan Braun; Licensed MIT
|
50
|
+
//
|
51
|
+
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
|
52
|
+
!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function f(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.base=A.hasOwnProperty("base")?A.base:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64,A.titleText=A.hasOwnProperty("titleText")?A.titleText:""}function p(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],f(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,a,r,c,h,l,u,d=[];if(f(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),0===(e=p(A=A||"h2, h3, h4, h5, h6")).length)return this;for(!function(){if(null!==document.head.querySelector("style.anchorjs"))return;var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"],style'))?document.head.appendChild(e):document.head.insertBefore(e,A);e.sheet.insertRule(".anchorjs-link{opacity:0;text-decoration:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}",e.sheet.cssRules.length),e.sheet.insertRule(":hover>.anchorjs-link,.anchorjs-link:focus{opacity:1}",e.sheet.cssRules.length),e.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",e.sheet.cssRules.length),e.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',e.sheet.cssRules.length)}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o<e.length;o++)if(this.hasAnchorJSLink(e[o]))d.push(o);else{if(e[o].hasAttribute("id"))n=e[o].getAttribute("id");else if(e[o].hasAttribute("data-anchor-id"))n=e[o].getAttribute("data-anchor-id");else{for(c=r=this.urlify(e[o].textContent),a=0;void 0!==s&&(c=r+"-"+a),a+=1,-1!==(s=i.indexOf(c)););s=void 0,i.push(c),e[o].setAttribute("id",c),n=c}(h=document.createElement("a")).className="anchorjs-link "+this.options.class,h.setAttribute("aria-label",this.options.ariaLabel),h.setAttribute("data-anchorjs-icon",this.options.icon),this.options.titleText&&(h.title=this.options.titleText),u=document.querySelector("base")?window.location.pathname+window.location.search:"",u=this.options.base||u,h.href=u+"#"+n,"always"===l&&(h.style.opacity="1"),""===this.options.icon&&(h.style.font="1em/1 anchorjs-icons","left"===this.options.placement&&(h.style.lineHeight="inherit")),"left"===this.options.placement?(h.style.position="absolute",h.style.marginLeft="-1em",h.style.paddingRight="0.5em",e[o].insertBefore(h,e[o].firstChild)):(h.style.paddingLeft="0.375em",e[o].appendChild(h))}for(o=0;o<d.length;o++)e.splice(d[o]-o,1);return this.elements=this.elements.concat(e),this},this.remove=function(A){for(var e,t,i=p(A),n=0;n<i.length;n++)(t=i[n].querySelector(".anchorjs-link"))&&(-1!==(e=this.elements.indexOf(i[n]))&&this.elements.splice(e,1),i[n].removeChild(t));return this},this.removeAll=function(){this.remove(this.elements)},this.urlify=function(A){return this.options.truncate||f(this.options),A.trim().replace(/\'/gi,"").replace(/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}});
|
53
|
+
// @license-end
|
54
|
+
</script>
|
52
55
|
<script>
|
53
56
|
/*
|
54
57
|
$('document').ready(function() {
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require "roman-numerals"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
module UN
|
5
|
+
module BaseConvert
|
6
|
+
MIDDLE_CLAUSE = "//clause[parent::sections]".freeze
|
7
|
+
|
8
|
+
def initial_anchor_names(d)
|
9
|
+
preface_names(d.at(ns("//preface/abstract")))
|
10
|
+
preface_names(d.at(ns("//foreword")))
|
11
|
+
preface_names(d.at(ns("//introduction")))
|
12
|
+
d.xpath(ns("//preface/clause")).each do |c|
|
13
|
+
preface_names(c)
|
14
|
+
end
|
15
|
+
preface_names(d.at(ns("//acknowledgements")))
|
16
|
+
sequential_asset_names(
|
17
|
+
d.xpath(ns("//preface/abstract | //foreword | //introduction | "\
|
18
|
+
"//preface/clause | //acknowledgements")))
|
19
|
+
middle_section_asset_names(d)
|
20
|
+
clause_names(d, 0)
|
21
|
+
termnote_anchor_names(d)
|
22
|
+
termexample_anchor_names(d)
|
23
|
+
end
|
24
|
+
|
25
|
+
def clause_names(docxml, sect_num)
|
26
|
+
q = "//clause[parent::sections]"
|
27
|
+
@paranumber = 0
|
28
|
+
docxml.xpath(ns(q)).each_with_index do |c, i|
|
29
|
+
section_names(c, (i + sect_num), 1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def levelnumber(num, lvl)
|
34
|
+
case lvl % 3
|
35
|
+
when 1 then RomanNumerals.to_roman(num)
|
36
|
+
when 2 then ("A".ord + num - 1).chr
|
37
|
+
when 0 then num.to_s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def annex_levelnum(num, lvl)
|
42
|
+
case lvl % 3
|
43
|
+
when 0 then RomanNumerals.to_roman(num)
|
44
|
+
when 1 then ("A".ord + num - 1).chr
|
45
|
+
when 2 then num.to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
NONTERMINAL =
|
50
|
+
"./clause | ./term | ./terms | ./definitions | ./references".freeze
|
51
|
+
|
52
|
+
def leaf_section?(clause)
|
53
|
+
!clause.at(ns(NONTERMINAL)) &&
|
54
|
+
!%w(definitions annex terms).include?(clause.name) &&
|
55
|
+
clause.at(ns("./p | ./bibitem"))
|
56
|
+
end
|
57
|
+
|
58
|
+
def label_leaf_section(clause, lvl)
|
59
|
+
@paranumber += 1
|
60
|
+
@anchors[clause["id"]] = {label: @paranumber.to_s,
|
61
|
+
xref: "paragraph #{@paranumber}",
|
62
|
+
level: lvl, type: "paragraph" }
|
63
|
+
end
|
64
|
+
|
65
|
+
def label_annex_leaf_section(clause, num, lvl)
|
66
|
+
@paranumber += 1
|
67
|
+
@anchors[clause["id"]] = {label: @paranumber.to_s,
|
68
|
+
xref: "paragraph #{num}.#{@paranumber}",
|
69
|
+
level: lvl, type: "paragraph" }
|
70
|
+
end
|
71
|
+
|
72
|
+
def section_names(clause, num, lvl)
|
73
|
+
return num if clause.nil?
|
74
|
+
leaf_section?(clause) and label_leaf_section(clause, lvl) and return
|
75
|
+
num = num + 1
|
76
|
+
lbl = levelnumber(num, 1)
|
77
|
+
@anchors[clause["id"]] = { label: lbl, level: lvl, type: "clause",
|
78
|
+
xref: l10n("#{@clause_lbl} #{lbl}") }
|
79
|
+
i = 1
|
80
|
+
clause.xpath(ns(NONTERMINAL)).each do |c|
|
81
|
+
next if c["unnumbered"] == "true"
|
82
|
+
section_names1(c, "#{lbl}.#{levelnumber(i, lvl + 1)}", lvl + 1)
|
83
|
+
i += 1 if !leaf_section?(c)
|
84
|
+
end
|
85
|
+
num
|
86
|
+
end
|
87
|
+
|
88
|
+
def section_names1(clause, num, level)
|
89
|
+
leaf_section?(clause) and label_leaf_section(clause, level) and return
|
90
|
+
/\.(?<leafnum>[^.]+$)/ =~ num
|
91
|
+
@anchors[clause["id"]] = { label: leafnum, level: level, type: "clause",
|
92
|
+
xref: l10n("#{@clause_lbl} #{num}") }
|
93
|
+
i = 1
|
94
|
+
clause.xpath(ns(NONTERMINAL)).each do |c|
|
95
|
+
next if c["unnumbered"] == "true"
|
96
|
+
section_names1(c, "#{num}.#{levelnumber(i, level + 1)}", level + 1)
|
97
|
+
i += 1 if !leaf_section?(c)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def annex_name_lbl(clause, num)
|
102
|
+
l10n("<b>#{@annex_lbl} #{num}</b>")
|
103
|
+
end
|
104
|
+
|
105
|
+
SUBCLAUSES =
|
106
|
+
"./clause | ./references | ./term | ./terms | ./definitions".freeze
|
107
|
+
|
108
|
+
|
109
|
+
def annex_names(clause, num)
|
110
|
+
hierarchical_asset_names(clause, num)
|
111
|
+
leaf_section?(clause) and
|
112
|
+
label_annex_leaf_section(clause, num, 1) and return
|
113
|
+
@anchors[clause["id"]] = { label: annex_name_lbl(clause, num),
|
114
|
+
type: "clause",
|
115
|
+
xref: "#{@annex_lbl} #{num}", level: 1 }
|
116
|
+
if a = single_annex_special_section(clause)
|
117
|
+
annex_names1(a, "#{num}", 1)
|
118
|
+
else
|
119
|
+
i = 1
|
120
|
+
clause.xpath(ns(SUBCLAUSES)).each do |c|
|
121
|
+
next if c["unnumbered"] == "true"
|
122
|
+
annex_names1(c, "#{num}.#{annex_levelnum(i, 2)}", 2)
|
123
|
+
i += 1 if !leaf_section?(c)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def annex_names1(clause, num, level)
|
129
|
+
leaf_section?(clause) and
|
130
|
+
label_annex_leaf_section(clause, num, level) and return
|
131
|
+
/\.(?<leafnum>[^.]+$)/ =~ num
|
132
|
+
@anchors[clause["id"]] = { label: leafnum, xref: "#{@annex_lbl} #{num}",
|
133
|
+
level: level, type: "clause" }
|
134
|
+
i = 1
|
135
|
+
clause.xpath(ns("./clause | ./references")).each do |c|
|
136
|
+
next if c["unnumbered"] == "true"
|
137
|
+
annex_names1(c, "#{num}.#{annex_levelnum(i, level + 1)}", level + 1)
|
138
|
+
i += 1 if !leaf_section?(c)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def back_anchor_names(docxml)
|
143
|
+
docxml.xpath(ns("//annex")).each_with_index do |c, i|
|
144
|
+
@paranumber = 0
|
145
|
+
annex_names(c, RomanNumerals.to_roman(i + 1))
|
146
|
+
end
|
147
|
+
docxml.xpath(ns("//bibliography/clause |"\
|
148
|
+
"//bibliography/references")).each do |b|
|
149
|
+
preface_names(b)
|
150
|
+
end
|
151
|
+
docxml.xpath(ns("//bibitem[not(ancestor::bibitem)]")).each do |ref|
|
152
|
+
reference_names(ref)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def sequential_admonition_names(clause)
|
157
|
+
i = 0
|
158
|
+
clause.xpath(ns(".//admonition")).each do |t|
|
159
|
+
next if t["id"].nil? || t["id"].empty?
|
160
|
+
i += 1 unless t["unnumbered"] == "true"
|
161
|
+
@anchors[t["id"]] = anchor_struct(i.to_s, nil, @admonition_lbl,
|
162
|
+
"box", t["unnumbered"])
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def hierarchical_admonition_names(clause, num)
|
167
|
+
i = 0
|
168
|
+
clause.xpath(ns(".//admonition")).each do |t|
|
169
|
+
next if t["id"].nil? || t["id"].empty?
|
170
|
+
i += 1 unless t["unnumbered"] == "true"
|
171
|
+
@anchors[t["id"]] =
|
172
|
+
anchor_struct("#{num}.#{i}", nil, @admonition_lbl, "box",
|
173
|
+
t["unnumbered"])
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def sequential_asset_names(clause)
|
178
|
+
super
|
179
|
+
sequential_admonition_names(clause)
|
180
|
+
end
|
181
|
+
|
182
|
+
def hierarchical_asset_names(clause, num)
|
183
|
+
super
|
184
|
+
hierarchical_admonition_names(clause, num)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -3,7 +3,11 @@ require "metanorma/processor"
|
|
3
3
|
module Metanorma
|
4
4
|
module UN
|
5
5
|
def self.fonts_used
|
6
|
-
|
6
|
+
{
|
7
|
+
html: ["Arial", "Arial Black", "Courier", "Times New Roman", "HanSans"],
|
8
|
+
doc: ["Arial", "Arial Black", "Courier", "Times New Roman", "HanSans"],
|
9
|
+
pdf: ["Arial", "Arial Black", "Courier", "Times New Roman", "HanSans"],
|
10
|
+
}
|
7
11
|
end
|
8
12
|
|
9
13
|
class Processor < Metanorma::Processor
|
data/lib/metanorma/un/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-un
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: htmlentities
|
@@ -276,7 +276,6 @@ files:
|
|
276
276
|
- lib/isodoc/un/html/htmlstyle.scss
|
277
277
|
- lib/isodoc/un/html/logo.jpg
|
278
278
|
- lib/isodoc/un/html/scripts.html
|
279
|
-
- lib/isodoc/un/html/scripts.pdf.html
|
280
279
|
- lib/isodoc/un/html/unece.scss
|
281
280
|
- lib/isodoc/un/html/word_unece_intro.html
|
282
281
|
- lib/isodoc/un/html/word_unece_plenary_titlepage.html
|
@@ -288,6 +287,7 @@ files:
|
|
288
287
|
- lib/isodoc/un/un.plenary.xsl
|
289
288
|
- lib/isodoc/un/un.recommendation.xsl
|
290
289
|
- lib/isodoc/un/word_convert.rb
|
290
|
+
- lib/isodoc/un/xref.rb
|
291
291
|
- lib/metanorma-un.rb
|
292
292
|
- lib/metanorma/un.rb
|
293
293
|
- lib/metanorma/un/UN_emblem_blue.svg
|
@@ -1,72 +0,0 @@
|
|
1
|
-
<script>
|
2
|
-
//TOC generation
|
3
|
-
$('#toc').toc({
|
4
|
-
'selectors': toclevel(), //elements to use as headings
|
5
|
-
'container': 'main', //element to find all selectors in
|
6
|
-
'smoothScrolling': true, //enable or disable smooth scrolling on click
|
7
|
-
'prefix': 'toc', //prefix for anchor tags and class names
|
8
|
-
'onHighlight': function(el) {}, //called when a new section is highlighted
|
9
|
-
'highlightOnScroll': false, //add class to heading that is currently in focus
|
10
|
-
'highlightOffset': 100, //offset to trigger the next headline
|
11
|
-
'anchorName': function(i, heading, prefix) { //custom function for anchor name
|
12
|
-
return prefix+i;
|
13
|
-
},
|
14
|
-
'headerText': function(i, heading, $heading) { //custom function building the header-item text
|
15
|
-
return $heading.text();
|
16
|
-
},
|
17
|
-
'itemClass': function(i, heading, $heading, prefix) { // custom function for item class
|
18
|
-
return $heading[0].tagName.toLowerCase();
|
19
|
-
}
|
20
|
-
});
|
21
|
-
|
22
|
-
</script>
|
23
|
-
|
24
|
-
<script>
|
25
|
-
//TOC toggle animation
|
26
|
-
$('#toggle').on('click', function(){
|
27
|
-
if( $('nav').is(':visible') ) {
|
28
|
-
$('nav').animate({ 'left': '-353px' }, 'slow', function(){
|
29
|
-
$('nav').hide();
|
30
|
-
});
|
31
|
-
$('.container').animate({ 'padding-left': '31px' }, 'slow');
|
32
|
-
}
|
33
|
-
else {
|
34
|
-
$('nav').show();
|
35
|
-
$('nav').animate({ 'left': '0px' }, 'slow');
|
36
|
-
$('.container').animate({ 'padding-left': '360px' }, 'slow');
|
37
|
-
}
|
38
|
-
});
|
39
|
-
</script>
|
40
|
-
|
41
|
-
<script>
|
42
|
-
// Scroll to top button
|
43
|
-
window.onscroll = function() {scrollFunction()};
|
44
|
-
|
45
|
-
function scrollFunction() {
|
46
|
-
if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) {
|
47
|
-
document.getElementById("myBtn").style.display = "block";
|
48
|
-
} else {
|
49
|
-
document.getElementById("myBtn").style.display = "none";
|
50
|
-
}
|
51
|
-
}
|
52
|
-
|
53
|
-
// When the user clicks on the button, scroll to the top of the document
|
54
|
-
function topFunction() {
|
55
|
-
document.body.scrollTop = 0;
|
56
|
-
document.documentElement.scrollTop = 0;
|
57
|
-
}
|
58
|
-
</script>
|
59
|
-
|
60
|
-
<script>
|
61
|
-
/*
|
62
|
-
$(document).ready(function() {
|
63
|
-
$('[id^=toc]').each(function ()
|
64
|
-
{
|
65
|
-
var currentToc = $(this);
|
66
|
-
var url = window.location.href;
|
67
|
-
currentToc.wrap("<a href='" + url + "#" + currentToc.attr("id") + "' </a>");
|
68
|
-
});
|
69
|
-
});
|
70
|
-
*/
|
71
|
-
</script>
|
72
|
-
|