metanorma-iso 2.0.3 → 2.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/isodoc/iso/html/header.html +42 -33
- data/lib/isodoc/iso/html/html_iso_titlepage.html +1 -1
- data/lib/isodoc/iso/html/isodoc.css +9 -7
- data/lib/isodoc/iso/html/isodoc.scss +7 -5
- data/lib/isodoc/iso/html/style-human.css +0 -1
- data/lib/isodoc/iso/html/style-human.scss +0 -1
- data/lib/isodoc/iso/html/style-iso.css +0 -1
- data/lib/isodoc/iso/html/style-iso.scss +0 -1
- data/lib/isodoc/iso/html/word_iso_titlepage.html +12 -11
- data/lib/isodoc/iso/html/wordstyle.css +46 -19
- data/lib/isodoc/iso/html/wordstyle.scss +52 -25
- data/lib/isodoc/iso/i18n-en.yaml +29 -2
- data/lib/isodoc/iso/i18n-fr.yaml +27 -3
- data/lib/isodoc/iso/i18n-ru.yaml +45 -0
- data/lib/isodoc/iso/i18n-zh-Hans.yaml +27 -3
- data/lib/isodoc/iso/i18n.rb +1 -0
- data/lib/isodoc/iso/init.rb +1 -2
- data/lib/isodoc/iso/iso.amendment.xsl +1204 -615
- data/lib/isodoc/iso/iso.international-standard.xsl +1204 -615
- data/lib/isodoc/iso/metadata.rb +12 -2
- data/lib/isodoc/iso/presentation_xml_convert.rb +58 -21
- data/lib/metanorma/iso/boilerplate-fr.xml +6 -7
- data/lib/metanorma/iso/boilerplate-ru.xml +37 -0
- data/lib/metanorma/iso/boilerplate.xml +6 -7
- data/lib/metanorma/iso/cleanup.rb +48 -11
- data/lib/metanorma/iso/front.rb +1 -1
- data/lib/metanorma/iso/front_id.rb +2 -0
- data/lib/metanorma/iso/isodoc.rng +73 -3
- data/lib/metanorma/iso/processor.rb +14 -7
- data/lib/metanorma/iso/validate.rb +30 -2
- data/lib/metanorma/iso/validate_image.rb +3 -3
- data/lib/metanorma/iso/validate_list.rb +122 -0
- data/lib/metanorma/iso/validate_section.rb +39 -32
- data/lib/metanorma/iso/validate_style.rb +32 -2
- data/lib/metanorma/iso/validate_title.rb +13 -1
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +1 -1
- data/spec/isodoc/amd_spec.rb +10 -5
- data/spec/isodoc/i18n_spec.rb +350 -9
- data/spec/isodoc/inline_spec.rb +127 -10
- data/spec/isodoc/metadata_spec.rb +153 -3
- data/spec/isodoc/postproc_spec.rb +3 -4
- data/spec/isodoc/section_spec.rb +1 -0
- data/spec/isodoc/terms_spec.rb +4 -4
- data/spec/metanorma/base_spec.rb +434 -326
- data/spec/metanorma/cleanup_spec.rb +11 -11
- data/spec/metanorma/refs_spec.rb +273 -61
- data/spec/metanorma/section_spec.rb +18 -26
- data/spec/metanorma/validate_spec.rb +448 -17
- data/spec/spec_helper.rb +6 -4
- data/spec/vcr_cassettes/docrels.yml +393 -0
- data/spec/vcr_cassettes/withdrawn_iso.yml +301 -0
- metadata +10 -5
data/lib/isodoc/iso/metadata.rb
CHANGED
@@ -72,12 +72,14 @@ module IsoDoc
|
|
72
72
|
case lang
|
73
73
|
when "en" then "Part"
|
74
74
|
when "fr" then "Partie"
|
75
|
+
when "ru" then "Часть"
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
78
79
|
def amd_label(lang)
|
79
80
|
case lang
|
80
81
|
when "en", "fr" then "AMENDMENT"
|
82
|
+
when "ru" then "ПОПРАВКА"
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
@@ -85,6 +87,7 @@ module IsoDoc
|
|
85
87
|
case lang
|
86
88
|
when "en" then "TECHNICAL CORRIGENDUM"
|
87
89
|
when "fr" then "RECTIFICATIF TECHNIQUE"
|
90
|
+
when "ru" then "ТЕХНИЧЕСКОЕ ИСПРАВЛЕНИЕ"
|
88
91
|
end
|
89
92
|
end
|
90
93
|
|
@@ -140,7 +143,11 @@ module IsoDoc
|
|
140
143
|
end
|
141
144
|
|
142
145
|
def title(isoxml, _out)
|
143
|
-
lang = @lang
|
146
|
+
lang = case @lang
|
147
|
+
when "fr" then "fr"
|
148
|
+
when "ru" then "ru"
|
149
|
+
else "en"
|
150
|
+
end
|
144
151
|
intro, main, part, amd = title_parts(isoxml, lang)
|
145
152
|
partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
|
146
153
|
|
@@ -159,7 +166,10 @@ module IsoDoc
|
|
159
166
|
end
|
160
167
|
|
161
168
|
def subtitle(isoxml, _out)
|
162
|
-
lang = @lang
|
169
|
+
lang = case @lang
|
170
|
+
when "fr", "ru" then "en"
|
171
|
+
else "fr"
|
172
|
+
end
|
163
173
|
intro, main, part, amd = title_parts(isoxml, lang)
|
164
174
|
partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
|
165
175
|
|
@@ -47,37 +47,74 @@ module IsoDoc
|
|
47
47
|
|
48
48
|
def eref_delim(delim, type)
|
49
49
|
if delim == ";" then ";"
|
50
|
-
else type == "list" ? "" : delim
|
50
|
+
else type == "list" ? " " : delim
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
54
|
+
def can_conflate_eref_rendering?(refs)
|
55
|
+
super or return false
|
56
|
+
|
57
|
+
first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
|
58
|
+
refs.first.at(ns("./locality/referenceFrom"))&.text)
|
59
|
+
refs.all? do |r|
|
60
|
+
subclause?(nil, r.at(ns("./locality/@type"))&.text,
|
61
|
+
r.at(ns("./locality/referenceFrom"))&.text) == first
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def locality_delimiter(loc)
|
66
|
+
loc&.next_element&.attribute("type")&.text == "list" and return " "
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
def eref_localities_conflated(refs, target, node)
|
71
|
+
droploc = node["droploc"]
|
72
|
+
node["droploc"] = true
|
73
|
+
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
74
|
+
node))
|
75
|
+
node["droploc"] = droploc
|
76
|
+
eref_localities1(target,
|
77
|
+
prefix_clause(target, refs.first.at(ns("./locality"))),
|
78
|
+
l10n(ret[1..-1].join), nil, node, @lang)
|
79
|
+
end
|
80
|
+
|
81
|
+
def prefix_clause(target, loc)
|
82
|
+
loc["type"] == "clause" or return loc["type"]
|
83
|
+
|
84
|
+
if subclause?(target, loc["type"], loc&.at(ns("./referenceFrom"))&.text)
|
85
|
+
""
|
86
|
+
else
|
87
|
+
"clause"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def subclause?(target, type, from)
|
92
|
+
(from&.match?(/\./) && type == "clause") ||
|
93
|
+
type == "list" || target&.match(/^IEV$|^IEC 60050-/)
|
94
|
+
end
|
95
|
+
|
96
|
+
def eref_localities1_zh(target, type, from, upto, node)
|
97
|
+
ret = " 第#{from}" if from
|
98
|
+
ret += "–#{upto}" if upto
|
99
|
+
if node["droploc"] != "true" && !subclause?(target, type, from)
|
100
|
+
ret += eref_locality_populate(type, node)
|
101
|
+
end
|
63
102
|
ret += ")" if type == "list"
|
64
103
|
ret
|
65
104
|
end
|
66
105
|
|
67
|
-
def eref_localities1(target, type, from, upto,
|
68
|
-
return
|
106
|
+
def eref_localities1(target, type, from, upto, node, lang = "en")
|
107
|
+
return nil if type == "anchor"
|
69
108
|
|
70
|
-
subsection = from&.text&.match(/\./)
|
71
109
|
type = type.downcase
|
72
110
|
lang == "zh" and
|
73
|
-
return l10n(eref_localities1_zh(target, type, from, upto, node
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
ret += "
|
80
|
-
ret += "–#{upto.text}" if upto
|
111
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
112
|
+
ret = if node["droploc"] != "true" && !subclause?(target, type, from)
|
113
|
+
eref_locality_populate(type, node)
|
114
|
+
else ""
|
115
|
+
end
|
116
|
+
ret += " #{from}" if from
|
117
|
+
ret += "–#{upto}" if upto
|
81
118
|
ret += ")" if type == "list"
|
82
119
|
l10n(ret)
|
83
120
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<boilerplate>
|
2
2
|
<copyright-statement>
|
3
3
|
<clause>
|
4
|
-
|
5
|
-
<p id="boilerplate-year">© {{ agency }} {{ docyear }}</p>
|
4
|
+
<p id="boilerplate-year">© {{ agency }} {{ docyear }}</p>
|
6
5
|
|
7
6
|
<p id="boilerplate-message">
|
8
|
-
Droits de reproduction réservés. Sauf indication contraire,
|
7
|
+
Droits de reproduction réservés. Sauf indication contraire, ou requise dans le cadre de sa mise en œuvre,
|
8
|
+
aucune partie de cette publication ne
|
9
9
|
peut être reproduite ni utilisée sous quelque forme que ce soit et par aucun procédé, électronique
|
10
10
|
ou mécanique, y compris la photocopie, l’affichage sur l’internet ou sur un Intranet, sans
|
11
11
|
autorisation écrite préalable. Les demandes d’autorisation peuvent être adressées à l’ISO à
|
@@ -14,10 +14,9 @@ l’adresse ci-après ou au comité membre de l’ISO dans le pays du demandeur.
|
|
14
14
|
|
15
15
|
<p id="boilerplate-address" align="left">
|
16
16
|
ISO copyright office<br/>
|
17
|
-
Ch. de Blandonnet 8
|
18
|
-
CH-1214 Vernier, Geneva
|
19
|
-
|
20
|
-
Fax + 41 22 749 09 47<br/>
|
17
|
+
CP 401 • Ch. de Blandonnet 8<br/>
|
18
|
+
CH-1214 Vernier, Geneva<br/>
|
19
|
+
Tél.  + 41 22 749 01 11<br/>
|
21
20
|
Email: copyright@iso.org<br/>
|
22
21
|
Website: www.iso.org
|
23
22
|
</p>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<boilerplate>
|
2
|
+
<copyright-statement>
|
3
|
+
<clause>
|
4
|
+
<p id="boilerplate-year">
|
5
|
+
© {{ agency }} {{ docyear }}
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p id="boilerplate-message">
|
9
|
+
Все права защищены. Если иначе не определено или не требуется в контексте его реализации, никакая часть этой публикации не может быть воспроизведена или использована иначе в любой форме или каким-либо образом, электронным или механическим, включая фотокопирование, или публикацию в Интернете или интранете, без предварительного письменного разрешения. Разрешение может быть запрошено ISO по адресу, указанному ниже, или у органа — члена ISO страны запрашивающего.
|
10
|
+
</p>
|
11
|
+
|
12
|
+
<p id="boilerplate-address" align="left">
|
13
|
+
Бюро ISO по охране авторских прав<br/>
|
14
|
+
CP 401 • Ch. de Blandonnet 8<br/>
|
15
|
+
CH-1214 Vernier, Geneva<br/>
|
16
|
+
Тел.  + 41 22 749 01 11<br/>
|
17
|
+
Электронная почта: copyright@iso.org<br/>
|
18
|
+
Сайт: www.iso.org
|
19
|
+
</p>
|
20
|
+
<p id="boilerplate-place">
|
21
|
+
Издано в Швейцарии
|
22
|
+
</p>
|
23
|
+
</clause>
|
24
|
+
</copyright-statement>
|
25
|
+
|
26
|
+
{% if unpublished %}
|
27
|
+
<license-statement>
|
28
|
+
<clause>
|
29
|
+
<title>Предупреждение для WD и CD</title>
|
30
|
+
|
31
|
+
<p>Этот документ не является международным стандартом ISO. Распространяется для ознакомления и комментариев. Оно может быть изменено без предварительного уведомления и не может упоминаться как международный стандарт.</p>
|
32
|
+
|
33
|
+
<p>Получателям этого проекта предлагается представить вместе со своими комментариями уведомление о любых соответствующих патентных правах, о которых им известно, и предоставить подтверждающую документацию.</p>
|
34
|
+
</clause>
|
35
|
+
</license-statement>
|
36
|
+
{% endif %}
|
37
|
+
</boilerplate>
|
@@ -1,14 +1,14 @@
|
|
1
1
|
<boilerplate>
|
2
2
|
<copyright-statement>
|
3
3
|
<clause>
|
4
|
-
<title>COPYRIGHT PROTECTED DOCUMENT</title>
|
5
4
|
<p id="boilerplate-year">
|
6
|
-
|
5
|
+
© {{ agency }} {{ docyear }}
|
7
6
|
</p>
|
8
7
|
|
9
8
|
<p id="boilerplate-message">
|
10
9
|
All rights
|
11
|
-
reserved. Unless otherwise specified,
|
10
|
+
reserved. Unless otherwise specified, or required in the context of its implementation,
|
11
|
+
no part of this publication may be
|
12
12
|
reproduced or utilized otherwise in any form or by any means, electronic or
|
13
13
|
mechanical, including photocopying, or posting on the internet or an intranet,
|
14
14
|
without prior written permission. Permission can be requested from either ISO
|
@@ -17,10 +17,9 @@ at the address below or ISO's member body in the country of the requester.
|
|
17
17
|
|
18
18
|
<p id="boilerplate-address" align="left">
|
19
19
|
ISO copyright office<br/>
|
20
|
-
Ch. de Blandonnet 8
|
21
|
-
CH-1214 Vernier, Geneva
|
22
|
-
|
23
|
-
Fax + 41 22 749 09 47<br/>
|
20
|
+
CP 401 • Ch. de Blandonnet 8<br/>
|
21
|
+
CH-1214 Vernier, Geneva<br/>
|
22
|
+
Phone:  + 41 22 749 01 11<br/>
|
24
23
|
Email: copyright@iso.org<br/>
|
25
24
|
Website: www.iso.org
|
26
25
|
</p>
|
@@ -37,13 +37,11 @@ module Metanorma
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def get_id_prefix(xmldoc)
|
40
|
-
prefix = []
|
41
40
|
xmldoc.xpath("//bibdata/contributor[role/@type = 'publisher']"\
|
42
|
-
"/organization").
|
41
|
+
"/organization").each_with_object([]) do |x, prefix|
|
43
42
|
x1 = x.at("abbreviation")&.text || x.at("name")&.text
|
44
43
|
(x1 == "ISO" and prefix.unshift("ISO")) or prefix << x1
|
45
44
|
end
|
46
|
-
prefix
|
47
45
|
end
|
48
46
|
|
49
47
|
# ISO as a prefix goes first
|
@@ -125,7 +123,11 @@ module Metanorma
|
|
125
123
|
end
|
126
124
|
|
127
125
|
def boilerplate_file(_xmldoc)
|
128
|
-
file = @lang
|
126
|
+
file = case @lang
|
127
|
+
when "fr" then "boilerplate-fr.xml"
|
128
|
+
when "ru" then "boilerplate-ru.xml"
|
129
|
+
else "boilerplate.xml"
|
130
|
+
end
|
129
131
|
File.join(@libdir, file)
|
130
132
|
end
|
131
133
|
|
@@ -136,8 +138,7 @@ module Metanorma
|
|
136
138
|
|
137
139
|
def unpub_footnotes(xmldoc)
|
138
140
|
xmldoc.xpath("//bibitem/note[@type = 'Unpublished-Status']").each do |n|
|
139
|
-
|
140
|
-
e = xmldoc.at("//eref[@bibitemid = '#{id}']") or next
|
141
|
+
e = xmldoc.at("//eref[@bibitemid = '#{n.parent['id']}']") or next
|
141
142
|
fn = n.children.to_xml
|
142
143
|
n&.elements&.first&.name == "p" or fn = "<p>#{fn}</p>"
|
143
144
|
e.next = "<fn>#{fn}</fn>"
|
@@ -147,21 +148,52 @@ module Metanorma
|
|
147
148
|
def bibitem_cleanup(xmldoc)
|
148
149
|
super
|
149
150
|
unpublished_note(xmldoc)
|
151
|
+
withdrawn_note(xmldoc)
|
150
152
|
end
|
151
153
|
|
152
154
|
def unpublished_note(xmldoc)
|
153
|
-
xmldoc.xpath("//bibitem[not(
|
154
|
-
|
155
|
+
xmldoc.xpath("//bibitem[not(./ancestor::bibitem)]"\
|
156
|
+
"[not(note[@type = 'Unpublished-Status'])]").each do |b|
|
155
157
|
next if pub_class(b) > 2
|
156
158
|
next unless (s = b.at("./status/stage")) && (s.text.to_i < 60)
|
157
159
|
|
158
160
|
id = b.at("docidentifier").text
|
159
|
-
b.
|
160
|
-
.previous = %(<note type="Unpublished-Status">
|
161
|
-
<p>#{@i18n.under_preparation.sub(/%/, id)}</p></note>)
|
161
|
+
insert_unpub_note(b, @i18n.under_preparation.sub(/%/, id))
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
165
|
+
def withdrawn_note(xmldoc)
|
166
|
+
xmldoc.xpath("//bibitem[not(note[@type = 'Unpublished-Status'])]")
|
167
|
+
.each do |b|
|
168
|
+
next unless withdrawn_ref?(b)
|
169
|
+
|
170
|
+
if id = replacement_standard(b)
|
171
|
+
insert_unpub_note(b, @i18n.cancelled_and_replaced.sub(/%/, id))
|
172
|
+
else
|
173
|
+
insert_unpub_note(b, @i18n.withdrawn)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def withdrawn_ref?(biblio)
|
179
|
+
return false if pub_class(biblio) > 2
|
180
|
+
|
181
|
+
(s = biblio.at("./status/stage")) && (s.text.to_i == 95) &&
|
182
|
+
(t = biblio.at("./status/substage")) && (t.text.to_i == 99)
|
183
|
+
end
|
184
|
+
|
185
|
+
def replacement_standard(biblio)
|
186
|
+
r = biblio.at("./relation[@type = 'updates']/bibitem") or return nil
|
187
|
+
id = r.at("./formattedref | ./docidentifier[@primary = 'true'] | "\
|
188
|
+
"./docidentifier | ./formattedref") or return nil
|
189
|
+
id.text
|
190
|
+
end
|
191
|
+
|
192
|
+
def insert_unpub_note(biblio, msg)
|
193
|
+
biblio.at("./language | ./script | ./abstract | ./status")
|
194
|
+
.previous = %(<note type="Unpublished-Status"><p>#{msg}</p></note>)
|
195
|
+
end
|
196
|
+
|
165
197
|
def termdef_boilerplate_insert(xmldoc, isodoc, once = false)
|
166
198
|
once = true
|
167
199
|
super
|
@@ -171,6 +203,11 @@ module Metanorma
|
|
171
203
|
@vocab and src.empty? and return
|
172
204
|
super
|
173
205
|
end
|
206
|
+
|
207
|
+
def section_names_terms_cleanup(xml)
|
208
|
+
@vocab and return
|
209
|
+
super
|
210
|
+
end
|
174
211
|
end
|
175
212
|
end
|
176
213
|
end
|
data/lib/metanorma/iso/front.rb
CHANGED
@@ -39,6 +39,7 @@ module Metanorma
|
|
39
39
|
ret = STAGE_ABBRS[stage.to_sym]
|
40
40
|
ret = "PRF" if stage == "60" && substage == "00"
|
41
41
|
ret = "AWI" if stage == "10" && substage == "99"
|
42
|
+
ret = "AWI" if stage == "20" && substage == "00"
|
42
43
|
if %w(amendment technical-corrigendum technical-report
|
43
44
|
technical-specification).include?(doctype)
|
44
45
|
ret = "D" if stage == "40" && doctype == "amendment"
|
@@ -106,6 +107,7 @@ module Metanorma
|
|
106
107
|
suffix = case lang
|
107
108
|
when "en" then "(E)"
|
108
109
|
when "fr" then "(F)"
|
110
|
+
when "ru" then "(R)"
|
109
111
|
else
|
110
112
|
"(X)"
|
111
113
|
end
|
@@ -152,9 +152,7 @@
|
|
152
152
|
<data type="boolean"/>
|
153
153
|
</attribute>
|
154
154
|
</optional>
|
155
|
-
<
|
156
|
-
<ref name="PureTextElement"/>
|
157
|
-
</oneOrMore>
|
155
|
+
<ref name="XrefBody"/>
|
158
156
|
</element>
|
159
157
|
</define>
|
160
158
|
<define name="erefType">
|
@@ -188,6 +186,42 @@
|
|
188
186
|
<ref name="PureTextElement"/>
|
189
187
|
</oneOrMore>
|
190
188
|
</define>
|
189
|
+
<define name="localityStack">
|
190
|
+
<element name="localityStack">
|
191
|
+
<optional>
|
192
|
+
<attribute name="connective">
|
193
|
+
<choice>
|
194
|
+
<value>and</value>
|
195
|
+
<value>or</value>
|
196
|
+
<value>from</value>
|
197
|
+
<value>to</value>
|
198
|
+
<value/>
|
199
|
+
</choice>
|
200
|
+
</attribute>
|
201
|
+
</optional>
|
202
|
+
<zeroOrMore>
|
203
|
+
<ref name="locality"/>
|
204
|
+
</zeroOrMore>
|
205
|
+
</element>
|
206
|
+
</define>
|
207
|
+
<define name="sourceLocalityStack">
|
208
|
+
<element name="sourceLocalityStack">
|
209
|
+
<optional>
|
210
|
+
<attribute name="connective">
|
211
|
+
<choice>
|
212
|
+
<value>and</value>
|
213
|
+
<value>or</value>
|
214
|
+
<value>from</value>
|
215
|
+
<value>to</value>
|
216
|
+
<value/>
|
217
|
+
</choice>
|
218
|
+
</attribute>
|
219
|
+
</optional>
|
220
|
+
<zeroOrMore>
|
221
|
+
<ref name="sourceLocality"/>
|
222
|
+
</zeroOrMore>
|
223
|
+
</element>
|
224
|
+
</define>
|
191
225
|
<define name="ul">
|
192
226
|
<element name="ul">
|
193
227
|
<attribute name="id">
|
@@ -1098,6 +1132,16 @@
|
|
1098
1132
|
</define>
|
1099
1133
|
</include>
|
1100
1134
|
<!-- end overrides -->
|
1135
|
+
<define name="image" combine="choice">
|
1136
|
+
<element name="svg">
|
1137
|
+
<oneOrMore>
|
1138
|
+
<choice>
|
1139
|
+
<text/>
|
1140
|
+
<ref name="AnyElement"/>
|
1141
|
+
</choice>
|
1142
|
+
</oneOrMore>
|
1143
|
+
</element>
|
1144
|
+
</define>
|
1101
1145
|
<define name="MultilingualRenderingType">
|
1102
1146
|
<choice>
|
1103
1147
|
<value>common</value>
|
@@ -2631,4 +2675,30 @@
|
|
2631
2675
|
</zeroOrMore>
|
2632
2676
|
</element>
|
2633
2677
|
</define>
|
2678
|
+
<define name="XrefBody">
|
2679
|
+
<zeroOrMore>
|
2680
|
+
<ref name="XrefTarget"/>
|
2681
|
+
</zeroOrMore>
|
2682
|
+
<oneOrMore>
|
2683
|
+
<ref name="PureTextElement"/>
|
2684
|
+
</oneOrMore>
|
2685
|
+
</define>
|
2686
|
+
<define name="XrefTarget">
|
2687
|
+
<element name="location">
|
2688
|
+
<attribute name="target">
|
2689
|
+
<data type="string">
|
2690
|
+
<param name="pattern">\i\c*|\c+#\c+</param>
|
2691
|
+
</data>
|
2692
|
+
</attribute>
|
2693
|
+
<attribute name="connective">
|
2694
|
+
<choice>
|
2695
|
+
<value>and</value>
|
2696
|
+
<value>or</value>
|
2697
|
+
<value>from</value>
|
2698
|
+
<value>to</value>
|
2699
|
+
<value/>
|
2700
|
+
</choice>
|
2701
|
+
</attribute>
|
2702
|
+
</element>
|
2703
|
+
</define>
|
2634
2704
|
</grammar>
|
@@ -45,19 +45,26 @@ module Metanorma
|
|
45
45
|
def output(isodoc_node, inname, outname, format, options={})
|
46
46
|
case format
|
47
47
|
when :html
|
48
|
-
IsoDoc::Iso::HtmlConvert.new(options)
|
48
|
+
IsoDoc::Iso::HtmlConvert.new(options)
|
49
|
+
.convert(inname, isodoc_node, nil, outname)
|
49
50
|
when :html_alt
|
50
|
-
IsoDoc::Iso::HtmlConvert.new(options.merge(alt: true))
|
51
|
+
IsoDoc::Iso::HtmlConvert.new(options.merge(alt: true))
|
52
|
+
.convert(inname, isodoc_node, nil, outname)
|
51
53
|
when :doc
|
52
|
-
IsoDoc::Iso::WordConvert.new(options)
|
54
|
+
IsoDoc::Iso::WordConvert.new(options)
|
55
|
+
.convert(inname, isodoc_node, nil, outname)
|
53
56
|
when :pdf
|
54
|
-
IsoDoc::Iso::PdfConvert.new(options)
|
57
|
+
IsoDoc::Iso::PdfConvert.new(options)
|
58
|
+
.convert(inname, isodoc_node, nil, outname)
|
55
59
|
when :sts
|
56
|
-
IsoDoc::Iso::StsConvert.new(options)
|
60
|
+
IsoDoc::Iso::StsConvert.new(options)
|
61
|
+
.convert(inname, isodoc_node, nil, outname)
|
57
62
|
when :isosts
|
58
|
-
IsoDoc::Iso::IsoStsConvert.new(options)
|
63
|
+
IsoDoc::Iso::IsoStsConvert.new(options)
|
64
|
+
.convert(inname, isodoc_node, nil, outname)
|
59
65
|
when :presentation
|
60
|
-
IsoDoc::Iso::PresentationXMLConvert.new(options)
|
66
|
+
IsoDoc::Iso::PresentationXMLConvert.new(options)
|
67
|
+
.convert(inname, isodoc_node, nil, outname)
|
61
68
|
else
|
62
69
|
super
|
63
70
|
end
|
@@ -4,6 +4,7 @@ require_relative "./validate_requirements"
|
|
4
4
|
require_relative "./validate_section"
|
5
5
|
require_relative "./validate_title"
|
6
6
|
require_relative "./validate_image"
|
7
|
+
require_relative "./validate_list"
|
7
8
|
require "nokogiri"
|
8
9
|
require "jing"
|
9
10
|
require "iev"
|
@@ -35,7 +36,7 @@ module Metanorma
|
|
35
36
|
/\b(see| refer to)\s*\Z/mi.match(preceding)
|
36
37
|
|
37
38
|
(target = root.at("//*[@id = '#{t['target']}']")) || next
|
38
|
-
if target
|
39
|
+
if target.at("./ancestor-or-self::*[@obligation = 'normative']")
|
39
40
|
@log.add("Style", t,
|
40
41
|
"'see #{t['target']}' is pointing to a normative section")
|
41
42
|
end
|
@@ -75,6 +76,30 @@ module Metanorma
|
|
75
76
|
regex.match(text) && @log.add("Style", elem, "#{term}: #{msg}")
|
76
77
|
end
|
77
78
|
|
79
|
+
# https://www.iso.org/ISO-house-style.html#iso-hs-s-text-r-r-ref_clause3
|
80
|
+
def term_xrefs_validate(xmldoc)
|
81
|
+
termids = xmldoc
|
82
|
+
.xpath("//sections/terms | //sections/clause[.//terms] | "\
|
83
|
+
"//annex[.//terms]").each_with_object({}) do |t, m|
|
84
|
+
t.xpath(".//*/@id").each { |a| m[a.text] = true }
|
85
|
+
t.name == "terms" and m[t["id"]] = true
|
86
|
+
end
|
87
|
+
xmldoc.xpath(".//xref").each do |x|
|
88
|
+
term_xrefs_validate1(x, termids)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def term_xrefs_validate1(xref, termids)
|
93
|
+
(termids[xref["target"]] && !termids[xref.parent["id"]]) and
|
94
|
+
@log.add("Style", xref,
|
95
|
+
"only terms clauses can cross-reference terms clause "\
|
96
|
+
"(#{xref['target']})")
|
97
|
+
(!termids[xref["target"]] && termids[xref.parent["id"]]) and
|
98
|
+
@log.add("Style", xref,
|
99
|
+
"non-terms clauses cannot cross-reference terms clause "\
|
100
|
+
"(#{xref['target']})")
|
101
|
+
end
|
102
|
+
|
78
103
|
# ISO/IEC DIR 2, 16.5.6
|
79
104
|
def termdef_style(xmldoc)
|
80
105
|
xmldoc.xpath("//term").each do |t|
|
@@ -98,7 +123,7 @@ module Metanorma
|
|
98
123
|
|
99
124
|
def script_validate(xmldoc)
|
100
125
|
script = xmldoc&.at("//bibdata/script")&.text
|
101
|
-
|
126
|
+
%w(Cyrl Latn).include?(script) or
|
102
127
|
@log.add("Document Attributes", nil,
|
103
128
|
"#{script} is not a recognised script")
|
104
129
|
end
|
@@ -139,11 +164,14 @@ module Metanorma
|
|
139
164
|
onlychild_clause_validate(doc.root)
|
140
165
|
termdef_style(doc.root)
|
141
166
|
see_xrefs_validate(doc.root)
|
167
|
+
term_xrefs_validate(doc.root)
|
142
168
|
see_erefs_validate(doc.root)
|
143
169
|
locality_erefs_validate(doc.root)
|
144
170
|
bibdata_validate(doc.root)
|
145
171
|
bibitem_validate(doc.root)
|
146
172
|
figure_validate(doc.root)
|
173
|
+
listcount_validate(doc)
|
174
|
+
list_punctuation(doc)
|
147
175
|
end
|
148
176
|
|
149
177
|
def bibitem_validate(xmldoc)
|
@@ -78,9 +78,9 @@ module Metanorma
|
|
78
78
|
xmldoc.xpath("//image").each do |i|
|
79
79
|
next if i["src"].start_with?("data:")
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
81
|
+
case File.basename(i["src"])
|
82
|
+
when /^ISO_\d+_/
|
83
|
+
when /^(SL)?#{prefix}fig/ then image_name_validate1(i, prefix)
|
84
84
|
else
|
85
85
|
@log.add("Style", i,
|
86
86
|
"image name #{i['src']} does not match DRG requirements: expect #{prefix}fig")
|