metanorma-iso 1.4.3 → 1.5.4
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/ubuntu.yml +1 -1
- data/lib/asciidoctor/iso/base.rb +9 -20
- data/lib/asciidoctor/iso/cleanup.rb +2 -3
- data/lib/asciidoctor/iso/front.rb +6 -7
- data/lib/asciidoctor/iso/front_id.rb +6 -6
- data/lib/asciidoctor/iso/isodoc.rng +16 -7
- data/lib/asciidoctor/iso/section.rb +5 -11
- data/lib/asciidoctor/iso/term_lookup_cleanup.rb +0 -1
- data/lib/asciidoctor/iso/validate_section.rb +40 -44
- data/lib/isodoc/iso/base_convert.rb +3 -64
- data/lib/isodoc/iso/html/wordstyle.css +10 -9
- data/lib/isodoc/iso/html/wordstyle.scss +15 -9
- data/lib/isodoc/iso/html_convert.rb +2 -1
- data/lib/{asciidoctor → isodoc}/iso/i18n-en.yaml +0 -1
- data/lib/{asciidoctor → isodoc}/iso/i18n-fr.yaml +0 -0
- data/lib/{asciidoctor → isodoc}/iso/i18n-zh-Hans.yaml +0 -0
- data/lib/isodoc/iso/i18n.rb +19 -0
- data/lib/isodoc/iso/init.rb +33 -0
- data/lib/isodoc/iso/iso.amendment.xsl +1403 -1719
- data/lib/isodoc/iso/iso.international-standard.xsl +1403 -1719
- data/lib/isodoc/iso/metadata.rb +1 -1
- data/lib/isodoc/iso/presentation_xml_convert.rb +99 -1
- data/lib/isodoc/iso/sections.rb +3 -8
- data/lib/isodoc/iso/word_convert.rb +19 -14
- data/lib/isodoc/iso/xref.rb +2 -0
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +2 -2
- data/spec/asciidoctor-iso/base_spec.rb +3 -11
- data/spec/asciidoctor-iso/cleanup_spec.rb +31 -7
- data/spec/asciidoctor-iso/inline_spec.rb +8 -2
- data/spec/asciidoctor-iso/refs_spec.rb +3 -3
- data/spec/asciidoctor-iso/section_spec.rb +9 -6
- data/spec/asciidoctor-iso/table_spec.rb +7 -1
- data/spec/asciidoctor-iso/validate_spec.rb +100 -21
- data/spec/isodoc/amd_spec.rb +309 -153
- data/spec/isodoc/blocks_spec.rb +362 -28
- data/spec/isodoc/i18n_spec.rb +468 -108
- data/spec/isodoc/inline_spec.rb +99 -31
- data/spec/isodoc/iso_spec.rb +95 -29
- data/spec/isodoc/postproc_spec.rb +190 -150
- data/spec/isodoc/ref_spec.rb +175 -3
- data/spec/isodoc/section_spec.rb +148 -82
- data/spec/isodoc/table_spec.rb +142 -5
- data/spec/isodoc/terms_spec.rb +78 -53
- data/spec/isodoc/xref_spec.rb +831 -658
- data/spec/metanorma/processor_spec.rb +2 -1
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b80a62eb663a85ad1428d97e32114a9b6341303689f0d43a5bac63e071e4740
|
4
|
+
data.tar.gz: 11412874aa684c02fde2eb00899f1f4290b3cede75b6981f6df11c2b0e99be29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a513b51527259420edc479f2cb6a2438e47383c66a1aceb2386cfba0ce7b2c7f16d3c55661cf83c6b5d8db35550c1a7354d81474df66d32df3a4dce6c79f104
|
7
|
+
data.tar.gz: 7676550f3771804a384e1b1d7f7948e46e950be96844031108f5d0ef019bbc605d18c8367b428858ea36d97b398134e34a529cb8ab4b09a82ac20594140c420a
|
@@ -39,7 +39,7 @@ jobs:
|
|
39
39
|
polling_interval_seconds: 5
|
40
40
|
timeout_minutes: 5
|
41
41
|
max_attempts: 3
|
42
|
-
command: sudo bash -c "curl -L https://github.com/metanorma/plantuml-install/raw/master/ubuntu.sh | bash"
|
42
|
+
command: sudo apt-get update -y && sudo bash -c "curl -L https://github.com/metanorma/plantuml-install/raw/master/ubuntu.sh | bash"
|
43
43
|
- name: Run specs
|
44
44
|
run: |
|
45
45
|
bundle exec rake
|
data/lib/asciidoctor/iso/base.rb
CHANGED
@@ -3,7 +3,6 @@ require "nokogiri"
|
|
3
3
|
require "json"
|
4
4
|
require "pathname"
|
5
5
|
require "open-uri"
|
6
|
-
require "pp"
|
7
6
|
require "isodoc"
|
8
7
|
require "fileutils"
|
9
8
|
require 'asciidoctor/iso/macros'
|
@@ -47,32 +46,22 @@ module Asciidoctor
|
|
47
46
|
|
48
47
|
def init(node)
|
49
48
|
super
|
50
|
-
@amd = %w(amendment technical-corrigendum).include? node
|
49
|
+
@amd = %w(amendment technical-corrigendum).include? doctype(node)
|
51
50
|
end
|
52
51
|
|
53
52
|
def outputs(node, ret)
|
54
53
|
File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
|
55
54
|
presentation_xml_converter(node).convert(@filename + ".xml")
|
56
|
-
html_converter_alt(node).convert(@filename + ".presentation.xml",
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
html_converter_alt(node).convert(@filename + ".presentation.xml",
|
56
|
+
nil, false, "#{@filename}_alt.html")
|
57
|
+
html_converter(node).convert(@filename + ".presentation.xml",
|
58
|
+
nil, false, "#{@filename}.html")
|
59
|
+
doc_converter(node).convert(@filename + ".presentation.xml",
|
60
|
+
nil, false, "#{@filename}.doc")
|
61
|
+
pdf_converter(node)&.convert(@filename + ".presentation.xml",
|
62
|
+
nil, false, "#{@filename}.pdf")
|
60
63
|
#sts_converter(node)&.convert(@filename + ".xml")
|
61
64
|
end
|
62
|
-
|
63
|
-
def load_yaml(lang, script)
|
64
|
-
y = if @i18nyaml then YAML.load_file(@i18nyaml)
|
65
|
-
elsif lang == "en"
|
66
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
|
67
|
-
elsif lang == "fr"
|
68
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "i18n-fr.yaml"))
|
69
|
-
elsif lang == "zh" && script == "Hans"
|
70
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "i18n-zh-Hans.yaml"))
|
71
|
-
else
|
72
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "i18n-en.yaml"))
|
73
|
-
end
|
74
|
-
super.merge(y)
|
75
|
-
end
|
76
65
|
end
|
77
66
|
end
|
78
67
|
end
|
@@ -4,20 +4,19 @@ require "htmlentities"
|
|
4
4
|
require "json"
|
5
5
|
require "pathname"
|
6
6
|
require "open-uri"
|
7
|
-
require "pp"
|
8
7
|
require "asciidoctor/iso/term_lookup_cleanup"
|
9
8
|
|
10
9
|
module Asciidoctor
|
11
10
|
module ISO
|
12
11
|
class Converter < Standoc::Converter
|
13
12
|
PRE_NORMREF_FOOTNOTES = "//preface//fn | "\
|
14
|
-
"//clause[
|
13
|
+
"//clause[@type = 'scope']//fn".freeze
|
15
14
|
|
16
15
|
NORMREF_FOOTNOTES =
|
17
16
|
"//references[@normative = 'true']//fn".freeze
|
18
17
|
|
19
18
|
POST_NORMREF_FOOTNOTES =
|
20
|
-
"//sections//clause[not(
|
19
|
+
"//sections//clause[not(@type = 'scope')]//fn | "\
|
21
20
|
"//annex//fn | "\
|
22
21
|
"//references[@normative = 'false']//fn".freeze
|
23
22
|
|
@@ -4,7 +4,6 @@ require "htmlentities"
|
|
4
4
|
require "json"
|
5
5
|
require "pathname"
|
6
6
|
require "open-uri"
|
7
|
-
require "pp"
|
8
7
|
require_relative "front_id"
|
9
8
|
|
10
9
|
module Asciidoctor
|
@@ -14,7 +13,7 @@ module Asciidoctor
|
|
14
13
|
super
|
15
14
|
structured_id(node, xml)
|
16
15
|
xml.stagename stage_name(get_stage(node), get_substage(node),
|
17
|
-
node
|
16
|
+
doctype(node), node.attr("iteration"))
|
18
17
|
@amd && a = node.attr("updates-document-type") and
|
19
18
|
xml.updates_document_type a
|
20
19
|
end
|
@@ -35,7 +34,7 @@ module Asciidoctor
|
|
35
34
|
|
36
35
|
def metadata_author(node, xml)
|
37
36
|
publishers = node.attr("publisher") || "ISO"
|
38
|
-
publishers
|
37
|
+
csv_split(publishers).each do |p|
|
39
38
|
xml.contributor do |c|
|
40
39
|
c.role **{ type: "author" }
|
41
40
|
c.organization { |a| organization(a, p) }
|
@@ -45,7 +44,7 @@ module Asciidoctor
|
|
45
44
|
|
46
45
|
def metadata_publisher(node, xml)
|
47
46
|
publishers = node.attr("publisher") || "ISO"
|
48
|
-
publishers
|
47
|
+
csv_split(publishers).each do |p|
|
49
48
|
xml.contributor do |c|
|
50
49
|
c.role **{ type: "publisher" }
|
51
50
|
c.organization { |a| organization(a, p) }
|
@@ -54,8 +53,8 @@ module Asciidoctor
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def metadata_copyright(node, xml)
|
57
|
-
publishers = node.attr("publisher") || "ISO"
|
58
|
-
publishers
|
56
|
+
publishers = node.attr("copyright-holder") || node.attr("publisher") || "ISO"
|
57
|
+
csv_split(publishers).each do |p|
|
59
58
|
xml.copyright do |c|
|
60
59
|
c.from (node.attr("copyright-year") || Date.today.year)
|
61
60
|
c.owner do |owner|
|
@@ -69,7 +68,7 @@ module Asciidoctor
|
|
69
68
|
stage = get_stage(node)
|
70
69
|
substage = get_substage(node)
|
71
70
|
xml.status do |s|
|
72
|
-
s.stage stage, **attr_code(abbreviation: stage_abbr(stage, substage, node
|
71
|
+
s.stage stage, **attr_code(abbreviation: stage_abbr(stage, substage, doctype(node)))
|
73
72
|
s.substage substage
|
74
73
|
node.attr("iteration") && (s.iteration node.attr("iteration"))
|
75
74
|
end
|
@@ -95,7 +95,7 @@ module Asciidoctor
|
|
95
95
|
def add_amd_parts(dn, node)
|
96
96
|
a = node.attr("amendment-number")
|
97
97
|
c = node.attr("corrigendum-number")
|
98
|
-
case node
|
98
|
+
case doctype(node)
|
99
99
|
when "amendment"
|
100
100
|
"#{dn}/Amd #{node.attr('amendment-number')}"
|
101
101
|
when "technical-corrigendum"
|
@@ -133,12 +133,12 @@ module Asciidoctor
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def id_stage_abbr(stage, substage, node)
|
136
|
-
ret = IsoDoc::Iso::Metadata.new("en", "Latn",
|
137
|
-
status_abbrev(stage_abbr(stage, substage, node
|
136
|
+
ret = IsoDoc::Iso::Metadata.new("en", "Latn", @i18n).
|
137
|
+
status_abbrev(stage_abbr(stage, substage, doctype(node)),
|
138
138
|
substage, node.attr("iteration"),
|
139
|
-
node.attr("draft"), node
|
139
|
+
node.attr("draft"), doctype(node))
|
140
140
|
if %w(amendment technical-corrigendum amendment
|
141
|
-
technical-corrigendum).include?(node
|
141
|
+
technical-corrigendum).include?(doctype(node))
|
142
142
|
ret = ret + " " unless %w(40 50).include?(stage)
|
143
143
|
end
|
144
144
|
ret
|
@@ -184,7 +184,7 @@ module Asciidoctor
|
|
184
184
|
end
|
185
185
|
|
186
186
|
def get_typeabbr(node)
|
187
|
-
case node
|
187
|
+
case doctype(node)
|
188
188
|
when "technical-report" then "TR "
|
189
189
|
when "technical-specification" then "TS "
|
190
190
|
else
|
@@ -42,8 +42,11 @@
|
|
42
42
|
</define>
|
43
43
|
<define name="xref">
|
44
44
|
<element name="xref">
|
45
|
+
<!-- attribute target { xsd:IDREF }, -->
|
45
46
|
<attribute name="target">
|
46
|
-
<data type="
|
47
|
+
<data type="string">
|
48
|
+
<param name="pattern">\i\c*|\c+#\c+</param>
|
49
|
+
</data>
|
47
50
|
</attribute>
|
48
51
|
<optional>
|
49
52
|
<attribute name="type">
|
@@ -922,6 +925,9 @@
|
|
922
925
|
<optional>
|
923
926
|
<attribute name="script"/>
|
924
927
|
</optional>
|
928
|
+
<optional>
|
929
|
+
<attribute name="type"/>
|
930
|
+
</optional>
|
925
931
|
<optional>
|
926
932
|
<attribute name="obligation">
|
927
933
|
<choice>
|
@@ -961,9 +967,6 @@
|
|
961
967
|
</define>
|
962
968
|
<define name="content-subsection">
|
963
969
|
<element name="clause">
|
964
|
-
<optional>
|
965
|
-
<attribute name="type"/>
|
966
|
-
</optional>
|
967
970
|
<ref name="Content-Section"/>
|
968
971
|
</element>
|
969
972
|
</define>
|
@@ -992,6 +995,9 @@
|
|
992
995
|
</choice>
|
993
996
|
</attribute>
|
994
997
|
</optional>
|
998
|
+
<optional>
|
999
|
+
<attribute name="type"/>
|
1000
|
+
</optional>
|
995
1001
|
<optional>
|
996
1002
|
<ref name="section-title"/>
|
997
1003
|
</optional>
|
@@ -1011,9 +1017,6 @@
|
|
1011
1017
|
</define>
|
1012
1018
|
<define name="clause">
|
1013
1019
|
<element name="clause">
|
1014
|
-
<optional>
|
1015
|
-
<attribute name="type"/>
|
1016
|
-
</optional>
|
1017
1020
|
<ref name="Clause-Section"/>
|
1018
1021
|
</element>
|
1019
1022
|
</define>
|
@@ -1042,6 +1045,9 @@
|
|
1042
1045
|
</choice>
|
1043
1046
|
</attribute>
|
1044
1047
|
</optional>
|
1048
|
+
<optional>
|
1049
|
+
<attribute name="type"/>
|
1050
|
+
</optional>
|
1045
1051
|
<optional>
|
1046
1052
|
<ref name="section-title"/>
|
1047
1053
|
</optional>
|
@@ -1180,6 +1186,9 @@
|
|
1180
1186
|
<optional>
|
1181
1187
|
<attribute name="script"/>
|
1182
1188
|
</optional>
|
1189
|
+
<optional>
|
1190
|
+
<attribute name="type"/>
|
1191
|
+
</optional>
|
1183
1192
|
<optional>
|
1184
1193
|
<attribute name="obligation">
|
1185
1194
|
<choice>
|
@@ -5,13 +5,15 @@ module Asciidoctor
|
|
5
5
|
module ISO
|
6
6
|
class Converter < Standoc::Converter
|
7
7
|
def clause_parse(attrs, xml, node)
|
8
|
-
title = node&.attr("heading")&.downcase ||
|
9
|
-
node.title.gsub(/<[^>]+>/, "").downcase
|
10
|
-
title == "scope" and return scope_parse(attrs, xml, node)
|
11
8
|
node.option? "appendix" and return appendix_parse(attrs, xml, node)
|
12
9
|
super
|
13
10
|
end
|
14
11
|
|
12
|
+
def scope_parse(attrs, xml, node)
|
13
|
+
attrs = attrs.merge(type: "scope") unless @amd
|
14
|
+
clause_parse(attrs, xml, node)
|
15
|
+
end
|
16
|
+
|
15
17
|
def appendix_parse(attrs, xml, node)
|
16
18
|
attrs["inline-header".to_sym] = node.option? "inline-header"
|
17
19
|
set_obligation(attrs, node)
|
@@ -28,14 +30,6 @@ module Asciidoctor
|
|
28
30
|
xml << node.content
|
29
31
|
end
|
30
32
|
|
31
|
-
def scope_parse(attrs, xml, node)
|
32
|
-
xml.clause **attr_code(attrs) do |xml_section|
|
33
|
-
xml_section.title { |t| t << "Scope" }
|
34
|
-
content = node.content
|
35
|
-
xml_section << content
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
33
|
def section_attributes(node)
|
40
34
|
super.merge(
|
41
35
|
change: @amd ? node.attr("change") : nil,
|
@@ -75,7 +75,6 @@ module Asciidoctor
|
|
75
75
|
|
76
76
|
def unique_text_id(text)
|
77
77
|
return "term-#{text}" if xmldoc.at("//*[@id = 'term-#{text}']").nil?
|
78
|
-
|
79
78
|
(1..Float::INFINITY).lazy.each do |index|
|
80
79
|
if xmldoc.at("//*[@id = 'term-#{text}-#{index}']").nil?
|
81
80
|
break("term-#{text}-#{index}")
|
@@ -7,6 +7,7 @@ module Asciidoctor
|
|
7
7
|
foreword_validate(doc.root)
|
8
8
|
normref_validate(doc.root)
|
9
9
|
symbols_validate(doc.root)
|
10
|
+
sections_presence_validate(doc.root)
|
10
11
|
sections_sequence_validate(doc.root)
|
11
12
|
section_style(doc.root)
|
12
13
|
subclause_validate(doc.root)
|
@@ -46,46 +47,44 @@ module Asciidoctor
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def seqcheck(names, msg, accepted)
|
49
|
-
n = names.shift
|
50
|
-
|
50
|
+
n = names.shift
|
51
|
+
return [] if n.nil?
|
52
|
+
test = accepted.map { |a| n.at(a) }
|
53
|
+
if test.all? { |a| a.nil? }
|
51
54
|
@log.add("Style", nil, msg)
|
52
|
-
names = []
|
53
55
|
end
|
54
56
|
names
|
55
57
|
end
|
56
58
|
|
59
|
+
def sections_presence_validate(root)
|
60
|
+
root.at("//sections/clause[@type = 'scope']") or
|
61
|
+
@log.add("Style", nil, "Scope clause missing")
|
62
|
+
root.at("//references[@normative = 'true']") or
|
63
|
+
@log.add("Style", nil, "Normative references missing")
|
64
|
+
root.at("//terms") or
|
65
|
+
@log.add("Style", nil, "Terms & definitions missing")
|
66
|
+
end
|
67
|
+
|
57
68
|
# spec of permissible section sequence
|
58
69
|
# we skip normative references, it goes to end of list
|
59
70
|
SEQ =
|
60
71
|
[
|
61
72
|
{
|
62
73
|
msg: "Initial section must be (content) Foreword",
|
63
|
-
val: [
|
74
|
+
val: ["./self::foreword"]
|
64
75
|
},
|
65
76
|
{
|
66
77
|
msg: "Prefatory material must be followed by (clause) Scope",
|
67
|
-
val:
|
68
|
-
{ tag: "clause", title: "Scope" }],
|
78
|
+
val: ["./self::introduction", "./self::clause[@type = 'scope']" ]
|
69
79
|
},
|
70
80
|
{
|
71
81
|
msg: "Prefatory material must be followed by (clause) Scope",
|
72
|
-
val: [
|
82
|
+
val: ["./self::clause[@type = 'scope']" ]
|
73
83
|
},
|
74
84
|
{
|
75
85
|
msg: "Normative References must be followed by "\
|
76
86
|
"Terms and Definitions",
|
77
|
-
val: [
|
78
|
-
{ tag: "terms", title: "Terms and definitions" },
|
79
|
-
{ tag: "clause", title: "Terms and definitions" },
|
80
|
-
{
|
81
|
-
tag: "terms",
|
82
|
-
title: "Terms, definitions, symbols and abbreviated terms",
|
83
|
-
},
|
84
|
-
{
|
85
|
-
tag: "clause",
|
86
|
-
title: "Terms, definitions, symbols and abbreviated terms",
|
87
|
-
},
|
88
|
-
],
|
87
|
+
val: ["./self::terms | .//terms"]
|
89
88
|
},
|
90
89
|
].freeze
|
91
90
|
|
@@ -95,50 +94,47 @@ module Asciidoctor
|
|
95
94
|
"//clause[descendant::references][not(parent::clause)]".freeze
|
96
95
|
|
97
96
|
def sections_sequence_validate(root)
|
98
|
-
|
99
|
-
names =
|
100
|
-
names = seqcheck(names, SEQ[0][:msg], SEQ[0][:val]) || return
|
97
|
+
names = root.xpath(SECTIONS_XPATH)
|
98
|
+
names = seqcheck(names, SEQ[0][:msg], SEQ[0][:val])
|
101
99
|
n = names[0]
|
102
|
-
names = seqcheck(names, SEQ[1][:msg], SEQ[1][:val])
|
103
|
-
if n
|
104
|
-
names = seqcheck(names, SEQ[2][:msg], SEQ[2][:val])
|
100
|
+
names = seqcheck(names, SEQ[1][:msg], SEQ[1][:val])
|
101
|
+
if n&.at("./self::introduction")
|
102
|
+
names = seqcheck(names, SEQ[2][:msg], SEQ[2][:val])
|
105
103
|
end
|
106
|
-
names = seqcheck(names, SEQ[3][:msg], SEQ[3][:val])
|
104
|
+
names = seqcheck(names, SEQ[3][:msg], SEQ[3][:val])
|
107
105
|
n = names.shift
|
108
|
-
if n
|
109
|
-
n = names.shift
|
106
|
+
if n&.at("./self::definitions")
|
107
|
+
n = names.shift
|
110
108
|
end
|
111
|
-
|
109
|
+
if n.nil? || n.name != "clause"
|
112
110
|
@log.add("Style", nil, "Document must contain at least one clause")
|
113
|
-
return
|
114
111
|
end
|
115
|
-
n
|
112
|
+
n&.at("./self::clause") ||
|
116
113
|
@log.add("Style", nil, "Document must contain clause after "\
|
117
114
|
"Terms and Definitions")
|
118
|
-
n
|
115
|
+
n&.at("./self::clause[@type = 'scope']") &&
|
119
116
|
@log.add("Style", nil, "Scope must occur before Terms and Definitions")
|
120
|
-
n = names.shift
|
121
|
-
while n
|
122
|
-
n[
|
117
|
+
n = names.shift
|
118
|
+
while n&.name == "clause"
|
119
|
+
n&.at("./self::clause[@type = 'scope']")
|
123
120
|
@log.add("Style", nil, "Scope must occur before Terms and Definitions")
|
124
|
-
n = names.shift
|
121
|
+
n = names.shift
|
125
122
|
end
|
126
|
-
unless
|
123
|
+
unless %w(annex references).include? n&.name
|
127
124
|
@log.add("Style", nil, "Only annexes and references can follow clauses")
|
128
125
|
end
|
129
|
-
while n
|
126
|
+
while n&.name == "annex"
|
130
127
|
n = names.shift
|
131
128
|
if n.nil?
|
132
129
|
@log.add("Style", nil, "Document must include (references) "\
|
133
130
|
"Normative References")
|
134
|
-
return
|
135
131
|
end
|
136
132
|
end
|
137
|
-
n
|
133
|
+
n&.at("./self::references[@normative = 'true']") ||
|
138
134
|
@log.add("Style", nil, "Document must include (references) "\
|
139
135
|
"Normative References")
|
140
|
-
n = names
|
141
|
-
n
|
136
|
+
n = names&.shift
|
137
|
+
n&.at("./self::references[@normative = 'false']") ||
|
142
138
|
@log.add("Style", nil, "Final section must be (references) Bibliography")
|
143
139
|
names.empty? ||
|
144
140
|
@log.add("Style", nil, "There are sections after the final Bibliography")
|
@@ -157,8 +153,8 @@ module Asciidoctor
|
|
157
153
|
def section_style(root)
|
158
154
|
foreword_style(root.at("//foreword"))
|
159
155
|
introduction_style(root.at("//introduction"))
|
160
|
-
scope_style(root.at("//clause[
|
161
|
-
scope = root.at("//clause[
|
156
|
+
scope_style(root.at("//clause[@type = 'scope']"))
|
157
|
+
scope = root.at("//clause[@type = 'scope']/clause")
|
162
158
|
# ISO/IEC DIR 2, 14.4
|
163
159
|
scope.nil? || style_warning(scope, SCOPE_WARN, nil)
|
164
160
|
end
|