isodoc 2.5.3 → 2.5.5
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 -3
- data/lib/isodoc/convert.rb +0 -8
- data/lib/isodoc/function/inline.rb +2 -32
- data/lib/isodoc/function/section.rb +71 -33
- data/lib/isodoc/html_function/html.rb +1 -7
- data/lib/isodoc/html_function/postprocess_cover.rb +10 -2
- data/lib/isodoc/presentation_function/block.rb +1 -1
- data/lib/isodoc/presentation_function/concepts.rb +90 -0
- data/lib/isodoc/presentation_function/erefs.rb +49 -0
- data/lib/isodoc/presentation_function/section.rb +95 -1
- data/lib/isodoc/presentation_function/terms.rb +16 -92
- data/lib/isodoc/presentation_function/xrefs.rb +2 -1
- data/lib/isodoc/presentation_xml_convert.rb +17 -6
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +13 -6
- data/lib/isodoc/word_function/postprocess_toc.rb +20 -1
- data/lib/isodoc-yaml/i18n-ar.yaml +1 -0
- data/lib/isodoc-yaml/i18n-de.yaml +2 -1
- data/lib/isodoc-yaml/i18n-en.yaml +1 -0
- data/lib/isodoc-yaml/i18n-es.yaml +1 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
- data/lib/isodoc-yaml/i18n-ja.yaml +4 -2
- data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6ca47f20afd4ccef8c44ce28bfca11c4803f9aa8988e950cf1842dc251dc855
|
4
|
+
data.tar.gz: 9f2ca8a82bb0528e05f8a6cc631cfad987c0fe8d819937af79580a119955a921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10170334bf2d0bbf492237695054a1a164c8c7f056a8cec5d782cd468f4a367524fc9dc841fccf4c3f7c90038af32d83e962d5cf224d66e5f7d05323b1b65083
|
7
|
+
data.tar.gz: 9fc62b5c28d0baff4b369f15f8811a6be8b0bd85e1b63db6a9b36017e9a84a276c9df3034c679c0bd11ecbca0d5f7056bd2aa1627873a561be29b67f5619db9a
|
data/isodoc.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Ribose Inc."]
|
9
9
|
spec.email = ["open.source@ribose.com"]
|
10
10
|
|
11
|
-
spec.summary = "Convert documents in IsoDoc into Word and HTML "\
|
11
|
+
spec.summary = "Convert documents in IsoDoc into Word and HTML " \
|
12
12
|
"in AsciiDoc."
|
13
13
|
spec.description = <<~DESCRIPTION
|
14
14
|
isodoc converts documents in the IsoDoc document model into
|
@@ -26,14 +26,13 @@ Gem::Specification.new do |spec|
|
|
26
26
|
f.match(%r{^(test|spec|features|bin|.github)/}) \
|
27
27
|
|| f.match(%r{Rakefile|bin/rspec})
|
28
28
|
end
|
29
|
-
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
30
29
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
31
30
|
|
32
31
|
spec.add_dependency "html2doc", "~> 1.5.3"
|
33
32
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
34
33
|
# spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
|
35
|
-
spec.add_dependency "liquid", "~> 5"
|
36
34
|
spec.add_dependency "emf2svg"
|
35
|
+
spec.add_dependency "liquid", "~> 5"
|
37
36
|
spec.add_dependency "plurimath"
|
38
37
|
spec.add_dependency "relaton-cli"
|
39
38
|
# spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
|
data/lib/isodoc/convert.rb
CHANGED
@@ -85,7 +85,6 @@ module IsoDoc
|
|
85
85
|
|
86
86
|
def convert1(docxml, filename, dir)
|
87
87
|
@xrefs.parse docxml
|
88
|
-
bibitem_lookup(docxml)
|
89
88
|
noko do |xml|
|
90
89
|
xml.html lang: @lang.to_s do |html|
|
91
90
|
html.parent.add_namespace("epub", "http://www.idpf.org/2007/ops")
|
@@ -97,13 +96,6 @@ module IsoDoc
|
|
97
96
|
end.join("\n")
|
98
97
|
end
|
99
98
|
|
100
|
-
def bibitem_lookup(docxml)
|
101
|
-
@bibitems = docxml.xpath(ns("//references/bibitem"))
|
102
|
-
.each_with_object({}) do |b, m|
|
103
|
-
m[b["id"]] = b
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
99
|
def convert_init(file, input_filename, debug)
|
108
100
|
docxml = Nokogiri::XML(file) { |config| config.huge }
|
109
101
|
filename, dir = init_file(input_filename, debug)
|
@@ -52,45 +52,15 @@ module IsoDoc
|
|
52
52
|
url.sub(/#{File.extname(url)}$/, ".html")
|
53
53
|
end
|
54
54
|
|
55
|
-
def eref_target(node)
|
56
|
-
url = suffix_url(eref_url(node["bibitemid"]))
|
57
|
-
anchor = node&.at(ns(".//locality[@type = 'anchor']"))
|
58
|
-
return url if url.nil? || /^#/.match?(url) || !anchor
|
59
|
-
|
60
|
-
"#{url}##{anchor.text.strip}"
|
61
|
-
end
|
62
|
-
|
63
|
-
def eref_url(id)
|
64
|
-
@bibitems.nil? and return nil
|
65
|
-
|
66
|
-
b = @bibitems[id]
|
67
|
-
b.nil? and return nil
|
68
|
-
|
69
|
-
url = b.at(ns("./uri[@type = 'citation'][@language = '#{@lang}']")) and
|
70
|
-
return url.text
|
71
|
-
url = b.at(ns("./uri[@type = 'citation']")) and return url.text
|
72
|
-
b["hidden"] == "true" and return b.at(ns("./uri"))&.text
|
73
|
-
"##{id}"
|
74
|
-
end
|
75
|
-
|
76
55
|
def eref_parse(node, out)
|
77
|
-
|
78
|
-
if node["type"] == "footnote"
|
79
|
-
out.sup do |s|
|
80
|
-
s.a(href: href) { |l| no_locality_parse(node, l) }
|
81
|
-
end
|
82
|
-
else
|
83
|
-
out.a(href: href) { |l| no_locality_parse(node, l) }
|
84
|
-
end
|
85
|
-
else no_locality_parse(node, out)
|
86
|
-
end
|
56
|
+
no_locality_parse(node, out)
|
87
57
|
end
|
88
58
|
|
89
59
|
def origin_parse(node, out)
|
90
60
|
if t = node.at(ns("./termref"))
|
91
61
|
termrefelem_parse(t, out)
|
92
62
|
else
|
93
|
-
|
63
|
+
no_locality_parse(node, out)
|
94
64
|
end
|
95
65
|
end
|
96
66
|
|
@@ -96,57 +96,77 @@ module IsoDoc
|
|
96
96
|
clause_parse(isoxml, out)
|
97
97
|
end
|
98
98
|
|
99
|
-
def introduction(
|
100
|
-
f = isoxml.at(ns("//introduction")) || return
|
99
|
+
def introduction(clause, out)
|
101
100
|
page_break(out)
|
102
|
-
out.div class: "Section3", id:
|
103
|
-
clause_name(
|
104
|
-
|
101
|
+
out.div class: "Section3", id: clause["id"] do |div|
|
102
|
+
clause_name(clause, clause.at(ns("./title")), div,
|
103
|
+
{ class: "IntroTitle" })
|
104
|
+
clause.elements.each do |e|
|
105
105
|
parse(e, div) unless e.name == "title"
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
def foreword(
|
111
|
-
f = isoxml.at(ns("//foreword")) || return
|
110
|
+
def foreword(clause, out)
|
112
111
|
page_break(out)
|
113
|
-
out.div **attr_code(id:
|
114
|
-
clause_name(
|
112
|
+
out.div **attr_code(id: clause["id"]) do |s|
|
113
|
+
clause_name(clause, clause.at(ns("./title")) || @i18n.foreword, s,
|
115
114
|
{ class: "ForewordTitle" })
|
116
|
-
|
115
|
+
clause.elements.each { |e| parse(e, s) unless e.name == "title" }
|
117
116
|
end
|
118
117
|
end
|
119
118
|
|
120
|
-
def acknowledgements(
|
121
|
-
f = isoxml.at(ns("//acknowledgements")) || return
|
119
|
+
def acknowledgements(clause, out)
|
122
120
|
title_attr = { class: "IntroTitle" }
|
123
121
|
page_break(out)
|
124
|
-
out.div class: "Section3", id:
|
125
|
-
clause_name(
|
126
|
-
|
122
|
+
out.div class: "Section3", id: clause["id"] do |div|
|
123
|
+
clause_name(clause, clause.at(ns("./title")), div, title_attr)
|
124
|
+
clause.elements.each do |e|
|
127
125
|
parse(e, div) unless e.name == "title"
|
128
126
|
end
|
129
127
|
end
|
130
128
|
end
|
131
129
|
|
132
|
-
def abstract(
|
133
|
-
f = isoxml.at(ns("//preface/abstract")) || return
|
130
|
+
def abstract(clause, out)
|
134
131
|
page_break(out)
|
135
|
-
out.div **attr_code(id:
|
136
|
-
clause_name(
|
137
|
-
|
132
|
+
out.div **attr_code(id: clause["id"]) do |s|
|
133
|
+
clause_name(clause, clause.at(ns("./title")), s,
|
134
|
+
{ class: "AbstractTitle" })
|
135
|
+
clause.elements.each { |e| parse(e, s) unless e.name == "title" }
|
138
136
|
end
|
139
137
|
end
|
140
138
|
|
141
|
-
def
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
139
|
+
def preface_attrs(node)
|
140
|
+
{ id: node["id"],
|
141
|
+
class: node["type"] == "toc" ? "TOC" : "Section3" }
|
142
|
+
end
|
143
|
+
|
144
|
+
def preface(clause, out)
|
145
|
+
if clause["type"] == "toc"
|
146
|
+
table_of_contents(clause, out)
|
147
|
+
else
|
148
|
+
preface_normal(clause, out)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def preface_normal(clause, out)
|
153
|
+
page_break(out)
|
154
|
+
out.div **attr_code(preface_attrs(clause)) do |div|
|
155
|
+
clause_name(clause, clause.at(ns("./title")), div,
|
156
|
+
{ class: "IntroTitle" })
|
157
|
+
clause.elements.each do |e|
|
158
|
+
parse(e, div) unless e.name == "title"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def table_of_contents(clause, out)
|
164
|
+
page_break(out)
|
165
|
+
out.div **attr_code(preface_attrs(clause)) do |div|
|
166
|
+
clause_name(clause, clause.at(ns("./title")), div,
|
167
|
+
{ class: "IntroTitle" })
|
168
|
+
clause.elements.each do |e|
|
169
|
+
parse(e, div) unless e.name == "title"
|
150
170
|
end
|
151
171
|
end
|
152
172
|
end
|
@@ -174,15 +194,33 @@ module IsoDoc
|
|
174
194
|
t.size == 1 && %w(terms definitions references).include?(t[0].name)
|
175
195
|
end
|
176
196
|
|
177
|
-
def
|
197
|
+
def front(isoxml, out)
|
178
198
|
p = isoxml.at(ns("//preface")) or return
|
179
199
|
p.elements.each do |e|
|
180
|
-
|
181
|
-
|
182
|
-
|
200
|
+
if is_clause?(e.name)
|
201
|
+
case e.name
|
202
|
+
when "abstract" then abstract e, out
|
203
|
+
when "foreword" then foreword e, out
|
204
|
+
when "introduction" then introduction e, out
|
205
|
+
when "executivesummary" then executivesummary e, out
|
206
|
+
when "clause" then preface e, out
|
207
|
+
when "acknowledgements" then acknowledgements e, out
|
208
|
+
end
|
209
|
+
else
|
210
|
+
preface_block(e, out)
|
211
|
+
end
|
183
212
|
end
|
184
213
|
end
|
185
214
|
|
215
|
+
def executivesummary(clause, out)
|
216
|
+
introduction clause, out
|
217
|
+
end
|
218
|
+
|
219
|
+
# block, e.g. note, admonition
|
220
|
+
def preface_block(block, out)
|
221
|
+
parse(block, out)
|
222
|
+
end
|
223
|
+
|
186
224
|
def copyright_parse(node, out)
|
187
225
|
return if @bare
|
188
226
|
|
@@ -5,7 +5,6 @@ module IsoDoc
|
|
5
5
|
module HtmlFunction
|
6
6
|
module Html
|
7
7
|
def convert1(docxml, filename, dir)
|
8
|
-
bibitem_lookup(docxml)
|
9
8
|
noko do |xml|
|
10
9
|
xml.html lang: @lang.to_s do |html|
|
11
10
|
info docxml, nil
|
@@ -37,12 +36,7 @@ module IsoDoc
|
|
37
36
|
def make_body3(body, docxml)
|
38
37
|
body.div class: "main-section" do |div3|
|
39
38
|
boilerplate docxml, div3
|
40
|
-
|
41
|
-
abstract docxml, div3
|
42
|
-
foreword docxml, div3
|
43
|
-
introduction docxml, div3
|
44
|
-
preface docxml, div3
|
45
|
-
acknowledgements docxml, div3
|
39
|
+
front docxml, div3
|
46
40
|
middle docxml, div3
|
47
41
|
footnotes div3
|
48
42
|
comments div3
|
@@ -117,16 +117,24 @@ module IsoDoc
|
|
117
117
|
|
118
118
|
# needs to be same output as toclevel
|
119
119
|
def html_toc(docxml)
|
120
|
-
idx = docxml
|
120
|
+
idx = html_toc_init(docxml) or return docxml
|
121
121
|
path = toclevel_classes.map do |x|
|
122
122
|
x.map { |l| "//main//#{l}#{toc_exclude_class}" }
|
123
123
|
end
|
124
124
|
toc = html_toc_entries(docxml, path)
|
125
125
|
.map { |k| k[:entry] }.join("\n")
|
126
|
-
idx
|
126
|
+
idx << "<ul>#{toc}</ul>"
|
127
127
|
docxml
|
128
128
|
end
|
129
129
|
|
130
|
+
def html_toc_init(docxml)
|
131
|
+
dest = docxml.at("//div[@id = 'toc']") or return
|
132
|
+
if source = docxml.at("//div[@class = 'TOC']")
|
133
|
+
dest << to_xml(source.remove.children)
|
134
|
+
end
|
135
|
+
dest
|
136
|
+
end
|
137
|
+
|
130
138
|
def html_toc_entries(docxml, path)
|
131
139
|
path.each_with_index.with_object([]) do |(p, i), m|
|
132
140
|
docxml.xpath(p.join(" | ")).each do |h|
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
|
+
def concept(docxml)
|
4
|
+
@definition_ids = docxml.xpath(ns("//definitions//dt"))
|
5
|
+
.each_with_object({}) { |x, m| m[x["id"]] = true }
|
6
|
+
docxml.xpath(ns("//concept")).each { |f| concept1(f) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def concept1(node)
|
10
|
+
xref = node&.at(ns("./xref/@target"))&.text or
|
11
|
+
return concept_render(node, ital: "true", ref: "true", bold: "false",
|
12
|
+
linkref: "true", linkmention: "false")
|
13
|
+
if @definition_ids[xref]
|
14
|
+
concept_render(node, ital: "false", ref: "false", bold: "false",
|
15
|
+
linkref: "true", linkmention: "false")
|
16
|
+
else concept_render(node, ital: "true", ref: "true", bold: "false",
|
17
|
+
linkref: "true", linkmention: "false")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def concept_render(node, defaults)
|
22
|
+
opts, render, ref = concept_render_init(node, defaults)
|
23
|
+
node&.at(ns("./refterm"))&.remove
|
24
|
+
ref && opts[:ref] != "false" and render&.next = " "
|
25
|
+
concept1_linkmention(ref, render, opts)
|
26
|
+
concept1_ref(node, ref, opts)
|
27
|
+
concept1_style(node, opts)
|
28
|
+
node.replace(node.children)
|
29
|
+
end
|
30
|
+
|
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)
|
37
|
+
end
|
38
|
+
|
39
|
+
def concept_render_init(node, defaults)
|
40
|
+
opts = %i(bold ital ref linkref linkmention)
|
41
|
+
.each_with_object({}) { |x, m| m[x] = node[x.to_s] || defaults[x] }
|
42
|
+
[opts, node.at(ns("./renderterm")),
|
43
|
+
node.at(ns("./xref | ./eref | ./termref"))]
|
44
|
+
end
|
45
|
+
|
46
|
+
def concept1_linkmention(ref, renderterm, opts)
|
47
|
+
(opts[:linkmention] == "true" && !renderterm.nil? && !ref.nil?) or return
|
48
|
+
ref2 = ref.clone
|
49
|
+
r2 = renderterm.clone
|
50
|
+
renderterm.replace(ref2).children = r2
|
51
|
+
end
|
52
|
+
|
53
|
+
def concept1_ref(_node, ref, opts)
|
54
|
+
ref.nil? and return
|
55
|
+
opts[:ref] == "false" and return ref.remove
|
56
|
+
concept1_ref_content(ref)
|
57
|
+
%w(xref eref).include? ref.name and get_linkend(ref)
|
58
|
+
opts[:linkref] == "false" && %w(xref eref).include?(ref.name) and
|
59
|
+
ref.replace(ref.children)
|
60
|
+
end
|
61
|
+
|
62
|
+
def concept1_ref_content(ref)
|
63
|
+
prev = "["
|
64
|
+
foll = "]"
|
65
|
+
non_locality_elems(ref).select do |c|
|
66
|
+
!c.text? || /\S/.match(c)
|
67
|
+
end.empty? and
|
68
|
+
(prev, foll = @i18n.term_defined_in.split("%"))
|
69
|
+
ref.previous = prev
|
70
|
+
ref.next = foll
|
71
|
+
end
|
72
|
+
|
73
|
+
def related(docxml)
|
74
|
+
docxml.xpath(ns("//related")).each { |f| related1(f) }
|
75
|
+
end
|
76
|
+
|
77
|
+
def related1(node)
|
78
|
+
p = node.at(ns("./preferred"))
|
79
|
+
ref = node.at(ns("./xref | ./eref | ./termref"))
|
80
|
+
label = @i18n.relatedterms[node["type"]].upcase
|
81
|
+
if p && ref
|
82
|
+
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
83
|
+
"<em>#{to_xml(p)}</em> (#{Common::to_xml(ref)})</p>"))
|
84
|
+
else
|
85
|
+
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
86
|
+
"<strong>**RELATED TERM NOT FOUND**</strong></p>"))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -179,5 +179,54 @@ module IsoDoc
|
|
179
179
|
end
|
180
180
|
" #{ret}"
|
181
181
|
end
|
182
|
+
|
183
|
+
def eref2link(docxml)
|
184
|
+
docxml.xpath(ns("//eref | //origin[not(termref)] | //quote/source"))
|
185
|
+
.each do |e|
|
186
|
+
href = eref_target(e) or next
|
187
|
+
e.xpath(ns("./locality | ./localityStack")).each(&:remove)
|
188
|
+
if /^#/.match?(href) then eref2xref(e)
|
189
|
+
else eref2link1(e, href)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def eref2xref(node)
|
195
|
+
node.name = "xref"
|
196
|
+
node["target"] = node["bibitemid"]
|
197
|
+
node.delete("bibitemid")
|
198
|
+
node.delete("citeas")
|
199
|
+
node["type"] == "footnote" and node.wrap("<sup></sup>")
|
200
|
+
end
|
201
|
+
|
202
|
+
def eref2link1(node, href)
|
203
|
+
repl = "<link target='#{href}'>#{node.children}</link>"
|
204
|
+
node["type"] == "footnote" and repl = "<sup>#{repl}</sup>"
|
205
|
+
node.replace(repl)
|
206
|
+
end
|
207
|
+
|
208
|
+
def suffix_url(url)
|
209
|
+
return url if url.nil? || %r{^https?://|^#}.match?(url)
|
210
|
+
return url unless File.extname(url).empty?
|
211
|
+
|
212
|
+
url.sub(/#{File.extname(url)}$/, ".html")
|
213
|
+
end
|
214
|
+
|
215
|
+
def eref_target(node)
|
216
|
+
url = suffix_url(eref_url(node["bibitemid"]))
|
217
|
+
anchor = node.at(ns(".//locality[@type = 'anchor']"))
|
218
|
+
return url if url.nil? || /^#/.match?(url) || !anchor
|
219
|
+
|
220
|
+
"#{url}##{anchor.text.strip}"
|
221
|
+
end
|
222
|
+
|
223
|
+
def eref_url(id)
|
224
|
+
@bibitems.nil? and return nil
|
225
|
+
b = @bibitems[id] or return nil
|
226
|
+
url = (b.at(ns("./uri[@type = 'citation'][@language = '#{@lang}']")) ||
|
227
|
+
b.at(ns("./uri[@type = 'citation']"))) and return url.text
|
228
|
+
b["hidden"] == "true" and return b.at(ns("./uri"))&.text
|
229
|
+
"##{id}"
|
230
|
+
end
|
182
231
|
end
|
183
232
|
end
|
@@ -124,9 +124,103 @@ module IsoDoc
|
|
124
124
|
display_order_xpath(docxml, "//colophon/*", i)
|
125
125
|
end
|
126
126
|
|
127
|
-
def clausetitle(docxml)
|
127
|
+
def clausetitle(docxml)
|
128
|
+
cjk_extended_title(docxml)
|
129
|
+
end
|
130
|
+
|
131
|
+
def cjk_search
|
132
|
+
lang = %w(zh ja ko).map { |x| "@language = '#{x}'" }.join(" or ")
|
133
|
+
%(Hans Hant Jpan Hang Kore).include?(@script) and
|
134
|
+
lang += " or not(@language)"
|
135
|
+
lang
|
136
|
+
end
|
137
|
+
|
138
|
+
def cjk_extended_title(docxml)
|
139
|
+
l = cjk_search
|
140
|
+
docxml.xpath(ns("//bibdata/title[#{l}] | //floating-title[#{l}] | " \
|
141
|
+
"//title[@depth = '1' or not(@depth)][#{l}]")).each do |t|
|
142
|
+
t.text.size < 4 or next
|
143
|
+
t.elements.empty? or next # can't be bothered
|
144
|
+
t.children = @i18n.cjk_extend(t.text)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def preface_rearrange(doc)
|
149
|
+
preface_move(doc.at(ns("//preface/abstract")),
|
150
|
+
%w(foreword introduction clause acknowledgements), doc)
|
151
|
+
preface_move(doc.at(ns("//preface/foreword")),
|
152
|
+
%w(introduction clause acknowledgements), doc)
|
153
|
+
preface_move(doc.at(ns("//preface/introduction")),
|
154
|
+
%w(clause acknowledgements), doc)
|
155
|
+
preface_move(doc.at(ns("//preface/acknowledgements")),
|
156
|
+
%w(), doc)
|
157
|
+
end
|
158
|
+
|
159
|
+
def preface_move(clause, after, _doc)
|
160
|
+
clause or return
|
161
|
+
preface = clause.parent
|
162
|
+
float = preceding_floats(clause)
|
163
|
+
prev = nil
|
164
|
+
xpath = after.map { |n| "./self::xmlns:#{n}" }.join(" | ")
|
165
|
+
xpath.empty? and xpath = "./self::*[not(following-sibling::*)]"
|
166
|
+
preface_move1(clause, preface, float, prev, xpath)
|
167
|
+
end
|
168
|
+
|
169
|
+
def preface_move1(clause, preface, float, prev, xpath)
|
170
|
+
preface.elements.each do |x|
|
171
|
+
((x.name == "floating-title" || x.at(xpath)) &&
|
172
|
+
xpath != "./self::*[not(following-sibling::*)]") or prev = x
|
173
|
+
# after.include?(x.name) or next
|
174
|
+
x.at(xpath) or next
|
175
|
+
clause == prev and break
|
176
|
+
prev ||= preface.children.first
|
177
|
+
float << clause
|
178
|
+
float.each { |n| prev.next = n }
|
179
|
+
break
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def preceding_floats(clause)
|
184
|
+
ret = []
|
185
|
+
p = clause
|
186
|
+
while prev = p.previous_element
|
187
|
+
if prev.name == "floating-title"
|
188
|
+
ret << prev
|
189
|
+
p = prev
|
190
|
+
else break
|
191
|
+
end
|
192
|
+
end
|
193
|
+
ret
|
194
|
+
end
|
195
|
+
|
196
|
+
def rearrange_clauses(docxml)
|
197
|
+
preface_rearrange(docxml) # feeds toc_title
|
198
|
+
toc_title(docxml)
|
199
|
+
end
|
200
|
+
|
201
|
+
def toc_title(docxml)
|
202
|
+
docxml.at(ns("//preface/clause[@type = 'toc']")) and return
|
203
|
+
ins = toc_title_insert_pt(docxml) or return
|
204
|
+
id = UUIDTools::UUID.random_create.to_s
|
205
|
+
ins.previous = <<~CLAUSE
|
206
|
+
<clause type = 'toc' id='_#{id}'><title depth='1'>#{@i18n.table_of_contents}</title></clause>
|
207
|
+
CLAUSE
|
208
|
+
end
|
209
|
+
|
210
|
+
def toc_title_insert_pt(docxml)
|
211
|
+
ins = docxml.at(ns("//preface")) ||
|
212
|
+
docxml.at(ns("//sections | //annex | //bibliography"))
|
213
|
+
&.before("<preface> </preface>")
|
214
|
+
&.previous_element or return nil
|
215
|
+
ins.children.empty? and ins << " "
|
216
|
+
ins.children.first
|
217
|
+
end
|
128
218
|
|
129
219
|
def toc(docxml)
|
220
|
+
toc_refs(docxml)
|
221
|
+
end
|
222
|
+
|
223
|
+
def toc_refs(docxml)
|
130
224
|
docxml.xpath(ns("//toc//xref[text()]")).each do |x|
|
131
225
|
lbl = @xrefs.anchor(x["target"], :label) or next
|
132
226
|
x.children.first.previous = "#{lbl}<tab/>"
|
@@ -1,92 +1,5 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
|
-
def concept(docxml)
|
4
|
-
@definition_ids = docxml.xpath(ns("//definitions//dt"))
|
5
|
-
.each_with_object({}) { |x, m| m[x["id"]] = true }
|
6
|
-
docxml.xpath(ns("//concept")).each { |f| concept1(f) }
|
7
|
-
end
|
8
|
-
|
9
|
-
def concept1(node)
|
10
|
-
xref = node&.at(ns("./xref/@target"))&.text or
|
11
|
-
return concept_render(node, ital: "true", ref: "true", bold: "false",
|
12
|
-
linkref: "true", linkmention: "false")
|
13
|
-
if @definition_ids[xref]
|
14
|
-
concept_render(node, ital: "false", ref: "false", bold: "false",
|
15
|
-
linkref: "true", linkmention: "false")
|
16
|
-
else concept_render(node, ital: "true", ref: "true", bold: "false",
|
17
|
-
linkref: "true", linkmention: "false")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def concept_render(node, defaults)
|
22
|
-
opts, render, ref = concept_render_init(node, defaults)
|
23
|
-
node&.at(ns("./refterm"))&.remove
|
24
|
-
ref && opts[:ref] != "false" and render&.next = " "
|
25
|
-
concept1_linkmention(ref, render, opts)
|
26
|
-
concept1_ref(node, ref, opts)
|
27
|
-
concept1_style(node, opts)
|
28
|
-
node.replace(node.children)
|
29
|
-
end
|
30
|
-
|
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)
|
37
|
-
end
|
38
|
-
|
39
|
-
def concept_render_init(node, defaults)
|
40
|
-
opts = %i(bold ital ref linkref linkmention)
|
41
|
-
.each_with_object({}) { |x, m| m[x] = node[x.to_s] || defaults[x] }
|
42
|
-
[opts, node.at(ns("./renderterm")),
|
43
|
-
node.at(ns("./xref | ./eref | ./termref"))]
|
44
|
-
end
|
45
|
-
|
46
|
-
def concept1_linkmention(ref, renderterm, opts)
|
47
|
-
(opts[:linkmention] == "true" && !renderterm.nil? && !ref.nil?) or return
|
48
|
-
ref2 = ref.clone
|
49
|
-
r2 = renderterm.clone
|
50
|
-
renderterm.replace(ref2).children = r2
|
51
|
-
end
|
52
|
-
|
53
|
-
def concept1_ref(_node, ref, opts)
|
54
|
-
ref.nil? and return
|
55
|
-
opts[:ref] == "false" and return ref.remove
|
56
|
-
concept1_ref_content(ref)
|
57
|
-
%w(xref eref).include? ref.name and get_linkend(ref)
|
58
|
-
opts[:linkref] == "false" && %w(xref eref).include?(ref.name) and
|
59
|
-
ref.replace(ref.children)
|
60
|
-
end
|
61
|
-
|
62
|
-
def concept1_ref_content(ref)
|
63
|
-
prev = "["
|
64
|
-
foll = "]"
|
65
|
-
non_locality_elems(ref).select do |c|
|
66
|
-
!c.text? || /\S/.match(c)
|
67
|
-
end.empty? and
|
68
|
-
(prev, foll = @i18n.term_defined_in.split("%"))
|
69
|
-
ref.previous = prev
|
70
|
-
ref.next = foll
|
71
|
-
end
|
72
|
-
|
73
|
-
def related(docxml)
|
74
|
-
docxml.xpath(ns("//related")).each { |f| related1(f) }
|
75
|
-
end
|
76
|
-
|
77
|
-
def related1(node)
|
78
|
-
p = node.at(ns("./preferred"))
|
79
|
-
ref = node.at(ns("./xref | ./eref | ./termref"))
|
80
|
-
label = @i18n.relatedterms[node["type"]].upcase
|
81
|
-
if p && ref
|
82
|
-
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
83
|
-
"<em>#{to_xml(p)}</em> (#{Common::to_xml(ref)})</p>"))
|
84
|
-
else
|
85
|
-
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
86
|
-
"<strong>**RELATED TERM NOT FOUND**</strong></p>"))
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
3
|
def designation(docxml)
|
91
4
|
docxml.xpath(ns("//term")).each { |t| merge_second_preferred(t) }
|
92
5
|
docxml.xpath(ns("//preferred | //admitted | //deprecates"))
|
@@ -225,9 +138,7 @@ module IsoDoc
|
|
225
138
|
end
|
226
139
|
|
227
140
|
def termsource(docxml)
|
228
|
-
docxml.xpath(ns("//termsource
|
229
|
-
termsource_modification(f)
|
230
|
-
end
|
141
|
+
docxml.xpath(ns("//termsource")).each { |f| termsource_modification(f) }
|
231
142
|
docxml.xpath(ns("//termsource")).each { |f| termsource1(f) }
|
232
143
|
end
|
233
144
|
|
@@ -238,12 +149,25 @@ module IsoDoc
|
|
238
149
|
elem.children = l10n("[#{@i18n.source}: #{to_xml(elem.children).strip}]")
|
239
150
|
end
|
240
151
|
|
241
|
-
def termsource_modification(
|
242
|
-
|
152
|
+
def termsource_modification(elem)
|
153
|
+
origin = elem.at(ns("./origin"))
|
154
|
+
s = termsource_status(elem["status"]) and origin.next = l10n(", #{s}")
|
155
|
+
termsource_add_modification_text(elem.at(ns("./modification")))
|
156
|
+
end
|
157
|
+
|
158
|
+
def termsource_add_modification_text(mod)
|
159
|
+
mod or return
|
243
160
|
mod.text.strip.empty? or mod.previous = " – "
|
244
161
|
mod.elements.size == 1 and
|
245
162
|
mod.elements[0].replace(mod.elements[0].children)
|
246
163
|
mod.replace(mod.children)
|
247
164
|
end
|
165
|
+
|
166
|
+
def termsource_status(status)
|
167
|
+
case status
|
168
|
+
when "modified" then @i18n.modified
|
169
|
+
when "adapted" then @i18n.adapted
|
170
|
+
end
|
171
|
+
end
|
248
172
|
end
|
249
173
|
end
|
@@ -76,7 +76,7 @@ module IsoDoc
|
|
76
76
|
# Note % to entry and Note % to entry: cannot conflate as Note % to entry 1 and 2
|
77
77
|
# So Notes 1 and 3, but Note 1 to entry and Note 3 to entry
|
78
78
|
def combine_conflated_xref_locations(locs)
|
79
|
-
out = if locs.any? { |l|
|
79
|
+
out = if locs.any? { |l| l[:elem]&.include?("%") }
|
80
80
|
locs.each { |l| l[:label] = @xrefs.anchor(l[:target], :xref) }
|
81
81
|
else
|
82
82
|
conflate_xref_locations(locs)
|
@@ -138,6 +138,7 @@ module IsoDoc
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def can_conflate_xref_rendering?(locs)
|
141
|
+
@i18n.get["no_conflate_xref_locations"] == true and return false
|
141
142
|
(locs.all? { |l| l[:container].nil? } ||
|
142
143
|
locs.all? { |l| l[:container] == locs.first[:container] }) &&
|
143
144
|
locs.all? { |l| l[:type] == locs[0][:type] }
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "presentation_function/block"
|
2
|
+
require_relative "presentation_function/concepts"
|
2
3
|
require_relative "presentation_function/terms"
|
3
4
|
require_relative "presentation_function/xrefs"
|
4
5
|
require_relative "presentation_function/erefs"
|
@@ -17,12 +18,20 @@ module IsoDoc
|
|
17
18
|
|
18
19
|
def convert1(docxml, _filename, _dir)
|
19
20
|
@xrefs.parse docxml
|
21
|
+
bibitem_lookup(docxml)
|
20
22
|
info docxml, nil
|
21
23
|
conversions(docxml)
|
22
24
|
docxml.root["type"] = "presentation"
|
23
25
|
docxml.to_xml.gsub(/</, "<").gsub(/>/, ">")
|
24
26
|
end
|
25
27
|
|
28
|
+
def bibitem_lookup(docxml)
|
29
|
+
@bibitems = docxml.xpath(ns("//references/bibitem"))
|
30
|
+
.each_with_object({}) do |b, m|
|
31
|
+
m[b["id"]] = b
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
26
35
|
def conversions(docxml)
|
27
36
|
semantic_xml_insert(docxml)
|
28
37
|
bibdata docxml
|
@@ -39,12 +48,13 @@ module IsoDoc
|
|
39
48
|
references docxml
|
40
49
|
# triggers xrefs reparse, so put references before all other sections,
|
41
50
|
# which alter titles and thus can alter xrefs
|
51
|
+
rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause
|
42
52
|
annex docxml
|
43
|
-
clause docxml
|
53
|
+
clause docxml # feeds clausetitle
|
44
54
|
term docxml
|
45
55
|
index docxml
|
46
|
-
clausetitle docxml
|
47
|
-
floattitle docxml
|
56
|
+
clausetitle docxml # feeds floattitle
|
57
|
+
floattitle docxml # feeds rearrange_clauses
|
48
58
|
toc docxml
|
49
59
|
display_order docxml
|
50
60
|
end
|
@@ -68,9 +78,10 @@ module IsoDoc
|
|
68
78
|
|
69
79
|
def inline(docxml)
|
70
80
|
xref docxml
|
71
|
-
eref docxml
|
72
|
-
origin docxml
|
73
|
-
quotesource docxml
|
81
|
+
eref docxml # feeds docxml
|
82
|
+
origin docxml # feeds docxml
|
83
|
+
quotesource docxml # feeds docxml
|
84
|
+
eref2link docxml
|
74
85
|
mathml docxml
|
75
86
|
variant docxml
|
76
87
|
identifier docxml
|
data/lib/isodoc/version.rb
CHANGED
@@ -28,12 +28,7 @@ module IsoDoc
|
|
28
28
|
def make_body2(body, docxml)
|
29
29
|
body.div class: "WordSection2" do |div2|
|
30
30
|
boilerplate docxml, div2
|
31
|
-
|
32
|
-
abstract docxml, div2
|
33
|
-
foreword docxml, div2
|
34
|
-
introduction docxml, div2
|
35
|
-
preface docxml, div2
|
36
|
-
acknowledgements docxml, div2
|
31
|
+
front docxml, div2
|
37
32
|
div2.p { |p| p << " " } # placeholder
|
38
33
|
end
|
39
34
|
section_break(body)
|
@@ -243,6 +238,18 @@ module IsoDoc
|
|
243
238
|
.at(ns("//metanorma-extension/toc[@type = 'recommendation']/title"))&.text
|
244
239
|
super
|
245
240
|
end
|
241
|
+
|
242
|
+
def table_of_contents(clause, out)
|
243
|
+
page_break(out)
|
244
|
+
out.div **attr_code(preface_attrs(clause)) do |div|
|
245
|
+
div.p class: "zzContents" do |p|
|
246
|
+
clause.at(ns("./title"))&.children&.each { |c| parse(c, p) }
|
247
|
+
end
|
248
|
+
clause.elements.each do |e|
|
249
|
+
parse(e, div) unless e.name == "title"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
246
253
|
end
|
247
254
|
end
|
248
255
|
end
|
@@ -2,12 +2,28 @@ module IsoDoc
|
|
2
2
|
module WordFunction
|
3
3
|
module Postprocess
|
4
4
|
def insert_toc(intro, docxml, level)
|
5
|
+
toc = assemble_toc(docxml, level)
|
6
|
+
if intro&.include?("WORDTOC")
|
7
|
+
if s = docxml.at("//div[@class = 'TOC']")
|
8
|
+
s&.previous_element&.elements&.first&.name == "br" and
|
9
|
+
s&.previous_element&.remove # page break
|
10
|
+
s.remove
|
11
|
+
end
|
12
|
+
intro.sub(/WORDTOC/, toc)
|
13
|
+
else
|
14
|
+
source = docxml.at("//div[@class = 'TOC']") and
|
15
|
+
source.children = toc
|
16
|
+
intro
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def assemble_toc(docxml, level)
|
5
21
|
toc = ""
|
6
22
|
toc += make_WordToC(docxml, level)
|
7
23
|
toc += make_table_word_toc(docxml)
|
8
24
|
toc += make_figure_word_toc(docxml)
|
9
25
|
toc += make_recommendation_word_toc(docxml)
|
10
|
-
|
26
|
+
toc
|
11
27
|
end
|
12
28
|
|
13
29
|
def word_toc_entry(toclevel, heading)
|
@@ -43,6 +59,9 @@ module IsoDoc
|
|
43
59
|
|
44
60
|
def make_WordToC(docxml, level)
|
45
61
|
toc = ""
|
62
|
+
if source = docxml.at("//div[@class = 'TOC']")
|
63
|
+
toc = to_xml(source.children)
|
64
|
+
end
|
46
65
|
# docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
|
47
66
|
xpath = (1..level).each.map { |i| "//h#{i}" }.join (" | ")
|
48
67
|
docxml.xpath(xpath).each do |h|
|
@@ -38,9 +38,10 @@ multiple_or: "%1, or %2"
|
|
38
38
|
chain_and: "%1 and %2"
|
39
39
|
chain_or: "%1 or %2"
|
40
40
|
chain_from: "%1 from %2"
|
41
|
-
chain_to: "%1
|
41
|
+
chain_to: "%1~%2"
|
42
42
|
nested_xref: "%1の%2"
|
43
43
|
list_nested_xref: "%1の%2"
|
44
|
+
no_conflate_xref_locations: true
|
44
45
|
ordinal_keys: []
|
45
46
|
SpelloutRules: spellout-ordinal
|
46
47
|
note: 注記
|
@@ -78,7 +79,8 @@ wholeoftext: Whole of text
|
|
78
79
|
draft_label: draft
|
79
80
|
inform_annex: 参考
|
80
81
|
norm_annex: 規定
|
81
|
-
modified:
|
82
|
+
modified: 修正された
|
83
|
+
adapted: 適合しました
|
82
84
|
deprecated: 推奨しない用語
|
83
85
|
source: 出典
|
84
86
|
and: and
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isodoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: html2doc
|
@@ -39,33 +39,33 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 4.3.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: emf2svg
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: liquid
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '5'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '5'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: plurimath
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -433,6 +433,7 @@ files:
|
|
433
433
|
- lib/isodoc/pdf_convert.rb
|
434
434
|
- lib/isodoc/presentation_function/bibdata.rb
|
435
435
|
- lib/isodoc/presentation_function/block.rb
|
436
|
+
- lib/isodoc/presentation_function/concepts.rb
|
436
437
|
- lib/isodoc/presentation_function/erefs.rb
|
437
438
|
- lib/isodoc/presentation_function/image.rb
|
438
439
|
- lib/isodoc/presentation_function/inline.rb
|