isodoc 2.3.6 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/isodoc.gemspec +2 -1
- data/lib/isodoc/base_style/typography.scss +5 -2
- data/lib/isodoc/class_utils.rb +6 -1
- data/lib/isodoc/convert.rb +7 -4
- data/lib/isodoc/function/blocks.rb +1 -1
- data/lib/isodoc/function/inline.rb +4 -4
- data/lib/isodoc/function/inline_simple.rb +2 -1
- data/lib/isodoc/function/references.rb +38 -52
- data/lib/isodoc/function/table.rb +21 -12
- data/lib/isodoc/function/to_word_html.rb +1 -0
- data/lib/isodoc/function/utils.rb +4 -0
- data/lib/isodoc/html_function/html.rb +6 -25
- data/lib/isodoc/html_function/postprocess_cover.rb +6 -9
- data/lib/isodoc/metadata.rb +5 -0
- data/lib/isodoc/presentation_function/bibdata.rb +9 -9
- data/lib/isodoc/presentation_function/block.rb +99 -33
- data/lib/isodoc/presentation_function/erefs.rb +49 -35
- data/lib/isodoc/presentation_function/refs.rb +76 -4
- data/lib/isodoc/presentation_function/section.rb +1 -1
- data/lib/isodoc/presentation_function/terms.rb +28 -23
- data/lib/isodoc/presentation_function/xrefs.rb +16 -7
- data/lib/isodoc/presentation_xml_convert.rb +2 -2
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/postprocess.rb +32 -3
- data/lib/isodoc/word_function/table.rb +24 -13
- data/lib/isodoc/xref/xref_gen.rb +11 -11
- metadata +19 -5
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "./image"
|
2
|
+
require "rouge"
|
2
3
|
|
3
4
|
module IsoDoc
|
4
5
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
@@ -25,24 +26,106 @@ module IsoDoc
|
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
29
|
+
def sourcehighlighter_theme
|
30
|
+
"igorpro"
|
31
|
+
end
|
32
|
+
|
33
|
+
def sourcehighlighter_css(docxml)
|
34
|
+
@sourcehighlighter or return
|
35
|
+
ins = docxml.at(ns("//misc-container")) ||
|
36
|
+
docxml.at(ns("//bibdata")).after("<misc-container/>").next_element
|
37
|
+
x = Rouge::Theme.find(sourcehighlighter_theme)
|
38
|
+
.render(scope: "sourcecode")
|
39
|
+
ins << "<source-highlighter-css>#{x}</source-highlighter-css>"
|
40
|
+
end
|
41
|
+
|
42
|
+
def sourcehighlighter
|
43
|
+
@sourcehighlighter or return
|
44
|
+
f = Rouge::Formatters::HTML.new
|
45
|
+
{ formatter: f,
|
46
|
+
formatter_line: Rouge::Formatters::HTMLTable.new(f, {}) }
|
47
|
+
end
|
48
|
+
|
28
49
|
def sourcecode(docxml)
|
50
|
+
sourcehighlighter_css(docxml)
|
51
|
+
@highlighter = sourcehighlighter
|
29
52
|
docxml.xpath(ns("//sourcecode")).each do |f|
|
30
53
|
sourcecode1(f)
|
31
54
|
end
|
32
55
|
end
|
33
56
|
|
34
57
|
def sourcecode1(elem)
|
35
|
-
|
58
|
+
source_highlight(elem)
|
59
|
+
source_label(elem)
|
60
|
+
end
|
61
|
+
|
62
|
+
def source_highlight(elem)
|
63
|
+
@highlighter or return
|
64
|
+
markup = source_remove_markup(elem)
|
65
|
+
p = source_lex(elem)
|
66
|
+
wrapper, code =
|
67
|
+
if elem["linenums"] == "true" then sourcecode_table_to_elem(elem, p)
|
68
|
+
else
|
69
|
+
r = Nokogiri::XML.fragment(@highlighter[:formatter].format(p))
|
70
|
+
[r, r]
|
71
|
+
end
|
72
|
+
elem.children = source_restore_markup(wrapper, code, markup)
|
73
|
+
end
|
74
|
+
|
75
|
+
def source_remove_markup(elem)
|
76
|
+
ret = {}
|
77
|
+
name = elem.at(ns("./name")) and ret[:name] = name.remove.to_xml
|
78
|
+
ret[:ann] = elem.xpath(ns("./annotation")).each(&:remove)
|
79
|
+
ret[:call] = elem.xpath(ns("./callout")).each_with_object([]) do |c, m|
|
80
|
+
m << { xml: c.remove.to_xml, line: c.line - elem.line }
|
81
|
+
end
|
82
|
+
ret
|
83
|
+
end
|
84
|
+
|
85
|
+
def source_restore_markup(wrapper, code, markup)
|
86
|
+
text = source_restore_callouts(code, markup[:call])
|
87
|
+
ret = if code == wrapper
|
88
|
+
text
|
89
|
+
else
|
90
|
+
code.replace(text)
|
91
|
+
to_xml(wrapper)
|
92
|
+
end
|
93
|
+
"#{markup[:name]}#{ret}#{markup[:ann]}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def source_restore_callouts(code, callouts)
|
97
|
+
text = to_xml(code)
|
98
|
+
text.split(/[\n\r]/).each_with_index do |c, i|
|
99
|
+
while !callouts.empty? && callouts[0][:line] == i
|
100
|
+
c.sub!(/\s+$/, " #{callouts[0][:xml]} ")
|
101
|
+
callouts.shift
|
102
|
+
end
|
103
|
+
end.join("\n")
|
104
|
+
end
|
36
105
|
|
106
|
+
def sourcecode_table_to_elem(elem, tokens)
|
107
|
+
r = Nokogiri::XML(@highlighter[:formatter_line].format(tokens)).root
|
108
|
+
pre = r.at(".//td[@class = 'rouge-code']/pre")
|
109
|
+
%w(style).each { |n| elem[n] and pre[n] = elem[n] }
|
110
|
+
pre.name = "sourcecode"
|
111
|
+
[r, pre]
|
112
|
+
end
|
113
|
+
|
114
|
+
def source_lex(elem)
|
115
|
+
l = (Rouge::Lexer.find(elem["lang"] || "plaintext") ||
|
116
|
+
Rouge::Lexer.find("plaintext"))
|
117
|
+
l.lex(@c.decode(elem.children.to_xml))
|
118
|
+
end
|
119
|
+
|
120
|
+
def source_label(elem)
|
121
|
+
labelled_ancestor(elem) and return
|
37
122
|
lbl = @xrefs.anchor(elem["id"], :label, false) or return
|
38
123
|
prefix_name(elem, block_delim,
|
39
124
|
l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
|
40
125
|
end
|
41
126
|
|
42
127
|
def formula(docxml)
|
43
|
-
docxml.xpath(ns("//formula")).each
|
44
|
-
formula1(f)
|
45
|
-
end
|
128
|
+
docxml.xpath(ns("//formula")).each { |f| formula1(f) }
|
46
129
|
end
|
47
130
|
|
48
131
|
def formula1(elem)
|
@@ -51,48 +134,38 @@ module IsoDoc
|
|
51
134
|
end
|
52
135
|
|
53
136
|
def example(docxml)
|
54
|
-
docxml.xpath(ns("//example")).each
|
55
|
-
example1(f)
|
56
|
-
end
|
137
|
+
docxml.xpath(ns("//example")).each { |f| example1(f) }
|
57
138
|
end
|
58
139
|
|
59
140
|
def example1(elem)
|
60
141
|
n = @xrefs.get[elem["id"]]
|
61
142
|
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
62
143
|
@i18n.example
|
63
|
-
else
|
64
|
-
l10n("#{@i18n.example} #{n[:label]}")
|
144
|
+
else l10n("#{@i18n.example} #{n[:label]}")
|
65
145
|
end
|
66
146
|
prefix_name(elem, block_delim, lbl, "name")
|
67
147
|
end
|
68
148
|
|
69
149
|
def note(docxml)
|
70
|
-
docxml.xpath(ns("//note")).each
|
71
|
-
note1(f)
|
72
|
-
end
|
150
|
+
docxml.xpath(ns("//note")).each { |f| note1(f) }
|
73
151
|
end
|
74
152
|
|
75
153
|
def note1(elem)
|
76
|
-
|
77
|
-
|
154
|
+
elem.parent.name == "bibitem" || elem["notag"] == "true" and return
|
78
155
|
n = @xrefs.get[elem["id"]]
|
79
156
|
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
80
157
|
@i18n.note
|
81
|
-
else
|
82
|
-
l10n("#{@i18n.note} #{n[:label]}")
|
158
|
+
else l10n("#{@i18n.note} #{n[:label]}")
|
83
159
|
end
|
84
160
|
prefix_name(elem, "", lbl, "name")
|
85
161
|
end
|
86
162
|
|
87
163
|
def admonition(docxml)
|
88
|
-
docxml.xpath(ns("//admonition")).each
|
89
|
-
admonition1(f)
|
90
|
-
end
|
164
|
+
docxml.xpath(ns("//admonition")).each { |f| admonition1(f) }
|
91
165
|
end
|
92
166
|
|
93
167
|
def admonition1(elem)
|
94
|
-
|
95
|
-
|
168
|
+
elem.at(ns("./name")) || elem["notag"] == "true" and return
|
96
169
|
prefix_name(elem, "", @i18n.admonition[elem["type"]]&.upcase, "name")
|
97
170
|
end
|
98
171
|
|
@@ -121,15 +194,12 @@ module IsoDoc
|
|
121
194
|
end
|
122
195
|
|
123
196
|
def table(docxml)
|
124
|
-
docxml.xpath(ns("//table")).each
|
125
|
-
table1(f)
|
126
|
-
end
|
197
|
+
docxml.xpath(ns("//table")).each { |f| table1(f) }
|
127
198
|
end
|
128
199
|
|
129
200
|
def table1(elem)
|
130
|
-
|
131
|
-
|
132
|
-
|
201
|
+
labelled_ancestor(elem) and return
|
202
|
+
elem["unnumbered"] && !elem.at(ns("./name")) and return
|
133
203
|
n = @xrefs.anchor(elem["id"], :label, false)
|
134
204
|
prefix_name(elem, block_delim, l10n("#{lower2cap @i18n.table} #{n}"),
|
135
205
|
"name")
|
@@ -137,9 +207,7 @@ module IsoDoc
|
|
137
207
|
|
138
208
|
# we use this to eliminate the semantic amend blocks from rendering
|
139
209
|
def amend(docxml)
|
140
|
-
docxml.xpath(ns("//amend")).each
|
141
|
-
amend1(f)
|
142
|
-
end
|
210
|
+
docxml.xpath(ns("//amend")).each { |f| amend1(f) }
|
143
211
|
end
|
144
212
|
|
145
213
|
def amend1(elem)
|
@@ -150,9 +218,7 @@ module IsoDoc
|
|
150
218
|
end
|
151
219
|
|
152
220
|
def ol(docxml)
|
153
|
-
docxml.xpath(ns("//ol")).each
|
154
|
-
ol1(f)
|
155
|
-
end
|
221
|
+
docxml.xpath(ns("//ol")).each { |f| ol1(f) }
|
156
222
|
@xrefs.list_anchor_names(docxml.xpath(ns(@xrefs.sections_xpath)))
|
157
223
|
end
|
158
224
|
|
@@ -9,7 +9,7 @@ module IsoDoc
|
|
9
9
|
|
10
10
|
def erefstack1(elem)
|
11
11
|
locs = elem.xpath(ns("./eref")).map do |e|
|
12
|
-
[e["connective"], e
|
12
|
+
[e["connective"], to_xml(e)]
|
13
13
|
end.flatten
|
14
14
|
ret = resolve_eref_connectives(locs)
|
15
15
|
elem.replace(ret[1])
|
@@ -30,9 +30,9 @@ module IsoDoc
|
|
30
30
|
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
31
31
|
node))
|
32
32
|
node.delete("droploc") unless droploc
|
33
|
-
eref_localities1(target,
|
34
|
-
|
35
|
-
|
33
|
+
eref_localities1({ target: target, number: "pl",
|
34
|
+
type: refs.first.at(ns("./locality/@type")).text,
|
35
|
+
from: l10n(ret[1..-1].join), node: node, lang: @lang })
|
36
36
|
end
|
37
37
|
|
38
38
|
def can_conflate_eref_rendering?(refs)
|
@@ -61,19 +61,24 @@ module IsoDoc
|
|
61
61
|
locs1 = []
|
62
62
|
add = ""
|
63
63
|
until locs.empty?
|
64
|
-
|
65
|
-
add += locs[0..2].join
|
66
|
-
locs.shift(3)
|
67
|
-
else
|
68
|
-
locs1 << add unless add.empty?
|
69
|
-
add = ""
|
70
|
-
locs1 << locs.shift
|
71
|
-
end
|
64
|
+
locs, locs1, add = resolve_comma_connectives1(locs, locs1, add)
|
72
65
|
end
|
73
66
|
locs1 << add unless add.empty?
|
74
67
|
locs1
|
75
68
|
end
|
76
69
|
|
70
|
+
def resolve_comma_connectives1(locs, locs1, add)
|
71
|
+
if [", ", " "].include?(locs[1])
|
72
|
+
add += locs[0..2].join
|
73
|
+
locs.shift(3)
|
74
|
+
else
|
75
|
+
locs1 << add unless add.empty?
|
76
|
+
add = ""
|
77
|
+
locs1 << locs.shift
|
78
|
+
end
|
79
|
+
[locs, locs1, add]
|
80
|
+
end
|
81
|
+
|
77
82
|
def resolve_to_connectives(locs)
|
78
83
|
locs1 = []
|
79
84
|
until locs.empty?
|
@@ -108,12 +113,7 @@ module IsoDoc
|
|
108
113
|
def eref_locality_stack(ref, idx, target, node)
|
109
114
|
ret = []
|
110
115
|
if ref.name == "localityStack"
|
111
|
-
ref
|
112
|
-
l = eref_localities0(rr, j, target, node) or next
|
113
|
-
|
114
|
-
ret << l
|
115
|
-
ret << locality_delimiter(rr) unless j == ref.elements.size - 1
|
116
|
-
end
|
116
|
+
ret = eref_locality_stack1(ref, target, node, ret)
|
117
117
|
else
|
118
118
|
l = eref_localities0(ref, idx, target, node) and ret << l
|
119
119
|
end
|
@@ -121,6 +121,15 @@ module IsoDoc
|
|
121
121
|
ret
|
122
122
|
end
|
123
123
|
|
124
|
+
def eref_locality_stack1(ref, target, node, ret)
|
125
|
+
ref.elements.each_with_index do |rr, j|
|
126
|
+
l = eref_localities0(rr, j, target, node) or next
|
127
|
+
ret << l
|
128
|
+
ret << locality_delimiter(rr) unless j == ref.elements.size - 1
|
129
|
+
end
|
130
|
+
ret
|
131
|
+
end
|
132
|
+
|
124
133
|
def locality_delimiter(_loc)
|
125
134
|
", "
|
126
135
|
end
|
@@ -128,38 +137,43 @@ module IsoDoc
|
|
128
137
|
def eref_localities0(ref, _idx, target, node)
|
129
138
|
if ref["type"] == "whole" then @i18n.wholeoftext
|
130
139
|
else
|
131
|
-
eref_localities1(target, ref["type"],
|
132
|
-
|
133
|
-
|
140
|
+
eref_localities1({ target: target, type: ref["type"], number: "sg",
|
141
|
+
from: ref.at(ns("./referenceFrom"))&.text,
|
142
|
+
upto: ref.at(ns("./referenceTo"))&.text, node: node,
|
143
|
+
lang: @lang })
|
134
144
|
end
|
135
145
|
end
|
136
146
|
|
137
|
-
def eref_localities1_zh(_target, type, from, upto, node)
|
138
|
-
|
139
|
-
ret
|
140
|
-
|
141
|
-
|
147
|
+
# def eref_localities1_zh(_target, type, from, upto, node)
|
148
|
+
def eref_localities1_zh(opt)
|
149
|
+
ret = "第#{opt[:from]}" if opt[:from]
|
150
|
+
ret += "–#{opt[:upto]}" if opt[:upto]
|
151
|
+
loc = eref_locality_populate(opt[:type], opt[:node], "sg")
|
152
|
+
ret += " #{loc}" unless opt[:node]["droploc"] == "true"
|
142
153
|
ret
|
143
154
|
end
|
144
155
|
|
145
|
-
def eref_localities1(target, type, from, upto, node, lang = "en")
|
146
|
-
|
156
|
+
# def eref_localities1(target, type, from, upto, node, lang = "en")
|
157
|
+
def eref_localities1(opt)
|
158
|
+
return nil if opt[:type] == "anchor"
|
147
159
|
|
148
|
-
lang == "zh" and
|
149
|
-
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
150
|
-
|
151
|
-
ret
|
152
|
-
ret += "
|
160
|
+
opt[:lang] == "zh" and
|
161
|
+
# return l10n(eref_localities1_zh(target, type, from, upto, node))
|
162
|
+
return l10n(eref_localities1_zh(opt))
|
163
|
+
ret = eref_locality_populate(opt[:type], opt[:node], opt[:number])
|
164
|
+
ret += " #{opt[:from]}" if opt[:from]
|
165
|
+
ret += "–#{opt[:upto]}" if opt[:upto]
|
153
166
|
l10n(ret)
|
154
167
|
end
|
155
168
|
|
156
|
-
def eref_locality_populate(type, node)
|
169
|
+
def eref_locality_populate(type, node, number)
|
157
170
|
return "" if node["droploc"] == "true"
|
158
171
|
|
159
172
|
loc = type.sub(/^locality:/, "")
|
160
173
|
ret = @i18n.locality[loc] || loc
|
174
|
+
number == "pl" and ret = @i18n.inflect(ret, number: "pl")
|
161
175
|
ret = case node["case"]
|
162
|
-
when "lowercase" then
|
176
|
+
when "lowercase" then ret.downcase
|
163
177
|
else Metanorma::Utils.strict_capitalize_first(ret)
|
164
178
|
end
|
165
179
|
" #{ret}"
|
@@ -20,7 +20,7 @@ module IsoDoc
|
|
20
20
|
d.remove_namespaces!
|
21
21
|
refs = d.xpath("//references/bibitem").each_with_object([]) do |b, m|
|
22
22
|
prep_for_rendering(b)
|
23
|
-
m << b
|
23
|
+
m << to_xml(b)
|
24
24
|
end.join
|
25
25
|
bibrenderer.render_all("<references>#{refs}</references>",
|
26
26
|
type: citestyle)
|
@@ -49,8 +49,8 @@ module IsoDoc
|
|
49
49
|
def bibrender_relaton(xml, renderings)
|
50
50
|
f = renderings[xml["id"]][:formattedref]
|
51
51
|
f &&= "<formattedref>#{f}</formattedref>"
|
52
|
-
xml.
|
53
|
-
|
52
|
+
x = xml.xpath(ns("./docidentifier | ./uri | ./note | ./biblio-tag"))
|
53
|
+
xml.children = "#{f}#{x.to_xml}"
|
54
54
|
end
|
55
55
|
|
56
56
|
def bibrenderer
|
@@ -74,6 +74,7 @@ module IsoDoc
|
|
74
74
|
i = bibliography_bibitem_number1(b, i)
|
75
75
|
end
|
76
76
|
@xrefs.references docxml
|
77
|
+
bibliography_bibitem_tag(docxml)
|
77
78
|
end
|
78
79
|
|
79
80
|
def bibliography_bibitem_number1(bibitem, idx)
|
@@ -99,8 +100,79 @@ module IsoDoc
|
|
99
100
|
|
100
101
|
def docid_prefixes(docxml)
|
101
102
|
docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
|
102
|
-
i.children = @xrefs.klass.docid_prefix(i["type"], i.
|
103
|
+
i.children = @xrefs.klass.docid_prefix(i["type"], to_xml(i.children))
|
103
104
|
end
|
104
105
|
end
|
106
|
+
|
107
|
+
def bibliography_bibitem_tag(docxml)
|
108
|
+
[true, false].each do |norm|
|
109
|
+
i = 0
|
110
|
+
docxml.xpath(ns("//references[@normative = '#{norm}']")).each do |r|
|
111
|
+
i = bibliography_bibitem_tag1(r, i, norm)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def bibliography_bibitem_tag1(ref, idx, norm)
|
117
|
+
ref.xpath(ns("./bibitem")).each do |b|
|
118
|
+
@xrefs.klass.implicit_reference(b) and next
|
119
|
+
idx += 1 unless b["hidden"]
|
120
|
+
insert_biblio_tag(b, idx, !norm, @xrefs.klass.standard?(b))
|
121
|
+
end
|
122
|
+
idx
|
123
|
+
end
|
124
|
+
|
125
|
+
def insert_biblio_tag(bib, ordinal, biblio, standard)
|
126
|
+
datefn = date_note_process(bib)
|
127
|
+
ids = @xrefs.klass.bibitem_ref_code(bib)
|
128
|
+
idents = @xrefs.klass.render_identifier(ids)
|
129
|
+
ret = if biblio then biblio_ref_entry_code(ordinal, idents, ids,
|
130
|
+
standard, datefn)
|
131
|
+
else norm_ref_entry_code(ordinal, idents, ids, standard, datefn)
|
132
|
+
end
|
133
|
+
bib << "<biblio-tag>#{ret}</biblio-tag>"
|
134
|
+
end
|
135
|
+
|
136
|
+
def norm_ref_entry_code(_ordinal, idents, _ids, _standard, datefn)
|
137
|
+
ret = (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
|
138
|
+
(idents[:ordinal] || idents[:metanorma]) && idents[:sdo] and
|
139
|
+
ret += ", #{idents[:sdo]}"
|
140
|
+
ret += datefn
|
141
|
+
ret.empty? and return ret
|
142
|
+
idents[:sdo] and ret += ","
|
143
|
+
"#{ret} "
|
144
|
+
end
|
145
|
+
|
146
|
+
# if ids is just a number, only use that ([1] Non-Standard)
|
147
|
+
# else, use both ordinal, as prefix, and ids
|
148
|
+
def biblio_ref_entry_code(ordinal, ids, _id, standard, datefn)
|
149
|
+
standard and id = nil
|
150
|
+
ret = (ids[:ordinal] || ids[:metanorma] || "[#{ordinal}]")
|
151
|
+
if ids[:sdo]
|
152
|
+
ret = prefix_bracketed_ref(ret)
|
153
|
+
ret += "#{ids[:sdo]}#{datefn}, "
|
154
|
+
else
|
155
|
+
ret = prefix_bracketed_ref("#{ret}#{datefn}")
|
156
|
+
end
|
157
|
+
ret
|
158
|
+
end
|
159
|
+
|
160
|
+
def prefix_bracketed_ref(text)
|
161
|
+
"#{text}<tab/>"
|
162
|
+
end
|
163
|
+
|
164
|
+
# strip any fns in docidentifier before they are extracted for rendering
|
165
|
+
def date_note_process(bib)
|
166
|
+
ret = ident_fn(bib)
|
167
|
+
date_note = bib.at(ns("./note[@type = 'Unpublished-Status']"))
|
168
|
+
date_note.nil? and return ret
|
169
|
+
id = UUIDTools::UUID.random_create.to_s
|
170
|
+
"#{ret}<fn reference='#{id}'><p>#{date_note.content}</p></fn>"
|
171
|
+
end
|
172
|
+
|
173
|
+
def ident_fn(bib)
|
174
|
+
ret = bib.at(ns("./docidentifier//fn")) or return ""
|
175
|
+
to_xml(ret.remove)
|
176
|
+
end
|
105
177
|
end
|
106
178
|
end
|
@@ -55,7 +55,7 @@ module IsoDoc
|
|
55
55
|
def annex1(elem)
|
56
56
|
lbl = @xrefs.anchor(elem["id"], :label)
|
57
57
|
if t = elem.at(ns("./title"))
|
58
|
-
t.children = "<strong>#{t.children
|
58
|
+
t.children = "<strong>#{to_xml(t.children)}</strong>"
|
59
59
|
end
|
60
60
|
prefix_name(elem, "<br/><br/>", lbl, "title")
|
61
61
|
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
3
|
def concept(docxml)
|
4
|
+
@definition_ids = docxml.xpath(ns("//definitions//dt"))
|
5
|
+
.each_with_object({}) { |x, m| m[x["id"]] = true }
|
4
6
|
docxml.xpath(ns("//concept")).each { |f| concept1(f) }
|
5
7
|
end
|
6
8
|
|
7
9
|
def concept1(node)
|
8
10
|
xref = node&.at(ns("./xref/@target"))&.text or
|
9
|
-
return concept_render(node, ital: "true", ref: "true",
|
11
|
+
return concept_render(node, ital: "true", ref: "true", bold: "false",
|
10
12
|
linkref: "true", linkmention: "false")
|
11
|
-
if
|
12
|
-
concept_render(node, ital: "false", ref: "false",
|
13
|
+
if @definition_ids[xref]
|
14
|
+
concept_render(node, ital: "false", ref: "false", bold: "false",
|
13
15
|
linkref: "true", linkmention: "false")
|
14
|
-
else concept_render(node, ital: "true", ref: "true",
|
16
|
+
else concept_render(node, ital: "true", ref: "true", bold: "false",
|
15
17
|
linkref: "true", linkmention: "false")
|
16
18
|
end
|
17
19
|
end
|
@@ -20,21 +22,23 @@ module IsoDoc
|
|
20
22
|
opts, render, ref = concept_render_init(node, defaults)
|
21
23
|
node&.at(ns("./refterm"))&.remove
|
22
24
|
ref && opts[:ref] != "false" and render&.next = " "
|
23
|
-
opts[:ital] == "true" and render&.name = "em"
|
24
25
|
concept1_linkmention(ref, render, opts)
|
25
26
|
concept1_ref(node, ref, opts)
|
26
|
-
|
27
|
-
node.replace(node.children
|
27
|
+
concept1_style(node, opts)
|
28
|
+
node.replace(node.children)
|
28
29
|
end
|
29
30
|
|
30
|
-
def
|
31
|
-
|
32
|
-
r =
|
33
|
-
|
31
|
+
def concept1_style(node, opts)
|
32
|
+
r = node.at(ns(".//renderterm")) or return
|
33
|
+
opts[:ital] == "true" and r.children = "<em>#{to_xml(r.children)}</em>"
|
34
|
+
opts[:bold] == "true" and
|
35
|
+
r.children = "<strong>#{to_xml(r.children)}</strong>"
|
36
|
+
r.replace(r.children)
|
34
37
|
end
|
35
38
|
|
36
39
|
def concept_render_init(node, defaults)
|
37
|
-
opts = %i(ital ref linkref linkmention)
|
40
|
+
opts = %i(bold ital ref linkref linkmention)
|
41
|
+
.each_with_object({}) do |x, m|
|
38
42
|
m[x] = node[x.to_s] || defaults[x]
|
39
43
|
end
|
40
44
|
[opts, node.at(ns("./renderterm")),
|
@@ -42,7 +46,8 @@ module IsoDoc
|
|
42
46
|
end
|
43
47
|
|
44
48
|
def concept1_linkmention(ref, renderterm, opts)
|
45
|
-
return unless opts[:linkmention] == "true" &&
|
49
|
+
return unless opts[:linkmention] == "true" &&
|
50
|
+
!renderterm.nil? && !ref.nil?
|
46
51
|
|
47
52
|
ref2 = ref.clone
|
48
53
|
r2 = renderterm.clone
|
@@ -68,8 +73,8 @@ module IsoDoc
|
|
68
73
|
!c.text? || /\S/.match(c)
|
69
74
|
end.empty?
|
70
75
|
ref.replace(@i18n.term_defined_in.sub(/%/,
|
71
|
-
ref
|
72
|
-
else ref.replace("[#{ref
|
76
|
+
to_xml(ref)))
|
77
|
+
else ref.replace("[#{to_xml(ref)}]")
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
@@ -83,7 +88,7 @@ module IsoDoc
|
|
83
88
|
label = @i18n.relatedterms[node["type"]].upcase
|
84
89
|
if p && ref
|
85
90
|
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
86
|
-
"<em>#{p
|
91
|
+
"<em>#{to_xml(p)}</em> (#{Common::to_xml(ref)})</p>"))
|
87
92
|
else
|
88
93
|
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
89
94
|
"<strong>**RELATED TERM NOT FOUND**</strong></p>"))
|
@@ -110,7 +115,7 @@ module IsoDoc
|
|
110
115
|
if merge_preferred_eligible?(pref, second)
|
111
116
|
n1 = pref.at(ns("./expression/name"))
|
112
117
|
n2 = second.remove.at(ns("./expression/name"))
|
113
|
-
n1.children = l10n("#{n1.children
|
118
|
+
n1.children = l10n("#{to_xml(n1.children)}; #{Common::to_xml(n2.children)}")
|
114
119
|
end
|
115
120
|
end
|
116
121
|
|
@@ -150,7 +155,7 @@ module IsoDoc
|
|
150
155
|
|
151
156
|
def designation_field(desgn, name)
|
152
157
|
f = desgn.xpath(ns("./field-of-application | ./usage-info"))
|
153
|
-
&.map { |u| u.children
|
158
|
+
&.map { |u| to_xml(u.children) }&.join(", ")
|
154
159
|
return nil if f&.empty?
|
155
160
|
|
156
161
|
name << ", <#{f}>"
|
@@ -181,7 +186,7 @@ module IsoDoc
|
|
181
186
|
def designation_pronunciation(desgn, name)
|
182
187
|
f = desgn.at(ns("./expression/pronunciation")) or return
|
183
188
|
|
184
|
-
name << ", /#{f.children
|
189
|
+
name << ", /#{to_xml(f.children)}/"
|
185
190
|
end
|
186
191
|
|
187
192
|
def termexample(docxml)
|
@@ -214,9 +219,9 @@ module IsoDoc
|
|
214
219
|
|
215
220
|
def multidef(elem)
|
216
221
|
d = elem.at(ns("./definition"))
|
217
|
-
d = d.replace("<ol><li>#{d.children
|
222
|
+
d = d.replace("<ol><li>#{to_xml(d.children)}</li></ol>").first
|
218
223
|
elem.xpath(ns("./definition")).each do |f|
|
219
|
-
f = f.replace("<li>#{f.children
|
224
|
+
f = f.replace("<li>#{to_xml(f.children)}</li>").first
|
220
225
|
d << f
|
221
226
|
end
|
222
227
|
d.wrap("<definition></definition>")
|
@@ -242,9 +247,9 @@ module IsoDoc
|
|
242
247
|
|
243
248
|
def termsource1(elem)
|
244
249
|
while elem&.next_element&.name == "termsource"
|
245
|
-
elem << "; #{elem.next_element.remove.children
|
250
|
+
elem << "; #{to_xml(elem.next_element.remove.children)}"
|
246
251
|
end
|
247
|
-
elem.children = l10n("[#{@i18n.source}: #{elem.children.
|
252
|
+
elem.children = l10n("[#{@i18n.source}: #{to_xml(elem.children).strip}]")
|
248
253
|
end
|
249
254
|
|
250
255
|
def termsource_modification(mod)
|
@@ -38,14 +38,23 @@ module IsoDoc
|
|
38
38
|
def anchor_xref(node, target)
|
39
39
|
x = @xrefs.anchor(target, :xref)
|
40
40
|
t = @xrefs.anchor(target, :title)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
ret = case node["style"]
|
42
|
+
when "basic" then t
|
43
|
+
when "full" then anchor_xref_full(x, t)
|
44
|
+
when "short", nil then x
|
45
|
+
else @xrefs.anchor(target, node[:style].to_sym)
|
46
|
+
end
|
47
|
+
ret || x
|
48
|
+
end
|
49
|
+
|
50
|
+
def anchor_xref_full(num, title)
|
51
|
+
(!title.nil? && !title.empty?) or return nil
|
52
|
+
|
53
|
+
l10n("#{num}, #{title}")
|
46
54
|
end
|
47
55
|
|
48
56
|
def prefix_container?(container, node)
|
57
|
+
node["style"] == "modspec" and return false # TODO: move to mn-requirements?
|
49
58
|
type = @xrefs.anchor(node["target"], :type)
|
50
59
|
container &&
|
51
60
|
get_note_container_id(node, type) != container &&
|
@@ -66,8 +75,8 @@ module IsoDoc
|
|
66
75
|
def combine_conflated_xref_locations(locs)
|
67
76
|
out = locs.each { |l| l[:label] = anchor_value(l[:target]) }
|
68
77
|
label = @i18n.inflect(locs.first[:elem], number: "pl")
|
69
|
-
|
70
|
-
combine_conflated_xref_locations_container(locs,
|
78
|
+
out[0][:label] = l10n("#{label} #{out[0][:label]}")
|
79
|
+
combine_conflated_xref_locations_container(locs, l10n(combine_conn(out)))
|
71
80
|
end
|
72
81
|
|
73
82
|
def combine_conflated_xref_locations_container(locs, ret)
|
@@ -85,11 +85,11 @@ module IsoDoc
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def postprocess(result, filename, _dir)
|
88
|
-
|
88
|
+
to_xml_file(result, filename)
|
89
89
|
@files_to_delete.each { |f| FileUtils.rm_rf f }
|
90
90
|
end
|
91
91
|
|
92
|
-
def
|
92
|
+
def to_xml_file(result, filename)
|
93
93
|
File.open(filename, "w:UTF-8") { |f| f.write(result) }
|
94
94
|
end
|
95
95
|
end
|
data/lib/isodoc/version.rb
CHANGED