isodoc 1.5.4 → 1.6.3
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/.rubocop.yml +6 -4
- data/Gemfile +2 -2
- data/Rakefile +2 -2
- data/bin/rspec +1 -2
- data/isodoc.gemspec +11 -11
- data/lib/isodoc-yaml/i18n-ar.yaml +152 -0
- data/lib/isodoc-yaml/i18n-de.yaml +149 -0
- data/lib/isodoc-yaml/i18n-es.yaml +151 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +154 -0
- data/lib/isodoc/base_style/all.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.css +7 -0
- data/lib/isodoc/base_style/metanorma_word.scss +8 -0
- data/lib/isodoc/base_style/reset.css +7 -0
- data/lib/isodoc/base_style/reset.scss +9 -0
- data/lib/isodoc/base_style/scripts.html +187 -0
- data/lib/isodoc/class_utils.rb +6 -5
- data/lib/isodoc/common.rb +2 -0
- data/lib/isodoc/convert.rb +30 -17
- data/lib/isodoc/css.rb +42 -28
- data/lib/isodoc/function/blocks.rb +21 -4
- data/lib/isodoc/function/blocks_example_note.rb +2 -2
- data/lib/isodoc/function/cleanup.rb +1 -2
- data/lib/isodoc/function/form.rb +51 -0
- data/lib/isodoc/function/inline.rb +32 -10
- data/lib/isodoc/function/references.rb +55 -42
- data/lib/isodoc/function/table.rb +1 -0
- data/lib/isodoc/function/to_word_html.rb +29 -28
- data/lib/isodoc/function/utils.rb +41 -38
- data/lib/isodoc/gem_tasks.rb +30 -31
- data/lib/isodoc/html_convert.rb +6 -4
- data/lib/isodoc/html_function/form.rb +62 -0
- data/lib/isodoc/html_function/postprocess.rb +35 -76
- data/lib/isodoc/html_function/postprocess_footnotes.rb +59 -0
- data/lib/isodoc/i18n.rb +33 -31
- data/lib/isodoc/pdf_convert.rb +1 -3
- data/lib/isodoc/presentation_function/bibdata.rb +13 -10
- data/lib/isodoc/presentation_function/block.rb +17 -8
- data/lib/isodoc/presentation_function/inline.rb +75 -118
- data/lib/isodoc/presentation_function/math.rb +84 -0
- data/lib/isodoc/presentation_function/section.rb +20 -22
- data/lib/isodoc/presentation_xml_convert.rb +2 -1
- data/lib/isodoc/sassc_importer.rb +1 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +28 -24
- data/lib/isodoc/word_function/footnotes.rb +22 -15
- data/lib/isodoc/word_function/postprocess.rb +16 -6
- data/lib/isodoc/xref.rb +10 -11
- data/lib/isodoc/xref/xref_counter.rb +32 -17
- data/lib/isodoc/xref/xref_gen.rb +45 -32
- data/lib/isodoc/xref/xref_sect_gen.rb +33 -31
- data/lib/isodoc/xslfo_convert.rb +36 -25
- data/spec/assets/html_override.css +1 -0
- data/spec/assets/word_override.css +1 -0
- data/spec/isodoc/blocks_spec.rb +2518 -2570
- data/spec/isodoc/cleanup_spec.rb +1107 -1109
- data/spec/isodoc/footnotes_spec.rb +1 -16
- data/spec/isodoc/form_spec.rb +156 -0
- data/spec/isodoc/i18n_spec.rb +984 -972
- data/spec/isodoc/inline_spec.rb +984 -920
- data/spec/isodoc/lists_spec.rb +316 -315
- data/spec/isodoc/postproc_spec.rb +1692 -1538
- data/spec/isodoc/presentation_xml_spec.rb +345 -342
- data/spec/isodoc/ref_spec.rb +718 -723
- data/spec/isodoc/section_spec.rb +910 -902
- data/spec/isodoc/table_spec.rb +566 -556
- data/spec/isodoc/terms_spec.rb +252 -256
- data/spec/isodoc/xref_spec.rb +3040 -2985
- data/spec/isodoc/xslfo_convert_spec.rb +39 -0
- data/spec/spec_helper.rb +30 -29
- metadata +80 -70
- data/.rubocop.ribose.yml +0 -65
- data/.rubocop.tb.yml +0 -650
- data/lib/twitter-cldr/patch.rb +0 -39
@@ -1,12 +1,12 @@
|
|
1
1
|
module IsoDoc::Function
|
2
2
|
module References
|
3
|
-
|
4
3
|
# This is highly specific to ISO, but it's not a bad precedent for
|
5
4
|
# references anyway; keeping here instead of in IsoDoc::Iso for now
|
6
|
-
def docid_l10n(
|
7
|
-
return
|
8
|
-
|
9
|
-
|
5
|
+
def docid_l10n(text)
|
6
|
+
return text if text.nil?
|
7
|
+
|
8
|
+
text.gsub(/All Parts/i, @i18n.all_parts.downcase) if @i18n.all_parts
|
9
|
+
text
|
10
10
|
end
|
11
11
|
|
12
12
|
# TODO generate formatted ref if not present
|
@@ -16,7 +16,7 @@ module IsoDoc::Function
|
|
16
16
|
identifiers = render_identifier(ids)
|
17
17
|
if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
|
18
18
|
else
|
19
|
-
ref <<
|
19
|
+
ref << (identifiers[0] || identifiers[1]).to_s
|
20
20
|
ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
|
21
21
|
end
|
22
22
|
ref << ", " unless biblio && !identifiers[1]
|
@@ -29,7 +29,7 @@ module IsoDoc::Function
|
|
29
29
|
identifiers = render_identifier(bibitem_ref_code(b))
|
30
30
|
if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
|
31
31
|
else
|
32
|
-
ref <<
|
32
|
+
ref << (identifiers[0] || identifiers[1]).to_s
|
33
33
|
ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
|
34
34
|
end
|
35
35
|
date_note_process(b, ref)
|
@@ -40,9 +40,9 @@ module IsoDoc::Function
|
|
40
40
|
|
41
41
|
# if t is just a number, only use that ([1] Non-Standard)
|
42
42
|
# else, use both ordinal, as prefix, and t
|
43
|
-
def ref_entry_code(r, ordinal, t,
|
43
|
+
def ref_entry_code(r, ordinal, t, _id)
|
44
44
|
prefix_bracketed_ref(r, t[0] || "[#{ordinal}]")
|
45
|
-
t[1] and r <<
|
45
|
+
t[1] and r << (t[1]).to_s
|
46
46
|
end
|
47
47
|
|
48
48
|
def pref_ref_code(b)
|
@@ -55,27 +55,36 @@ module IsoDoc::Function
|
|
55
55
|
id = b.at(ns("./docidentifier[@type = 'metanorma']"))
|
56
56
|
id1 = pref_ref_code(b)
|
57
57
|
id2 = b.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
|
58
|
-
"@type = 'ISBN']"))
|
58
|
+
"@type = 'ISBN']"))
|
59
59
|
return [id, id1, id2] if id || id1 || id2
|
60
|
+
|
60
61
|
id = Nokogiri::XML::Node.new("docidentifier", b.document)
|
61
62
|
id << "(NO ID)"
|
62
63
|
[nil, id, nil]
|
63
64
|
end
|
64
65
|
|
65
|
-
def bracket_if_num(
|
66
|
-
return nil if
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
def bracket_if_num(num)
|
67
|
+
return nil if num.nil?
|
68
|
+
|
69
|
+
num = num.text.sub(/^\[/, "").sub(/\]$/, "")
|
70
|
+
return "[#{num}]" if /^\d+$/.match?(num)
|
71
|
+
|
72
|
+
num
|
70
73
|
end
|
71
74
|
|
72
75
|
def render_identifier(id)
|
73
76
|
[
|
74
77
|
bracket_if_num(id[0]),
|
75
|
-
id[1].nil?
|
76
|
-
|
77
|
-
|
78
|
-
|
78
|
+
if id[1].nil?
|
79
|
+
nil
|
80
|
+
else
|
81
|
+
docid_prefix(id[1]["type"], id[1].text.sub(/^\[/, "").sub(/\]$/, ""))
|
82
|
+
end,
|
83
|
+
if id[2].nil?
|
84
|
+
nil
|
85
|
+
else
|
86
|
+
docid_prefix(id[2]["type"], id[2].text.sub(/^\[/, "").sub(/\]$/, ""))
|
87
|
+
end,
|
79
88
|
]
|
80
89
|
end
|
81
90
|
|
@@ -87,12 +96,14 @@ module IsoDoc::Function
|
|
87
96
|
|
88
97
|
def omit_docid_prefix(prefix)
|
89
98
|
return true if prefix.nil? || prefix.empty?
|
90
|
-
|
99
|
+
|
100
|
+
%w(ISO IEC IEV ITU W3C csd metanorma rfc-anchor).include? prefix
|
91
101
|
end
|
92
102
|
|
93
103
|
def date_note_process(b, ref)
|
94
104
|
date_note = b.at(ns("./note[@type = 'Unpublished-Status']"))
|
95
105
|
return if date_note.nil?
|
106
|
+
|
96
107
|
date_note.children.first.replace("<p>#{date_note.content}</p>")
|
97
108
|
footnote_parse(date_note, ref)
|
98
109
|
end
|
@@ -101,18 +112,17 @@ module IsoDoc::Function
|
|
101
112
|
{ id: b["id"], class: biblio ? "Biblio" : "NormRef" }
|
102
113
|
end
|
103
114
|
|
104
|
-
def iso_title(
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
title
|
115
|
+
def iso_title(bib)
|
116
|
+
bib.at(ns("./title[@language = '#{@lang}' and @type = 'main']")) ||
|
117
|
+
bib.at(ns("./title[@language = '#{@lang}']")) ||
|
118
|
+
bib.at(ns("./title[@type = 'main']")) ||
|
119
|
+
bib.at(ns("./title"))
|
110
120
|
end
|
111
121
|
|
112
122
|
# reference not to be rendered because it is deemed implicit
|
113
123
|
# in the standards environment
|
114
|
-
def implicit_reference(
|
115
|
-
|
124
|
+
def implicit_reference(bib)
|
125
|
+
bib["hidden"] == "true"
|
116
126
|
end
|
117
127
|
|
118
128
|
def prefix_bracketed_ref(ref, text)
|
@@ -120,35 +130,38 @@ module IsoDoc::Function
|
|
120
130
|
insert_tab(ref, 1)
|
121
131
|
end
|
122
132
|
|
123
|
-
def reference_format(
|
124
|
-
if ftitle =
|
133
|
+
def reference_format(bib, r)
|
134
|
+
if ftitle = bib.at(ns("./formattedref"))
|
125
135
|
ftitle&.children&.each { |n| parse(n, r) }
|
126
136
|
else
|
127
|
-
title = iso_title(
|
137
|
+
title = iso_title(bib)
|
128
138
|
r.i do |i|
|
129
139
|
title&.children&.each { |n| parse(n, i) }
|
130
140
|
end
|
131
141
|
end
|
132
142
|
end
|
133
143
|
|
134
|
-
def is_standard(
|
144
|
+
def is_standard(bib)
|
135
145
|
ret = false
|
136
|
-
|
146
|
+
bib.xpath(ns("./docidentifier")).each do |id|
|
137
147
|
next if id["type"].nil? ||
|
138
148
|
%w(metanorma DOI ISSN ISBN).include?(id["type"])
|
149
|
+
|
139
150
|
ret = true
|
140
151
|
end
|
141
152
|
ret
|
142
153
|
end
|
143
154
|
|
144
|
-
def biblio_list(
|
155
|
+
def biblio_list(refs, div, biblio)
|
145
156
|
i = 0
|
146
|
-
|
157
|
+
refs.children.each do |b|
|
147
158
|
if b.name == "bibitem"
|
148
159
|
next if implicit_reference(b)
|
160
|
+
|
149
161
|
i += 1
|
150
|
-
|
151
|
-
|
162
|
+
if is_standard(b) then std_bibitem_entry(div, b, i, biblio)
|
163
|
+
else nonstd_bibitem(div, b, i, biblio)
|
164
|
+
end
|
152
165
|
else
|
153
166
|
parse(b, div) unless %w(title).include? b.name
|
154
167
|
end
|
@@ -174,7 +187,7 @@ module IsoDoc::Function
|
|
174
187
|
num
|
175
188
|
end
|
176
189
|
|
177
|
-
def bibliography_xpath
|
190
|
+
def bibliography_xpath
|
178
191
|
"//bibliography/clause[.//references]"\
|
179
192
|
"[not(.//references[@normative = 'true'])] | "\
|
180
193
|
"//bibliography/references[@normative = 'false']"
|
@@ -184,7 +197,7 @@ module IsoDoc::Function
|
|
184
197
|
f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or return
|
185
198
|
page_break(out)
|
186
199
|
out.div do |div|
|
187
|
-
div.h1 **{class: "Section3"} do |h1|
|
200
|
+
div.h1 **{ class: "Section3" } do |h1|
|
188
201
|
f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
|
189
202
|
end
|
190
203
|
biblio_list(f, div, true)
|
@@ -193,7 +206,6 @@ module IsoDoc::Function
|
|
193
206
|
|
194
207
|
def bibliography_parse(node, out)
|
195
208
|
node["hidden"] != true or return
|
196
|
-
title = node&.at(ns("./title"))&.text || ""
|
197
209
|
out.div do |div|
|
198
210
|
clause_parse_title(node, div, node.at(ns("./title")), out,
|
199
211
|
{ class: "Section3" })
|
@@ -201,11 +213,12 @@ module IsoDoc::Function
|
|
201
213
|
end
|
202
214
|
end
|
203
215
|
|
204
|
-
def format_ref(ref, prefix,
|
216
|
+
def format_ref(ref, prefix, _isopub, _date, _allparts)
|
205
217
|
ref = docid_prefix(prefix, ref)
|
206
218
|
return "[#{ref}]" if ref && /^\d+$/.match(ref) && !prefix &&
|
207
219
|
!/^\[.*\]$/.match(ref)
|
208
|
-
|
220
|
+
|
221
|
+
ref
|
209
222
|
end
|
210
223
|
end
|
211
224
|
end
|
@@ -18,15 +18,22 @@ module IsoDoc::Function
|
|
18
18
|
|
19
19
|
def init_file(filename, debug)
|
20
20
|
filepath = Pathname.new(filename)
|
21
|
-
filename = filepath.sub_ext(
|
21
|
+
filename = filepath.sub_ext("").sub(/\.presentation$/, "").to_s
|
22
|
+
dir = init_dir(filename, debug)
|
23
|
+
@filename = filename
|
24
|
+
@localdir = filepath.parent.to_s + "/"
|
25
|
+
@sourcedir = @localdir
|
26
|
+
@sourcefilename and @sourcedir = Pathname.new(@sourcefilename).parent.to_s + "/"
|
27
|
+
[filename, dir]
|
28
|
+
end
|
29
|
+
|
30
|
+
def init_dir(filename, debug)
|
22
31
|
dir = "#{filename}_files"
|
23
32
|
unless debug
|
24
|
-
Dir.mkdir(dir,
|
33
|
+
Dir.mkdir(dir, 0o777) unless File.exists?(dir)
|
25
34
|
FileUtils.rm_rf "#{dir}/*"
|
26
35
|
end
|
27
|
-
|
28
|
-
@localdir = filepath.parent.to_s + '/'
|
29
|
-
[filename, dir]
|
36
|
+
dir
|
30
37
|
end
|
31
38
|
|
32
39
|
# tmp image dir is same directory as @filename
|
@@ -44,15 +51,14 @@ module IsoDoc::Function
|
|
44
51
|
if @standardstylesheet
|
45
52
|
head.style do |style|
|
46
53
|
@standardstylesheet.open
|
47
|
-
stylesheet = @standardstylesheet.read
|
48
|
-
gsub("FILENAME", File.basename(filename).sub(/\.presentation$/, ""))
|
54
|
+
stylesheet = @standardstylesheet.read
|
49
55
|
style.comment "\n#{stylesheet}\n"
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
53
59
|
|
54
60
|
def body_attr
|
55
|
-
{ lang:
|
61
|
+
{ lang: @lang.to_s }
|
56
62
|
end
|
57
63
|
|
58
64
|
def make_body(xml, docxml)
|
@@ -70,7 +76,7 @@ module IsoDoc::Function
|
|
70
76
|
section_break(body)
|
71
77
|
end
|
72
78
|
|
73
|
-
def make_body2(body,
|
79
|
+
def make_body2(body, _docxml)
|
74
80
|
body.div **{ class: "prefatory-section" } do |div2|
|
75
81
|
div2.p { |p| p << " " } # placeholder
|
76
82
|
end
|
@@ -109,23 +115,13 @@ module IsoDoc::Function
|
|
109
115
|
@meta.get
|
110
116
|
end
|
111
117
|
|
112
|
-
def middle_title(_isoxml, out)
|
113
|
-
out.p(**{ class: "zzSTDTitle1" }) { |p| p << @meta.get[:doctitle] }
|
114
|
-
end
|
115
|
-
|
116
|
-
def middle_admonitions(isoxml, out)
|
117
|
-
isoxml.xpath(ns("//sections/note | //sections/admonition")).each do |x|
|
118
|
-
parse(x, out)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
118
|
def middle(isoxml, out)
|
123
119
|
middle_title(isoxml, out)
|
124
120
|
middle_admonitions(isoxml, out)
|
125
121
|
i = scope isoxml, out, 0
|
126
122
|
i = norm_ref isoxml, out, i
|
127
123
|
i = terms_defs isoxml, out, i
|
128
|
-
|
124
|
+
symbols_abbrevs isoxml, out, i
|
129
125
|
clause isoxml, out
|
130
126
|
annex isoxml, out
|
131
127
|
bibliography isoxml, out
|
@@ -133,22 +129,20 @@ module IsoDoc::Function
|
|
133
129
|
|
134
130
|
def boilerplate(node, out)
|
135
131
|
boilerplate = node.at(ns("//boilerplate")) or return
|
136
|
-
out.div **{class: "authority"} do |s|
|
132
|
+
out.div **{ class: "authority" } do |s|
|
137
133
|
boilerplate.children.each do |n|
|
138
134
|
if n.name == "title"
|
139
135
|
s.h1 do |h|
|
140
136
|
n.children.each { |nn| parse(nn, h) }
|
141
137
|
end
|
142
|
-
else
|
143
|
-
parse(n, s)
|
138
|
+
else parse(n, s)
|
144
139
|
end
|
145
140
|
end
|
146
141
|
end
|
147
142
|
end
|
148
143
|
|
149
144
|
def parse(node, out)
|
150
|
-
if node.text?
|
151
|
-
text_parse(node, out)
|
145
|
+
if node.text? then text_parse(node, out)
|
152
146
|
else
|
153
147
|
case node.name
|
154
148
|
when "em" then em_parse(node, out)
|
@@ -225,9 +219,16 @@ module IsoDoc::Function
|
|
225
219
|
when "passthrough" then passthrough_parse(node, out)
|
226
220
|
when "amend" then amend_parse(node, out)
|
227
221
|
when "tab" then clausedelimspace(out) # in Presentation XML only
|
228
|
-
when "svg" then svg_parse(node, out) #
|
229
|
-
|
230
|
-
|
222
|
+
when "svg" then svg_parse(node, out) # in Presentation XML only
|
223
|
+
when "add" then add_parse(node, out)
|
224
|
+
when "del" then del_parse(node, out)
|
225
|
+
when "form" then form_parse(node, out)
|
226
|
+
when "input" then input_parse(node, out)
|
227
|
+
when "select" then select_parse(node, out)
|
228
|
+
when "label" then label_parse(node, out)
|
229
|
+
when "option" then option_parse(node, out)
|
230
|
+
when "textarea" then textarea_parse(node, out)
|
231
|
+
else error_parse(node, out)
|
231
232
|
end
|
232
233
|
end
|
233
234
|
end
|
@@ -28,10 +28,10 @@ module IsoDoc::Function
|
|
28
28
|
# to allow for HTMLentities
|
29
29
|
def noko(&block)
|
30
30
|
doc = ::Nokogiri::XML.parse(NOKOHEAD)
|
31
|
-
fragment = doc.fragment(
|
31
|
+
fragment = doc.fragment("")
|
32
32
|
::Nokogiri::XML::Builder.with fragment, &block
|
33
|
-
fragment.to_xml(encoding:
|
34
|
-
l.gsub(/\s*\n/,
|
33
|
+
fragment.to_xml(encoding: "US-ASCII").lines.map do |l|
|
34
|
+
l.gsub(/\s*\n/, "")
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -46,17 +46,18 @@ module IsoDoc::Function
|
|
46
46
|
'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
|
47
47
|
|
48
48
|
def to_xhtml(xml)
|
49
|
-
xml.gsub!(/<\?xml[^>]*>/,
|
49
|
+
xml.gsub!(/<\?xml[^>]*>/, "")
|
50
50
|
/<!DOCTYPE /.match(xml) || (xml = DOCTYPE_HDR + xml)
|
51
51
|
xml = xml.split(/(\&[^ \r\n\t#;]+;)/).map do |t|
|
52
52
|
/^(\&[^ \t\r\n#;]+;)/.match?(t) ?
|
53
53
|
HTMLEntities.new.encode(HTMLEntities.new.decode(t), :hexadecimal) : t
|
54
|
-
end.join(
|
54
|
+
end.join("")
|
55
55
|
begin
|
56
56
|
Nokogiri::XML.parse(xml, &:strict)
|
57
57
|
rescue Nokogiri::XML::SyntaxError => e
|
58
|
-
File.open("#{@filename}.#{@format}.err",
|
59
|
-
abort "Malformed Output XML for #{@format}: #{e}
|
58
|
+
File.open("#{@filename}.#{@format}.err", "w:UTF-8") { |f| f.write xml }
|
59
|
+
abort "Malformed Output XML for #{@format}: #{e} "\
|
60
|
+
"(see #{@filename}.#{@format}.err)"
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -67,11 +68,12 @@ module IsoDoc::Function
|
|
67
68
|
end
|
68
69
|
|
69
70
|
def from_xhtml(xml)
|
70
|
-
xml.to_xml.sub(%r{ xmlns="http://www.w3.org/1999/xhtml"},
|
71
|
+
xml.to_xml.sub(%r{ xmlns="http://www.w3.org/1999/xhtml"}, "")
|
71
72
|
end
|
72
73
|
|
73
74
|
CLAUSE_ANCESTOR =
|
74
75
|
".//ancestor::*[local-name() = 'annex' or "\
|
76
|
+
"local-name() = 'definitions' or "\
|
75
77
|
"local-name() = 'acknowledgements' or local-name() = 'term' or "\
|
76
78
|
"local-name() = 'appendix' or local-name() = 'foreword' or "\
|
77
79
|
"local-name() = 'introduction' or local-name() = 'terms' or "\
|
@@ -102,31 +104,32 @@ module IsoDoc::Function
|
|
102
104
|
else
|
103
105
|
@i18n.l10n("#{array[0..-2].join(', ')} "\
|
104
106
|
"#{@i18n.and} #{array.last}",
|
105
|
-
|
107
|
+
@lang, @script)
|
106
108
|
end
|
107
109
|
end
|
108
110
|
|
109
111
|
# avoid `; avoid {{ (Liquid Templates); avoid [[ (Javascript)
|
110
112
|
def extract_delims(text)
|
111
|
-
@openmathdelim =
|
112
|
-
@closemathdelim =
|
113
|
+
@openmathdelim = "(#("
|
114
|
+
@closemathdelim = ")#)"
|
113
115
|
while text.include?(@openmathdelim) || text.include?(@closemathdelim)
|
114
|
-
@openmathdelim +=
|
115
|
-
@closemathdelim +=
|
116
|
+
@openmathdelim += "("
|
117
|
+
@closemathdelim += ")"
|
116
118
|
end
|
117
119
|
[@openmathdelim, @closemathdelim]
|
118
120
|
end
|
119
121
|
|
120
122
|
def header_strip(h)
|
121
|
-
h = h.to_s.gsub(%r{<br\s*/>},
|
122
|
-
|
123
|
+
h = h.to_s.gsub(%r{<br\s*/>}, " ").gsub(/<\/?h[123456][^>]*>/, "")
|
124
|
+
.gsub(/<\/?b[^>]*>/, "")
|
123
125
|
h1 = to_xhtml_fragment(h.dup)
|
124
126
|
h1.traverse do |x|
|
125
|
-
x.replace(
|
126
|
-
x.remove if x.name ==
|
127
|
-
x.remove if x.name ==
|
128
|
-
x.remove if x.name ==
|
129
|
-
x.
|
127
|
+
x.replace(" ") if x.name == "span" && /mso-tab-count/.match(x["style"])
|
128
|
+
x.remove if x.name == "img"
|
129
|
+
x.remove if x.name == "span" && x["class"] == "MsoCommentReference"
|
130
|
+
x.remove if x.name == "a" && x["class"] == "FootnoteRef"
|
131
|
+
x.remove if x.name == "span" && /mso-bookmark/.match(x["style"])
|
132
|
+
x.replace(x.children) if x.name == "a"
|
130
133
|
end
|
131
134
|
from_xhtml(h1)
|
132
135
|
end
|
@@ -138,9 +141,9 @@ module IsoDoc::Function
|
|
138
141
|
def liquid(doc)
|
139
142
|
# unescape HTML escapes in doc
|
140
143
|
doc = doc.split(%r<(\{%|%\})>).each_slice(4).map do |a|
|
141
|
-
a[2] = a[2].gsub(/\</,
|
142
|
-
a.join(
|
143
|
-
end.join(
|
144
|
+
a[2] = a[2].gsub(/\</, "<").gsub(/\>/, ">") if a.size > 2
|
145
|
+
a.join("")
|
146
|
+
end.join("")
|
144
147
|
Liquid::Template.parse(doc)
|
145
148
|
end
|
146
149
|
|
@@ -151,20 +154,20 @@ module IsoDoc::Function
|
|
151
154
|
|
152
155
|
def populate_template(docxml, _format = nil)
|
153
156
|
meta = @meta
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
157
|
+
.get
|
158
|
+
.merge(@labels ? {labels: @labels} : {})
|
159
|
+
.merge(@meta.labels ? {labels: @meta.labels} : {})
|
160
|
+
.merge(fonts_options || {})
|
158
161
|
template = liquid(docxml)
|
159
162
|
template.render(meta.map { |k, v| [k.to_s, empty2nil(v)] }.to_h)
|
160
|
-
|
163
|
+
.gsub("<", "<").gsub(">", ">").gsub("&", "&")
|
161
164
|
end
|
162
165
|
|
163
166
|
def save_dataimage(uri, _relative_dir = true)
|
164
167
|
%r{^data:(image|application)/(?<imgtype>[^;]+);base64,(?<imgdata>.+)$} =~ uri
|
165
|
-
imgtype.sub!(/\+[a-z0-9]+$/,
|
166
|
-
imgtype =
|
167
|
-
Tempfile.open([
|
168
|
+
imgtype.sub!(/\+[a-z0-9]+$/, "") # svg+xml
|
169
|
+
imgtype = "png" unless /^[a-z0-9]+$/.match imgtype
|
170
|
+
Tempfile.open(["image", ".#{imgtype}"]) do |f|
|
168
171
|
f.binmode
|
169
172
|
f.write(Base64.strict_decode64(imgdata))
|
170
173
|
@tempfile_cache << f # persist to the end
|
@@ -173,18 +176,18 @@ module IsoDoc::Function
|
|
173
176
|
end
|
174
177
|
|
175
178
|
def image_localfile(i)
|
176
|
-
if /^data:/.match? i[
|
177
|
-
save_dataimage(i[
|
178
|
-
elsif %r{^([A-Z]:)?/}.match? i[
|
179
|
-
i[
|
179
|
+
if /^data:/.match? i["src"]
|
180
|
+
save_dataimage(i["src"], false)
|
181
|
+
elsif %r{^([A-Z]:)?/}.match? i["src"]
|
182
|
+
i["src"]
|
180
183
|
else
|
181
|
-
File.join(@localdir, i[
|
184
|
+
File.join(@localdir, i["src"])
|
182
185
|
end
|
183
186
|
end
|
184
187
|
|
185
188
|
def labelled_ancestor(node)
|
186
|
-
!node.ancestors(
|
187
|
-
|
189
|
+
!node.ancestors("example, requirement, recommendation, permission, "\
|
190
|
+
"note, table, figure, sourcecode").empty?
|
188
191
|
end
|
189
192
|
end
|
190
193
|
end
|