metanorma-iso 1.8.4 → 1.9.0.1
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/rake.yml +1 -1
- data/.rubocop.yml +1 -1
- data/lib/asciidoctor/iso/cleanup.rb +0 -1
- data/lib/asciidoctor/iso/isodoc.rng +50 -8
- data/lib/asciidoctor/iso/isostandard.rng +7 -3
- data/lib/asciidoctor/iso/section.rb +3 -0
- data/lib/asciidoctor/iso/validate.rb +4 -17
- data/lib/asciidoctor/iso/validate_section.rb +50 -34
- data/lib/asciidoctor/iso/validate_style.rb +3 -3
- data/lib/isodoc/iso/base_convert.rb +41 -16
- data/lib/isodoc/iso/html/isodoc.css +475 -20
- data/lib/isodoc/iso/html/isodoc.scss +456 -23
- data/lib/isodoc/iso/html/wordstyle.css +202 -31
- data/lib/isodoc/iso/html/wordstyle.scss +194 -32
- data/lib/isodoc/iso/iso.amendment.xsl +480 -388
- data/lib/isodoc/iso/iso.international-standard.xsl +480 -388
- data/lib/isodoc/iso/isosts_convert.rb +12 -13
- data/lib/isodoc/iso/metadata.rb +2 -2
- data/lib/isodoc/iso/presentation_xml_convert.rb +62 -9
- data/lib/isodoc/iso/sts_convert.rb +4 -5
- data/lib/isodoc/iso/word_convert.rb +153 -39
- data/lib/isodoc/iso/xref.rb +17 -1
- data/lib/metanorma/iso/version.rb +1 -1
- data/metanorma-iso.gemspec +4 -4
- data/spec/asciidoctor/section_spec.rb +128 -7
- data/spec/asciidoctor/validate_spec.rb +15 -15
- data/spec/isodoc/amd_spec.rb +193 -201
- data/spec/isodoc/blocks_spec.rb +100 -88
- data/spec/isodoc/i18n_spec.rb +36 -36
- data/spec/isodoc/inline_spec.rb +472 -2
- data/spec/isodoc/iso_spec.rb +86 -138
- data/spec/isodoc/postproc_spec.rb +19 -10
- data/spec/isodoc/ref_spec.rb +6 -6
- data/spec/isodoc/section_spec.rb +394 -276
- data/spec/isodoc/table_spec.rb +166 -231
- data/spec/isodoc/terms_spec.rb +11 -8
- data/spec/isodoc/xref_spec.rb +147 -118
- metadata +8 -8
@@ -1,31 +1,30 @@
|
|
1
1
|
require "isodoc"
|
2
|
-
require "
|
2
|
+
require "mnconvert"
|
3
3
|
|
4
4
|
module IsoDoc
|
5
5
|
module Iso
|
6
|
-
|
7
6
|
# A {Converter} implementation that generates HTML output, and a document
|
8
7
|
# schema encapsulation of the document for validation
|
9
8
|
#
|
10
9
|
class IsoStsConvert < IsoDoc::XslfoPdfConvert
|
11
|
-
def initialize(
|
10
|
+
def initialize(_options)
|
12
11
|
@libdir = File.dirname(__FILE__)
|
13
12
|
@format = :isosts
|
14
13
|
@suffix = "isosts.xml"
|
15
14
|
end
|
16
15
|
|
17
|
-
def convert(
|
18
|
-
file = File.read(
|
19
|
-
|
20
|
-
/\.xml$/.match(
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
def convert(input_fname, file = nil, debug = false, output_fname = nil)
|
17
|
+
file = File.read(input_fname, encoding: "utf-8") if file.nil?
|
18
|
+
_, fname, dir = convert_init(file, input_fname, debug)
|
19
|
+
/\.xml$/.match(input_fname) or
|
20
|
+
input_fname = Tempfile.open([fname, ".xml"], encoding: "utf-8") do |f|
|
21
|
+
f.write file
|
22
|
+
f.path
|
23
|
+
end
|
25
24
|
FileUtils.rm_rf dir
|
26
|
-
|
25
|
+
MnConvert.convert(input_fname, output_fname || "#{fname}.#{@suffix}",
|
26
|
+
MnConvert::InputFormat::MN, { output_format: :iso })
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
data/lib/isodoc/iso/metadata.rb
CHANGED
@@ -38,12 +38,12 @@ module IsoDoc
|
|
38
38
|
set(:statusabbr, status_abbrev(docstatus["abbreviation"] || "??",
|
39
39
|
isoxml&.at(ns("//bibdata/status/substage"))&.text,
|
40
40
|
isoxml&.at(ns("//bibdata/status/iteration"))&.text,
|
41
|
-
isoxml&.at(ns("//version/draft"))&.text,
|
41
|
+
isoxml&.at(ns("//bibdata/version/draft"))&.text,
|
42
42
|
isoxml&.at(ns("//bibdata/ext/doctype"))&.text))
|
43
43
|
unpublished(docstatus.text) and
|
44
44
|
set(:stageabbr, docstatus["abbreviation"])
|
45
45
|
end
|
46
|
-
revdate = isoxml.at(ns("//version/revision-date"))
|
46
|
+
revdate = isoxml.at(ns("//bibdata/version/revision-date"))
|
47
47
|
set(:revdate, revdate&.text)
|
48
48
|
end
|
49
49
|
|
@@ -45,7 +45,7 @@ module IsoDoc
|
|
45
45
|
prefix_name(node, " — ", lbl, "name")
|
46
46
|
end
|
47
47
|
|
48
|
-
def eref_localities1_zh(target, type, from,
|
48
|
+
def eref_localities1_zh(target, type, from, upto, node, delim)
|
49
49
|
subsection = from&.text&.match(/\./)
|
50
50
|
ret = if delim == ";"
|
51
51
|
";"
|
@@ -53,32 +53,31 @@ module IsoDoc
|
|
53
53
|
type == "list" ? "" : delim
|
54
54
|
end
|
55
55
|
ret += " 第#{from.text}" if from
|
56
|
-
ret += "–#{
|
56
|
+
ret += "–#{upto.text}" if upto
|
57
57
|
loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize)
|
58
58
|
ret += " #{loc}" unless subsection && type == "clause" ||
|
59
59
|
type == "list" || target.match(/^IEV$|^IEC 60050-/) ||
|
60
|
-
|
60
|
+
node["droploc"] == "true"
|
61
61
|
ret += ")" if type == "list"
|
62
62
|
ret
|
63
63
|
end
|
64
64
|
|
65
|
-
def eref_localities1(target, type, from,
|
65
|
+
def eref_localities1(target, type, from, upto, delim, node, lang = "en")
|
66
66
|
return "" if type == "anchor"
|
67
67
|
|
68
68
|
subsection = from&.text&.match(/\./)
|
69
69
|
type = type.downcase
|
70
70
|
lang == "zh" and
|
71
|
-
return l10n(eref_localities1_zh(target, type, from,
|
72
|
-
ret = if delim == ";"
|
73
|
-
";"
|
71
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node, delim))
|
72
|
+
ret = if delim == ";" then ";"
|
74
73
|
else
|
75
74
|
type == "list" ? "" : delim
|
76
75
|
end
|
77
|
-
ret += eref_locality_populate(type,
|
76
|
+
ret += eref_locality_populate(type, node) unless subsection &&
|
78
77
|
type == "clause" || type == "list" ||
|
79
78
|
target.match(/^IEV$|^IEC 60050-/)
|
80
79
|
ret += " #{from.text}" if from
|
81
|
-
ret += "–#{
|
80
|
+
ret += "–#{upto.text}" if upto
|
82
81
|
ret += ")" if type == "list"
|
83
82
|
l10n(ret)
|
84
83
|
end
|
@@ -113,6 +112,60 @@ module IsoDoc
|
|
113
112
|
end
|
114
113
|
end
|
115
114
|
|
115
|
+
def concept(docxml)
|
116
|
+
docxml.xpath(ns("//terms//concept")).each_with_object({}) do |f, m|
|
117
|
+
concept_term(f, m)
|
118
|
+
end
|
119
|
+
docxml.xpath(ns("//concept")).each do |node|
|
120
|
+
concept_render(node, node["ital"] || "false", node["ref"] || "false")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def concept_term(node, seen)
|
125
|
+
term = node&.at(ns("./refterm"))&.to_xml
|
126
|
+
if term && seen[term]
|
127
|
+
concept_render(node, node["ital"] || "false", node["ref"] || "false")
|
128
|
+
else concept_render(node, node["ital"] || "true", node["ref"] || "true")
|
129
|
+
end
|
130
|
+
seen[term] = true if term
|
131
|
+
seen
|
132
|
+
end
|
133
|
+
|
134
|
+
def concept1_ref(node, ref)
|
135
|
+
if r = node.at(ns("./xref | ./eref | ./termref"))
|
136
|
+
return r.remove if ref == "false"
|
137
|
+
|
138
|
+
r.name == "termref" and
|
139
|
+
r.replace(@i18n.term_defined_in.sub(/%/, r.to_xml)) or
|
140
|
+
r.replace("(#{r.to_xml})")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def concept1(node)
|
145
|
+
node.replace(node&.at(ns("./renderterm"))&.children ||
|
146
|
+
node&.at(ns("./refterm"))&.children ||
|
147
|
+
node.children)
|
148
|
+
end
|
149
|
+
|
150
|
+
# we're assuming terms and clauses in the right place for display,
|
151
|
+
# to cope with multiple terms sections
|
152
|
+
|
153
|
+
def display_order(docxml)
|
154
|
+
i = 0
|
155
|
+
i = display_order_xpath(docxml, "//preface/*", i)
|
156
|
+
i = display_order_at(docxml, "//clause[@type = 'scope']", i)
|
157
|
+
i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
|
158
|
+
# i = display_order_at(docxml, "//sections/terms | "\
|
159
|
+
# "//sections/clause[descendant::terms]", i)
|
160
|
+
# i = display_order_at(docxml, "//sections/definitions", i)
|
161
|
+
# i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
162
|
+
i = display_order_xpath(docxml, "//sections/clause[not(@type = 'scope')] | "\
|
163
|
+
"//sections/terms | //sections/definitions", i)
|
164
|
+
i = display_order_xpath(docxml, "//annex", i)
|
165
|
+
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
166
|
+
display_order_xpath(docxml, "//indexsect", i)
|
167
|
+
end
|
168
|
+
|
116
169
|
include Init
|
117
170
|
end
|
118
171
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require "isodoc"
|
2
|
-
require "
|
2
|
+
require "mnconvert"
|
3
3
|
|
4
4
|
module IsoDoc
|
5
5
|
module Iso
|
6
|
-
|
7
6
|
class StsConvert < IsoDoc::XslfoPdfConvert
|
8
7
|
def initialize(_options) # rubocop:disable Lint/MissingSuper
|
9
8
|
@libdir = File.dirname(__FILE__)
|
@@ -14,14 +13,14 @@ module IsoDoc
|
|
14
13
|
def convert(in_fname, file = nil, debug = false, out_fname = nil)
|
15
14
|
file = File.read(in_fname, encoding: "utf-8") if file.nil?
|
16
15
|
_docxml, filename, dir = convert_init(file, in_fname, debug)
|
17
|
-
|
16
|
+
/\.xml$/.match?(in_fname) or
|
18
17
|
in_fname = Tempfile.open([filename, ".xml"], encoding: "utf-8") do |f|
|
19
18
|
f.write file
|
20
19
|
f.path
|
21
20
|
end
|
22
|
-
end
|
23
21
|
FileUtils.rm_rf dir
|
24
|
-
|
22
|
+
MnConvert.convert(in_fname, out_fname || "#{filename}.#{@suffix}",
|
23
|
+
MnConvert::InputFormat::MN)
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
@@ -14,34 +14,34 @@ module IsoDoc
|
|
14
14
|
@htmlToClevels = 3 if @htmlToClevels.zero?
|
15
15
|
end
|
16
16
|
|
17
|
+
def font_choice(options)
|
18
|
+
if options[:script] == "Hans" then '"Source Han Sans",serif'
|
19
|
+
else '"Cambria",serif'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
17
23
|
def default_fonts(options)
|
18
|
-
{
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
monospacefontsize: "9.0pt",
|
26
|
-
smallerfontsize: "10.0pt",
|
27
|
-
footnotefontsize: "10.0pt",
|
28
|
-
}
|
24
|
+
{ bodyfont: font_choice(options),
|
25
|
+
headerfont: font_choice(options),
|
26
|
+
monospacefont: '"Courier New",monospace',
|
27
|
+
normalfontsize: "11.0pt",
|
28
|
+
monospacefontsize: "9.0pt",
|
29
|
+
smallerfontsize: "10.0pt",
|
30
|
+
footnotefontsize: "10.0pt" }
|
29
31
|
end
|
30
32
|
|
31
33
|
def default_file_locations(options)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
olstyle: "l2",
|
44
|
-
}
|
34
|
+
a = options[:alt] ? "style-human.scss" : "style-iso.scss"
|
35
|
+
{ htmlstylesheet: html_doc_path(a),
|
36
|
+
htmlcoverpage: html_doc_path("html_iso_titlepage.html"),
|
37
|
+
htmlintropage: html_doc_path("html_iso_intro.html"),
|
38
|
+
wordstylesheet: html_doc_path("wordstyle.scss"),
|
39
|
+
standardstylesheet: html_doc_path("isodoc.scss"),
|
40
|
+
header: html_doc_path("header.html"),
|
41
|
+
wordcoverpage: html_doc_path("word_iso_titlepage.html"),
|
42
|
+
wordintropage: html_doc_path("word_iso_intro.html"),
|
43
|
+
ulstyle: "l3",
|
44
|
+
olstyle: "l2" }
|
45
45
|
end
|
46
46
|
|
47
47
|
def make_body(xml, docxml)
|
@@ -54,9 +54,10 @@ module IsoDoc
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def colophon(body,
|
58
|
-
stage =
|
57
|
+
def colophon(body, _docxml)
|
58
|
+
stage = @meta.get[:stage_int]
|
59
59
|
return if !stage.nil? && stage < 60
|
60
|
+
|
60
61
|
body.br **{ clear: "all", style: "page-break-before:left;"\
|
61
62
|
"mso-break-type:section-break" }
|
62
63
|
body.div **{ class: "colophon" } do |div|
|
@@ -67,35 +68,55 @@ module IsoDoc
|
|
67
68
|
super
|
68
69
|
xml.xpath("//div[@class = 'figure']//table[@class = 'dl']").each do |t|
|
69
70
|
t["class"] = "figdl"
|
70
|
-
d = t.add_previous_sibling("<div class='figdl'
|
71
|
+
d = t.add_previous_sibling("<div class='figdl' "\
|
72
|
+
"style='page-break-after:avoid;'/>")
|
71
73
|
t.parent = d.first
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
77
|
# force Annex h2 down to be p.h2Annex, so it is not picked up by ToC
|
76
|
-
def word_annex_cleanup1(docxml,
|
77
|
-
docxml.xpath("//h#{
|
78
|
+
def word_annex_cleanup1(docxml, lvl)
|
79
|
+
docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
|
78
80
|
h2.name = "p"
|
79
|
-
h2["class"] = "h#{
|
81
|
+
h2["class"] = "h#{lvl}Annex"
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
83
85
|
def word_annex_cleanup(docxml)
|
84
|
-
word_annex_cleanup1(docxml,
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
86
|
+
(2..6).each { |i| word_annex_cleanup1(docxml, i) }
|
87
|
+
end
|
88
|
+
|
89
|
+
def word_annex_cleanup_h1(docxml)
|
90
|
+
docxml.xpath("//h1[@class = 'Annex']").each do |h|
|
91
|
+
h.name = "p"
|
92
|
+
h["class"] = "ANNEX"
|
93
|
+
end
|
94
|
+
%w(BiblioTitle ForewordTitle IntroTitle).each do |s|
|
95
|
+
docxml.xpath("//*[@class = '#{s}']").each do |h|
|
96
|
+
h.name = "p"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def style_cleanup(docxml)
|
102
|
+
word_annex_cleanup_h1(docxml)
|
103
|
+
style_cleanup1(docxml)
|
104
|
+
end
|
105
|
+
|
106
|
+
def style_cleanup1(docxml)
|
107
|
+
docxml.xpath("//*[@class = 'example']").each do |p|
|
108
|
+
p["class"] = "Example"
|
109
|
+
end
|
89
110
|
end
|
90
111
|
|
91
112
|
def authority_hdr_cleanup(docxml)
|
92
|
-
docxml&.xpath("//div[@class = 'boilerplate-license']")
|
113
|
+
docxml&.xpath("//div[@class = 'boilerplate-license']")&.each do |d|
|
93
114
|
d.xpath(".//h1").each do |p|
|
94
115
|
p.name = "p"
|
95
116
|
p["class"] = "zzWarningHdr"
|
96
117
|
end
|
97
118
|
end
|
98
|
-
docxml&.xpath("//div[@class = 'boilerplate-copyright']")
|
119
|
+
docxml&.xpath("//div[@class = 'boilerplate-copyright']")&.each do |d|
|
99
120
|
d.xpath(".//h1").each do |p|
|
100
121
|
p.name = "p"
|
101
122
|
p["class"] = "zzCopyrightHdr"
|
@@ -120,11 +141,104 @@ module IsoDoc
|
|
120
141
|
def word_cleanup(docxml)
|
121
142
|
authority_hdr_cleanup(docxml)
|
122
143
|
super
|
144
|
+
style_cleanup(docxml)
|
123
145
|
docxml
|
124
146
|
end
|
125
147
|
|
126
|
-
def
|
127
|
-
|
148
|
+
def word_toc_preface(level)
|
149
|
+
<<~TOC.freeze
|
150
|
+
<span lang="EN-GB"><span
|
151
|
+
style='mso-element:field-begin'></span><span
|
152
|
+
style='mso-spacerun:yes'> </span>TOC
|
153
|
+
\\o "1-#{level}" \\h \\z \\t "Heading
|
154
|
+
1;1;ANNEX;1;Biblio Title;1;Foreword Title;1;Intro Title;1" <span
|
155
|
+
style='mso-element:field-separator'></span></span>
|
156
|
+
TOC
|
157
|
+
end
|
158
|
+
|
159
|
+
def footnote_reference_format(link)
|
160
|
+
link.children =
|
161
|
+
"<span class='MsoFootnoteReference'>#{link.children.to_xml}</span>)"
|
162
|
+
end
|
163
|
+
|
164
|
+
def bibliography_attrs
|
165
|
+
{ class: "BiblioTitle" }
|
166
|
+
end
|
167
|
+
|
168
|
+
def bibliography(xml, out)
|
169
|
+
f = xml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or return
|
170
|
+
page_break(out)
|
171
|
+
out.div do |div|
|
172
|
+
div.h1 **bibliography_attrs do |h1|
|
173
|
+
f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
|
174
|
+
end
|
175
|
+
biblio_list(f, div, true)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def bibliography_parse(node, out)
|
180
|
+
node["hidden"] != true or return
|
181
|
+
out.div do |div|
|
182
|
+
clause_parse_title(node, div, node.at(ns("./title")), out,
|
183
|
+
bibliography_attrs)
|
184
|
+
biblio_list(node, div, true)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def para_class(node)
|
189
|
+
if !node.ancestors("definition").empty? && !@in_footnote
|
190
|
+
"Definition"
|
191
|
+
elsif !node.ancestors("foreword").empty? && !@in_footnote
|
192
|
+
"ForewordText"
|
193
|
+
else
|
194
|
+
super
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def termref_attrs
|
199
|
+
{ class: "Source" }
|
200
|
+
end
|
201
|
+
|
202
|
+
def termref_parse(node, out)
|
203
|
+
out.p **termref_attrs do |p|
|
204
|
+
p << "[TERMREF]"
|
205
|
+
node.children.each { |n| parse(n, p) }
|
206
|
+
p << "[/TERMREF]"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def figure_name_attrs(node)
|
211
|
+
s = node.ancestors("annex").empty? ? "FigureTitle" : "AnnexFigureTitle"
|
212
|
+
{ class: s, style: "text-align:center;" }
|
213
|
+
end
|
214
|
+
|
215
|
+
def figure_name_parse(node, div, name)
|
216
|
+
return if name.nil?
|
217
|
+
|
218
|
+
div.p **figure_name_attrs(node) do |p|
|
219
|
+
name.children.each { |n| parse(n, p) }
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def table_title_attrs(node)
|
224
|
+
s = node.ancestors("annex").empty? ? "Tabletitle" : "AnnexTableTitle"
|
225
|
+
{ class: s, style: "text-align:center;" }
|
226
|
+
end
|
227
|
+
|
228
|
+
def table_title_parse(node, out)
|
229
|
+
name = node.at(ns("./name")) or return
|
230
|
+
out.p **table_title_attrs(node) do |p|
|
231
|
+
name&.children&.each { |n| parse(n, p) }
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def annex_name(_annex, name, div)
|
236
|
+
return if name.nil?
|
237
|
+
|
238
|
+
name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
|
239
|
+
div.h1 **{ class: "Annex" } do |t|
|
240
|
+
name.children.each { |c2| parse(c2, t) }
|
241
|
+
end
|
128
242
|
end
|
129
243
|
|
130
244
|
include BaseConvert
|
data/lib/isodoc/iso/xref.rb
CHANGED
@@ -8,7 +8,7 @@ module IsoDoc
|
|
8
8
|
if @klass.amd(doc)
|
9
9
|
initial_anchor_names_amd(doc)
|
10
10
|
else
|
11
|
-
|
11
|
+
initial_anchor_names1(doc)
|
12
12
|
end
|
13
13
|
introduction_names(doc.at(ns("//introduction")))
|
14
14
|
end
|
@@ -26,6 +26,22 @@ module IsoDoc
|
|
26
26
|
termexample_anchor_names(doc)
|
27
27
|
end
|
28
28
|
|
29
|
+
def initial_anchor_names1(doc)
|
30
|
+
doc.xpath(ns("//preface/*")).each { |c| c.element? and preface_names(c) }
|
31
|
+
# potentially overridden in middle_section_asset_names()
|
32
|
+
sequential_asset_names(doc.xpath(ns("//preface/*")))
|
33
|
+
n = Counter.new
|
34
|
+
n = section_names(doc.at(ns("//clause[@type = 'scope']")), n, 1)
|
35
|
+
n = section_names(doc.at(ns(@klass.norm_ref_xpath)), n, 1)
|
36
|
+
doc.xpath(ns("//sections/clause[not(@type = 'scope')] | "\
|
37
|
+
"//sections/terms | //sections/definitions")).each do |c|
|
38
|
+
n = section_names(c, n, 1)
|
39
|
+
end
|
40
|
+
middle_section_asset_names(doc)
|
41
|
+
termnote_anchor_names(doc)
|
42
|
+
termexample_anchor_names(doc)
|
43
|
+
end
|
44
|
+
|
29
45
|
# we can reference 0-number clauses in introduction
|
30
46
|
def introduction_names(clause)
|
31
47
|
return if clause.nil?
|