isodoc 1.7.3.1 → 1.7.6.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/isodoc.gemspec +7 -4
- data/lib/isodoc/class_utils.rb +2 -2
- data/lib/isodoc/convert.rb +2 -0
- data/lib/isodoc/function/blocks_example_note.rb +85 -79
- data/lib/isodoc/function/cleanup.rb +181 -175
- data/lib/isodoc/function/inline.rb +110 -108
- data/lib/isodoc/function/inline_simple.rb +55 -55
- data/lib/isodoc/function/lists.rb +75 -71
- data/lib/isodoc/function/references.rb +165 -160
- data/lib/isodoc/function/section.rb +140 -190
- data/lib/isodoc/function/section_titles.rb +82 -0
- data/lib/isodoc/function/table.rb +90 -87
- data/lib/isodoc/function/terms.rb +58 -56
- data/lib/isodoc/function/to_word_html.rb +3 -1
- data/lib/isodoc/function/utils.rb +34 -14
- data/lib/isodoc/html_function/comments.rb +107 -111
- data/lib/isodoc/html_function/footnotes.rb +68 -67
- data/lib/isodoc/html_function/html.rb +113 -103
- data/lib/isodoc/html_function/mathvariant_to_plain.rb +5 -3
- data/lib/isodoc/presentation_function/block.rb +73 -78
- data/lib/isodoc/presentation_function/concept.rb +68 -0
- data/lib/isodoc/presentation_function/image.rb +112 -0
- data/lib/isodoc/presentation_function/inline.rb +6 -39
- data/lib/isodoc/presentation_function/math.rb +9 -0
- data/lib/isodoc/presentation_function/section.rb +12 -1
- data/lib/isodoc/presentation_xml_convert.rb +3 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +176 -174
- data/lib/isodoc/word_function/comments.rb +117 -112
- data/lib/isodoc/word_function/footnotes.rb +88 -86
- data/lib/isodoc/word_function/inline.rb +42 -67
- data/lib/isodoc/word_function/postprocess_cover.rb +121 -110
- data/lib/isodoc/xref/xref_gen.rb +153 -150
- data/lib/isodoc/xslfo_convert.rb +2 -2
- data/spec/assets/odf.svg +1 -4
- data/spec/isodoc/blocks_spec.rb +187 -32
- data/spec/isodoc/inline_spec.rb +300 -116
- data/spec/isodoc/postproc_spec.rb +38 -0
- data/spec/isodoc/presentation_xml_spec.rb +144 -0
- data/spec/isodoc/section_spec.rb +764 -0
- data/spec/isodoc/terms_spec.rb +116 -0
- metadata +63 -18
@@ -41,6 +41,7 @@ module IsoDoc
|
|
41
41
|
def convert
|
42
42
|
docxml.xpath("//m:math", MATHML).each do |elem|
|
43
43
|
next if nothing_to_style(elem)
|
44
|
+
|
44
45
|
mathml1(elem)
|
45
46
|
end
|
46
47
|
docxml
|
@@ -49,7 +50,8 @@ module IsoDoc
|
|
49
50
|
private
|
50
51
|
|
51
52
|
def nothing_to_style(elem)
|
52
|
-
!elem.at("./*[@mathvariant][not(@mathvariant = 'normal')]
|
53
|
+
!elem.at("./*[@mathvariant][not(@mathvariant = 'normal')]"\
|
54
|
+
"[not(@mathvariant = 'italic')]")
|
53
55
|
end
|
54
56
|
|
55
57
|
def mathml1(base_elem)
|
@@ -58,7 +60,7 @@ module IsoDoc
|
|
58
60
|
.merge(MATHVARIANT_TO_PLANE_MAPPINGS)
|
59
61
|
.each_pair do |mathvariant_list, plain_font|
|
60
62
|
base_elem.xpath(mathvariant_xpath(mathvariant_list)).each do |elem|
|
61
|
-
|
63
|
+
to_plane(elem, plain_font)
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -69,7 +71,7 @@ module IsoDoc
|
|
69
71
|
.join
|
70
72
|
end
|
71
73
|
|
72
|
-
def
|
74
|
+
def to_plane(elem, font)
|
73
75
|
elem.traverse do |n|
|
74
76
|
next unless n.text?
|
75
77
|
|
@@ -1,55 +1,24 @@
|
|
1
|
-
|
1
|
+
require_relative "./image"
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
5
|
-
def lower2cap(
|
6
|
-
return
|
5
|
+
def lower2cap(text)
|
6
|
+
return text if /^[[:upper:]][[:upper:]]/.match?(text)
|
7
7
|
|
8
|
-
|
8
|
+
text.capitalize
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
docxml.xpath(ns("//image")).each { |f| svg_extract(f) }
|
13
|
-
docxml.xpath(ns("//figure")).each { |f| figure1(f) }
|
14
|
-
docxml.xpath(ns("//svgmap")).each do |s|
|
15
|
-
if f = s.at(ns("./figure")) then s.replace(f)
|
16
|
-
else
|
17
|
-
s.remove
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def svg_extract(elem)
|
23
|
-
return unless %r{^data:image/svg\+xml;base64,}.match?(elem["src"])
|
24
|
-
|
25
|
-
svg = Base64.strict_decode64(elem["src"]
|
26
|
-
.sub(%r{^data:image/svg\+xml;base64,}, ""))
|
27
|
-
x = Nokogiri::XML.fragment(svg.sub(/<\?xml[^>]*>/, "")) do |config|
|
28
|
-
config.huge
|
29
|
-
end
|
30
|
-
elem.replace(x)
|
31
|
-
end
|
32
|
-
|
33
|
-
def figure1(f)
|
34
|
-
return sourcecode1(f) if f["class"] == "pseudocode" || f["type"] == "pseudocode"
|
35
|
-
return if labelled_ancestor(f) && f.ancestors("figure").empty?
|
36
|
-
return if f.at(ns("./figure")) and !f.at(ns("./name"))
|
37
|
-
|
38
|
-
lbl = @xrefs.anchor(f['id'], :label, false) or return
|
39
|
-
prefix_name(f, " — ",
|
40
|
-
l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
|
41
|
-
end
|
42
|
-
|
43
|
-
def prefix_name(f, delim, number, elem)
|
11
|
+
def prefix_name(node, delim, number, elem)
|
44
12
|
return if number.nil? || number.empty?
|
45
13
|
|
46
|
-
unless name =
|
47
|
-
|
48
|
-
|
49
|
-
|
14
|
+
unless name = node.at(ns("./#{elem}"))
|
15
|
+
node.children.empty? and node.add_child("<#{elem}></#{elem}>") or
|
16
|
+
node.children.first.previous = "<#{elem}></#{elem}>"
|
17
|
+
name = node.children.first
|
18
|
+
end
|
19
|
+
if name.children.empty? then name.add_child(number)
|
20
|
+
else (name.children.first.previous = "#{number}#{delim}")
|
50
21
|
end
|
51
|
-
name.children.empty? ? name.add_child(number) :
|
52
|
-
( name.children.first.previous = "#{number}#{delim}" )
|
53
22
|
end
|
54
23
|
|
55
24
|
def sourcecode(docxml)
|
@@ -58,12 +27,13 @@ module IsoDoc
|
|
58
27
|
end
|
59
28
|
end
|
60
29
|
|
61
|
-
def sourcecode1(
|
62
|
-
return if labelled_ancestor(
|
63
|
-
return unless
|
30
|
+
def sourcecode1(elem)
|
31
|
+
return if labelled_ancestor(elem)
|
32
|
+
return unless elem.ancestors("example").empty?
|
64
33
|
|
65
|
-
lbl = @xrefs.anchor(
|
66
|
-
prefix_name(
|
34
|
+
lbl = @xrefs.anchor(elem["id"], :label, false) or return
|
35
|
+
prefix_name(elem, " — ",
|
36
|
+
l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
|
67
37
|
end
|
68
38
|
|
69
39
|
def formula(docxml)
|
@@ -73,9 +43,9 @@ module IsoDoc
|
|
73
43
|
end
|
74
44
|
|
75
45
|
# introduce name element
|
76
|
-
def formula1(
|
77
|
-
lbl = @xrefs.anchor(
|
78
|
-
prefix_name(
|
46
|
+
def formula1(elem)
|
47
|
+
lbl = @xrefs.anchor(elem["id"], :label, false)
|
48
|
+
prefix_name(elem, "", lbl, "name")
|
79
49
|
end
|
80
50
|
|
81
51
|
def example(docxml)
|
@@ -90,11 +60,14 @@ module IsoDoc
|
|
90
60
|
end
|
91
61
|
end
|
92
62
|
|
93
|
-
def example1(
|
94
|
-
n = @xrefs.get[
|
95
|
-
lbl =
|
96
|
-
|
97
|
-
|
63
|
+
def example1(elem)
|
64
|
+
n = @xrefs.get[elem["id"]]
|
65
|
+
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
66
|
+
@i18n.example
|
67
|
+
else
|
68
|
+
l10n("#{@i18n.example} #{n[:label]}")
|
69
|
+
end
|
70
|
+
prefix_name(elem, " — ", lbl, "name")
|
98
71
|
end
|
99
72
|
|
100
73
|
def note(docxml)
|
@@ -104,13 +77,16 @@ module IsoDoc
|
|
104
77
|
end
|
105
78
|
|
106
79
|
# introduce name element
|
107
|
-
def note1(
|
108
|
-
return if
|
80
|
+
def note1(elem)
|
81
|
+
return if elem.parent.name == "bibitem"
|
109
82
|
|
110
|
-
n = @xrefs.get[
|
111
|
-
lbl =
|
112
|
-
|
113
|
-
|
83
|
+
n = @xrefs.get[elem["id"]]
|
84
|
+
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
85
|
+
@i18n.note
|
86
|
+
else
|
87
|
+
l10n("#{@i18n.note} #{n[:label]}")
|
88
|
+
end
|
89
|
+
prefix_name(elem, "", lbl, "name")
|
114
90
|
end
|
115
91
|
|
116
92
|
def termnote(docxml)
|
@@ -120,9 +96,27 @@ module IsoDoc
|
|
120
96
|
end
|
121
97
|
|
122
98
|
# introduce name element
|
123
|
-
def termnote1(
|
124
|
-
lbl = l10n(@xrefs.anchor(
|
125
|
-
prefix_name(
|
99
|
+
def termnote1(elem)
|
100
|
+
lbl = l10n(@xrefs.anchor(elem["id"], :label) || "???")
|
101
|
+
prefix_name(elem, "", lower2cap(lbl), "name")
|
102
|
+
end
|
103
|
+
|
104
|
+
def termdefinition(docxml)
|
105
|
+
docxml.xpath(ns("//term[definition]")).each do |f|
|
106
|
+
termdefinition1(f)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def termdefinition1(elem)
|
111
|
+
return unless elem.xpath(ns("./definition")).size > 1
|
112
|
+
|
113
|
+
d = elem.at(ns("./definition"))
|
114
|
+
d = d.replace("<ol><li>#{d.children.to_xml}</li></ol>").first
|
115
|
+
elem.xpath(ns("./definition")).each do |f|
|
116
|
+
f = f.replace("<li>#{f.children.to_xml}</li>").first
|
117
|
+
d << f
|
118
|
+
end
|
119
|
+
d.wrap("<definition></definition>")
|
126
120
|
end
|
127
121
|
|
128
122
|
def recommendation(docxml)
|
@@ -144,10 +138,10 @@ module IsoDoc
|
|
144
138
|
end
|
145
139
|
|
146
140
|
# introduce name element
|
147
|
-
def recommendation1(
|
148
|
-
n = @xrefs.anchor(
|
141
|
+
def recommendation1(elem, type)
|
142
|
+
n = @xrefs.anchor(elem["id"], :label, false)
|
149
143
|
lbl = (n.nil? ? type : l10n("#{type} #{n}"))
|
150
|
-
prefix_name(
|
144
|
+
prefix_name(elem, "", lbl, "name")
|
151
145
|
end
|
152
146
|
|
153
147
|
def table(docxml)
|
@@ -156,12 +150,13 @@ module IsoDoc
|
|
156
150
|
end
|
157
151
|
end
|
158
152
|
|
159
|
-
def table1(
|
160
|
-
return if labelled_ancestor(
|
161
|
-
return if
|
153
|
+
def table1(elem)
|
154
|
+
return if labelled_ancestor(elem)
|
155
|
+
return if elem["unnumbered"] && !elem.at(ns("./name"))
|
162
156
|
|
163
|
-
n = @xrefs.anchor(
|
164
|
-
prefix_name(
|
157
|
+
n = @xrefs.anchor(elem["id"], :label, false)
|
158
|
+
prefix_name(elem, " — ", l10n("#{lower2cap @i18n.table} #{n}"),
|
159
|
+
"name")
|
165
160
|
end
|
166
161
|
|
167
162
|
# we use this to eliminate the semantic amend blocks from rendering
|
@@ -171,11 +166,11 @@ module IsoDoc
|
|
171
166
|
end
|
172
167
|
end
|
173
168
|
|
174
|
-
def amend1(
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
169
|
+
def amend1(elem)
|
170
|
+
elem.xpath(ns("./autonumber")).each(&:remove)
|
171
|
+
elem.xpath(ns("./newcontent")).each { |a| a.name = "quote" }
|
172
|
+
elem.xpath(ns("./description")).each { |a| a.replace(a.children) }
|
173
|
+
elem.replace(elem.children)
|
179
174
|
end
|
180
175
|
end
|
181
176
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
|
+
def concept(docxml)
|
4
|
+
docxml.xpath(ns("//concept")).each { |f| concept1(f) }
|
5
|
+
end
|
6
|
+
|
7
|
+
def concept1(node)
|
8
|
+
xref = node&.at(ns("./xref/@target"))&.text or
|
9
|
+
return concept_render(node, ital: node["ital"] || "true",
|
10
|
+
ref: node["ref"] || "true",
|
11
|
+
linkref: node["linkref"] || "true",
|
12
|
+
linkmention: node["linkmention"] || "false")
|
13
|
+
if node.at(ns("//definitions//dt[@id = '#{xref}']"))
|
14
|
+
concept_render(node, ital: node["ital"] || "false",
|
15
|
+
ref: node["ref"] || "false",
|
16
|
+
linkref: node["linkref"] || "true",
|
17
|
+
linkmention: node["linkmention"] || "false")
|
18
|
+
else concept_render(node, ital: node["ital"] || "true",
|
19
|
+
ref: node["ref"] || "true",
|
20
|
+
linkref: node["linkref"] || "true",
|
21
|
+
linkmention: node["linkmention"] || "false")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def concept_render(node, opts)
|
26
|
+
node&.at(ns("./refterm"))&.remove
|
27
|
+
r = node.at(ns("./renderterm"))
|
28
|
+
ref = node.at(ns("./xref | ./eref | ./termref"))
|
29
|
+
ref && opts[:ref] != "false" and r&.next = " "
|
30
|
+
opts[:ital] == "true" and r&.name = "em"
|
31
|
+
if opts[:linkmention] == "true" && !r.nil? && !ref.nil?
|
32
|
+
ref2 = ref.clone
|
33
|
+
r2 = r.clone
|
34
|
+
r.replace(ref2).children = r2
|
35
|
+
end
|
36
|
+
concept1_ref(node, ref, opts)
|
37
|
+
if opts[:ital] == "false"
|
38
|
+
r = node.at(ns(".//renderterm"))
|
39
|
+
r&.replace(r&.children)
|
40
|
+
end
|
41
|
+
node.replace(node.children)
|
42
|
+
end
|
43
|
+
|
44
|
+
def concept1_ref(_node, ref, opts)
|
45
|
+
ref.nil? and return
|
46
|
+
return ref.remove if opts[:ref] == "false"
|
47
|
+
|
48
|
+
r = concept1_ref_content(ref)
|
49
|
+
ref = r.at("./descendant-or-self::xmlns:xref | "\
|
50
|
+
"./descendant-or-self::xmlns:eref | "\
|
51
|
+
"./descendant-or-self::xmlns:termref")
|
52
|
+
%w(xref eref).include? ref&.name and get_linkend(ref)
|
53
|
+
if opts[:linkref] == "false" && %w(xref eref).include?(ref&.name)
|
54
|
+
ref.replace(ref.children)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def concept1_ref_content(ref)
|
59
|
+
if non_locality_elems(ref).select do |c|
|
60
|
+
!c.text? || /\S/.match(c)
|
61
|
+
end.empty?
|
62
|
+
ref.replace(@i18n.term_defined_in.sub(/%/,
|
63
|
+
ref.to_xml))
|
64
|
+
else ref.replace("[#{ref.to_xml}]")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require "base64"
|
2
|
+
require "emf2svg"
|
3
|
+
|
4
|
+
module IsoDoc
|
5
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
6
|
+
def figure(docxml)
|
7
|
+
docxml.xpath(ns("//image")).each { |f| svg_extract(f) }
|
8
|
+
docxml.xpath(ns("//figure")).each { |f| figure1(f) }
|
9
|
+
docxml.xpath(ns("//svgmap")).each do |s|
|
10
|
+
if f = s.at(ns("./figure")) then s.replace(f)
|
11
|
+
else s.remove
|
12
|
+
end
|
13
|
+
end
|
14
|
+
docxml.xpath(ns("//image")).each { |f| svg_emf_double(f) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def svg_extract(elem)
|
18
|
+
return unless %r{^data:image/svg\+xml;}.match?(elem["src"])
|
19
|
+
|
20
|
+
svg = Base64.strict_decode64(elem["src"]
|
21
|
+
.sub(%r{^data:image/svg\+xml;(charset=[^;]+;)?base64,}, ""))
|
22
|
+
x = Nokogiri::XML.fragment(svg.sub(/<\?xml[^>]*>/, "")) do |config|
|
23
|
+
config.huge
|
24
|
+
end
|
25
|
+
elem["src"] = ""
|
26
|
+
elem.children = x
|
27
|
+
end
|
28
|
+
|
29
|
+
def figure1(elem)
|
30
|
+
return sourcecode1(elem) if elem["class"] == "pseudocode" ||
|
31
|
+
elem["type"] == "pseudocode"
|
32
|
+
return if labelled_ancestor(elem) && elem.ancestors("figure").empty? ||
|
33
|
+
elem.at(ns("./figure")) && !elem.at(ns("./name"))
|
34
|
+
|
35
|
+
lbl = @xrefs.anchor(elem["id"], :label, false) or return
|
36
|
+
prefix_name(elem, " — ",
|
37
|
+
l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
|
38
|
+
end
|
39
|
+
|
40
|
+
def svg_emf_double(img)
|
41
|
+
if emf?(img["mimetype"])
|
42
|
+
img = emf_encode(img)
|
43
|
+
img.children.first.previous = emf_to_svg(img)
|
44
|
+
elsif img["mimetype"] == "image/svg+xml"
|
45
|
+
src = svg_to_emf(img) and img << "<emf src='#{src}'/>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def emf_encode(img)
|
50
|
+
img["mimetype"] = "image/svg+xml"
|
51
|
+
unless %r{^data:image}.match?(img["src"])
|
52
|
+
img["src"] = Metanorma::Utils::datauri(img["src"])
|
53
|
+
end
|
54
|
+
img.children = "<emf src='#{img['src']}'/>"
|
55
|
+
img["src"] = ""
|
56
|
+
img
|
57
|
+
end
|
58
|
+
|
59
|
+
def emf_to_svg(img)
|
60
|
+
emf = Metanorma::Utils::save_dataimage(img.at(ns("./emf/@src")).text)
|
61
|
+
Emf2svg.from_file(emf).sub(/<\?[^>]+>/, "")
|
62
|
+
end
|
63
|
+
|
64
|
+
def svg_to_emf(node)
|
65
|
+
uri = svg_to_emf_uri(node)
|
66
|
+
ret = svg_to_emf_filename(uri)
|
67
|
+
File.exists?(ret) and return ret
|
68
|
+
exe = inkscape_installed? or return nil
|
69
|
+
uri = Metanorma::Utils::external_path uri
|
70
|
+
exe = Metanorma::Utils::external_path exe
|
71
|
+
system(%(#{exe} --export-type="emf" #{uri})) and
|
72
|
+
return Metanorma::Utils::datauri(ret)
|
73
|
+
|
74
|
+
warn %(Fail on #{exe} --export-type="emf" #{uri})
|
75
|
+
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
|
79
|
+
def svg_to_emf_uri(node)
|
80
|
+
uri = if node&.elements&.first&.name == "svg"
|
81
|
+
a = Base64.strict_encode64(node.children.to_xml)
|
82
|
+
"data:image/svg+xml;base64,#{a}"
|
83
|
+
else node["src"]
|
84
|
+
end
|
85
|
+
if %r{^data:}.match?(uri)
|
86
|
+
uri = save_dataimage(uri)
|
87
|
+
@tempfile_cache << uri
|
88
|
+
end
|
89
|
+
uri
|
90
|
+
end
|
91
|
+
|
92
|
+
def svg_to_emf_filename(uri)
|
93
|
+
"#{File.join(File.dirname(uri), File.basename(uri, '.*'))}.emf"
|
94
|
+
end
|
95
|
+
|
96
|
+
def emf_to_svgfilename(uri)
|
97
|
+
"#{File.join(File.dirname(uri), File.basename(uri, '.*'))}.svg"
|
98
|
+
end
|
99
|
+
|
100
|
+
def inkscape_installed?
|
101
|
+
cmd = "inkscape"
|
102
|
+
exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
|
103
|
+
ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
|
104
|
+
exts.each do |ext|
|
105
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
106
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require "metanorma-utils"
|
2
|
+
require_relative "./concept"
|
3
|
+
|
1
4
|
module IsoDoc
|
2
5
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
6
|
def prefix_container(container, linkend, _target)
|
@@ -67,7 +70,7 @@ module IsoDoc
|
|
67
70
|
link += eref_localities(node.xpath(ns("./locality | ./localityStack")),
|
68
71
|
link, node)
|
69
72
|
non_locality_elems(node).each(&:remove)
|
70
|
-
node.add_child(link)
|
73
|
+
node.add_child(cleanup_entities(link))
|
71
74
|
end
|
72
75
|
# so not <origin bibitemid="ISO7301" citeas="ISO 7301">
|
73
76
|
# <locality type="section"><reference>3.1</reference></locality></origin>
|
@@ -88,8 +91,7 @@ module IsoDoc
|
|
88
91
|
ret += eref_localities0(rr, j, target, delim, node)
|
89
92
|
delim = ","
|
90
93
|
end
|
91
|
-
else
|
92
|
-
ret += eref_localities0(ref, idx, target, delim, node)
|
94
|
+
else ret += eref_localities0(ref, idx, target, delim, node)
|
93
95
|
end
|
94
96
|
ret
|
95
97
|
end
|
@@ -130,7 +132,7 @@ module IsoDoc
|
|
130
132
|
loc = @i18n.locality[type] || type.sub(/^locality:/, "")
|
131
133
|
loc = case node["case"]
|
132
134
|
when "lowercase" then loc.downcase
|
133
|
-
else loc
|
135
|
+
else Metanorma::Utils.strict_capitalize_first(loc)
|
134
136
|
end
|
135
137
|
" #{loc}"
|
136
138
|
end
|
@@ -155,41 +157,6 @@ module IsoDoc
|
|
155
157
|
get_linkend(node)
|
156
158
|
end
|
157
159
|
|
158
|
-
def concept(docxml)
|
159
|
-
docxml.xpath(ns("//concept")).each { |f| concept1(f) }
|
160
|
-
end
|
161
|
-
|
162
|
-
def concept1(node)
|
163
|
-
xref = node&.at(ns("./xref/@target"))&.text or
|
164
|
-
return concept_render(node, node["ital"] || "true",
|
165
|
-
node["ref"] || "true")
|
166
|
-
if node.at(ns("//definitions//dt[@id = '#{xref}']"))
|
167
|
-
concept_render(node, node["ital"] || "false", node["ref"] || "false")
|
168
|
-
else concept_render(node, node["ital"] || "true", node["ref"] || "true")
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def concept_render(node, ital, ref)
|
173
|
-
node&.at(ns("./refterm"))&.remove
|
174
|
-
r = node.at(ns("./renderterm"))
|
175
|
-
r&.next = " " if node.at(ns("./xref | ./eref | ./termref")) && ref != "false"
|
176
|
-
if ital == "true" then r&.name = "em"
|
177
|
-
else r&.replace(r&.children)
|
178
|
-
end
|
179
|
-
concept1_ref(node, ref)
|
180
|
-
node.replace(node.children)
|
181
|
-
end
|
182
|
-
|
183
|
-
def concept1_ref(node, ref)
|
184
|
-
r = node.at(ns("./xref | ./eref | ./termref")) or return
|
185
|
-
return r.remove if ref == "false"
|
186
|
-
|
187
|
-
if non_locality_elems(r).select { |c| !c.text? || /\S/.match(c) }.empty?
|
188
|
-
r.replace(@i18n.term_defined_in.sub(/%/, r.to_xml))
|
189
|
-
else r.replace("[#{r.to_xml}]")
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
160
|
def variant(docxml)
|
194
161
|
docxml.xpath(ns("//variant")).each { |f| variant1(f) }
|
195
162
|
docxml.xpath(ns("//variant[@remove = 'true']")).each(&:remove)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "twitter_cldr"
|
2
2
|
require "bigdecimal"
|
3
|
+
require "mathml2asciimath"
|
3
4
|
|
4
5
|
module IsoDoc
|
5
6
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
@@ -70,7 +71,15 @@ module IsoDoc
|
|
70
71
|
locale
|
71
72
|
end
|
72
73
|
|
74
|
+
def asciimath_dup(node)
|
75
|
+
return if @suppressasciimathdup
|
76
|
+
|
77
|
+
a = MathML2AsciiMath.m2a(node.to_xml)
|
78
|
+
node.next = "<!-- #{a} -->"
|
79
|
+
end
|
80
|
+
|
73
81
|
def mathml1(node, locale)
|
82
|
+
asciimath_dup(node)
|
74
83
|
localize_maths(node, locale)
|
75
84
|
return unless node.elements.size == 1 && node.elements.first.name == "mn"
|
76
85
|
|
@@ -78,12 +78,23 @@ module IsoDoc
|
|
78
78
|
i = display_order_at(docxml, "//clause[@type = 'scope']", i)
|
79
79
|
i = display_order_at(docxml, @xrefs.klass.norm_ref_xpath, i)
|
80
80
|
i = display_order_at(docxml, "//sections/terms | "\
|
81
|
-
|
81
|
+
"//sections/clause[descendant::terms]", i)
|
82
82
|
i = display_order_at(docxml, "//sections/definitions", i)
|
83
83
|
i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
84
84
|
i = display_order_xpath(docxml, "//annex", i)
|
85
85
|
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
86
86
|
display_order_xpath(docxml, "//indexsect", i)
|
87
87
|
end
|
88
|
+
|
89
|
+
def clausetitle(docxml)
|
90
|
+
docxml.xpath(ns("//variant-title[@type = 'toc']")).each(&:remove)
|
91
|
+
end
|
92
|
+
|
93
|
+
def toc(docxml)
|
94
|
+
docxml.xpath(ns("//toc//xref[text()]")).each do |x|
|
95
|
+
lbl = @xrefs.get[x["target"]][:label] or next
|
96
|
+
x.children.first.previous = "#{lbl}<tab/>"
|
97
|
+
end
|
98
|
+
end
|
88
99
|
end
|
89
100
|
end
|
@@ -34,6 +34,8 @@ module IsoDoc
|
|
34
34
|
term docxml
|
35
35
|
references docxml
|
36
36
|
index docxml
|
37
|
+
clausetitle docxml
|
38
|
+
toc docxml
|
37
39
|
display_order docxml
|
38
40
|
end
|
39
41
|
|
@@ -47,6 +49,7 @@ module IsoDoc
|
|
47
49
|
termexample docxml
|
48
50
|
note docxml
|
49
51
|
termnote docxml
|
52
|
+
termdefinition docxml
|
50
53
|
permission docxml
|
51
54
|
requirement docxml
|
52
55
|
recommendation docxml
|
data/lib/isodoc/version.rb
CHANGED