metanorma-iso 1.9.1 → 1.9.5
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/asciidoctor/iso/cleanup.rb +3 -4
- data/lib/asciidoctor/iso/front_id.rb +7 -2
- data/lib/asciidoctor/iso/isodoc.rng +49 -11
- data/lib/asciidoctor/iso/isostandard.rng +4 -1
- data/lib/asciidoctor/iso/reqt.rng +15 -4
- data/lib/asciidoctor/iso/section.rb +7 -1
- data/lib/asciidoctor/iso/validate_section.rb +18 -20
- data/lib/asciidoctor/iso/validate_style.rb +17 -9
- data/lib/isodoc/iso/index.rb +48 -24
- data/lib/isodoc/iso/iso.amendment.xsl +451 -148
- data/lib/isodoc/iso/iso.international-standard.xsl +451 -148
- data/lib/isodoc/iso/metadata.rb +28 -16
- data/lib/isodoc/iso/presentation_xml_convert.rb +30 -22
- data/lib/metanorma/iso/processor.rb +1 -1
- data/lib/metanorma/iso/version.rb +1 -1
- data/spec/asciidoctor/base_spec.rb +2 -55
- data/spec/asciidoctor/blank_spec.rb +38 -0
- data/spec/asciidoctor/blocks_spec.rb +39 -0
- data/spec/asciidoctor/refs_spec.rb +1 -1
- data/spec/isodoc/inline_spec.rb +306 -245
- data/spec/isodoc/terms_spec.rb +30 -0
- metadata +3 -2
data/lib/isodoc/iso/metadata.rb
CHANGED
@@ -2,7 +2,7 @@ require "isodoc"
|
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
module Iso
|
5
|
-
class
|
5
|
+
class Metadata < IsoDoc::Metadata
|
6
6
|
def initialize(lang, script, i18n)
|
7
7
|
super
|
8
8
|
set(:tc, "XXXX")
|
@@ -14,17 +14,17 @@ module IsoDoc
|
|
14
14
|
set(:obsoletes_part, nil)
|
15
15
|
end
|
16
16
|
|
17
|
-
def status_abbrev(stage,
|
17
|
+
def status_abbrev(stage, _substage, iter, draft, doctype)
|
18
18
|
return "" unless stage
|
19
19
|
|
20
20
|
if %w(technical-report technical-specification).include?(doctype)
|
21
21
|
stage = "DTS" if stage == "DIS"
|
22
22
|
stage = "FDTS" if stage == "FDIS"
|
23
23
|
end
|
24
|
-
if %w(PWI NWIP WD CD).include?(stage)
|
25
|
-
stage += iter
|
24
|
+
if %w(PWI NWIP WD CD).include?(stage) && iter
|
25
|
+
stage += iter
|
26
26
|
end
|
27
|
-
stage = "Pre"
|
27
|
+
stage = "Pre#{stage}" if /^0\./.match?(draft)
|
28
28
|
stage
|
29
29
|
end
|
30
30
|
|
@@ -48,14 +48,14 @@ module IsoDoc
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def unpublished(status)
|
51
|
-
status.to_i
|
51
|
+
status.to_i.positive? && status.to_i < 60
|
52
52
|
end
|
53
53
|
|
54
54
|
def docid(isoxml, _out)
|
55
55
|
dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'ISO']"))
|
56
56
|
set(:docnumber, dn&.text)
|
57
57
|
tcdn = isoxml.xpath(ns("//bibdata/docidentifier[@type = 'iso-tc']"))
|
58
|
-
set(:tc_docnumber, tcdn.map
|
58
|
+
set(:tc_docnumber, tcdn.map(&:text))
|
59
59
|
dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-with-lang']"))
|
60
60
|
set(:docnumber_lang, dn&.text)
|
61
61
|
dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-reference']"))
|
@@ -87,6 +87,7 @@ module IsoDoc
|
|
87
87
|
|
88
88
|
def part_title(part, partnum, subpartnum, lang)
|
89
89
|
return "" unless part
|
90
|
+
|
90
91
|
suffix = @c.encode(part.text, :hexadecimal)
|
91
92
|
partnum = "#{partnum}–#{subpartnum}" if partnum && subpartnum
|
92
93
|
suffix = "#{part_label(lang)} #{partnum}: " + suffix if partnum
|
@@ -125,10 +126,14 @@ module IsoDoc
|
|
125
126
|
end
|
126
127
|
|
127
128
|
def title_parts(isoxml, lang)
|
128
|
-
[isoxml.at(ns("//bibdata//title[@type='title-intro' and
|
129
|
-
|
130
|
-
isoxml.at(ns("//bibdata//title[@type='title-
|
131
|
-
|
129
|
+
[isoxml.at(ns("//bibdata//title[@type='title-intro' and "\
|
130
|
+
"@language='#{lang}']")),
|
131
|
+
isoxml.at(ns("//bibdata//title[@type='title-main' and "\
|
132
|
+
"@language='#{lang}']")),
|
133
|
+
isoxml.at(ns("//bibdata//title[@type='title-part' and "\
|
134
|
+
"@language='#{lang}']")),
|
135
|
+
isoxml.at(ns("//bibdata//title[@type='title-amd' and "\
|
136
|
+
"@language='#{lang}']"))]
|
132
137
|
end
|
133
138
|
|
134
139
|
def title(isoxml, _out)
|
@@ -139,7 +144,10 @@ module IsoDoc
|
|
139
144
|
set(:doctitlemain, @c.encode(main ? main.text : "", :hexadecimal))
|
140
145
|
main = compose_title(main, intro, part, partnumber, subpartnumber, lang)
|
141
146
|
set(:doctitle, main)
|
142
|
-
|
147
|
+
if intro
|
148
|
+
set(:doctitleintro,
|
149
|
+
@c.encode(intro ? intro.text : "", :hexadecimal))
|
150
|
+
end
|
143
151
|
set(:doctitlepartlabel, part_prefix(partnumber, subpartnumber, lang))
|
144
152
|
set(:doctitlepart, @c.encode(part.text, :hexadecimal)) if part
|
145
153
|
set(:doctitleamdlabel, amd_prefix(amdnumber, lang)) if amdnumber
|
@@ -155,7 +163,10 @@ module IsoDoc
|
|
155
163
|
set(:docsubtitlemain, @c.encode(main ? main.text : "", :hexadecimal))
|
156
164
|
main = compose_title(main, intro, part, partnumber, subpartnumber, lang)
|
157
165
|
set(:docsubtitle, main)
|
158
|
-
|
166
|
+
if intro
|
167
|
+
set(:docsubtitleintro,
|
168
|
+
@c.encode(intro ? intro.text : "", :hexadecimal))
|
169
|
+
end
|
159
170
|
set(:docsubtitlepartlabel, part_prefix(partnumber, subpartnumber, lang))
|
160
171
|
set(:docsubtitlepart, @c.encode(part.text, :hexadecimal)) if part
|
161
172
|
set(:docsubtitleamdlabel, amd_prefix(amdnumber, lang)) if amdnumber
|
@@ -173,8 +184,8 @@ module IsoDoc
|
|
173
184
|
|
174
185
|
def tc(xml)
|
175
186
|
tc_num = xml.at(ns("//bibdata/ext/editorialgroup/technical-committee/@number"))
|
176
|
-
tc_type = xml.at(ns("//bibdata/ext/editorialgroup/technical-committee/@type"))
|
177
|
-
text || "TC"
|
187
|
+
tc_type = xml.at(ns("//bibdata/ext/editorialgroup/technical-committee/@type"))
|
188
|
+
&.text || "TC"
|
178
189
|
if tc_num
|
179
190
|
tcid = "#{tc_type} #{tc_num.text}"
|
180
191
|
set(:tc, tcid)
|
@@ -212,7 +223,8 @@ module IsoDoc
|
|
212
223
|
ics = []
|
213
224
|
isoxml.xpath(ns("//bibdata/ext/ics/code")).each { |i| ics << i.text }
|
214
225
|
set(:ics, ics.empty? ? nil : ics.join(", "))
|
215
|
-
a = isoxml.at(ns("//bibdata/ext/horizontal")) and set(:horizontal,
|
226
|
+
a = isoxml.at(ns("//bibdata/ext/horizontal")) and set(:horizontal,
|
227
|
+
a.text)
|
216
228
|
end
|
217
229
|
end
|
218
230
|
end
|
@@ -45,13 +45,15 @@ module IsoDoc
|
|
45
45
|
prefix_name(node, " — ", lbl, "name")
|
46
46
|
end
|
47
47
|
|
48
|
+
def eref_delim(delim, type)
|
49
|
+
if delim == ";" then ";"
|
50
|
+
else type == "list" ? "" : delim
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
48
54
|
def eref_localities1_zh(target, type, from, upto, node, delim)
|
49
55
|
subsection = from&.text&.match(/\./)
|
50
|
-
ret =
|
51
|
-
";"
|
52
|
-
else
|
53
|
-
type == "list" ? "" : delim
|
54
|
-
end
|
56
|
+
ret = eref_delim(delim, type)
|
55
57
|
ret += " 第#{from.text}" if from
|
56
58
|
ret += "–#{upto.text}" if upto
|
57
59
|
loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize)
|
@@ -68,11 +70,9 @@ module IsoDoc
|
|
68
70
|
subsection = from&.text&.match(/\./)
|
69
71
|
type = type.downcase
|
70
72
|
lang == "zh" and
|
71
|
-
return l10n(eref_localities1_zh(target, type, from, upto, node,
|
72
|
-
|
73
|
-
|
74
|
-
type == "list" ? "" : delim
|
75
|
-
end
|
73
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node,
|
74
|
+
delim))
|
75
|
+
ret = eref_delim(delim, type)
|
76
76
|
ret += eref_locality_populate(type, node) unless subsection &&
|
77
77
|
type == "clause" || type == "list" ||
|
78
78
|
target.match(/^IEV$|^IEC 60050-/)
|
@@ -113,31 +113,39 @@ module IsoDoc
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def concept(docxml)
|
116
|
-
docxml.xpath(ns("//
|
116
|
+
docxml.xpath(ns("//term//concept")).each_with_object({}) do |f, m|
|
117
117
|
concept_term(f, m)
|
118
118
|
end
|
119
119
|
docxml.xpath(ns("//concept")).each do |node|
|
120
|
-
concept_render(node, node["ital"] || "false",
|
120
|
+
concept_render(node, ital: node["ital"] || "false",
|
121
|
+
ref: node["ref"] || "false",
|
122
|
+
linkref: node["linkref"] || "true",
|
123
|
+
linkmention: node["linkmention"] || "false")
|
121
124
|
end
|
122
125
|
end
|
123
126
|
|
124
127
|
def concept_term(node, seen)
|
125
128
|
term = node&.at(ns("./refterm"))&.to_xml
|
126
129
|
if term && seen[term]
|
127
|
-
concept_render(node, node["ital"] || "false",
|
128
|
-
|
130
|
+
concept_render(node, ital: node["ital"] || "false",
|
131
|
+
ref: node["ref"] || "false",
|
132
|
+
linkref: node["linkref"] || "true",
|
133
|
+
linkmention: node["linkmention"] || "false")
|
134
|
+
else concept_render(node, ital: node["ital"] || "true",
|
135
|
+
ref: node["ref"] || "true",
|
136
|
+
linkref: node["linkref"] || "true",
|
137
|
+
linkmention: node["linkmention"] || "false")
|
129
138
|
end
|
130
139
|
seen[term] = true if term
|
131
140
|
seen
|
132
141
|
end
|
133
142
|
|
134
|
-
def
|
135
|
-
if
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
r.replace("(#{r.to_xml})")
|
143
|
+
def concept1_ref_content(ref)
|
144
|
+
if ref.name == "termref"
|
145
|
+
ref.replace(@i18n.term_defined_in.sub(/%/,
|
146
|
+
ref.to_xml))
|
147
|
+
else
|
148
|
+
ref.replace("(#{ref.to_xml})")
|
141
149
|
end
|
142
150
|
end
|
143
151
|
|
@@ -160,7 +168,7 @@ module IsoDoc
|
|
160
168
|
# i = display_order_at(docxml, "//sections/definitions", i)
|
161
169
|
# i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
162
170
|
i = display_order_xpath(docxml, "//sections/clause[not(@type = 'scope')] | "\
|
163
|
-
|
171
|
+
"//sections/terms | //sections/definitions", i)
|
164
172
|
i = display_order_xpath(docxml, "//annex", i)
|
165
173
|
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
166
174
|
display_order_xpath(docxml, "//indexsect", i)
|
@@ -5,60 +5,6 @@ RSpec.describe Asciidoctor::ISO do
|
|
5
5
|
expect(Metanorma::ISO::VERSION).not_to be nil
|
6
6
|
end
|
7
7
|
|
8
|
-
it "processes a blank document" do
|
9
|
-
input = <<~INPUT
|
10
|
-
#{ASCIIDOC_BLANK_HDR}
|
11
|
-
INPUT
|
12
|
-
output = <<~OUTPUT
|
13
|
-
#{BLANK_HDR}
|
14
|
-
<sections/>
|
15
|
-
</iso-standard>
|
16
|
-
OUTPUT
|
17
|
-
expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
|
18
|
-
.to be_equivalent_to xmlpp(output)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "converts a blank document" do
|
22
|
-
input = <<~INPUT
|
23
|
-
= Document title
|
24
|
-
Author
|
25
|
-
:docfile: test.adoc
|
26
|
-
:novalid:
|
27
|
-
:no-isobib:
|
28
|
-
INPUT
|
29
|
-
output = <<~OUTPUT
|
30
|
-
#{BLANK_HDR}
|
31
|
-
<sections/>
|
32
|
-
</iso-standard>
|
33
|
-
OUTPUT
|
34
|
-
expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
|
35
|
-
.to be_equivalent_to xmlpp(output)
|
36
|
-
expect(File.exist?("test_alt.html")).to be true
|
37
|
-
expect(File.exist?("test.html")).to be true
|
38
|
-
expect(File.exist?("test.doc")).to be true
|
39
|
-
expect(File.exist?("test.pdf")).to be true
|
40
|
-
expect(File.exist?("htmlstyle.css")).to be false
|
41
|
-
end
|
42
|
-
|
43
|
-
it "converts a blank document in French" do
|
44
|
-
input = <<~INPUT
|
45
|
-
= Document title
|
46
|
-
Author
|
47
|
-
:docfile: test.adoc
|
48
|
-
:novalid:
|
49
|
-
:no-isobib:
|
50
|
-
:no-pdf:
|
51
|
-
:language: fr
|
52
|
-
INPUT
|
53
|
-
output = <<~OUTPUT
|
54
|
-
#{BLANK_HDR_FR}
|
55
|
-
<sections/>
|
56
|
-
</iso-standard>
|
57
|
-
OUTPUT
|
58
|
-
expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
|
59
|
-
.to be_equivalent_to xmlpp(output)
|
60
|
-
end
|
61
|
-
|
62
8
|
it "processes default metadata" do
|
63
9
|
output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
|
64
10
|
= Document title
|
@@ -212,6 +158,8 @@ RSpec.describe Asciidoctor::ISO do
|
|
212
158
|
:pub-fax: 4444444
|
213
159
|
:pub-email: x@example.com
|
214
160
|
:pub-uri: http://www.example.com
|
161
|
+
:docstage:
|
162
|
+
:docsubstage:
|
215
163
|
INPUT
|
216
164
|
expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
|
217
165
|
.to be_equivalent_to xmlpp(<<~"OUTPUT")
|
@@ -304,7 +252,6 @@ RSpec.describe Asciidoctor::ISO do
|
|
304
252
|
<phone type='fax'>4444444</phone>
|
305
253
|
<email>x@example.com</email>
|
306
254
|
<uri>http://www.example.com</uri>
|
307
|
-
#{' '}
|
308
255
|
</organization>
|
309
256
|
</owner>
|
310
257
|
</copyright>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Asciidoctor::ISO do
|
4
|
+
it "processes a blank document" do
|
5
|
+
input = <<~INPUT
|
6
|
+
#{ASCIIDOC_BLANK_HDR}
|
7
|
+
INPUT
|
8
|
+
output = <<~OUTPUT
|
9
|
+
#{BLANK_HDR}
|
10
|
+
<sections/>
|
11
|
+
</iso-standard>
|
12
|
+
OUTPUT
|
13
|
+
expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
|
14
|
+
.to be_equivalent_to xmlpp(output)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "converts a blank document" do
|
18
|
+
input = <<~INPUT
|
19
|
+
= Document title
|
20
|
+
Author
|
21
|
+
:docfile: test.adoc
|
22
|
+
:novalid:
|
23
|
+
:no-isobib:
|
24
|
+
INPUT
|
25
|
+
output = <<~OUTPUT
|
26
|
+
#{BLANK_HDR}
|
27
|
+
<sections/>
|
28
|
+
</iso-standard>
|
29
|
+
OUTPUT
|
30
|
+
expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
|
31
|
+
.to be_equivalent_to xmlpp(output)
|
32
|
+
expect(File.exist?("test_alt.html")).to be true
|
33
|
+
expect(File.exist?("test.html")).to be true
|
34
|
+
expect(File.exist?("test.doc")).to be true
|
35
|
+
expect(File.exist?("test.pdf")).to be true
|
36
|
+
expect(File.exist?("htmlstyle.css")).to be false
|
37
|
+
end
|
38
|
+
end
|
@@ -586,4 +586,43 @@ RSpec.describe Asciidoctor::ISO do
|
|
586
586
|
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
587
587
|
.to be_equivalent_to xmlpp(output)
|
588
588
|
end
|
589
|
+
|
590
|
+
it "processes nested terms" do
|
591
|
+
input = <<~INPUT
|
592
|
+
#{ASCIIDOC_BLANK_HDR}
|
593
|
+
== Terms and Definitions
|
594
|
+
|
595
|
+
[.term]
|
596
|
+
=== Term1
|
597
|
+
|
598
|
+
definition
|
599
|
+
|
600
|
+
==== Term11
|
601
|
+
definition2
|
602
|
+
INPUT
|
603
|
+
output = <<~OUTPUT
|
604
|
+
#{BLANK_HDR}
|
605
|
+
<sections>
|
606
|
+
<terms id='_' obligation='normative'>
|
607
|
+
<title>Terms and definitions</title>
|
608
|
+
#{TERM_BOILERPLATE}
|
609
|
+
<term id='term-term1'>
|
610
|
+
<preferred>Term1</preferred>
|
611
|
+
<definition>
|
612
|
+
<p id='_'>definition</p>
|
613
|
+
</definition>
|
614
|
+
<term id='term-term11'>
|
615
|
+
<preferred>Term11</preferred>
|
616
|
+
<definition>
|
617
|
+
<p id='_'>definition2</p>
|
618
|
+
</definition>
|
619
|
+
</term>
|
620
|
+
</term>
|
621
|
+
</terms>
|
622
|
+
</sections>
|
623
|
+
</iso-standard>
|
624
|
+
OUTPUT
|
625
|
+
expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
|
626
|
+
.to be_equivalent_to xmlpp(output)
|
627
|
+
end
|
589
628
|
end
|
@@ -26,7 +26,7 @@ RSpec.describe Asciidoctor::ISO do
|
|
26
26
|
<title>Clause</title>
|
27
27
|
<p id="_">
|
28
28
|
<eref bibitemid="iso123" citeas="ISO 123:--" type="inline"/>
|
29
|
-
<fn reference="1">The standard is in press</fn>
|
29
|
+
<fn reference="1"><p id="_">The standard is in press</p></fn>
|
30
30
|
<eref bibitemid="iso123" citeas="ISO 123:--" type="inline"/>A.
|
31
31
|
<fn reference="2">
|
32
32
|
<p id="_">a footnote</p></fn>
|