isodoc 2.4.3 → 2.4.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 +0 -1
- data/lib/isodoc/class_utils.rb +5 -2
- data/lib/isodoc/convert.rb +3 -6
- data/lib/isodoc/function/blocks_example_note.rb +5 -5
- data/lib/isodoc/function/section.rb +22 -9
- data/lib/isodoc/function/table.rb +12 -9
- data/lib/isodoc/function/to_word_html.rb +5 -4
- data/lib/isodoc/init.rb +9 -0
- data/lib/isodoc/metadata_contributor.rb +7 -9
- data/lib/isodoc/presentation_function/block.rb +18 -9
- data/lib/isodoc/presentation_function/image.rb +2 -2
- data/lib/isodoc/presentation_function/math.rb +1 -1
- data/lib/isodoc/presentation_function/refs.rb +11 -8
- data/lib/isodoc/presentation_function/section.rb +6 -4
- data/lib/isodoc/presentation_function/sourcecode.rb +13 -5
- data/lib/isodoc/presentation_function/terms.rb +8 -9
- data/lib/isodoc/presentation_xml_convert.rb +14 -5
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/table.rb +8 -4
- data/lib/isodoc/xref/xref_anchor.rb +5 -3
- data/lib/isodoc/xref/xref_gen.rb +25 -14
- data/lib/isodoc/xref/xref_gen_seq.rb +9 -9
- data/lib/isodoc/xref/xref_sect_gen.rb +6 -4
- data/lib/isodoc/xref.rb +1 -1
- data/lib/isodoc-yaml/i18n-ar.yaml +1 -0
- data/lib/isodoc-yaml/i18n-de.yaml +1 -0
- 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-ru.yaml +1 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- data/lib/isodoc.rb +2 -1
- metadata +4 -18
- /data/lib/relaton/{render → render-isodoc}/config.yml +0 -0
- /data/lib/relaton/{render → render-isodoc}/general.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cbb9d45ce42c28917d84ebd31912cd4218cd47f633d27cf58f1060396c14d67
|
4
|
+
data.tar.gz: 25872abe5383206f171fadb766688bd46e751cb83852fa0c09848cdb8a4a45a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8734f21809f2c71d90bbb291c2da8e703cf25e06bebeb83cf3db464d2b97179dd2744be793e11b2657435309c2faf8a08d4d8d48a16c2fad34bdc8fe628a3b1d
|
7
|
+
data.tar.gz: ebbcfc1ca95fe1b7d3c8ec89a73823176ae72ad0cd3b43cdc9061a9eafc6dce8612832c0a6dc1fc3f3be4948367567e74fc8c78eb90d5e234a8bd6fbd9cd467a
|
data/isodoc.gemspec
CHANGED
@@ -40,7 +40,6 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_dependency "metanorma-utils", "~> 1.4.5"
|
41
41
|
spec.add_dependency "mn2pdf"
|
42
42
|
spec.add_dependency "mn-requirements", "~> 0.3.1"
|
43
|
-
spec.add_dependency "relaton-cli"
|
44
43
|
spec.add_dependency "relaton-render", "~> 0.5.2"
|
45
44
|
spec.add_dependency "roman-numerals"
|
46
45
|
spec.add_dependency "rouge", "~> 4.0"
|
data/lib/isodoc/class_utils.rb
CHANGED
@@ -76,8 +76,11 @@ module IsoDoc
|
|
76
76
|
|
77
77
|
# node is at the start of sentence in a Metanorma XML context
|
78
78
|
def start_of_sentence(node)
|
79
|
-
prec =
|
80
|
-
|
79
|
+
prec = [] # all text nodes before node
|
80
|
+
nearest_block_parent(node).traverse do |x|
|
81
|
+
x == node and break
|
82
|
+
x.text? and prec << x
|
83
|
+
end
|
81
84
|
prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map(&:text).join)
|
82
85
|
end
|
83
86
|
end
|
data/lib/isodoc/convert.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require "isodoc/common"
|
4
2
|
require "fileutils"
|
5
3
|
require "tempfile"
|
@@ -161,10 +159,8 @@ module IsoDoc
|
|
161
159
|
end
|
162
160
|
|
163
161
|
def init_toc(options)
|
164
|
-
@
|
165
|
-
@wordToClevels = 2
|
166
|
-
@htmlToClevels = (options[:htmltoclevels] || options[:toclevels]).to_i
|
167
|
-
@htmlToClevels = 2 if @htmlToClevels.zero?
|
162
|
+
@htmlToClevels = 2
|
163
|
+
@wordToClevels = 2
|
168
164
|
@tocfigures = options[:tocfigures]
|
169
165
|
@toctables = options[:toctables]
|
170
166
|
@tocrecommendations = options[:tocrecommendations]
|
@@ -218,6 +214,7 @@ module IsoDoc
|
|
218
214
|
convert_i18n_init(docxml)
|
219
215
|
metadata_init(@lang, @script, @locale, @i18n)
|
220
216
|
xref_init(@lang, @script, self, @i18n, { locale: @locale })
|
217
|
+
toc_init(docxml)
|
221
218
|
[docxml, filename, dir]
|
222
219
|
end
|
223
220
|
|
@@ -4,7 +4,7 @@ module IsoDoc
|
|
4
4
|
def example_label(_node, div, name)
|
5
5
|
return if name.nil?
|
6
6
|
|
7
|
-
div.p
|
7
|
+
div.p class: "example-title" do |_p|
|
8
8
|
name.children.each { |n| parse(n, div) }
|
9
9
|
end
|
10
10
|
end
|
@@ -29,7 +29,7 @@ module IsoDoc
|
|
29
29
|
|
30
30
|
def example_table_attr(node)
|
31
31
|
attr_code(id: node["id"], class: "example",
|
32
|
-
style: "border-collapse:collapse;border-spacing:0;"\
|
32
|
+
style: "border-collapse:collapse;border-spacing:0;" \
|
33
33
|
"#{keep_style(node)}")
|
34
34
|
end
|
35
35
|
|
@@ -60,7 +60,7 @@ module IsoDoc
|
|
60
60
|
def note_p_parse(node, div)
|
61
61
|
name = node&.at(ns("./name"))&.remove
|
62
62
|
div.p do |p|
|
63
|
-
name and p.span
|
63
|
+
name and p.span class: "note_label" do |s|
|
64
64
|
name.children.each { |n| parse(n, s) }
|
65
65
|
s << note_delim
|
66
66
|
end
|
@@ -73,7 +73,7 @@ module IsoDoc
|
|
73
73
|
def note_parse1(node, div)
|
74
74
|
name = node&.at(ns("./name"))&.remove
|
75
75
|
name and div.p do |p|
|
76
|
-
p.span
|
76
|
+
p.span class: "note_label" do |s|
|
77
77
|
name.children.each { |n| parse(n, s) }
|
78
78
|
s << note_delim
|
79
79
|
end
|
@@ -117,7 +117,7 @@ module IsoDoc
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def admonition_name_parse(_node, div, name)
|
120
|
-
div.p
|
120
|
+
div.p class: "AdmonitionTitle", style: "text-align:center;" do |p|
|
121
121
|
name.children.each { |n| parse(n, p) }
|
122
122
|
end
|
123
123
|
end
|
@@ -58,7 +58,7 @@ module IsoDoc
|
|
58
58
|
num
|
59
59
|
end
|
60
60
|
|
61
|
-
TERM_CLAUSE = "//sections/terms | "\
|
61
|
+
TERM_CLAUSE = "//sections/terms | " \
|
62
62
|
"//sections/clause[descendant::terms]".freeze
|
63
63
|
|
64
64
|
def terms_defs(isoxml, out, num)
|
@@ -100,7 +100,7 @@ module IsoDoc
|
|
100
100
|
def introduction(isoxml, out)
|
101
101
|
f = isoxml.at(ns("//introduction")) || return
|
102
102
|
page_break(out)
|
103
|
-
out.div
|
103
|
+
out.div class: "Section3", id: f["id"] do |div|
|
104
104
|
clause_name(nil, f.at(ns("./title")), div, { class: "IntroTitle" })
|
105
105
|
f.elements.each do |e|
|
106
106
|
parse(e, div) unless e.name == "title"
|
@@ -122,7 +122,7 @@ module IsoDoc
|
|
122
122
|
f = isoxml.at(ns("//acknowledgements")) || return
|
123
123
|
title_attr = { class: "IntroTitle" }
|
124
124
|
page_break(out)
|
125
|
-
out.div
|
125
|
+
out.div class: "Section3", id: f["id"] do |div|
|
126
126
|
clause_name(nil, f&.at(ns("./title")), div, title_attr)
|
127
127
|
f.elements.each do |e|
|
128
128
|
parse(e, div) unless e.name == "title"
|
@@ -140,10 +140,23 @@ module IsoDoc
|
|
140
140
|
end
|
141
141
|
|
142
142
|
def preface(isoxml, out)
|
143
|
-
isoxml.xpath(ns("//preface/clause | //preface/references | "\
|
143
|
+
isoxml.xpath(ns("//preface/clause | //preface/references | " \
|
144
144
|
"//preface/definitions | //preface/terms")).each do |f|
|
145
145
|
page_break(out)
|
146
|
-
out.div
|
146
|
+
out.div class: "Section3", id: f["id"] do |div|
|
147
|
+
clause_name(nil, f&.at(ns("./title")), div, { class: "IntroTitle" })
|
148
|
+
f.elements.each do |e|
|
149
|
+
parse(e, div) unless e.name == "title"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def colophon(isoxml, out)
|
156
|
+
isoxml.at(ns("//colophon")) or return
|
157
|
+
page_break(out)
|
158
|
+
isoxml.xpath(ns("//colophon/clause")).each do |f|
|
159
|
+
out.div class: "Section3", id: f["id"] do |div|
|
147
160
|
clause_name(nil, f&.at(ns("./title")), div, { class: "IntroTitle" })
|
148
161
|
f.elements.each do |e|
|
149
162
|
parse(e, div) unless e.name == "title"
|
@@ -174,7 +187,7 @@ module IsoDoc
|
|
174
187
|
def copyright_parse(node, out)
|
175
188
|
return if @bare
|
176
189
|
|
177
|
-
out.div
|
190
|
+
out.div class: "boilerplate-copyright" do |div|
|
178
191
|
node.children.each { |n| parse(n, div) }
|
179
192
|
end
|
180
193
|
end
|
@@ -182,7 +195,7 @@ module IsoDoc
|
|
182
195
|
def license_parse(node, out)
|
183
196
|
return if @bare
|
184
197
|
|
185
|
-
out.div
|
198
|
+
out.div class: "boilerplate-license" do |div|
|
186
199
|
node.children.each { |n| parse(n, div) }
|
187
200
|
end
|
188
201
|
end
|
@@ -190,7 +203,7 @@ module IsoDoc
|
|
190
203
|
def legal_parse(node, out)
|
191
204
|
return if @bare
|
192
205
|
|
193
|
-
out.div
|
206
|
+
out.div class: "boilerplate-legal" do |div|
|
194
207
|
node.children.each { |n| parse(n, div) }
|
195
208
|
end
|
196
209
|
end
|
@@ -198,7 +211,7 @@ module IsoDoc
|
|
198
211
|
def feedback_parse(node, out)
|
199
212
|
return if @bare
|
200
213
|
|
201
|
-
out.div
|
214
|
+
out.div class: "boilerplate-feedback" do |div|
|
202
215
|
node.children.each { |n| parse(n, div) }
|
203
216
|
end
|
204
217
|
end
|
@@ -3,7 +3,7 @@ module IsoDoc
|
|
3
3
|
module Table
|
4
4
|
def table_title_parse(node, out)
|
5
5
|
name = node.at(ns("./name")) or return
|
6
|
-
out.p
|
6
|
+
out.p class: "TableTitle", style: "text-align:center;" do |p|
|
7
7
|
name&.children&.each { |n| parse(n, p) }
|
8
8
|
end
|
9
9
|
end
|
@@ -56,7 +56,7 @@ module IsoDoc
|
|
56
56
|
return unless node["summary"]
|
57
57
|
|
58
58
|
table.caption do |c|
|
59
|
-
c.span
|
59
|
+
c.span style: "display:none" do |s|
|
60
60
|
s << node["summary"]
|
61
61
|
end
|
62
62
|
end
|
@@ -66,7 +66,7 @@ module IsoDoc
|
|
66
66
|
colgroup = node.at(ns("./colgroup")) or return
|
67
67
|
table.colgroup do |cg|
|
68
68
|
colgroup.xpath(ns("./col")).each do |c|
|
69
|
-
cg.col
|
69
|
+
cg.col style: "width: #{c['width']};"
|
70
70
|
end
|
71
71
|
end
|
72
72
|
end
|
@@ -75,16 +75,19 @@ module IsoDoc
|
|
75
75
|
@in_table = true
|
76
76
|
table_title_parse(node, out)
|
77
77
|
out.table **table_attrs(node) do |t|
|
78
|
-
|
79
|
-
colgroup(node, t)
|
80
|
-
thead_parse(node, t)
|
81
|
-
tbody_parse(node, t)
|
82
|
-
tfoot_parse(node, t)
|
78
|
+
table_parse_core(node, t)
|
83
79
|
(dl = node.at(ns("./dl"))) && parse(dl, out)
|
84
80
|
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
85
81
|
end
|
86
82
|
@in_table = false
|
87
|
-
|
83
|
+
end
|
84
|
+
|
85
|
+
def table_parse_core(node, out)
|
86
|
+
tcaption(node, out)
|
87
|
+
colgroup(node, out)
|
88
|
+
thead_parse(node, out)
|
89
|
+
tbody_parse(node, out)
|
90
|
+
tfoot_parse(node, out)
|
88
91
|
end
|
89
92
|
|
90
93
|
SW = "solid windowtext".freeze
|
@@ -69,21 +69,21 @@ module IsoDoc
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def make_body1(body, _docxml)
|
72
|
-
body.div
|
72
|
+
body.div class: "title-section" do |div1|
|
73
73
|
div1.p { |p| p << " " } # placeholder
|
74
74
|
end
|
75
75
|
section_break(body)
|
76
76
|
end
|
77
77
|
|
78
78
|
def make_body2(body, _docxml)
|
79
|
-
body.div
|
79
|
+
body.div class: "prefatory-section" do |div2|
|
80
80
|
div2.p { |p| p << " " } # placeholder
|
81
81
|
end
|
82
82
|
section_break(body)
|
83
83
|
end
|
84
84
|
|
85
85
|
def make_body3(body, docxml)
|
86
|
-
body.div
|
86
|
+
body.div class: "main-section" do |div3|
|
87
87
|
boilerplate docxml, div3
|
88
88
|
preface_block docxml, div3
|
89
89
|
abstract docxml, div3
|
@@ -125,13 +125,14 @@ module IsoDoc
|
|
125
125
|
clause isoxml, out
|
126
126
|
annex isoxml, out
|
127
127
|
bibliography isoxml, out
|
128
|
+
colophon isoxml, out
|
128
129
|
end
|
129
130
|
|
130
131
|
def boilerplate(node, out)
|
131
132
|
return if @bare
|
132
133
|
|
133
134
|
boilerplate = node.at(ns("//boilerplate")) or return
|
134
|
-
out.div
|
135
|
+
out.div class: "authority" do |s|
|
135
136
|
boilerplate.children.each do |n|
|
136
137
|
if n.name == "title"
|
137
138
|
s.h1 do |h|
|
data/lib/isodoc/init.rb
CHANGED
@@ -17,5 +17,14 @@ module IsoDoc
|
|
17
17
|
def l10n(expr, lang = @lang, script = @script, locale = @locale)
|
18
18
|
@i18n.l10n(expr, lang, script, locale)
|
19
19
|
end
|
20
|
+
|
21
|
+
def toc_init(docxml)
|
22
|
+
x = "//metanorma-extension/presentation-metadata" \
|
23
|
+
"[name[text() = 'TOC Heading Levels']]/value"
|
24
|
+
n = docxml.at(ns(x.sub(/TOC/, "DOC TOC"))) and
|
25
|
+
@wordToClevels = n.text.to_i
|
26
|
+
n = docxml.at(ns(x.sub(/TOC/, "HTML TOC"))) and
|
27
|
+
@htmlToClevels = n.text.to_i
|
28
|
+
end
|
20
29
|
end
|
21
30
|
end
|
@@ -20,16 +20,14 @@ module IsoDoc
|
|
20
20
|
|
21
21
|
def extract_person_affiliations(authors)
|
22
22
|
authors.reduce([]) do |m, a|
|
23
|
+
pos = a.at(ns("./affiliation/name"))&.text
|
23
24
|
name = a.at(ns("./affiliation/organization/name"))&.text
|
24
|
-
subdivs = a.xpath(ns("./affiliation/organization/subdivision"))
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
m << (
|
29
|
-
|
30
|
-
else
|
31
|
-
(name || location || "")
|
32
|
-
end)
|
25
|
+
subdivs = a.xpath(ns("./affiliation/organization/subdivision"))
|
26
|
+
&.map(&:text)&.join(", ")
|
27
|
+
location =
|
28
|
+
a.at(ns("./affiliation/organization/address/formattedAddress"))&.text
|
29
|
+
m << l10n([pos, name, subdivs, location].map { |x| x&.empty? ? nil : x }
|
30
|
+
.compact.join(", "))
|
33
31
|
m
|
34
32
|
end
|
35
33
|
end
|
@@ -15,8 +15,7 @@ module IsoDoc
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def prefix_name(node, delim, number, elem)
|
18
|
-
|
19
|
-
|
18
|
+
number.nil? || number.empty? and return
|
20
19
|
unless name = node.at(ns("./#{elem}"))
|
21
20
|
(node.children.empty? and node.add_child("<#{elem}></#{elem}>")) or
|
22
21
|
node.children.first.previous = "<#{elem}></#{elem}>"
|
@@ -54,12 +53,12 @@ module IsoDoc
|
|
54
53
|
end
|
55
54
|
|
56
55
|
def note1(elem)
|
57
|
-
elem.parent.name
|
56
|
+
%w(bibdata bibitem).include?(elem.parent.name) ||
|
57
|
+
elem["notag"] == "true" and return
|
58
58
|
n = @xrefs.get[elem["id"]]
|
59
|
-
lbl =
|
60
|
-
|
61
|
-
|
62
|
-
end
|
59
|
+
lbl = @i18n.note
|
60
|
+
(n.nil? || n[:label].nil? || n[:label].empty?) or
|
61
|
+
lbl = l10n("#{lbl} #{n[:label]}")
|
63
62
|
prefix_name(elem, "", lbl, "name")
|
64
63
|
end
|
65
64
|
|
@@ -68,8 +67,18 @@ module IsoDoc
|
|
68
67
|
end
|
69
68
|
|
70
69
|
def admonition1(elem)
|
71
|
-
|
72
|
-
|
70
|
+
if elem["type"] == "box"
|
71
|
+
admonition_numbered1(elem)
|
72
|
+
else
|
73
|
+
elem["notag"] == "true" || elem.at(ns("./name")) and return
|
74
|
+
prefix_name(elem, "", @i18n.admonition[elem["type"]]&.upcase, "name")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def admonition_numbered1(elem)
|
79
|
+
elem["unnumbered"] && !elem.at(ns("./name")) and return
|
80
|
+
n = @xrefs.anchor(elem["id"], :label, false)
|
81
|
+
prefix_name(elem, block_delim, l10n("#{@i18n.box} #{n}"), "name")
|
73
82
|
end
|
74
83
|
|
75
84
|
def recommendation(docxml)
|
@@ -16,8 +16,8 @@ module IsoDoc
|
|
16
16
|
def svg_wrap(elem)
|
17
17
|
return if elem.parent.name == "image"
|
18
18
|
|
19
|
-
elem.
|
20
|
-
|
19
|
+
elem.wrap("<image src='' mimetype='image/svg+xml' height='auto' " \
|
20
|
+
"width='auto'></image>")
|
21
21
|
end
|
22
22
|
|
23
23
|
def svgmap_extract(elem)
|
@@ -106,7 +106,7 @@ module IsoDoc
|
|
106
106
|
def mathml_style_inherit(node)
|
107
107
|
node.at("./ancestor::xmlns:strong") or return
|
108
108
|
node.children =
|
109
|
-
"<mstyle
|
109
|
+
"<mstyle mathvariant='bold'>#{node.children.to_xml}</mstyle>"
|
110
110
|
end
|
111
111
|
|
112
112
|
def mathml_number_to_number(node)
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require_relative "../../relaton/render/general"
|
2
|
-
|
3
1
|
module IsoDoc
|
4
2
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
5
3
|
def references(docxml)
|
@@ -8,11 +6,16 @@ module IsoDoc
|
|
8
6
|
docxml.xpath(ns("//references/bibitem")).each do |x|
|
9
7
|
bibitem(x, renderings)
|
10
8
|
end
|
9
|
+
hidden_items(docxml)
|
10
|
+
@xrefs.parse_inclusions(refs: true).parse(docxml)
|
11
|
+
end
|
12
|
+
|
13
|
+
def hidden_items(docxml)
|
11
14
|
docxml.xpath(ns("//references[bibitem/@hidden = 'true']")).each do |x|
|
12
15
|
x.at(ns("./bibitem[not(@hidden = 'true')]")) and next
|
16
|
+
x.elements.map(&:name).any? { |n| n != "bibitem" } and next
|
13
17
|
x["hidden"] = "true"
|
14
18
|
end
|
15
|
-
@xrefs.parse_inclusions(refs: true).parse(docxml)
|
16
19
|
end
|
17
20
|
|
18
21
|
def references_render(docxml)
|
@@ -127,13 +130,13 @@ module IsoDoc
|
|
127
130
|
ids = @xrefs.klass.bibitem_ref_code(bib)
|
128
131
|
idents = @xrefs.klass.render_identifier(ids)
|
129
132
|
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)
|
133
|
+
standard, datefn, bib)
|
134
|
+
else norm_ref_entry_code(ordinal, idents, ids, standard, datefn, bib)
|
132
135
|
end
|
133
136
|
bib << "<biblio-tag>#{ret}</biblio-tag>"
|
134
137
|
end
|
135
138
|
|
136
|
-
def norm_ref_entry_code(_ordinal, idents, _ids, _standard, datefn)
|
139
|
+
def norm_ref_entry_code(_ordinal, idents, _ids, _standard, datefn, _bib)
|
137
140
|
ret = (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
|
138
141
|
(idents[:ordinal] || idents[:metanorma]) && idents[:sdo] and
|
139
142
|
ret += ", #{idents[:sdo]}"
|
@@ -145,8 +148,8 @@ module IsoDoc
|
|
145
148
|
|
146
149
|
# if ids is just a number, only use that ([1] Non-Standard)
|
147
150
|
# else, use both ordinal, as prefix, and ids
|
148
|
-
def biblio_ref_entry_code(ordinal, ids, _id, standard, datefn)
|
149
|
-
standard and id = nil
|
151
|
+
def biblio_ref_entry_code(ordinal, ids, _id, standard, datefn, _bib)
|
152
|
+
#standard and id = nil
|
150
153
|
ret = (ids[:ordinal] || ids[:metanorma] || "[#{ordinal}]")
|
151
154
|
if ids[:sdo]
|
152
155
|
ret = prefix_bracketed_ref(ret)
|
@@ -17,7 +17,7 @@ module IsoDoc
|
|
17
17
|
level = @xrefs.anchor(elem["id"], :level, false) ||
|
18
18
|
(elem.ancestors("clause, annex").size + 1)
|
19
19
|
t = elem.at(ns("./title")) and t["depth"] = level
|
20
|
-
return if !elem.ancestors("boilerplate").empty? ||
|
20
|
+
return if !elem.ancestors("boilerplate, metanorma-extension").empty? ||
|
21
21
|
@suppressheadingnumbers || elem["unnumbered"]
|
22
22
|
|
23
23
|
lbl = @xrefs.anchor(elem["id"], :label,
|
@@ -28,12 +28,13 @@ module IsoDoc
|
|
28
28
|
def floattitle(docxml)
|
29
29
|
docxml.xpath(ns("//clause | //annex | //appendix | //introduction | " \
|
30
30
|
"//foreword | //preface/abstract | //acknowledgements | " \
|
31
|
-
"//terms | //definitions | //references"))
|
31
|
+
"//terms | //definitions | //references | //colophon"))
|
32
32
|
.each do |f|
|
33
33
|
floattitle1(f)
|
34
34
|
end
|
35
35
|
# top-level
|
36
|
-
docxml.xpath(ns("//sections | //preface
|
36
|
+
docxml.xpath(ns("//sections | //preface | //colophon"))
|
37
|
+
.each { |f| floattitle1(f) }
|
37
38
|
end
|
38
39
|
|
39
40
|
def floattitle1(elem)
|
@@ -119,7 +120,8 @@ module IsoDoc
|
|
119
120
|
i = display_order_xpath(docxml, @xrefs.klass.middle_clause(docxml), i)
|
120
121
|
i = display_order_xpath(docxml, "//annex", i)
|
121
122
|
i = display_order_xpath(docxml, @xrefs.klass.bibliography_xpath, i)
|
122
|
-
display_order_xpath(docxml, "//indexsect", i)
|
123
|
+
i = display_order_xpath(docxml, "//indexsect", i)
|
124
|
+
display_order_xpath(docxml, "//colophon/*", i)
|
123
125
|
end
|
124
126
|
|
125
127
|
def clausetitle(docxml); end
|
@@ -1,16 +1,23 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
3
|
def sourcehighlighter_css(docxml)
|
4
|
-
|
4
|
+
ret = custom_css(docxml)
|
5
|
+
ret.empty? and return
|
5
6
|
ins = docxml.at(ns("//metanorma-extension")) ||
|
6
7
|
docxml.at(ns("//bibdata")).after("<metanorma-extension/>").next_element
|
7
|
-
ins << "<source-highlighter-css>#{
|
8
|
+
ins << "<source-highlighter-css>#{ret}" \
|
8
9
|
"</source-highlighter-css>"
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
12
|
+
def custom_css(docxml)
|
13
|
+
ret = ""
|
14
|
+
@sourcehighlighter and
|
15
|
+
ret += File.read(File.join(File.dirname(__FILE__), "..", "base_style",
|
16
|
+
"rouge.css"))
|
17
|
+
a = docxml.at(ns("//metanorma-extension/" \
|
18
|
+
"clause[title = 'user-css']/sourcecode")) and
|
19
|
+
ret += "\n#{to_xml(a.children)}"
|
20
|
+
ret
|
14
21
|
end
|
15
22
|
|
16
23
|
def sourcehighlighter
|
@@ -109,6 +116,7 @@ module IsoDoc
|
|
109
116
|
Rouge::Lexer.find("plaintext"))
|
110
117
|
l = Rouge::Lexers::Escape.new(start: "{^^{", end: "}^^}", lang: lexer)
|
111
118
|
source = to_xml(elem.children).gsub(/</, "{^^{<").gsub(/>/, ">}^^}")
|
119
|
+
l.lang.reset!
|
112
120
|
l.lex(@c.decode(source))
|
113
121
|
end
|
114
122
|
|
@@ -56,23 +56,22 @@ module IsoDoc
|
|
56
56
|
def concept1_ref(_node, ref, opts)
|
57
57
|
ref.nil? and return
|
58
58
|
opts[:ref] == "false" and return ref.remove
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
"./descendant-or-self::xmlns:termref")
|
63
|
-
%w(xref eref).include? ref&.name and get_linkend(ref)
|
64
|
-
opts[:linkref] == "false" && %w(xref eref).include?(ref&.name) and
|
59
|
+
concept1_ref_content(ref)
|
60
|
+
%w(xref eref).include? ref.name and get_linkend(ref)
|
61
|
+
opts[:linkref] == "false" && %w(xref eref).include?(ref.name) and
|
65
62
|
ref.replace(ref.children)
|
66
63
|
end
|
67
64
|
|
68
65
|
def concept1_ref_content(ref)
|
66
|
+
prev = "["
|
67
|
+
foll = "]"
|
69
68
|
if non_locality_elems(ref).select do |c|
|
70
69
|
!c.text? || /\S/.match(c)
|
71
70
|
end.empty?
|
72
|
-
|
73
|
-
to_xml(ref)))
|
74
|
-
else ref.replace("[#{to_xml(ref)}]")
|
71
|
+
prev, foll = @i18n.term_defined_in.split("%")
|
75
72
|
end
|
73
|
+
ref.previous = prev
|
74
|
+
ref.next = foll
|
76
75
|
end
|
77
76
|
|
78
77
|
def related(docxml)
|
@@ -87,10 +87,11 @@ module IsoDoc
|
|
87
87
|
|
88
88
|
def semantic_xml_insert(xml)
|
89
89
|
@semantic_xml_insert or return
|
90
|
-
embed =
|
90
|
+
embed = embedable_semantic_xml(xml)
|
91
91
|
ins = metanorma_extension_insert_pt(xml)
|
92
92
|
ins = ins.at(ns("./metanorma")) || ins.add_child("<metanorma/>").first
|
93
|
-
ins
|
93
|
+
ins = ins.add_child("<source/>").first
|
94
|
+
ins << embed
|
94
95
|
end
|
95
96
|
|
96
97
|
def metanorma_extension_insert_pt(xml)
|
@@ -107,14 +108,22 @@ module IsoDoc
|
|
107
108
|
end
|
108
109
|
|
109
110
|
def embedable_semantic_xml_tags(xml)
|
110
|
-
|
111
|
-
|
111
|
+
ret = to_xml(xml)
|
112
|
+
.sub(/ xmlns=['"][^"']+['"]/, "") # root XMLNS
|
113
|
+
.split(/(?=[<> \t\r\n\f\v])/).map do |x|
|
114
|
+
case x
|
115
|
+
when /^<[^:]+:/ then x.sub(/:/, ":semantic__")
|
116
|
+
when /^<[^:]+$/ then x.sub(%r{(</?)([[:alpha:]])},
|
117
|
+
"\\1semantic__\\2")
|
118
|
+
else x end
|
119
|
+
end
|
120
|
+
Nokogiri::XML(ret.join).root
|
112
121
|
end
|
113
122
|
|
114
123
|
def embedable_semantic_xml_attributes(xml)
|
115
124
|
Metanorma::Utils::anchor_attributes.each do |(tag_name, attr_name)|
|
116
125
|
tag_name == "*" or tag_name = "semantic__#{tag_name}"
|
117
|
-
xml.xpath(
|
126
|
+
xml.xpath("//#{tag_name}[@#{attr_name}]").each do |elem|
|
118
127
|
elem.attributes[attr_name].value =
|
119
128
|
"semantic__#{elem.attributes[attr_name].value}"
|
120
129
|
end
|
data/lib/isodoc/version.rb
CHANGED
@@ -89,16 +89,20 @@ module IsoDoc
|
|
89
89
|
table_title_parse(node, out)
|
90
90
|
out.div align: "center", class: "table_container" do |div|
|
91
91
|
div.table **table_attrs(node) do |t|
|
92
|
-
|
93
|
-
thead_parse(node, t)
|
94
|
-
tbody_parse(node, t)
|
95
|
-
tfoot_parse(node, t)
|
92
|
+
table_parse_core(node, out)
|
96
93
|
(dl = node.at(ns("./dl"))) && parse(dl, out)
|
97
94
|
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
98
95
|
end
|
99
96
|
end
|
100
97
|
@in_table = false
|
101
98
|
end
|
99
|
+
|
100
|
+
def table_parse_core(node, out)
|
101
|
+
colgroup(node, out)
|
102
|
+
thead_parse(node, out)
|
103
|
+
tbody_parse(node, out)
|
104
|
+
tfoot_parse(node, out)
|
105
|
+
end
|
102
106
|
end
|
103
107
|
end
|
104
108
|
end
|
@@ -4,10 +4,12 @@ module IsoDoc
|
|
4
4
|
module XrefGen
|
5
5
|
module Anchor
|
6
6
|
class SeenAnchor
|
7
|
-
|
8
|
-
|
9
|
-
def initialize
|
7
|
+
def initialize(xmldoc)
|
10
8
|
@seen = {}
|
9
|
+
# ignore all metanorma-extension ids
|
10
|
+
xmldoc.xpath("//xmlns:metanorma-extension//*[@id]").each do |x|
|
11
|
+
add(x["id"])
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
def seen(elem)
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -92,14 +92,15 @@ module IsoDoc
|
|
92
92
|
SECTIONS_XPATH
|
93
93
|
end
|
94
94
|
|
95
|
-
|
95
|
+
def child_asset_path(asset)
|
96
96
|
"./*[not(self::xmlns:clause) and not(self::xmlns:appendix) and " \
|
97
|
-
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//xmlns:
|
98
|
-
"./xmlns:
|
97
|
+
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//xmlns:X | " \
|
98
|
+
"./xmlns:X".gsub("X", asset)
|
99
|
+
end
|
99
100
|
|
100
101
|
def note_anchor_names(sections)
|
101
102
|
sections.each do |s|
|
102
|
-
notes = s.xpath(
|
103
|
+
notes = s.xpath(child_asset_path("note")) -
|
103
104
|
s.xpath(ns(".//figure//note | .//table//note"))
|
104
105
|
note_anchor_names1(notes, Counter.new)
|
105
106
|
note_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
|
@@ -107,26 +108,35 @@ module IsoDoc
|
|
107
108
|
end
|
108
109
|
|
109
110
|
def note_anchor_names1(notes, counter)
|
110
|
-
notes.each do |n|
|
111
|
-
next if @anchors[n["id"]] || blank?(n["id"])
|
112
|
-
|
111
|
+
notes.noblank.each do |n|
|
113
112
|
@anchors[n["id"]] =
|
114
113
|
anchor_struct(increment_label(notes, n, counter), n,
|
115
114
|
@labels["note_xref"], "note", false)
|
116
115
|
end
|
117
116
|
end
|
118
117
|
|
119
|
-
CHILD_EXAMPLES_XPATH =
|
120
|
-
"./*[not(self::xmlns:clause) and not(self::xmlns:appendix) and " \
|
121
|
-
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//" \
|
122
|
-
"xmlns:example | ./xmlns:example".freeze
|
123
|
-
|
124
118
|
CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | " \
|
125
119
|
"./references".freeze
|
126
120
|
|
121
|
+
def admonition_anchor_names(sections)
|
122
|
+
sections.each do |s|
|
123
|
+
notes = s.xpath(child_asset_path("admonition[@type = 'box']"))
|
124
|
+
admonition_anchor_names1(notes, Counter.new)
|
125
|
+
admonition_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def admonition_anchor_names1(notes, counter)
|
130
|
+
notes.noblank.each do |n|
|
131
|
+
@anchors[n["id"]] ||=
|
132
|
+
anchor_struct(increment_label(notes, n, counter), n,
|
133
|
+
@labels["box"], "admonition", n["unnumbered"])
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
127
137
|
def example_anchor_names(sections)
|
128
138
|
sections.each do |s|
|
129
|
-
notes = s.xpath(
|
139
|
+
notes = s.xpath(child_asset_path("example"))
|
130
140
|
example_anchor_names1(notes, Counter.new)
|
131
141
|
example_anchor_names(s.xpath(ns(CHILD_SECTIONS)))
|
132
142
|
end
|
@@ -154,7 +164,8 @@ module IsoDoc
|
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
157
|
-
def list_item_anchor_names(list, list_anchor, depth, prev_label,
|
167
|
+
def list_item_anchor_names(list, list_anchor, depth, prev_label,
|
168
|
+
refer_list)
|
158
169
|
c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
|
159
170
|
list.xpath(ns("./li")).each do |li|
|
160
171
|
label = c.increment(li).listlabel(list, depth)
|
@@ -45,10 +45,14 @@ module IsoDoc
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
def subfigure_label(subfignum)
|
49
|
+
subfignum.zero? and return ""
|
50
|
+
"-#{subfignum}"
|
51
|
+
end
|
52
|
+
|
48
53
|
def sequential_figure_body(subfignum, counter, block, klass)
|
49
54
|
label = counter.print
|
50
|
-
label &&= label + (subfignum
|
51
|
-
|
55
|
+
label &&= label + subfigure_label(subfignum)
|
52
56
|
@anchors[block["id"]] = anchor_struct(
|
53
57
|
label, nil, @labels[klass] || klass.capitalize, klass,
|
54
58
|
block["unnumbered"]
|
@@ -58,8 +62,7 @@ module IsoDoc
|
|
58
62
|
def sequential_table_names(clause)
|
59
63
|
c = Counter.new
|
60
64
|
clause.xpath(ns(".//table")).noblank.each do |t|
|
61
|
-
|
62
|
-
|
65
|
+
labelled_ancestor(t) and next
|
63
66
|
@anchors[t["id"]] = anchor_struct(
|
64
67
|
c.increment(t).print, nil,
|
65
68
|
@labels["table"], "table", t["unnumbered"]
|
@@ -117,7 +120,6 @@ module IsoDoc
|
|
117
120
|
block, anchor_struct(id, block,
|
118
121
|
label, klass, block["unnumbered"])
|
119
122
|
)
|
120
|
-
|
121
123
|
model.permission_parts(block, id, label, klass).each do |n|
|
122
124
|
@anchors[n[:id]] = anchor_struct(n[:number], n[:elem], n[:label],
|
123
125
|
n[:klass], false)
|
@@ -171,8 +173,7 @@ module IsoDoc
|
|
171
173
|
|
172
174
|
def hierarchical_figure_body(num, subfignum, counter, block, klass)
|
173
175
|
label = "#{num}#{hiersep}#{counter.print}" +
|
174
|
-
(subfignum
|
175
|
-
|
176
|
+
subfigure_label(subfignum)
|
176
177
|
@anchors[block["id"]] =
|
177
178
|
anchor_struct(label, nil, @labels[klass] || klass.capitalize,
|
178
179
|
klass, block["unnumbered"])
|
@@ -181,8 +182,7 @@ module IsoDoc
|
|
181
182
|
def hierarchical_table_names(clause, num)
|
182
183
|
c = Counter.new
|
183
184
|
clause.xpath(ns(".//table")).noblank.each do |t|
|
184
|
-
|
185
|
-
|
185
|
+
labelled_ancestor(t) and next
|
186
186
|
@anchors[t["id"]] =
|
187
187
|
anchor_struct("#{num}#{hiersep}#{c.increment(t).print}",
|
188
188
|
nil, @labels["table"], "table", t["unnumbered"])
|
@@ -1,17 +1,18 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
module XrefGen
|
3
3
|
module Sections
|
4
|
-
def back_anchor_names(
|
4
|
+
def back_anchor_names(xml)
|
5
5
|
if @parse_settings.empty? || @parse_settings[:clauses]
|
6
6
|
i = Counter.new("@")
|
7
|
-
|
7
|
+
xml.xpath(ns("//annex")).each do |c|
|
8
8
|
annex_names(c, i.increment(c).print)
|
9
9
|
end
|
10
|
-
|
10
|
+
xml.xpath(ns(@klass.bibliography_xpath)).each do |b|
|
11
11
|
preface_names(b)
|
12
12
|
end
|
13
|
+
xml.xpath(ns("//colophon/clause")).each { |b| preface_names(b) }
|
13
14
|
end
|
14
|
-
references(
|
15
|
+
references(xml) if @parse_settings.empty? || @parse_settings[:refs]
|
15
16
|
end
|
16
17
|
|
17
18
|
def references(docxml)
|
@@ -45,6 +46,7 @@ module IsoDoc
|
|
45
46
|
termexample_anchor_names(doc)
|
46
47
|
note_anchor_names(doc.xpath(ns("//table | //figure")))
|
47
48
|
note_anchor_names(doc.xpath(ns(sections_xpath)))
|
49
|
+
admonition_anchor_names(doc.xpath(ns(sections_xpath)))
|
48
50
|
example_anchor_names(doc.xpath(ns(sections_xpath)))
|
49
51
|
list_anchor_names(doc.xpath(ns(sections_xpath)))
|
50
52
|
deflist_anchor_names(doc.xpath(ns(sections_xpath)))
|
data/lib/isodoc/xref.rb
CHANGED
@@ -49,7 +49,6 @@ module IsoDoc
|
|
49
49
|
return nil if ident.nil? || ident.empty?
|
50
50
|
|
51
51
|
if warning && !@anchors[ident]
|
52
|
-
@seen ||= SeenAnchor.instance
|
53
52
|
@seen.seen(ident) or warn "No label has been processed for ID #{ident}"
|
54
53
|
@seen.add(ident)
|
55
54
|
return "[#{ident}]"
|
@@ -59,6 +58,7 @@ module IsoDoc
|
|
59
58
|
|
60
59
|
# extract names for all anchors, xref and label
|
61
60
|
def parse(docxml)
|
61
|
+
@seen = SeenAnchor.new(docxml)
|
62
62
|
amend_preprocess(docxml) if @parse_settings.empty?
|
63
63
|
initial_anchor_names(docxml)
|
64
64
|
back_anchor_names(docxml)
|
data/lib/isodoc.rb
CHANGED
@@ -7,10 +7,10 @@ require "base64"
|
|
7
7
|
require "mime/types"
|
8
8
|
require "image_size"
|
9
9
|
require "set"
|
10
|
-
require "pp"
|
11
10
|
require "html2doc"
|
12
11
|
require "liquid"
|
13
12
|
require "htmlentities"
|
13
|
+
require "relaton-render"
|
14
14
|
|
15
15
|
require "isodoc/common"
|
16
16
|
require "isodoc/convert"
|
@@ -24,6 +24,7 @@ require "isodoc/presentation_xml_convert"
|
|
24
24
|
require "isodoc/xref"
|
25
25
|
require "isodoc/i18n"
|
26
26
|
require "metanorma/output"
|
27
|
+
require "relaton/render-isodoc/general"
|
27
28
|
|
28
29
|
module IsoDoc
|
29
30
|
end
|
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.4.
|
4
|
+
version: 2.4.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-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciimath
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 0.3.1
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: relaton-cli
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: relaton-render
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -494,8 +480,8 @@ files:
|
|
494
480
|
- lib/metanorma/output/base.rb
|
495
481
|
- lib/metanorma/output/utils.rb
|
496
482
|
- lib/metanorma/output/xslfo.rb
|
497
|
-
- lib/relaton/render/config.yml
|
498
|
-
- lib/relaton/render/general.rb
|
483
|
+
- lib/relaton/render-isodoc/config.yml
|
484
|
+
- lib/relaton/render-isodoc/general.rb
|
499
485
|
homepage: https://github.com/metanorma/isodoc
|
500
486
|
licenses:
|
501
487
|
- BSD-2-Clause
|
File without changes
|
File without changes
|