metanorma-iso 2.4.0 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/isodoc/iso/base_convert.rb +9 -3
- data/lib/isodoc/iso/i18n-ja.yaml +39 -0
- data/lib/isodoc/iso/i18n.rb +6 -1
- data/lib/isodoc/iso/iso.amendment.xsl +356 -17
- data/lib/isodoc/iso/iso.international-standard.xsl +356 -17
- data/lib/isodoc/iso/metadata.rb +3 -3
- data/lib/isodoc/iso/presentation_xml_convert.rb +1 -0
- data/lib/isodoc/iso/word_cleanup.rb +1 -1
- data/lib/isodoc/iso/word_convert.rb +8 -3
- data/lib/metanorma/iso/isodoc.rng +29 -7
- data/lib/metanorma/iso/validate.rb +5 -4
- data/lib/metanorma/iso/validate_list.rb +3 -1
- data/lib/metanorma/iso/validate_requirements.rb +1 -0
- data/lib/metanorma/iso/validate_section.rb +12 -12
- data/lib/metanorma/iso/validate_style.rb +8 -8
- data/lib/metanorma/iso/validate_title.rb +5 -4
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +2 -2
- metadata +7 -6
data/lib/isodoc/iso/metadata.rb
CHANGED
@@ -84,15 +84,15 @@ module IsoDoc
|
|
84
84
|
p = titlenums[:part]
|
85
85
|
titlenums[:part] && titlenums[:subpart] and
|
86
86
|
p = "#{titlenums[:part]}–#{titlenums[:subpart]}"
|
87
|
-
"#{PART_LABEL[lang.to_sym]} #{p}"
|
87
|
+
"#{self.class::PART_LABEL[lang.to_sym]} #{p}"
|
88
88
|
end
|
89
89
|
|
90
90
|
def amd_prefix(titlenums, lang)
|
91
|
-
"#{AMD_LABEL[lang.to_sym]} #{titlenums[:amd]}"
|
91
|
+
"#{self.class::AMD_LABEL[lang.to_sym]} #{titlenums[:amd]}"
|
92
92
|
end
|
93
93
|
|
94
94
|
def corr_prefix(titlenums, lang)
|
95
|
-
"#{CORR_LABEL[lang.to_sym]} #{titlenums[:corr]}"
|
95
|
+
"#{self.class::CORR_LABEL[lang.to_sym]} #{titlenums[:corr]}"
|
96
96
|
end
|
97
97
|
|
98
98
|
def compose_title(tparts, tnums, lang)
|
@@ -86,7 +86,7 @@ module IsoDoc
|
|
86
86
|
}.freeze
|
87
87
|
|
88
88
|
def new_styles(docxml)
|
89
|
-
STYLESMAP.each do |k, v|
|
89
|
+
self.class::STYLESMAP.each do |k, v|
|
90
90
|
docxml.xpath("//*[@class = '#{k}']").each { |s| s["class"] = v }
|
91
91
|
end
|
92
92
|
docxml.xpath("//div[@class = 'Section3']//p[@class = 'Tabletitle']")
|
@@ -231,14 +231,19 @@ module IsoDoc
|
|
231
231
|
out.div align: "center", class: "table_container" do |div|
|
232
232
|
div.table **table_attrs(node) do |t|
|
233
233
|
table_parse_core(node, t)
|
234
|
-
(
|
235
|
-
node.xpath(ns("./note[not(@type = 'units')]"))
|
236
|
-
.each { |n| parse(n, div) }
|
234
|
+
table_parse_tail(node, t)
|
237
235
|
end
|
238
236
|
end
|
239
237
|
@in_table = false
|
240
238
|
end
|
241
239
|
|
240
|
+
def table_parse_tail(node, out)
|
241
|
+
(dl = node.at(ns("./dl"))) && parse(dl, out)
|
242
|
+
node.xpath(ns("./source")).each { |n| parse(n, out) }
|
243
|
+
node.xpath(ns("./note[not(@type = 'units')]"))
|
244
|
+
.each { |n| parse(n, out) }
|
245
|
+
end
|
246
|
+
|
242
247
|
include BaseConvert
|
243
248
|
include Init
|
244
249
|
end
|
@@ -382,6 +382,9 @@
|
|
382
382
|
<optional>
|
383
383
|
<ref name="dl"/>
|
384
384
|
</optional>
|
385
|
+
<optional>
|
386
|
+
<ref name="source"/>
|
387
|
+
</optional>
|
385
388
|
</element>
|
386
389
|
</define>
|
387
390
|
<define name="figure">
|
@@ -404,9 +407,6 @@
|
|
404
407
|
<attribute name="class"/>
|
405
408
|
</optional>
|
406
409
|
<ref name="BlockAttributes"/>
|
407
|
-
<optional>
|
408
|
-
<ref name="source"/>
|
409
|
-
</optional>
|
410
410
|
<optional>
|
411
411
|
<ref name="tname"/>
|
412
412
|
</optional>
|
@@ -431,6 +431,20 @@
|
|
431
431
|
<zeroOrMore>
|
432
432
|
<ref name="note"/>
|
433
433
|
</zeroOrMore>
|
434
|
+
<optional>
|
435
|
+
<ref name="source"/>
|
436
|
+
</optional>
|
437
|
+
</element>
|
438
|
+
</define>
|
439
|
+
<define name="source">
|
440
|
+
<element name="source">
|
441
|
+
<attribute name="status">
|
442
|
+
<ref name="SourceStatusType"/>
|
443
|
+
</attribute>
|
444
|
+
<ref name="origin"/>
|
445
|
+
<optional>
|
446
|
+
<ref name="modification"/>
|
447
|
+
</optional>
|
434
448
|
</element>
|
435
449
|
</define>
|
436
450
|
<define name="sourcecode">
|
@@ -2099,10 +2113,7 @@
|
|
2099
2113
|
<define name="termsource">
|
2100
2114
|
<element name="termsource">
|
2101
2115
|
<attribute name="status">
|
2102
|
-
<
|
2103
|
-
<value>identical</value>
|
2104
|
-
<value>modified</value>
|
2105
|
-
</choice>
|
2116
|
+
<ref name="SourceStatusType"/>
|
2106
2117
|
</attribute>
|
2107
2118
|
<attribute name="type">
|
2108
2119
|
<choice>
|
@@ -2116,6 +2127,17 @@
|
|
2116
2127
|
</optional>
|
2117
2128
|
</element>
|
2118
2129
|
</define>
|
2130
|
+
<define name="SourceStatusType">
|
2131
|
+
<choice>
|
2132
|
+
<value>identical</value>
|
2133
|
+
<value>modified</value>
|
2134
|
+
<value>restyled</value>
|
2135
|
+
<value>context-added</value>
|
2136
|
+
<value>generalisation</value>
|
2137
|
+
<value>specialisation</value>
|
2138
|
+
<value>unspecified</value>
|
2139
|
+
</choice>
|
2140
|
+
</define>
|
2119
2141
|
<define name="origin">
|
2120
2142
|
<element name="origin">
|
2121
2143
|
<choice>
|
@@ -106,10 +106,11 @@ module Metanorma
|
|
106
106
|
xmldoc.xpath("//term").each do |t|
|
107
107
|
para = t.at("./definition/verbal-definition") || return
|
108
108
|
term = t.at("./preferred//name").text
|
109
|
-
termdef_warn(para.text, /\A(the|a)\b/i, t, term,
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
@lang == "en" and termdef_warn(para.text, /\A(the|a)\b/i, t, term,
|
110
|
+
"term definition starts with article")
|
111
|
+
%(Cyrl Latn).include?(@script) and
|
112
|
+
termdef_warn(para.text, /\.\Z/i, t, term,
|
113
|
+
"term definition ends with period")
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
@@ -56,7 +56,8 @@ module Metanorma
|
|
56
56
|
def list_punctuation1(list, prectext)
|
57
57
|
prectext ||= ""
|
58
58
|
entries = list.xpath(".//li")
|
59
|
-
|
59
|
+
%w(Cyrl Latn Grek).include?(@script) or return
|
60
|
+
case prectext.strip[-1]
|
60
61
|
when ":", "" then list_after_colon_punctuation(list, entries)
|
61
62
|
when "." then entries.each { |li| list_full_sentence(li) }
|
62
63
|
else style_warning(list, "All lists must be preceded by "\
|
@@ -98,6 +99,7 @@ module Metanorma
|
|
98
99
|
end
|
99
100
|
|
100
101
|
def list_full_sentence(elem)
|
102
|
+
%w(Cyrl Latn Grek).include?(@script) or return
|
101
103
|
text = elem.text.strip
|
102
104
|
starts_uppercase?(text) or
|
103
105
|
style_warning(elem, "List entry of separate sentences must start "\
|
@@ -32,9 +32,9 @@ module Metanorma
|
|
32
32
|
@log.add("Style", f, "normative references contains subclauses")
|
33
33
|
end
|
34
34
|
|
35
|
-
ONE_SYMBOLS_WARNING = "Only one Symbols and Abbreviated "\
|
35
|
+
ONE_SYMBOLS_WARNING = "Only one Symbols and Abbreviated " \
|
36
36
|
"Terms section in the standard".freeze
|
37
|
-
NON_DL_SYMBOLS_WARNING = "Symbols and Abbreviated Terms can "\
|
37
|
+
NON_DL_SYMBOLS_WARNING = "Symbols and Abbreviated Terms can " \
|
38
38
|
"only contain a definition list".freeze
|
39
39
|
|
40
40
|
def symbols_validate(root)
|
@@ -46,7 +46,7 @@ module Metanorma
|
|
46
46
|
@log.add("Style", f.first, NON_DL_SYMBOLS_WARNING)
|
47
47
|
@vocab and f.each do |f1|
|
48
48
|
f1.at("./ancestor::annex") or
|
49
|
-
@log.add("Style", f1, "In vocabulary documents, Symbols and "\
|
49
|
+
@log.add("Style", f1, "In vocabulary documents, Symbols and " \
|
50
50
|
"Abbreviated Terms are only permitted in annexes")
|
51
51
|
end
|
52
52
|
end
|
@@ -80,15 +80,15 @@ module Metanorma
|
|
80
80
|
val: ["./self::introduction", "./self::clause[@type = 'scope']"] },
|
81
81
|
{ msg: "Prefatory material must be followed by (clause) Scope",
|
82
82
|
val: ["./self::clause[@type = 'scope']"] },
|
83
|
-
{ msg: "Normative References must be followed by "\
|
83
|
+
{ msg: "Normative References must be followed by " \
|
84
84
|
"Terms and Definitions",
|
85
85
|
val: ["./self::terms | .//terms"] },
|
86
86
|
].freeze
|
87
87
|
|
88
88
|
SECTIONS_XPATH =
|
89
|
-
"//foreword | //introduction | //sections/terms | .//annex | "\
|
90
|
-
"//sections/definitions | //sections/clause | "\
|
91
|
-
"//references[not(parent::clause)] | "\
|
89
|
+
"//foreword | //introduction | //sections/terms | .//annex | " \
|
90
|
+
"//sections/definitions | //sections/clause | " \
|
91
|
+
"//references[not(parent::clause)] | " \
|
92
92
|
"//clause[descendant::references][not(parent::clause)]".freeze
|
93
93
|
|
94
94
|
def sections_sequence_validate(root)
|
@@ -119,7 +119,7 @@ module Metanorma
|
|
119
119
|
@log.add("Style", elem, "Document must contain at least one clause")
|
120
120
|
end
|
121
121
|
elem&.at("./self::clause") ||
|
122
|
-
@log.add("Style", elem, "Document must contain clause after "\
|
122
|
+
@log.add("Style", elem, "Document must contain clause after " \
|
123
123
|
"Terms and Definitions")
|
124
124
|
elem&.at("./self::clause[@type = 'scope']") &&
|
125
125
|
@log.add("Style", elem,
|
@@ -151,12 +151,12 @@ module Metanorma
|
|
151
151
|
while elem&.name == "annex"
|
152
152
|
elem = names.shift
|
153
153
|
if elem.nil?
|
154
|
-
@log.add("Style", nil, "Document must include (references) "\
|
154
|
+
@log.add("Style", nil, "Document must include (references) " \
|
155
155
|
"Normative References")
|
156
156
|
end
|
157
157
|
end
|
158
158
|
elem&.at("./self::references[@normative = 'true']") ||
|
159
|
-
@log.add("Style", nil, "Document must include (references) "\
|
159
|
+
@log.add("Style", nil, "Document must include (references) " \
|
160
160
|
"Normative References")
|
161
161
|
elem = names&.shift
|
162
162
|
elem&.at("./self::references[@normative = 'false']") ||
|
@@ -227,13 +227,13 @@ module Metanorma
|
|
227
227
|
if terms.size == 1
|
228
228
|
((t = terms.first.at("./title")) && (t&.text == @i18n.termsdef)) or
|
229
229
|
@log.add("Style", terms.first,
|
230
|
-
"Single terms clause in vocabulary document "\
|
230
|
+
"Single terms clause in vocabulary document " \
|
231
231
|
"should have normal Terms and definitions heading")
|
232
232
|
elsif terms.size > 1
|
233
233
|
terms.each do |x|
|
234
234
|
((t = x.at("./title")) && /^#{@i18n.termsrelated}/.match?(t&.text)) or
|
235
235
|
@log.add("Style", x,
|
236
|
-
"Multiple terms clauses in vocabulary document "\
|
236
|
+
"Multiple terms clauses in vocabulary document " \
|
237
237
|
"should have 'Terms related to' heading")
|
238
238
|
end
|
239
239
|
end
|
@@ -110,8 +110,8 @@ module Metanorma
|
|
110
110
|
)
|
111
111
|
style_regex(/\b(?<num>[0-9]+\.[0-9]+)/i,
|
112
112
|
"possible decimal point", node, text)
|
113
|
-
style_regex(/\b(?<num>billions?)\b/i,
|
114
|
-
|
113
|
+
@lang == "en" and style_regex(/\b(?<num>billions?)\b/i,
|
114
|
+
"ambiguous number", node, text)
|
115
115
|
style_regex(/(^|\s)(?<num>-[0-9][0-9,.]*)/i,
|
116
116
|
"hyphen instead of minus sign U+2212", node, text)
|
117
117
|
end
|
@@ -135,8 +135,8 @@ module Metanorma
|
|
135
135
|
end
|
136
136
|
|
137
137
|
# leaving out as problematic: N J K C S T H h d B o E
|
138
|
-
SI_UNIT = "(m|cm|mm|km|μm|nm|g|kg|mgmol|cd|rad|sr|Hz|Hz|MHz|Pa|hPa|kJ|"\
|
139
|
-
"V|kV|W|MW|kW|F|μF|Ω|Wb|°C|lm|lx|Bq|Gy|Sv|kat|l|t|eV|u|Np|Bd|"\
|
138
|
+
SI_UNIT = "(m|cm|mm|km|μm|nm|g|kg|mgmol|cd|rad|sr|Hz|Hz|MHz|Pa|hPa|kJ|" \
|
139
|
+
"V|kV|W|MW|kW|F|μF|Ω|Wb|°C|lm|lx|Bq|Gy|Sv|kat|l|t|eV|u|Np|Bd|" \
|
140
140
|
"bit|kB|MB|Hart|nat|Sh|var)".freeze
|
141
141
|
|
142
142
|
# ISO/IEC DIR 2, 9.3
|
@@ -165,8 +165,8 @@ module Metanorma
|
|
165
165
|
# https://www.iso.org/ISO-house-style.html#iso-hs-s-text-r-p-and
|
166
166
|
# https://www.iso.org/ISO-house-style.html#iso-hs-s-text-r-p-andor
|
167
167
|
def style_punct(node, text)
|
168
|
-
style_regex(/\b(?<num>and\/?or)\b/i,
|
169
|
-
|
168
|
+
@lang == "en" and style_regex(/\b(?<num>and\/?or)\b/i,
|
169
|
+
"Use 'either x or y, or both'", node, text)
|
170
170
|
style_regex(/\s(?<num>&)\s/i,
|
171
171
|
"Avoid ampersand in ordinary text'", node, text)
|
172
172
|
end
|
@@ -180,8 +180,8 @@ module Metanorma
|
|
180
180
|
end
|
181
181
|
|
182
182
|
ASSETS_TO_STYLE =
|
183
|
-
"//termsource | //formula | //termnote | "\
|
184
|
-
"//p[not(ancestor::boilerplate)] | //li[not(p)] | //dt | "\
|
183
|
+
"//termsource | //formula | //termnote | " \
|
184
|
+
"//p[not(ancestor::boilerplate)] | //li[not(p)] | //dt | " \
|
185
185
|
"//dd[not(p)] | //td[not(p)] | //th[not(p)]".freeze
|
186
186
|
|
187
187
|
def asset_style(root)
|
@@ -42,8 +42,8 @@ module Metanorma
|
|
42
42
|
def title_subpart_validate(root)
|
43
43
|
docid = root.at("//bibdata/docidentifier[@type = 'ISO']")
|
44
44
|
subpart = /-\d+-\d+/.match docid
|
45
|
-
iec = root.at("//bibdata/contributor[role/@type = 'publisher']/"\
|
46
|
-
"organization[abbreviation = 'IEC' or "\
|
45
|
+
iec = root.at("//bibdata/contributor[role/@type = 'publisher']/" \
|
46
|
+
"organization[abbreviation = 'IEC' or " \
|
47
47
|
"name = 'International Electrotechnical Commission']")
|
48
48
|
subpart && !iec and
|
49
49
|
@log.add("Style", docid, "Subpart defined on non-IEC document!")
|
@@ -51,6 +51,7 @@ module Metanorma
|
|
51
51
|
|
52
52
|
# ISO/IEC DIR 2, 11.5.2
|
53
53
|
def title_names_type_validate(root)
|
54
|
+
@lang == "en" or return
|
54
55
|
doctypes = /International\sStandard | Technical\sSpecification |
|
55
56
|
Publicly\sAvailable\sSpecification | Technical\sReport | Guide /xi
|
56
57
|
title_main_en = title_lang_part(root, "main", "en")
|
@@ -93,8 +94,8 @@ module Metanorma
|
|
93
94
|
|
94
95
|
# https://www.iso.org/ISO-house-style.html#iso-hs-s-text-r-p-full
|
95
96
|
def title_no_full_stop_validate(root)
|
96
|
-
root.xpath("//preface//title | //sections//title | //annex//title | "\
|
97
|
-
"//references/title | //preface//name | //sections//name | "\
|
97
|
+
root.xpath("//preface//title | //sections//title | //annex//title | " \
|
98
|
+
"//references/title | //preface//name | //sections//name | " \
|
98
99
|
"//annex//name").each do |t|
|
99
100
|
style_regex(/\A(?<num>.+\.\Z)/i,
|
100
101
|
"No full stop at end of title or caption",
|
data/metanorma-iso.gemspec
CHANGED
@@ -32,9 +32,9 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
33
33
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
34
34
|
|
35
|
-
spec.add_dependency "metanorma-standoc", "~> 2.4.
|
35
|
+
spec.add_dependency "metanorma-standoc", "~> 2.4.2"
|
36
36
|
spec.add_dependency "mnconvert", "~> 1.14"
|
37
|
-
spec.add_dependency "pubid-iso", "~> 0.
|
37
|
+
spec.add_dependency "pubid-iso", "~> 0.5.0"
|
38
38
|
spec.add_dependency "ruby-jing"
|
39
39
|
spec.add_dependency "tokenizer", "~> 0.3.0"
|
40
40
|
spec.add_dependency "twitter_cldr"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-iso
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.2
|
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-
|
11
|
+
date: 2023-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: metanorma-standoc
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.4.
|
19
|
+
version: 2.4.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.4.
|
26
|
+
version: 2.4.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mnconvert
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.5.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.5.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ruby-jing
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -340,6 +340,7 @@ files:
|
|
340
340
|
- lib/isodoc/iso/html_convert.rb
|
341
341
|
- lib/isodoc/iso/i18n-en.yaml
|
342
342
|
- lib/isodoc/iso/i18n-fr.yaml
|
343
|
+
- lib/isodoc/iso/i18n-ja.yaml
|
343
344
|
- lib/isodoc/iso/i18n-ru.yaml
|
344
345
|
- lib/isodoc/iso/i18n-zh-Hans.yaml
|
345
346
|
- lib/isodoc/iso/i18n.rb
|