metanorma-iso 2.0.8 → 2.1.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/lib/html2doc/lists.rb +37 -0
- data/lib/isodoc/iso/base_convert.rb +1 -1
- data/lib/isodoc/iso/html/html_iso_titlepage.html +5 -0
- data/lib/isodoc/iso/html/isodoc-dis.css +304 -242
- data/lib/isodoc/iso/html/isodoc-dis.scss +379 -260
- data/lib/isodoc/iso/html/word_iso_intro-dis.html +7 -0
- data/lib/isodoc/iso/html/word_iso_titlepage-dis.html +4 -3
- data/lib/isodoc/iso/html/word_iso_titlepage.html +10 -4
- data/lib/isodoc/iso/html/wordstyle-dis.css +168 -48
- data/lib/isodoc/iso/html/wordstyle-dis.scss +158 -43
- data/lib/isodoc/iso/html_convert.rb +2 -2
- data/lib/isodoc/iso/i18n-en.yaml +1 -0
- data/lib/isodoc/iso/i18n-fr.yaml +1 -0
- data/lib/isodoc/iso/i18n-ru.yaml +1 -0
- data/lib/isodoc/iso/i18n-zh-Hans.yaml +1 -0
- data/lib/isodoc/iso/init.rb +17 -1
- data/lib/isodoc/iso/iso.amendment.xsl +1697 -426
- data/lib/isodoc/iso/iso.international-standard.xsl +1697 -426
- data/lib/isodoc/iso/metadata.rb +13 -19
- data/lib/isodoc/iso/presentation_inline.rb +90 -0
- data/lib/isodoc/iso/presentation_xml_convert.rb +41 -100
- data/lib/isodoc/iso/presentation_xref.rb +126 -0
- data/lib/isodoc/iso/sections.rb +2 -2
- data/lib/isodoc/iso/word_cleanup.rb +16 -2
- data/lib/isodoc/iso/word_convert.rb +29 -12
- data/lib/isodoc/iso/word_dis_convert.rb +183 -0
- data/lib/isodoc/iso/xref.rb +46 -25
- data/lib/metanorma/iso/biblio.rng +37 -8
- data/lib/metanorma/iso/boilerplate-fr.xml +1 -1
- data/lib/metanorma/iso/boilerplate-ru.xml +1 -3
- data/lib/metanorma/iso/boilerplate.xml +1 -3
- data/lib/metanorma/iso/cleanup.rb +2 -1
- data/lib/metanorma/iso/isodoc.rng +56 -0
- data/lib/metanorma/iso/version.rb +1 -1
- data/lib/metanorma-iso.rb +1 -0
- data/lib/relaton/render/config.yml +4 -0
- data/lib/relaton/render/general.rb +13 -0
- data/metanorma-iso.gemspec +1 -1
- data/spec/isodoc/amd_spec.rb +31 -30
- data/spec/isodoc/blocks_spec.rb +286 -179
- data/spec/isodoc/i18n_spec.rb +187 -21
- data/spec/isodoc/inline_spec.rb +35 -42
- data/spec/isodoc/iso_spec.rb +1 -1
- data/spec/isodoc/metadata_spec.rb +17 -17
- data/spec/isodoc/postproc_spec.rb +28 -3
- data/spec/isodoc/ref_spec.rb +66 -69
- data/spec/isodoc/section_spec.rb +78 -76
- data/spec/isodoc/table_spec.rb +2 -2
- data/spec/isodoc/terms_spec.rb +2 -2
- data/spec/isodoc/word_dis_spec.rb +760 -0
- data/spec/isodoc/xref_spec.rb +51 -51
- data/spec/metanorma/base_spec.rb +10 -10
- data/spec/spec_helper.rb +11 -1
- data/spec/vcr_cassettes/withdrawn_iso.yml +26 -26
- metadata +11 -5
- data/spec/vcr_cassettes/docrels.yml +0 -385
data/lib/isodoc/iso/metadata.rb
CHANGED
@@ -21,8 +21,7 @@ module IsoDoc
|
|
21
21
|
stage = "DTS" if stage == "DIS"
|
22
22
|
stage = "FDTS" if stage == "FDIS"
|
23
23
|
end
|
24
|
-
%w(PWI NWIP WD CD).include?(stage) && iter and
|
25
|
-
stage += iter
|
24
|
+
%w(PWI NWIP WD CD).include?(stage) && iter and stage += iter
|
26
25
|
stage = "Pre#{stage}" if /^0\./.match?(draft)
|
27
26
|
stage
|
28
27
|
end
|
@@ -32,9 +31,7 @@ module IsoDoc
|
|
32
31
|
set(:unpublished, false)
|
33
32
|
revdate = isoxml.at(ns("//bibdata/version/revision-date"))
|
34
33
|
set(:revdate, revdate&.text)
|
35
|
-
|
36
|
-
docstatus1(isoxml, docstatus)
|
37
|
-
end
|
34
|
+
docstatus and docstatus1(isoxml, docstatus)
|
38
35
|
end
|
39
36
|
|
40
37
|
def docstatus1(isoxml, docstatus)
|
@@ -97,25 +94,25 @@ module IsoDoc
|
|
97
94
|
suffix = @c.encode(part.text, :hexadecimal)
|
98
95
|
p = titlenums[:part]
|
99
96
|
titlenums[:part] && titlenums[:subpart] and
|
100
|
-
p = "#{titlenums[:part]}
|
97
|
+
p = "#{titlenums[:part]}–#{titlenums[:subpart]}"
|
101
98
|
titlenums[:part] and
|
102
|
-
suffix = "#{part_label(lang)}
|
99
|
+
suffix = "#{part_label(lang)} #{p}: " + suffix
|
103
100
|
suffix
|
104
101
|
end
|
105
102
|
|
106
103
|
def part_prefix(titlenums, lang)
|
107
104
|
p = titlenums[:part]
|
108
105
|
titlenums[:part] && titlenums[:subpart] and
|
109
|
-
p = "#{titlenums[:part]}
|
110
|
-
"#{part_label(lang)}
|
106
|
+
p = "#{titlenums[:part]}–#{titlenums[:subpart]}"
|
107
|
+
"#{part_label(lang)} #{p}"
|
111
108
|
end
|
112
109
|
|
113
110
|
def amd_prefix(titlenums, lang)
|
114
|
-
"#{amd_label(lang)}
|
111
|
+
"#{amd_label(lang)} #{titlenums[:amd]}"
|
115
112
|
end
|
116
113
|
|
117
114
|
def corr_prefix(titlenums, lang)
|
118
|
-
"#{corr_label(lang)}
|
115
|
+
"#{corr_label(lang)} #{titlenums[:corr]}"
|
119
116
|
end
|
120
117
|
|
121
118
|
def compose_title(tparts, tnums, lang)
|
@@ -124,10 +121,10 @@ module IsoDoc
|
|
124
121
|
main = @c.encode(tparts[:main].text, :hexadecimal)
|
125
122
|
tparts[:intro] &&
|
126
123
|
main = "#{@c.encode(tparts[:intro].text,
|
127
|
-
:hexadecimal)}
|
124
|
+
:hexadecimal)} — #{main}"
|
128
125
|
if tparts[:part]
|
129
126
|
suffix = part_title(tparts[:part], tnums, lang)
|
130
|
-
main = "#{main}
|
127
|
+
main = "#{main} — #{suffix}"
|
131
128
|
end
|
132
129
|
main
|
133
130
|
end
|
@@ -164,10 +161,9 @@ module IsoDoc
|
|
164
161
|
@c.encode(tp[:main] ? tp[:main].text : "", :hexadecimal))
|
165
162
|
main = compose_title(tp, tn, lang)
|
166
163
|
set(:doctitle, main)
|
167
|
-
|
164
|
+
tp[:intro] and
|
168
165
|
set(:doctitleintro,
|
169
166
|
@c.encode(tp[:intro] ? tp[:intro].text : "", :hexadecimal))
|
170
|
-
end
|
171
167
|
set(:doctitlepartlabel, part_prefix(tn, lang))
|
172
168
|
set(:doctitlepart, @c.encode(tp[:part].text, :hexadecimal)) if tp[:part]
|
173
169
|
set(:doctitleamdlabel, amd_prefix(tn, lang)) if tn[:amd]
|
@@ -184,15 +180,13 @@ module IsoDoc
|
|
184
180
|
@c.encode(tp[:main] ? tp[:main].text : "", :hexadecimal))
|
185
181
|
main = compose_title(tp, tn, lang)
|
186
182
|
set(:docsubtitle, main)
|
187
|
-
|
183
|
+
tp[:intro] and
|
188
184
|
set(:docsubtitleintro,
|
189
185
|
@c.encode(tp[:intro] ? tp[:intro].text : "", :hexadecimal))
|
190
|
-
end
|
191
186
|
set(:docsubtitlepartlabel, part_prefix(tn, lang))
|
192
|
-
|
187
|
+
tp[:part] and
|
193
188
|
set(:docsubtitlepart,
|
194
189
|
@c.encode(tp[:part].text, :hexadecimal))
|
195
|
-
end
|
196
190
|
set(:docsubtitleamdlabel, amd_prefix(tn, lang)) if tn[:amd]
|
197
191
|
set(:docsubtitleamd, @c.encode(tp[:amd].text, :hexadecimal)) if tp[:amd]
|
198
192
|
set(:docsubtitlecorrlabel, corr_prefix(tn, lang)) if tn[:corr]
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module Iso
|
3
|
+
class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
|
4
|
+
def xref_init(lang, script, klass, labels, options)
|
5
|
+
@xrefs = Xref.new(lang, script, klass, labels, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def eref_delim(delim, type)
|
9
|
+
if delim == ";" then ";"
|
10
|
+
else type == "list" ? " " : delim
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def can_conflate_eref_rendering?(refs)
|
15
|
+
super or return false
|
16
|
+
|
17
|
+
first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
|
18
|
+
refs.first.at(ns("./locality/referenceFrom"))&.text)
|
19
|
+
refs.all? do |r|
|
20
|
+
subclause?(nil, r.at(ns("./locality/@type"))&.text,
|
21
|
+
r.at(ns("./locality/referenceFrom"))&.text) == first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def locality_delimiter(loc)
|
26
|
+
loc&.next_element&.attribute("type")&.text == "list" and return " "
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def eref_localities_conflated(refs, target, node)
|
31
|
+
droploc = node["droploc"]
|
32
|
+
node["droploc"] = true
|
33
|
+
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
34
|
+
node))
|
35
|
+
node["droploc"] = droploc
|
36
|
+
eref_localities1(target,
|
37
|
+
prefix_clause(target, refs.first.at(ns("./locality"))),
|
38
|
+
l10n(ret[1..-1].join), nil, node, @lang)
|
39
|
+
end
|
40
|
+
|
41
|
+
def prefix_clause(target, loc)
|
42
|
+
loc["type"] == "clause" or return loc["type"]
|
43
|
+
|
44
|
+
if subclause?(target, loc["type"],
|
45
|
+
loc&.at(ns("./referenceFrom"))&.text)
|
46
|
+
""
|
47
|
+
else
|
48
|
+
"clause"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def subclause?(target, type, from)
|
53
|
+
(from&.match?(/\./) && type == "clause") ||
|
54
|
+
type == "list" || target&.match(/^IEV$|^IEC 60050-/)
|
55
|
+
end
|
56
|
+
|
57
|
+
def eref_localities1_zh(target, type, from, upto, node)
|
58
|
+
ret = " 第#{from}" if from
|
59
|
+
ret += "–#{upto}" if upto
|
60
|
+
if node["droploc"] != "true" && !subclause?(target, type, from)
|
61
|
+
ret += eref_locality_populate(type, node)
|
62
|
+
end
|
63
|
+
ret += ")" if type == "list"
|
64
|
+
ret
|
65
|
+
end
|
66
|
+
|
67
|
+
def eref_localities1(target, type, from, upto, node, lang = "en")
|
68
|
+
return nil if type == "anchor"
|
69
|
+
|
70
|
+
type = type.downcase
|
71
|
+
lang == "zh" and
|
72
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
73
|
+
ret = if node["droploc"] != "true" && !subclause?(target, type,
|
74
|
+
from)
|
75
|
+
eref_locality_populate(type, node)
|
76
|
+
else ""
|
77
|
+
end
|
78
|
+
ret += " #{from}" if from
|
79
|
+
ret += "–#{upto}" if upto
|
80
|
+
ret += ")" if type == "list"
|
81
|
+
l10n(ret)
|
82
|
+
end
|
83
|
+
|
84
|
+
def prefix_container(container, linkend, target)
|
85
|
+
delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
|
86
|
+
l10n(@xrefs.anchor(container, :xref) + delim + linkend)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
require_relative "init"
|
2
2
|
require "isodoc"
|
3
3
|
require_relative "index"
|
4
|
+
require_relative "presentation_inline"
|
5
|
+
require_relative "presentation_xref"
|
6
|
+
require_relative "../../relaton/render/general"
|
4
7
|
|
5
8
|
module IsoDoc
|
6
9
|
module Iso
|
7
10
|
class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
|
8
11
|
def convert1(docxml, filename, dir)
|
12
|
+
@iso_class = instance_of?(IsoDoc::Iso::PresentationXMLConvert)
|
9
13
|
if amd(docxml)
|
10
14
|
@oldsuppressheadingnumbers = @suppressheadingnumbers
|
11
15
|
@suppressheadingnumbers = true
|
@@ -22,104 +26,19 @@ module IsoDoc
|
|
22
26
|
amd(isoxml) and @suppressheadingnumbers = true
|
23
27
|
end
|
24
28
|
|
25
|
-
def xref_init(lang, script, klass, labels, options)
|
26
|
-
@xrefs = Xref.new(lang, script, klass, labels, options)
|
27
|
-
end
|
28
|
-
|
29
29
|
def figure1(node)
|
30
30
|
lbl = @xrefs.anchor(node["id"], :label, false) or return
|
31
31
|
figname = node.parent.name == "figure" ? "" : "#{@i18n.figure} "
|
32
|
-
connective = node.parent.name == "figure" ? "
|
32
|
+
connective = node.parent.name == "figure" ? "  " : " — "
|
33
33
|
prefix_name(node, connective, l10n("#{figname}#{lbl}"), "name")
|
34
34
|
end
|
35
35
|
|
36
36
|
def example1(node)
|
37
37
|
n = @xrefs.get[node["id"]]
|
38
|
-
lbl = if n.nil? || n[:label]
|
39
|
-
|
40
|
-
else
|
41
|
-
l10n("#{@i18n.example} #{n[:label]}")
|
38
|
+
lbl = if n.nil? || blank?(n[:label]) then @i18n.example
|
39
|
+
else l10n("#{@i18n.example} #{n[:label]}")
|
42
40
|
end
|
43
|
-
prefix_name(node, "
|
44
|
-
end
|
45
|
-
|
46
|
-
def eref_delim(delim, type)
|
47
|
-
if delim == ";" then ";"
|
48
|
-
else type == "list" ? " " : delim
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def can_conflate_eref_rendering?(refs)
|
53
|
-
super or return false
|
54
|
-
|
55
|
-
first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
|
56
|
-
refs.first.at(ns("./locality/referenceFrom"))&.text)
|
57
|
-
refs.all? do |r|
|
58
|
-
subclause?(nil, r.at(ns("./locality/@type"))&.text,
|
59
|
-
r.at(ns("./locality/referenceFrom"))&.text) == first
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def locality_delimiter(loc)
|
64
|
-
loc&.next_element&.attribute("type")&.text == "list" and return " "
|
65
|
-
super
|
66
|
-
end
|
67
|
-
|
68
|
-
def eref_localities_conflated(refs, target, node)
|
69
|
-
droploc = node["droploc"]
|
70
|
-
node["droploc"] = true
|
71
|
-
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
72
|
-
node))
|
73
|
-
node["droploc"] = droploc
|
74
|
-
eref_localities1(target,
|
75
|
-
prefix_clause(target, refs.first.at(ns("./locality"))),
|
76
|
-
l10n(ret[1..-1].join), nil, node, @lang)
|
77
|
-
end
|
78
|
-
|
79
|
-
def prefix_clause(target, loc)
|
80
|
-
loc["type"] == "clause" or return loc["type"]
|
81
|
-
|
82
|
-
if subclause?(target, loc["type"], loc&.at(ns("./referenceFrom"))&.text)
|
83
|
-
""
|
84
|
-
else
|
85
|
-
"clause"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def subclause?(target, type, from)
|
90
|
-
(from&.match?(/\./) && type == "clause") ||
|
91
|
-
type == "list" || target&.match(/^IEV$|^IEC 60050-/)
|
92
|
-
end
|
93
|
-
|
94
|
-
def eref_localities1_zh(target, type, from, upto, node)
|
95
|
-
ret = " 第#{from}" if from
|
96
|
-
ret += "–#{upto}" if upto
|
97
|
-
if node["droploc"] != "true" && !subclause?(target, type, from)
|
98
|
-
ret += eref_locality_populate(type, node)
|
99
|
-
end
|
100
|
-
ret += ")" if type == "list"
|
101
|
-
ret
|
102
|
-
end
|
103
|
-
|
104
|
-
def eref_localities1(target, type, from, upto, node, lang = "en")
|
105
|
-
return nil if type == "anchor"
|
106
|
-
|
107
|
-
type = type.downcase
|
108
|
-
lang == "zh" and
|
109
|
-
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
110
|
-
ret = if node["droploc"] != "true" && !subclause?(target, type, from)
|
111
|
-
eref_locality_populate(type, node)
|
112
|
-
else ""
|
113
|
-
end
|
114
|
-
ret += " #{from}" if from
|
115
|
-
ret += "–#{upto}" if upto
|
116
|
-
ret += ")" if type == "list"
|
117
|
-
l10n(ret)
|
118
|
-
end
|
119
|
-
|
120
|
-
def prefix_container(container, linkend, target)
|
121
|
-
delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
|
122
|
-
l10n(@xrefs.anchor(container, :xref) + delim + linkend)
|
41
|
+
prefix_name(node, " — ", lbl, "name")
|
123
42
|
end
|
124
43
|
|
125
44
|
def example_span_label(_node, div, name)
|
@@ -141,8 +60,7 @@ module IsoDoc
|
|
141
60
|
def clause(docxml)
|
142
61
|
docxml.xpath(ns("//clause[not(ancestor::annex)] | "\
|
143
62
|
"//terms | //definitions | //references | "\
|
144
|
-
"//preface/introduction[clause]"))
|
145
|
-
.each do |f|
|
63
|
+
"//preface/introduction[clause]")).each do |f|
|
146
64
|
clause1(f)
|
147
65
|
end
|
148
66
|
end
|
@@ -158,9 +76,7 @@ module IsoDoc
|
|
158
76
|
def concept_term(docxml)
|
159
77
|
docxml.xpath(ns("//term")).each do |f|
|
160
78
|
m = {}
|
161
|
-
f.xpath(ns(".//concept")).each
|
162
|
-
concept_term1(c, m)
|
163
|
-
end
|
79
|
+
f.xpath(ns(".//concept")).each { |c| concept_term1(c, m) }
|
164
80
|
end
|
165
81
|
end
|
166
82
|
|
@@ -177,12 +93,11 @@ module IsoDoc
|
|
177
93
|
end
|
178
94
|
|
179
95
|
def concept1_ref_content(ref)
|
180
|
-
if ref.name == "termref"
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
96
|
+
repl = if ref.name == "termref"
|
97
|
+
@i18n.term_defined_in.sub(/%/, ref.to_xml)
|
98
|
+
else "(#{ref.to_xml})"
|
99
|
+
end
|
100
|
+
ref.replace(repl)
|
186
101
|
end
|
187
102
|
|
188
103
|
def concept1(node)
|
@@ -244,6 +159,32 @@ module IsoDoc
|
|
244
159
|
super
|
245
160
|
end
|
246
161
|
|
162
|
+
def admonition1(elem)
|
163
|
+
super
|
164
|
+
return unless n = elem.at(ns("./name"))
|
165
|
+
|
166
|
+
p = n.next_element
|
167
|
+
return unless p.name == "p"
|
168
|
+
|
169
|
+
p.children.first.previous = admonition_name(n.remove.children.to_xml)
|
170
|
+
end
|
171
|
+
|
172
|
+
def admonition_name(xml)
|
173
|
+
"#{xml} — "
|
174
|
+
end
|
175
|
+
|
176
|
+
def bibrenderer
|
177
|
+
::Relaton::Render::Iso::General.new(language: @lang, i18nhash: @i18n.get)
|
178
|
+
end
|
179
|
+
|
180
|
+
def bibrender(xml)
|
181
|
+
unless xml.at(ns("./formattedref"))
|
182
|
+
xml.children =
|
183
|
+
"#{bibrenderer.render(xml.to_xml)}"\
|
184
|
+
"#{xml.xpath(ns('./docidentifier | ./uri | ./note')).to_xml}"
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
247
188
|
include Init
|
248
189
|
end
|
249
190
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module Iso
|
3
|
+
class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
|
4
|
+
def xref_init(lang, script, klass, labels, options)
|
5
|
+
@xrefs = Xref.new(lang, script, klass, labels, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
def eref_delim(delim, type)
|
9
|
+
if delim == ";" then ";"
|
10
|
+
else type == "list" ? " " : delim
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def can_conflate_eref_rendering?(refs)
|
15
|
+
super or return false
|
16
|
+
|
17
|
+
first = subclause?(nil, refs.first.at(ns("./locality/@type"))&.text,
|
18
|
+
refs.first.at(ns("./locality/referenceFrom"))&.text)
|
19
|
+
refs.all? do |r|
|
20
|
+
subclause?(nil, r.at(ns("./locality/@type"))&.text,
|
21
|
+
r.at(ns("./locality/referenceFrom"))&.text) == first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def locality_delimiter(loc)
|
26
|
+
loc&.next_element&.attribute("type")&.text == "list" and return " "
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def eref_localities_conflated(refs, target, node)
|
31
|
+
droploc = node["droploc"]
|
32
|
+
node["droploc"] = true
|
33
|
+
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
34
|
+
node))
|
35
|
+
node["droploc"] = droploc
|
36
|
+
eref_localities1(target,
|
37
|
+
prefix_clause(target, refs.first.at(ns("./locality"))),
|
38
|
+
l10n(ret[1..-1].join), nil, node, @lang)
|
39
|
+
end
|
40
|
+
|
41
|
+
def prefix_clause(target, loc)
|
42
|
+
loc["type"] == "clause" or return loc["type"]
|
43
|
+
|
44
|
+
if subclause?(target, loc["type"],
|
45
|
+
loc&.at(ns("./referenceFrom"))&.text)
|
46
|
+
""
|
47
|
+
else "clause"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def subclause?(target, type, from)
|
52
|
+
(from&.match?(/\./) && type == "clause") ||
|
53
|
+
type == "list" ||
|
54
|
+
target&.gsub(/<[^>]+>/, "")&.match(/^IEV$|^IEC 60050-/)
|
55
|
+
end
|
56
|
+
|
57
|
+
LOCALITY2SPAN = {
|
58
|
+
annex: "citeapp",
|
59
|
+
dunno: "citebase",
|
60
|
+
dunno2: "citebib",
|
61
|
+
dunno3: "citebox",
|
62
|
+
dunno4: "citeen",
|
63
|
+
dunno5: "citeeq",
|
64
|
+
figure: "citefig",
|
65
|
+
dunno6: "citefn",
|
66
|
+
clause: "citesec",
|
67
|
+
dunno7: "citesection",
|
68
|
+
table: "citetbl",
|
69
|
+
dunno8: "citetfn",
|
70
|
+
}.freeze
|
71
|
+
|
72
|
+
def locality_span_wrap(ret, type)
|
73
|
+
type or return ret
|
74
|
+
m = /^(\s*)(.+?)(\s*)$/.match(ret) or return ret
|
75
|
+
ret = [m[1], m[2], m[3]]
|
76
|
+
spanclass = LOCALITY2SPAN[type.to_sym] and
|
77
|
+
ret[1] = "<span class='#{spanclass}'>#{ret[1]}</span>"
|
78
|
+
ret.join
|
79
|
+
end
|
80
|
+
|
81
|
+
def eref_localities1_zh(target, type, from, upto, node)
|
82
|
+
ret = " 第#{from}" if from
|
83
|
+
ret += "–#{upto}" if upto
|
84
|
+
node["droploc"] != "true" && !subclause?(target, type, from) and
|
85
|
+
ret += eref_locality_populate(type, node)
|
86
|
+
ret += ")" if type == "list"
|
87
|
+
locality_span_wrap(ret, type)
|
88
|
+
end
|
89
|
+
|
90
|
+
def eref_localities1(target, type, from, upto, node, lang = "en")
|
91
|
+
return nil if type == "anchor"
|
92
|
+
|
93
|
+
type = type.downcase
|
94
|
+
lang == "zh" and
|
95
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
96
|
+
ret = ""
|
97
|
+
node["droploc"] != "true" && !subclause?(target, type, from) and
|
98
|
+
ret = eref_locality_populate(type, node)
|
99
|
+
ret += " #{from}" if from
|
100
|
+
ret += "–#{upto}" if upto
|
101
|
+
ret += ")" if type == "list"
|
102
|
+
ret = l10n(ret)
|
103
|
+
locality_span_wrap(ret, type)
|
104
|
+
end
|
105
|
+
|
106
|
+
def prefix_container(container, linkend, target)
|
107
|
+
delim = @xrefs.anchor(target, :type) == "listitem" ? " " : ", "
|
108
|
+
l10n(@xrefs.anchor(container, :xref) + delim + linkend)
|
109
|
+
end
|
110
|
+
|
111
|
+
def expand_citeas(text)
|
112
|
+
std_docid_semantic(super)
|
113
|
+
end
|
114
|
+
|
115
|
+
def anchor_value(id)
|
116
|
+
locality_span_wrap(super, @xrefs.anchor(id, :subtype) ||
|
117
|
+
@xrefs.anchor(id, :type))
|
118
|
+
end
|
119
|
+
|
120
|
+
def anchor_linkend1(node)
|
121
|
+
locality_span_wrap(super, @xrefs.anchor(node["target"], :subtype) ||
|
122
|
+
@xrefs.anchor(node["target"], :type))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/lib/isodoc/iso/sections.rb
CHANGED
@@ -9,9 +9,9 @@ module IsoDoc
|
|
9
9
|
def middle_title_main(out)
|
10
10
|
out.p(**{ class: "zzSTDTitle1" }) do |p|
|
11
11
|
p << @meta.get[:doctitleintro]
|
12
|
-
p << "
|
12
|
+
p << " — " if @meta.get[:doctitleintro] && @meta.get[:doctitlemain]
|
13
13
|
p << @meta.get[:doctitlemain]
|
14
|
-
p << "
|
14
|
+
p << " — " if @meta.get[:doctitlemain] && @meta.get[:doctitlepart]
|
15
15
|
end
|
16
16
|
a = @meta.get[:doctitlepart] and out.p(**{ class: "zzSTDTitle2" }) do |p|
|
17
17
|
b = @meta.get[:doctitlepartlabel] and p << "#{b}: "
|
@@ -65,7 +65,7 @@ module IsoDoc
|
|
65
65
|
insert = docxml.at("//div[@id = 'boilerplate-license-destination']")
|
66
66
|
auth = docxml&.at("//div[@class = 'boilerplate-license']")&.remove
|
67
67
|
auth&.xpath(".//p[not(@class)]")&.each { |p| p["class"] = "zzWarning" }
|
68
|
-
auth and insert.children = auth
|
68
|
+
auth and insert and insert.children = auth
|
69
69
|
insert = docxml.at("//div[@id = 'boilerplate-copyright-destination']")
|
70
70
|
auth = docxml&.at("//div[@class = 'boilerplate-copyright']")&.remove
|
71
71
|
auth&.xpath(".//p[not(@class)]")&.each do |p|
|
@@ -80,7 +80,8 @@ module IsoDoc
|
|
80
80
|
auth&.xpath(".//p[@id = 'boilerplate-place']")&.each do |p|
|
81
81
|
p["class"] = "zzCopyright1"
|
82
82
|
end
|
83
|
-
auth and insert.children = auth
|
83
|
+
auth and insert and insert.children = auth
|
84
|
+
coverpage_note_cleanup(docxml)
|
84
85
|
end
|
85
86
|
|
86
87
|
def word_cleanup(docxml)
|
@@ -89,6 +90,19 @@ module IsoDoc
|
|
89
90
|
style_cleanup(docxml)
|
90
91
|
docxml
|
91
92
|
end
|
93
|
+
|
94
|
+
# supply missing annex title
|
95
|
+
def make_WordToC(docxml, level)
|
96
|
+
toc = ""
|
97
|
+
xpath = (1..level).each.map { |i| "//h#{i}" }.join (" | ")
|
98
|
+
docxml.xpath(xpath).each do |h|
|
99
|
+
x = ""
|
100
|
+
x = @anchor[h.parent["id"]][:xref] if h["class"] == "ANNEX"
|
101
|
+
toc += word_toc_entry(h.name[1].to_i, x + header_strip(h))
|
102
|
+
end
|
103
|
+
toc.sub(/(<p class="MsoToc1">)/,
|
104
|
+
%{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
|
105
|
+
end
|
92
106
|
end
|
93
107
|
end
|
94
108
|
end
|
@@ -2,6 +2,7 @@ require_relative "base_convert"
|
|
2
2
|
require "isodoc"
|
3
3
|
require_relative "init"
|
4
4
|
require_relative "word_cleanup"
|
5
|
+
require_relative "word_dis_convert"
|
5
6
|
|
6
7
|
module IsoDoc
|
7
8
|
module Iso
|
@@ -13,6 +14,11 @@ module IsoDoc
|
|
13
14
|
@wordToClevels = 3 if @wordToClevels.zero?
|
14
15
|
@htmlToClevels = options[:htmltoclevels].to_i
|
15
16
|
@htmlToClevels = 3 if @htmlToClevels.zero?
|
17
|
+
init_dis
|
18
|
+
end
|
19
|
+
|
20
|
+
def init_dis
|
21
|
+
@dis = ::IsoDoc::Iso::WordDISConvert.new(options)
|
16
22
|
end
|
17
23
|
|
18
24
|
def font_choice(options)
|
@@ -45,16 +51,16 @@ module IsoDoc
|
|
45
51
|
olstyle: "l2" }
|
46
52
|
end
|
47
53
|
|
48
|
-
def
|
49
|
-
|
50
|
-
if
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
@
|
55
|
-
|
54
|
+
def convert(input_filename, file = nil, debug = false,
|
55
|
+
output_filename = nil)
|
56
|
+
file = File.read(input_filename, encoding: "utf-8") if file.nil?
|
57
|
+
docxml = Nokogiri::XML(file) { |config| config.huge }
|
58
|
+
if @dis &&
|
59
|
+
/^[45].$/.match?(docxml&.at(ns("//bibdata/status/stage"))&.text)
|
60
|
+
@dis.convert(input_filename, file, debug, output_filename)
|
61
|
+
else
|
62
|
+
super
|
56
63
|
end
|
57
|
-
super
|
58
64
|
end
|
59
65
|
|
60
66
|
def make_body(xml, docxml)
|
@@ -82,8 +88,8 @@ module IsoDoc
|
|
82
88
|
<span lang="EN-GB"><span
|
83
89
|
style='mso-element:field-begin'></span><span
|
84
90
|
style='mso-spacerun:yes'> </span>TOC
|
85
|
-
\\o
|
86
|
-
1;1;ANNEX;1;Biblio Title;1;Foreword Title;1;Intro Title;1
|
91
|
+
\\o "1-#{level}" \\h \\z \\t "Heading
|
92
|
+
1;1;ANNEX;1;Biblio Title;1;Foreword Title;1;Intro Title;1" <span
|
87
93
|
style='mso-element:field-separator'></span></span>
|
88
94
|
TOC
|
89
95
|
end
|
@@ -171,11 +177,22 @@ module IsoDoc
|
|
171
177
|
|
172
178
|
name&.at(ns("./strong"))&.remove # supplied by CSS list numbering
|
173
179
|
div.h1 **{ class: "Annex" } do |t|
|
174
|
-
name
|
180
|
+
annex_name1(name, t)
|
175
181
|
clause_parse_subtitle(name, t)
|
176
182
|
end
|
177
183
|
end
|
178
184
|
|
185
|
+
def annex_name1(name, out)
|
186
|
+
name.children.each do |c2|
|
187
|
+
if c2.name == "span" && c2["class"] == "obligation"
|
188
|
+
out.span **{ style: "font-weight:normal;" } do |s|
|
189
|
+
c2.children.each { |c3| parse(c3, s) }
|
190
|
+
end
|
191
|
+
else parse(c2, out)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
179
196
|
include BaseConvert
|
180
197
|
include Init
|
181
198
|
end
|