isodoc 2.5.3 → 2.5.5
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 -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
|