isodoc 2.3.6 → 2.4.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 +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