isodoc 2.5.8 → 2.5.10
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/lib/isodoc/base_style/all.css +7 -3
- data/lib/isodoc/base_style/reset.css +7 -3
- data/lib/isodoc/base_style/reset.scss +7 -3
- data/lib/isodoc/function/cleanup.rb +0 -42
- data/lib/isodoc/function/lists.rb +4 -0
- data/lib/isodoc/function/section.rb +3 -3
- data/lib/isodoc/function/utils.rb +12 -6
- data/lib/isodoc/presentation_function/block.rb +72 -48
- data/lib/isodoc/presentation_function/reqt.rb +47 -0
- data/lib/isodoc/presentation_xml_convert.rb +3 -2
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +8 -83
- data/lib/isodoc/word_function/inline.rb +22 -9
- data/lib/isodoc/word_function/lists.rb +107 -0
- 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-ja.yaml +1 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a73625d6e0b342e44b34e2c93ef6df6126e1694dbcd9475cc52168da86a8cb8b
|
4
|
+
data.tar.gz: 58bed9e6bd9f0a5812a6e7ee46e90ea2c4e2dc4bf1592a66db4302dd4d579f5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28274dab0c28284a969ae3caf93e2065447c8b70b9166385e972b610014eb6bdeea8de3ec25273dfa1aea7fb78eaea463e894a0feeef18b82f0be3f2f479ff7c
|
7
|
+
data.tar.gz: 87c56a3f6c1aefd791ae520d2e3c1e0c7d7060b5d81aca3e64096294cd3c5de28cd71d70ad04db8823457bc90773a8f6b1d427a43e1cdd3ed067b5ab72099c29
|
@@ -90,7 +90,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
90
90
|
|
91
91
|
blockquote, q {
|
92
92
|
quotes: none; }
|
93
|
-
blockquote
|
93
|
+
blockquote::before, blockquote::after, q::before, q::after {
|
94
94
|
content: '';
|
95
95
|
content: none; }
|
96
96
|
|
@@ -113,14 +113,18 @@ b, strong {
|
|
113
113
|
div.document-stage-band, div.document-type-band {
|
114
114
|
background-color: #333333; }
|
115
115
|
|
116
|
-
a.FootnoteRef + a.FootnoteRef
|
116
|
+
a.FootnoteRef + a.FootnoteRef::before {
|
117
117
|
content: ", ";
|
118
118
|
vertical-align: super; }
|
119
119
|
|
120
|
-
a.TableFootnoteRef + a.TableFootnoteRef
|
120
|
+
a.TableFootnoteRef + a.TableFootnoteRef::before {
|
121
121
|
content: ", ";
|
122
122
|
vertical-align: super; }
|
123
123
|
|
124
|
+
a.TableFootnoteRef, span.TableFootnoteRef,
|
125
|
+
a.FootnoteRef, span.FootnoteRef {
|
126
|
+
vertical-align: super; }
|
127
|
+
|
124
128
|
.addition {
|
125
129
|
color: blue; }
|
126
130
|
|
@@ -90,7 +90,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
90
90
|
|
91
91
|
blockquote, q {
|
92
92
|
quotes: none; }
|
93
|
-
blockquote
|
93
|
+
blockquote::before, blockquote::after, q::before, q::after {
|
94
94
|
content: '';
|
95
95
|
content: none; }
|
96
96
|
|
@@ -113,14 +113,18 @@ b, strong {
|
|
113
113
|
div.document-stage-band, div.document-type-band {
|
114
114
|
background-color: #333333; }
|
115
115
|
|
116
|
-
a.FootnoteRef + a.FootnoteRef
|
116
|
+
a.FootnoteRef + a.FootnoteRef::before {
|
117
117
|
content: ", ";
|
118
118
|
vertical-align: super; }
|
119
119
|
|
120
|
-
a.TableFootnoteRef + a.TableFootnoteRef
|
120
|
+
a.TableFootnoteRef + a.TableFootnoteRef::before {
|
121
121
|
content: ", ";
|
122
122
|
vertical-align: super; }
|
123
123
|
|
124
|
+
a.TableFootnoteRef, span.TableFootnoteRef,
|
125
|
+
a.FootnoteRef, span.FootnoteRef {
|
126
|
+
vertical-align: super; }
|
127
|
+
|
124
128
|
.addition {
|
125
129
|
color: blue; }
|
126
130
|
|
@@ -102,7 +102,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
102
102
|
blockquote, q {
|
103
103
|
quotes: none;
|
104
104
|
|
105
|
-
|
105
|
+
&::before, &::after {
|
106
106
|
content: '';
|
107
107
|
content: none;
|
108
108
|
}
|
@@ -139,16 +139,20 @@ div.document-stage-band, div.document-type-band {
|
|
139
139
|
background-color: #333333;
|
140
140
|
}
|
141
141
|
|
142
|
-
a.FootnoteRef + a.FootnoteRef
|
142
|
+
a.FootnoteRef + a.FootnoteRef::before {
|
143
143
|
content: ", ";
|
144
144
|
vertical-align: super;
|
145
145
|
}
|
146
146
|
|
147
|
-
a.TableFootnoteRef + a.TableFootnoteRef
|
147
|
+
a.TableFootnoteRef + a.TableFootnoteRef::before {
|
148
148
|
content: ", ";
|
149
149
|
vertical-align: super;
|
150
150
|
}
|
151
151
|
|
152
|
+
a.TableFootnoteRef, span.TableFootnoteRef,
|
153
|
+
a.FootnoteRef, span.FootnoteRef {
|
154
|
+
vertical-align: super;
|
155
|
+
}
|
152
156
|
|
153
157
|
.addition {
|
154
158
|
color: blue;
|
@@ -25,47 +25,6 @@ module IsoDoc
|
|
25
25
|
admonition_cleanup(docxml)
|
26
26
|
end
|
27
27
|
|
28
|
-
def table_long_strings_cleanup(docxml)
|
29
|
-
return unless @break_up_urls_in_tables
|
30
|
-
|
31
|
-
docxml.xpath("//td | //th").each do |d|
|
32
|
-
d.traverse do |n|
|
33
|
-
n.text? or next
|
34
|
-
ret = break_up_long_str(n.text)
|
35
|
-
n.content = ret
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
LONGSTR_THRESHOLD = 10
|
41
|
-
LONGSTR_NOPUNCT = 2
|
42
|
-
|
43
|
-
def break_up_long_str(text)
|
44
|
-
/^\s*$/.match?(text) and return text
|
45
|
-
text.split(/(?=\s)/).map do |w|
|
46
|
-
if /^\s*$/.match(text) || (w.size < LONGSTR_THRESHOLD) then w
|
47
|
-
else
|
48
|
-
w.scan(/.{,#{LONGSTR_THRESHOLD}}/o).map.with_index do |w1, i|
|
49
|
-
w1.size < LONGSTR_THRESHOLD ? w1 : break_up_long_str1(w1, i + 1)
|
50
|
-
end.join
|
51
|
-
end
|
52
|
-
end.join
|
53
|
-
end
|
54
|
-
|
55
|
-
# break on punct every LONGSTRING_THRESHOLD chars
|
56
|
-
# break regardless every LONGSTRING_THRESHOLD * LONGSTR_NOPUNCT
|
57
|
-
def break_up_long_str1(text, iteration)
|
58
|
-
s = text.split(%r{(?<=[,.?+;/=(\[])})
|
59
|
-
if s.size == 1
|
60
|
-
(iteration % LONGSTR_NOPUNCT).zero? and
|
61
|
-
text += "\u200b"
|
62
|
-
text
|
63
|
-
else
|
64
|
-
s[-1] = "\u200b#{s[-1]}"
|
65
|
-
s.join
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
28
|
def admonition_cleanup(docxml)
|
70
29
|
docxml.xpath("//div[@class = 'Admonition'][title]").each do |d|
|
71
30
|
title = d.at("./title")
|
@@ -214,7 +173,6 @@ module IsoDoc
|
|
214
173
|
def table_cleanup(docxml)
|
215
174
|
table_footnote_cleanup(docxml)
|
216
175
|
table_note_cleanup(docxml)
|
217
|
-
table_long_strings_cleanup(docxml)
|
218
176
|
docxml
|
219
177
|
end
|
220
178
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "
|
1
|
+
require_relative "section_titles"
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
module Function
|
@@ -20,7 +20,7 @@ module IsoDoc
|
|
20
20
|
def clause(isoxml, out)
|
21
21
|
isoxml.xpath(ns(middle_clause(isoxml))).each do |c|
|
22
22
|
out.div **attr_code(clause_attrs(c)) do |s|
|
23
|
-
clause_name(c, c
|
23
|
+
clause_name(c, c.at(ns("./title")), s, nil)
|
24
24
|
c.elements.reject { |c1| c1.name == "title" }.each do |c1|
|
25
25
|
parse(c1, s)
|
26
26
|
end
|
@@ -64,7 +64,7 @@ module IsoDoc
|
|
64
64
|
f = isoxml.at(ns(TERM_CLAUSE)) or return num
|
65
65
|
out.div **attr_code(id: f["id"]) do |div|
|
66
66
|
num = num + 1
|
67
|
-
clause_name(f, f
|
67
|
+
clause_name(f, f.at(ns("./title")), div, nil)
|
68
68
|
f.elements.each do |e|
|
69
69
|
parse(e, div) unless %w{title source}.include? e.name
|
70
70
|
end
|
@@ -60,7 +60,7 @@ module IsoDoc
|
|
60
60
|
|
61
61
|
def to_xhtml_prep(xml)
|
62
62
|
xml.gsub!(/<\?xml[^>]*>/, "")
|
63
|
-
|
63
|
+
xml.include?("<!DOCTYPE ") || (xml = DOCTYPE_HDR + xml)
|
64
64
|
numeric_escapes(xml)
|
65
65
|
end
|
66
66
|
|
@@ -130,7 +130,7 @@ module IsoDoc
|
|
130
130
|
.gsub(%r{</?p(\s[^>]+)?>}, "")
|
131
131
|
.gsub(/<\/?h[123456][^>]*>/, "").gsub(/<\/?b[^>]*>/, "").dup)
|
132
132
|
h1.traverse do |x|
|
133
|
-
if x.name == "span" &&
|
133
|
+
if x.name == "span" && x["style"]&.include?("mso-tab-count")
|
134
134
|
x.replace(" ")
|
135
135
|
elsif header_strip_elem?(x) then x.remove
|
136
136
|
elsif x.name == "a" then x.replace(x.children)
|
@@ -143,7 +143,7 @@ module IsoDoc
|
|
143
143
|
elem.name == "img" ||
|
144
144
|
(elem.name == "span" && elem["class"] == "MsoCommentReference") ||
|
145
145
|
(elem.name == "a" && elem["class"] == "FootnoteRef") ||
|
146
|
-
(elem.name == "span" &&
|
146
|
+
(elem.name == "span" && elem["style"]&.include?("mso-bookmark"))
|
147
147
|
end
|
148
148
|
|
149
149
|
def liquid(doc)
|
@@ -202,9 +202,15 @@ module IsoDoc
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
205
|
-
|
206
|
-
|
207
|
-
|
205
|
+
LABELLED_ANCESTOR_ELEMENTS =
|
206
|
+
%w(example requirement recommendation permission
|
207
|
+
note table figure sourcecode).freeze
|
208
|
+
|
209
|
+
def labelled_ancestor(elem)
|
210
|
+
#require "debug"; binding.b
|
211
|
+
#!elem.path.gsub(/\[\d+\]/, "").split(%r{/})[1..-1]
|
212
|
+
!elem.ancestors.map(&:name)
|
213
|
+
.intersection(LABELLED_ANCESTOR_ELEMENTS).empty?
|
208
214
|
end
|
209
215
|
|
210
216
|
def emf?(type)
|
@@ -1,12 +1,11 @@
|
|
1
|
-
require_relative "
|
2
|
-
require_relative "
|
1
|
+
require_relative "image"
|
2
|
+
require_relative "sourcecode"
|
3
3
|
require "rouge"
|
4
4
|
|
5
5
|
module IsoDoc
|
6
6
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
7
7
|
def lower2cap(text)
|
8
|
-
|
9
|
-
|
8
|
+
/^[[:upper:]][[:upper:]]/.match?(text) and return text
|
10
9
|
text.capitalize
|
11
10
|
end
|
12
11
|
|
@@ -89,31 +88,8 @@ module IsoDoc
|
|
89
88
|
prefix_name(elem, block_delim, l10n("#{@i18n.box} #{n}"), "name")
|
90
89
|
end
|
91
90
|
|
92
|
-
def recommendation(docxml)
|
93
|
-
docxml.xpath(ns("//recommendation")).each do |f|
|
94
|
-
recommendation1(f, lower2cap(@i18n.recommendation))
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def requirement(docxml)
|
99
|
-
docxml.xpath(ns("//requirement")).each do |f|
|
100
|
-
recommendation1(f, lower2cap(@i18n.requirement))
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def permission(docxml)
|
105
|
-
docxml.xpath(ns("//permission")).each do |f|
|
106
|
-
recommendation1(f, lower2cap(@i18n.permission))
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def recommendation1(elem, type)
|
111
|
-
lbl = @reqt_models.model(elem["model"])
|
112
|
-
.recommendation_label(elem, type, xrefs)
|
113
|
-
prefix_name(elem, "", l10n(lbl), "name")
|
114
|
-
end
|
115
|
-
|
116
91
|
def table(docxml)
|
92
|
+
table_long_strings_cleanup(docxml)
|
117
93
|
docxml.xpath(ns("//table")).each { |f| table1(f) }
|
118
94
|
end
|
119
95
|
|
@@ -125,6 +101,74 @@ module IsoDoc
|
|
125
101
|
"name")
|
126
102
|
end
|
127
103
|
|
104
|
+
def table_long_strings_cleanup(docxml)
|
105
|
+
@break_up_urls_in_tables or return
|
106
|
+
docxml.xpath(ns("//td | //th")).each do |d|
|
107
|
+
d.traverse do |n|
|
108
|
+
n.text? or next
|
109
|
+
ret = break_up_long_str(n.text)
|
110
|
+
n.content = ret
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
LONGSTR_THRESHOLD = 10
|
116
|
+
LONGSTR_NOPUNCT = 2
|
117
|
+
|
118
|
+
def break_up_long_str(text)
|
119
|
+
/^\s*$/.match?(text) and return text
|
120
|
+
text.split(/(?=\s)/).map do |w|
|
121
|
+
if /^\s*$/.match(text) || (w.size < LONGSTR_THRESHOLD) then w
|
122
|
+
else
|
123
|
+
w.scan(/.{,#{LONGSTR_THRESHOLD}}/o).map.with_index do |w1, i|
|
124
|
+
w1.size < LONGSTR_THRESHOLD ? w1 : break_up_long_str1(w1, i + 1)
|
125
|
+
end.join
|
126
|
+
end
|
127
|
+
end.join
|
128
|
+
end
|
129
|
+
|
130
|
+
STR_BREAKUP_RE = %r{
|
131
|
+
(?<=[=_—–\u2009→?+;]) | # break after any of these
|
132
|
+
(?<=[,.:])(?!\d) | # break on punct only if not preceding digit
|
133
|
+
(?<=[>])(?![>]) | # > not >->
|
134
|
+
(?<=[\]])(?![\]]) | # ] not ]-]
|
135
|
+
(?<=//) | # //
|
136
|
+
(?<=[/])(?![/]) | # / not /-/
|
137
|
+
(?<![<])(?=[<]) | # < not <-<
|
138
|
+
(?<=\p{L})(?=[(\{\[]\p{L}) # letter and bracket, followed by letter
|
139
|
+
}x.freeze
|
140
|
+
|
141
|
+
|
142
|
+
CAMEL_CASE_RE = %r{
|
143
|
+
(?<=\p{Ll}\p{Ll})(?=\p{Lu}\p{Ll}\p{Ll}) # 2 lowerc / upperc, 2 lowerc
|
144
|
+
}x.freeze
|
145
|
+
|
146
|
+
# break on punct every LONGSTRING_THRESHOLD chars, with zero width space
|
147
|
+
# if punct fails, try break on camel case, with soft hyphen
|
148
|
+
# break regardless every LONGSTRING_THRESHOLD * LONGSTR_NOPUNCT,
|
149
|
+
# with soft hyphen
|
150
|
+
def break_up_long_str1(text, iteration)
|
151
|
+
s, separator = break_up_long_str2(text)
|
152
|
+
if s.size == 1 # could not break up
|
153
|
+
(iteration % LONGSTR_NOPUNCT).zero? and
|
154
|
+
text += "\u00ad" # force soft hyphen
|
155
|
+
text
|
156
|
+
else
|
157
|
+
s[-1] = "#{separator}#{s[-1]}"
|
158
|
+
s.join
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def break_up_long_str2(text)
|
163
|
+
s = text.split(STR_BREAKUP_RE, -1)
|
164
|
+
separator = "\u200b"
|
165
|
+
if s.size == 1
|
166
|
+
s = text.split(CAMEL_CASE_RE)
|
167
|
+
separator = "\u00ad"
|
168
|
+
end
|
169
|
+
[s, separator]
|
170
|
+
end
|
171
|
+
|
128
172
|
# we use this to eliminate the semantic amend blocks from rendering
|
129
173
|
def amend(docxml)
|
130
174
|
docxml.xpath(ns("//amend")).each { |f| amend1(f) }
|
@@ -167,26 +211,6 @@ module IsoDoc
|
|
167
211
|
elem["label"] = @xrefs.anchor(elem["id"], :label, false)
|
168
212
|
end
|
169
213
|
|
170
|
-
def requirement_render_preprocessing(docxml); end
|
171
|
-
|
172
|
-
REQS = %w(requirement recommendation permission).freeze
|
173
|
-
|
174
|
-
def requirement_render(docxml)
|
175
|
-
requirement_render_preprocessing(docxml)
|
176
|
-
REQS.each do |x|
|
177
|
-
REQS.each do |y|
|
178
|
-
docxml.xpath(ns("//#{x}//#{y}")).each { |r| requirement_render1(r) }
|
179
|
-
end
|
180
|
-
end
|
181
|
-
docxml.xpath(ns("//requirement | //recommendation | //permission"))
|
182
|
-
.each { |r| requirement_render1(r) }
|
183
|
-
end
|
184
|
-
|
185
|
-
def requirement_render1(node)
|
186
|
-
node.replace(@reqt_models.model(node["model"])
|
187
|
-
.requirement_render1(node))
|
188
|
-
end
|
189
|
-
|
190
214
|
def source(docxml)
|
191
215
|
docxml.xpath(ns("//source/modification")).each do |f|
|
192
216
|
source_modification(f)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
3
|
+
def recommendation(docxml)
|
4
|
+
docxml.xpath(ns("//recommendation")).each do |f|
|
5
|
+
recommendation1(f, lower2cap(@i18n.recommendation))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def requirement(docxml)
|
10
|
+
docxml.xpath(ns("//requirement")).each do |f|
|
11
|
+
recommendation1(f, lower2cap(@i18n.requirement))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def permission(docxml)
|
16
|
+
docxml.xpath(ns("//permission")).each do |f|
|
17
|
+
recommendation1(f, lower2cap(@i18n.permission))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def recommendation1(elem, type)
|
22
|
+
lbl = @reqt_models.model(elem["model"])
|
23
|
+
.recommendation_label(elem, type, xrefs)
|
24
|
+
prefix_name(elem, "", l10n(lbl), "name")
|
25
|
+
end
|
26
|
+
|
27
|
+
def requirement_render_preprocessing(docxml); end
|
28
|
+
|
29
|
+
REQS = %w(requirement recommendation permission).freeze
|
30
|
+
|
31
|
+
def requirement_render(docxml)
|
32
|
+
requirement_render_preprocessing(docxml)
|
33
|
+
REQS.each do |x|
|
34
|
+
REQS.each do |y|
|
35
|
+
docxml.xpath(ns("//#{x}//#{y}")).each { |r| requirement_render1(r) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
docxml.xpath(ns("//requirement | //recommendation | //permission"))
|
39
|
+
.each { |r| requirement_render1(r) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def requirement_render1(node)
|
43
|
+
node.replace(@reqt_models.model(node["model"])
|
44
|
+
.requirement_render1(node))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "presentation_function/block"
|
2
|
+
require_relative "presentation_function/reqt"
|
2
3
|
require_relative "presentation_function/concepts"
|
3
4
|
require_relative "presentation_function/terms"
|
4
5
|
require_relative "presentation_function/xrefs"
|
@@ -22,7 +23,7 @@ module IsoDoc
|
|
22
23
|
info docxml, nil
|
23
24
|
conversions(docxml)
|
24
25
|
docxml.root["type"] = "presentation"
|
25
|
-
docxml.to_xml.gsub(
|
26
|
+
docxml.to_xml.gsub("<", "<").gsub(">", ">")
|
26
27
|
end
|
27
28
|
|
28
29
|
def bibitem_lookup(docxml)
|
@@ -125,7 +126,7 @@ module IsoDoc
|
|
125
126
|
.sub(/ xmlns=['"][^"']+['"]/, "") # root XMLNS
|
126
127
|
.split(/(?=[<> \t\r\n\f\v])/).map do |x|
|
127
128
|
case x
|
128
|
-
when /^<[^:]+:/ then x.sub(
|
129
|
+
when /^<[^:]+:/ then x.sub(":", ":semantic__")
|
129
130
|
when /^<[^:]+$/ then x.sub(%r{(</?)([[:alpha:]])},
|
130
131
|
"\\1semantic__\\2")
|
131
132
|
else x end
|
data/lib/isodoc/version.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative "./table"
|
2
2
|
require_relative "./inline"
|
3
|
+
require_relative "./lists"
|
3
4
|
|
4
5
|
module IsoDoc
|
5
6
|
module WordFunction
|
@@ -42,12 +43,6 @@ module IsoDoc
|
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
|
-
def insert_tab(out, count)
|
46
|
-
out.span **attr_code(style: "mso-tab-count:#{count}") do |span|
|
47
|
-
[1..count].each { span << "  " }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
46
|
def para_class(_node)
|
52
47
|
return "Sourcecode" if @annotation
|
53
48
|
return "MsoCommentText" if @in_comment
|
@@ -67,58 +62,6 @@ module IsoDoc
|
|
67
62
|
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
68
63
|
end
|
69
64
|
|
70
|
-
WORD_DT_ATTRS = { class: @note ? "Note" : nil, align: "left",
|
71
|
-
style: "margin-left:0pt;text-align:left;" }.freeze
|
72
|
-
|
73
|
-
def dt_parse(dterm, term)
|
74
|
-
term.p **attr_code(WORD_DT_ATTRS) do |p|
|
75
|
-
if dterm.elements.empty?
|
76
|
-
p << dterm.text
|
77
|
-
else
|
78
|
-
dterm.children.each { |n| parse(n, p) }
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def dl_parse(node, out)
|
84
|
-
return super unless node.ancestors("table, dl").empty?
|
85
|
-
|
86
|
-
dl_parse_table(node, out)
|
87
|
-
end
|
88
|
-
|
89
|
-
def dl_parse_table(node, out)
|
90
|
-
list_title_parse(node, out)
|
91
|
-
out.table class: (node["class"] || "dl") do |v|
|
92
|
-
node.elements.select { |n| dt_dd?(n) }
|
93
|
-
.each_slice(2) do |dt, dd|
|
94
|
-
dl_parse_table1(v, dt, dd)
|
95
|
-
end
|
96
|
-
dl_parse_notes(node, v)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def dl_parse_table1(table, dterm, ddefn)
|
101
|
-
table.tr do |tr|
|
102
|
-
tr.td valign: "top", align: "left" do |term|
|
103
|
-
dt_parse(dterm, term)
|
104
|
-
end
|
105
|
-
tr.td valign: "top" do |listitem|
|
106
|
-
ddefn.children.each { |n| parse(n, listitem) }
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def dl_parse_notes(node, out)
|
112
|
-
remainder = node.elements.reject { |n| dt_dd?(n) || n.name == "name" }
|
113
|
-
return if remainder.empty?
|
114
|
-
|
115
|
-
out.tr do |tr|
|
116
|
-
tr.td colspan: 2 do |td|
|
117
|
-
remainder.each { |n| parse(n, td) }
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
65
|
def figure_get_or_make_dl(node)
|
123
66
|
dl = node.at(".//table[@class = 'dl']")
|
124
67
|
if dl.nil?
|
@@ -130,7 +73,7 @@ module IsoDoc
|
|
130
73
|
|
131
74
|
# get rid of footnote link, it is in diagram
|
132
75
|
def figure_aside_process(fig, aside, key)
|
133
|
-
fig
|
76
|
+
fig.at("./a[@class='TableFootnoteRef']")&.remove
|
134
77
|
fnref = fig.at(".//span[@class='TableFootnoteRef']/..")
|
135
78
|
tr = key.add_child("<tr></tr>").first
|
136
79
|
dt = tr.add_child("<td valign='top' align='left'></td>").first
|
@@ -143,7 +86,7 @@ module IsoDoc
|
|
143
86
|
end
|
144
87
|
|
145
88
|
def note_p_parse(node, div)
|
146
|
-
name = node
|
89
|
+
name = node.at(ns("./name"))&.remove
|
147
90
|
div.p class: "Note" do |p|
|
148
91
|
p.span class: "note_label" do |s|
|
149
92
|
name&.children&.each { |n| parse(n, s) }
|
@@ -155,7 +98,7 @@ module IsoDoc
|
|
155
98
|
end
|
156
99
|
|
157
100
|
def note_parse1(node, div)
|
158
|
-
name = node
|
101
|
+
name = node.at(ns("./name"))&.remove
|
159
102
|
div.p class: "Note" do |p|
|
160
103
|
p.span class: "note_label" do |s|
|
161
104
|
name&.children&.each { |n| parse(n, s) }
|
@@ -211,30 +154,12 @@ module IsoDoc
|
|
211
154
|
end
|
212
155
|
end
|
213
156
|
|
214
|
-
def
|
215
|
-
out.li **attr_code(id: node["id"]) do |li|
|
216
|
-
if node["uncheckedcheckbox"] == "true"
|
217
|
-
li << '<span class="zzMoveToFollowing">☐ </span>'
|
218
|
-
elsif node["checkedcheckbox"] == "true"
|
219
|
-
li << '<span class="zzMoveToFollowing">☑ </span>'
|
220
|
-
end
|
221
|
-
node.children.each { |n| parse(n, li) }
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
def suffix_url(url)
|
226
|
-
return url if url.nil? || %r{^https?://|^#}.match?(url)
|
227
|
-
return url unless File.extname(url).empty?
|
228
|
-
|
229
|
-
url.sub(/#{File.extname(url)}$/, ".doc")
|
230
|
-
end
|
231
|
-
|
232
|
-
def info(isoxml, out)
|
157
|
+
def info(xml, out)
|
233
158
|
@tocfigurestitle =
|
234
|
-
|
159
|
+
xml.at(ns("//metanorma-extension/toc[@type = 'figure']/title"))&.text
|
235
160
|
@toctablestitle =
|
236
|
-
|
237
|
-
@tocrecommendationstitle =
|
161
|
+
xml.at(ns("//metanorma-extension/toc[@type = 'table']/title"))&.text
|
162
|
+
@tocrecommendationstitle = xml
|
238
163
|
.at(ns("//metanorma-extension/toc[@type = 'recommendation']/title"))&.text
|
239
164
|
super
|
240
165
|
end
|
@@ -1,22 +1,28 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
module WordFunction
|
3
3
|
module Body
|
4
|
+
def insert_tab(out, count)
|
5
|
+
out.span **attr_code(style: "mso-tab-count:#{count}") do |span|
|
6
|
+
[1..count].each { span << "  " }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
def section_break(body, continuous: false)
|
5
11
|
body.p do |p|
|
6
12
|
if continuous
|
7
|
-
p.br
|
8
|
-
|
13
|
+
p.br clear: "all", style: "page-break-before:auto;" \
|
14
|
+
"mso-break-type:section-break"
|
9
15
|
else
|
10
|
-
p.br
|
16
|
+
p.br clear: "all", class: "section"
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
15
21
|
def page_break(out)
|
16
22
|
out.p do |p|
|
17
|
-
p.br
|
18
|
-
|
19
|
-
|
23
|
+
p.br clear: "all",
|
24
|
+
style: "mso-special-character:line-break;" \
|
25
|
+
"page-break-before:always"
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
@@ -24,8 +30,8 @@ module IsoDoc
|
|
24
30
|
return page_break(out) if node["orientation"].nil?
|
25
31
|
|
26
32
|
out.p do |p|
|
27
|
-
p.br
|
28
|
-
|
33
|
+
p.br clear: "all", class: "section",
|
34
|
+
orientation: node["orientation"]
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
@@ -56,10 +62,17 @@ module IsoDoc
|
|
56
62
|
else
|
57
63
|
"##{node['target']}"
|
58
64
|
end
|
59
|
-
out.a(
|
65
|
+
out.a(href: target) do |l|
|
60
66
|
node.children.each { |n| parse(n, l) }
|
61
67
|
end
|
62
68
|
end
|
69
|
+
|
70
|
+
def suffix_url(url)
|
71
|
+
return url if url.nil? || %r{^https?://|^#}.match?(url)
|
72
|
+
return url unless File.extname(url).empty?
|
73
|
+
|
74
|
+
url.sub(/#{File.extname(url)}$/, ".doc")
|
75
|
+
end
|
63
76
|
end
|
64
77
|
end
|
65
78
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require_relative "./table"
|
2
|
+
require_relative "./inline"
|
3
|
+
|
4
|
+
module IsoDoc
|
5
|
+
module WordFunction
|
6
|
+
module Body
|
7
|
+
WORD_DT_ATTRS = { class: @note ? "Note" : nil, align: "left",
|
8
|
+
style: "margin-left:0pt;text-align:left;" }.freeze
|
9
|
+
|
10
|
+
def dt_parse(dterm, term)
|
11
|
+
term.p **attr_code(WORD_DT_ATTRS) do |p|
|
12
|
+
if dterm.elements.empty?
|
13
|
+
p << dterm.text
|
14
|
+
else
|
15
|
+
dterm.children.each { |n| parse(n, p) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def dl_parse(node, out)
|
21
|
+
node.ancestors("table, dl").empty? or
|
22
|
+
return dl_parse_nontable(node, out)
|
23
|
+
dl_parse_table(node, out)
|
24
|
+
end
|
25
|
+
|
26
|
+
def dl_parse_nontable(node, out)
|
27
|
+
node["id"] and bookmark_parse(node, out)
|
28
|
+
list_title_parse(node, out)
|
29
|
+
node.elements.select { |n| dt_dd?(n) }
|
30
|
+
.each_slice(2) do |dt, dd|
|
31
|
+
dl_parse_nontable1(out, dt, dd)
|
32
|
+
end
|
33
|
+
dl_parse_notes(node, out)
|
34
|
+
end
|
35
|
+
|
36
|
+
WORD_EMBED_DL_ATTRS =
|
37
|
+
"text-indent: -2.0cm; margin-left: 2.0cm; tab-stops: 2.0cm;".freeze
|
38
|
+
|
39
|
+
def dl_parse_nontable1(out, dterm, ddef)
|
40
|
+
out.p **attr_code(style: WORD_EMBED_DL_ATTRS, id: dterm["id"]) do |p|
|
41
|
+
dterm.children.each { |n| parse(n, p) }
|
42
|
+
insert_tab(p, 1)
|
43
|
+
ddef["id"] and bookmark_parse(ddef, out)
|
44
|
+
ddef_first_para(out, ddef)
|
45
|
+
end
|
46
|
+
ddef_other_paras(out, ddef)
|
47
|
+
end
|
48
|
+
|
49
|
+
def ddef_first_para(out, ddef)
|
50
|
+
if ddef.elements&.first&.name == "p"
|
51
|
+
ddef.children.first.children.each { |n| parse(n, out) }
|
52
|
+
else
|
53
|
+
ddef.children.each { |n| parse(n, out) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def ddef_other_paras(out, ddef)
|
58
|
+
ddef.elements&.first&.name == "p" or return
|
59
|
+
ddef.children[1..-1].each { |n| parse(n, out) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def dl_parse_table(node, out)
|
63
|
+
list_title_parse(node, out)
|
64
|
+
out.table **attr_code(id: node["id"],
|
65
|
+
class: (node["class"] || "dl")) do |v|
|
66
|
+
node.elements.select { |n| dt_dd?(n) }
|
67
|
+
.each_slice(2) do |dt, dd|
|
68
|
+
dl_parse_table1(v, dt, dd)
|
69
|
+
end
|
70
|
+
dl_parse_table_notes(node, v)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def dl_parse_table1(table, dterm, ddefn)
|
75
|
+
table.tr do |tr|
|
76
|
+
tr.td valign: "top", align: "left" do |term|
|
77
|
+
dt_parse(dterm, term)
|
78
|
+
end
|
79
|
+
tr.td valign: "top" do |listitem|
|
80
|
+
ddefn.children.each { |n| parse(n, listitem) }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def dl_parse_table_notes(node, out)
|
86
|
+
remainder = node.elements.reject { |n| dt_dd?(n) || n.name == "name" }
|
87
|
+
remainder.empty? and return
|
88
|
+
out.tr do |tr|
|
89
|
+
tr.td colspan: 2 do |td|
|
90
|
+
remainder.each { |n| parse(n, td) }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def li_parse(node, out)
|
96
|
+
out.li **attr_code(id: node["id"]) do |li|
|
97
|
+
if node["uncheckedcheckbox"] == "true"
|
98
|
+
li << '<span class="zzMoveToFollowing">☐ </span>'
|
99
|
+
elsif node["checkedcheckbox"] == "true"
|
100
|
+
li << '<span class="zzMoveToFollowing">☑ </span>'
|
101
|
+
end
|
102
|
+
node.children.each { |n| parse(n, li) }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
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.5.
|
4
|
+
version: 2.5.10
|
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-07-
|
11
|
+
date: 2023-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: html2doc
|
@@ -439,6 +439,7 @@ files:
|
|
439
439
|
- lib/isodoc/presentation_function/inline.rb
|
440
440
|
- lib/isodoc/presentation_function/math.rb
|
441
441
|
- lib/isodoc/presentation_function/refs.rb
|
442
|
+
- lib/isodoc/presentation_function/reqt.rb
|
442
443
|
- lib/isodoc/presentation_function/section.rb
|
443
444
|
- lib/isodoc/presentation_function/sourcecode.rb
|
444
445
|
- lib/isodoc/presentation_function/terms.rb
|
@@ -452,6 +453,7 @@ files:
|
|
452
453
|
- lib/isodoc/word_function/comments.rb
|
453
454
|
- lib/isodoc/word_function/footnotes.rb
|
454
455
|
- lib/isodoc/word_function/inline.rb
|
456
|
+
- lib/isodoc/word_function/lists.rb
|
455
457
|
- lib/isodoc/word_function/postprocess.rb
|
456
458
|
- lib/isodoc/word_function/postprocess_cover.rb
|
457
459
|
- lib/isodoc/word_function/postprocess_table.rb
|