isodoc 1.5.2 → 1.6.1

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.rubocop.yml +6 -2
  4. data/Gemfile +2 -2
  5. data/bin/rspec +1 -2
  6. data/isodoc.gemspec +11 -11
  7. data/lib/isodoc/base_style/all.css +7 -0
  8. data/lib/isodoc/base_style/metanorma_word.css +7 -0
  9. data/lib/isodoc/base_style/metanorma_word.scss +8 -0
  10. data/lib/isodoc/base_style/reset.css +7 -0
  11. data/lib/isodoc/base_style/reset.scss +9 -0
  12. data/lib/isodoc/base_style/scripts.html +187 -0
  13. data/lib/isodoc/class_utils.rb +6 -5
  14. data/lib/isodoc/convert.rb +30 -17
  15. data/lib/isodoc/css.rb +42 -28
  16. data/lib/isodoc/function/blocks.rb +15 -4
  17. data/lib/isodoc/function/blocks_example_note.rb +2 -2
  18. data/lib/isodoc/function/cleanup.rb +1 -2
  19. data/lib/isodoc/function/inline.rb +31 -10
  20. data/lib/isodoc/function/references.rb +1 -1
  21. data/lib/isodoc/function/to_word_html.rb +19 -8
  22. data/lib/isodoc/function/utils.rb +41 -38
  23. data/lib/isodoc/gem_tasks.rb +30 -31
  24. data/lib/isodoc/html_convert.rb +4 -4
  25. data/lib/isodoc/html_function/postprocess.rb +35 -76
  26. data/lib/isodoc/html_function/postprocess_footnotes.rb +59 -0
  27. data/lib/isodoc/i18n.rb +20 -20
  28. data/lib/isodoc/pdf_convert.rb +1 -3
  29. data/lib/isodoc/presentation_function/block.rb +26 -11
  30. data/lib/isodoc/presentation_function/inline.rb +44 -38
  31. data/lib/isodoc/presentation_xml_convert.rb +1 -1
  32. data/lib/isodoc/version.rb +1 -1
  33. data/lib/isodoc/word_function/footnotes.rb +22 -15
  34. data/lib/isodoc/word_function/inline.rb +6 -0
  35. data/lib/isodoc/word_function/postprocess.rb +16 -6
  36. data/lib/isodoc/xref.rb +10 -11
  37. data/lib/isodoc/xref/xref_counter.rb +31 -15
  38. data/lib/isodoc/xref/xref_gen.rb +28 -22
  39. data/lib/isodoc/xref/xref_sect_gen.rb +22 -20
  40. data/lib/isodoc/xslfo_convert.rb +36 -25
  41. data/spec/assets/html_override.css +1 -0
  42. data/spec/assets/word_override.css +1 -0
  43. data/spec/isodoc/blocks_spec.rb +2599 -2503
  44. data/spec/isodoc/cleanup_spec.rb +1107 -1109
  45. data/spec/isodoc/footnotes_spec.rb +1 -16
  46. data/spec/isodoc/i18n_spec.rb +984 -972
  47. data/spec/isodoc/inline_spec.rb +34 -0
  48. data/spec/isodoc/lists_spec.rb +316 -315
  49. data/spec/isodoc/postproc_spec.rb +1655 -1521
  50. data/spec/isodoc/presentation_xml_spec.rb +345 -338
  51. data/spec/isodoc/ref_spec.rb +718 -723
  52. data/spec/isodoc/section_spec.rb +910 -902
  53. data/spec/isodoc/table_spec.rb +566 -556
  54. data/spec/isodoc/terms_spec.rb +252 -256
  55. data/spec/isodoc/xref_spec.rb +3040 -2985
  56. data/spec/isodoc/xslfo_convert_spec.rb +39 -0
  57. data/spec/spec_helper.rb +30 -29
  58. metadata +72 -69
  59. data/.rubocop.ribose.yml +0 -65
  60. data/.rubocop.tb.yml +0 -650
data/lib/isodoc/css.rb CHANGED
@@ -6,26 +6,40 @@ module IsoDoc
6
6
  def precompiled_style_or_original(stylesheet_path)
7
7
  # Already have compiled stylesheet, use it
8
8
  return stylesheet_path if stylesheet_path.nil? ||
9
- File.extname(stylesheet_path) == '.css'
10
- basename = File.basename(stylesheet_path, '.*')
9
+ File.extname(stylesheet_path) == ".css"
10
+
11
+ basename = File.basename(stylesheet_path, ".*")
11
12
  compiled_path = File.join(File.dirname(stylesheet_path),
12
13
  "#{basename}.css")
13
14
  return stylesheet_path unless File.file?(compiled_path)
15
+
14
16
  compiled_path
15
17
  end
16
18
 
19
+ def localpath(path)
20
+ return path if %r{^[A-Z]:|^/|^file:/}.match?(path)
21
+ return path unless (@sourcedir || @localdir) && path
22
+
23
+ File.expand_path(File.join((@sourcedir || @localdir), path))
24
+ end
25
+
17
26
  # run this after @meta is populated
18
27
  def populate_css
19
- @htmlstylesheet = generate_css(@htmlstylesheet_name, true)
20
- @wordstylesheet = generate_css(@wordstylesheet_name, false)
21
- @standardstylesheet = generate_css(@standardstylesheet_name, false)
28
+ @htmlstylesheet = generate_css(localpath(@htmlstylesheet_name), true)
29
+ @wordstylesheet = generate_css(localpath(@wordstylesheet_name), false)
30
+ @standardstylesheet =
31
+ generate_css(localpath(@standardstylesheet_name), false)
32
+ @htmlstylesheet_override_name and @htmlstylesheet_override =
33
+ File.open(localpath(@htmlstylesheet_override_name))
34
+ @wordstylesheet_override_name and @wordstylesheet_override =
35
+ File.open(localpath(@wordstylesheet_override_name))
22
36
  end
23
37
 
24
38
  def default_fonts(_options)
25
39
  {
26
- bodyfont: 'Arial',
27
- headerfont: 'Arial',
28
- monospacefont: 'Courier',
40
+ bodyfont: "Arial",
41
+ headerfont: "Arial",
42
+ monospacefont: "Courier",
29
43
  }
30
44
  end
31
45
 
@@ -37,35 +51,35 @@ module IsoDoc
37
51
 
38
52
  def fonts_options
39
53
  {
40
- 'bodyfont' => options[:bodyfont] || 'Arial',
41
- 'headerfont' => options[:headerfont] || 'Arial',
42
- 'monospacefont' => options[:monospacefont] || 'Courier',
54
+ "bodyfont" => options[:bodyfont] || "Arial",
55
+ "headerfont" => options[:headerfont] || "Arial",
56
+ "monospacefont" => options[:monospacefont] || "Courier",
43
57
  "normalfontsize" => options[:normalfontsize],
44
58
  "monospacefontsize" => options[:monospacefontsize],
45
59
  "smallerfontsize" => options[:smallerfontsize],
46
- "footnotefontsize" => options[:footnotefontsize]
60
+ "footnotefontsize" => options[:footnotefontsize],
47
61
  }
48
62
  end
49
63
 
50
64
  def scss_fontheader(is_html_css)
51
- b = options[:bodyfont] || 'Arial'
52
- h = options[:headerfont] || 'Arial'
53
- m = options[:monospacefont] || 'Courier'
54
- ns = options[:normalfontsize] || (is_html_css ? "1.0em" : '12.0pt')
55
- ms = options[:monospacefontsize] || (is_html_css ? "0.8em" : '11.0pt')
56
- ss = options[:smallerfontsize] || (is_html_css ? "0.9em" : '10.0pt')
57
- fs = options[:footnotefontsize] || (is_html_css ? "0.9em" : '9.0pt')
65
+ b = options[:bodyfont] || "Arial"
66
+ h = options[:headerfont] || "Arial"
67
+ m = options[:monospacefont] || "Courier"
68
+ ns = options[:normalfontsize] || (is_html_css ? "1.0em" : "12.0pt")
69
+ ms = options[:monospacefontsize] || (is_html_css ? "0.8em" : "11.0pt")
70
+ ss = options[:smallerfontsize] || (is_html_css ? "0.9em" : "10.0pt")
71
+ fs = options[:footnotefontsize] || (is_html_css ? "0.9em" : "9.0pt")
58
72
  "$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"\
59
73
  "$normalfontsize: #{ns};\n$monospacefontsize: #{ms};\n"\
60
74
  "$smallerfontsize: #{ss};\n$footnotefontsize: #{fs};\n"
61
75
  end
62
76
 
63
77
  def convert_scss(filename, stylesheet, stripwordcss)
64
- require 'sassc'
65
- require 'isodoc/sassc_importer'
78
+ require "sassc"
79
+ require "isodoc/sassc_importer"
66
80
 
67
- [File.join(Gem.loaded_specs['isodoc'].full_gem_path,
68
- 'lib', 'isodoc'),
81
+ [File.join(Gem.loaded_specs["isodoc"].full_gem_path,
82
+ "lib", "isodoc"),
69
83
  File.dirname(filename)].each do |name|
70
84
  SassC.load_paths << name
71
85
  end
@@ -79,14 +93,14 @@ module IsoDoc
79
93
  return nil if filename.nil?
80
94
 
81
95
  filename = precompiled_style_or_original(filename)
82
- stylesheet = File.read(filename, encoding: 'UTF-8')
96
+ stylesheet = File.read(filename, encoding: "UTF-8")
83
97
  stylesheet = populate_template(stylesheet, :word)
84
- stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, '\\1') if stripwordcss
85
- if File.extname(filename) == '.scss'
98
+ stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, "\\1") if stripwordcss
99
+ if File.extname(filename) == ".scss"
86
100
  stylesheet = convert_scss(filename, stylesheet, stripwordcss)
87
101
  end
88
- Tempfile.open([File.basename(filename, '.*'), 'css'],
89
- encoding: 'utf-8') do |f|
102
+ Tempfile.open([File.basename(filename, ".*"), "css"],
103
+ encoding: "utf-8") do |f|
90
104
  f.write(stylesheet)
91
105
  f
92
106
  end
@@ -24,6 +24,7 @@ module IsoDoc::Function
24
24
  def figure_parse(node, out)
25
25
  return pseudocode_parse(node, out) if node["class"] == "pseudocode" ||
26
26
  node["type"] == "pseudocode"
27
+
27
28
  @in_figure = true
28
29
  out.div **figure_attrs(node) do |div|
29
30
  node.children.each do |n|
@@ -51,6 +52,7 @@ module IsoDoc::Function
51
52
 
52
53
  def sourcecode_name_parse(node, div, name)
53
54
  return if name.nil?
55
+
54
56
  div.p **{ class: "SourceTitle", style: "text-align:center;" } do |p|
55
57
  name.children.each { |n| parse(n, p) }
56
58
  end
@@ -91,14 +93,15 @@ module IsoDoc::Function
91
93
  @annotation = false
92
94
  end
93
95
 
94
- def admonition_class(node)
96
+ def admonition_class(_node)
95
97
  "Admonition"
96
98
  end
97
99
 
98
100
  def admonition_name(node, type)
99
101
  name = node&.at(ns("./name")) and return name
100
- name = Nokogiri::XML::Node.new('name', node.document)
102
+ name = Nokogiri::XML::Node.new("name", node.document)
101
103
  return unless type && @i18n.admonition[type]
104
+
102
105
  name << @i18n.admonition[type]&.upcase
103
106
  name
104
107
  end
@@ -119,7 +122,8 @@ module IsoDoc::Function
119
122
 
120
123
  def formula_where(dl, out)
121
124
  return unless dl
122
- out.p **{ style: "page-break-after:avoid;"} do |p|
125
+
126
+ out.p **{ style: "page-break-after:avoid;" } do |p|
123
127
  p << @i18n.where
124
128
  end
125
129
  parse(dl, out)
@@ -148,6 +152,7 @@ module IsoDoc::Function
148
152
  formula_where(node.at(ns("./dl")), div)
149
153
  node.children.each do |n|
150
154
  next if %w(stem dl name).include? n.name
155
+
151
156
  parse(n, div)
152
157
  end
153
158
  end
@@ -182,6 +187,7 @@ module IsoDoc::Function
182
187
  author = node.at(ns("./author"))
183
188
  source = node.at(ns("./source"))
184
189
  return if author.nil? && source.nil?
190
+
185
191
  out.p **{ class: "QuoteAttribution" } do |p|
186
192
  p << "&mdash; #{author.text}" if author
187
193
  p << ", " if author && source
@@ -201,9 +207,14 @@ module IsoDoc::Function
201
207
  end
202
208
 
203
209
  def passthrough_parse(node, out)
204
- return if node["format"] and
210
+ return if node["format"] &&
205
211
  !(node["format"].split(/,/).include? @format.to_s)
212
+
206
213
  out.passthrough node.text
207
214
  end
215
+
216
+ def svg_parse(node, out)
217
+ out << node.to_xml
218
+ end
208
219
  end
209
220
  end
@@ -59,7 +59,7 @@ module IsoDoc::Function
59
59
  name = node&.at(ns("./name"))&.remove
60
60
  div.p do |p|
61
61
  name and p.span **{ class: "note_label" } do |s|
62
- name and name.children.each { |n| parse(n, s) }
62
+ name.children.each { |n| parse(n, s) }
63
63
  s << note_delim
64
64
  end
65
65
  insert_tab(p, 1)
@@ -98,7 +98,7 @@ module IsoDoc::Function
98
98
  @note = true
99
99
  out.div **note_attrs(node) do |div|
100
100
  node&.at(ns("./*[local-name() != 'name'][1]"))&.name == "p" ?
101
- #node.first_element_child.name == "p" ?
101
+ # node.first_element_child.name == "p" ?
102
102
  note_p_parse(node, div) : note_parse1(node, div)
103
103
  end
104
104
  @note = false
@@ -204,8 +204,7 @@ module IsoDoc::Function
204
204
  docxml
205
205
  end
206
206
 
207
- def symbols_cleanup(docxml)
208
- end
207
+ def symbols_cleanup(docxml); end
209
208
 
210
209
  def table_footnote_reference_format(a)
211
210
  a
@@ -23,21 +23,26 @@ module IsoDoc::Function
23
23
  end
24
24
 
25
25
  def xref_parse(node, out)
26
- target = /#/.match(node["target"]) ? node["target"].sub(/#/, ".html#") :
27
- "##{node["target"]}"
28
- out.a(**{ "href": target }) { |l| no_locality_parse(node, l) }
26
+ target = if /#/.match?(node["target"])
27
+ node["target"].sub(/#/, ".html#")
28
+ else
29
+ "##{node['target']}"
30
+ end
31
+ out.a(**{ "href": target }) { |l| no_locality_parse(node, l) }
29
32
  end
30
33
 
31
34
  def suffix_url(url)
32
- return url if %r{^http[s]?://}.match(url)
35
+ return url if %r{^https?://}.match?(url)
36
+
33
37
  url.sub(/#{File.extname(url)}$/, ".html")
34
38
  end
35
39
 
36
40
  def eref_target(node)
37
- href = "#" + node["bibitemid"]
41
+ href = "##{node['bibitemid']}"
38
42
  url = node.at(ns("//bibitem[@id = '#{node['bibitemid']}']/"\
39
43
  "uri[@type = 'citation']"))
40
44
  return href unless url
45
+
41
46
  href = suffix_url(url.text)
42
47
  anchor = node&.at(ns(".//locality[@type = 'anchor']"))&.text&.strip
43
48
  anchor and href += "##{anchor}"
@@ -68,10 +73,11 @@ module IsoDoc::Function
68
73
  end
69
74
 
70
75
  def stem_parse(node, out)
71
- ooml = if node["type"] == "AsciiMath"
76
+ ooml = case node["type"]
77
+ when "AsciiMath"
72
78
  "#{@openmathdelim}#{HTMLEntities.new.encode(node.text)}"\
73
79
  "#{@closemathdelim}"
74
- elsif node["type"] == "MathML" then node.first_element_child.to_s
80
+ when "MathML" then node.first_element_child.to_s
75
81
  else
76
82
  HTMLEntities.new.encode(node.text)
77
83
  end
@@ -93,7 +99,7 @@ module IsoDoc::Function
93
99
  height: node["height"] || "auto",
94
100
  width: node["width"] || "auto",
95
101
  title: node["title"],
96
- alt: node["alt"] }
102
+ alt: node["alt"] }
97
103
  out.img **attr_code(attrs)
98
104
  image_title_parse(out, caption)
99
105
  end
@@ -106,12 +112,27 @@ module IsoDoc::Function
106
112
 
107
113
  def text_parse(node, out)
108
114
  return if node.nil? || node.text.nil?
115
+
109
116
  text = node.to_s
110
- text = text.gsub("\n", "<br/>").gsub("<br/> ", "<br/>&nbsp;").
111
- gsub(/[ ](?=[ ])/, "&nbsp;") if in_sourcecode
117
+ if in_sourcecode
118
+ text = text.gsub("\n", "<br/>").gsub("<br/> ", "<br/>&nbsp;")
119
+ .gsub(/ (?= )/, "&nbsp;")
120
+ end
112
121
  out << text
113
122
  end
114
123
 
124
+ def add_parse(node, out)
125
+ out.span **{class: "addition"} do |e|
126
+ node.children.each { |n| parse(n, e) }
127
+ end
128
+ end
129
+
130
+ def del_parse(node, out)
131
+ out.span **{class: "deletion"} do |e|
132
+ node.children.each { |n| parse(n, e) }
133
+ end
134
+ end
135
+
115
136
  def error_parse(node, out)
116
137
  text = node.to_xml.gsub(/</, "&lt;").gsub(/>/, "&gt;")
117
138
  out.para do |p|
@@ -87,7 +87,7 @@ module IsoDoc::Function
87
87
 
88
88
  def omit_docid_prefix(prefix)
89
89
  return true if prefix.nil? || prefix.empty?
90
- return %w(ISO IEC IEV ITU W3C metanorma).include? prefix
90
+ return %w(ISO IEC IEV ITU W3C csd metanorma rfc-anchor).include? prefix
91
91
  end
92
92
 
93
93
  def date_note_process(b, ref)
@@ -19,14 +19,21 @@ module IsoDoc::Function
19
19
  def init_file(filename, debug)
20
20
  filepath = Pathname.new(filename)
21
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
33
  Dir.mkdir(dir, 0777) unless File.exists?(dir)
25
34
  FileUtils.rm_rf "#{dir}/*"
26
35
  end
27
- @filename = filename
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,16 @@ 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.gsub(
55
+ "FILENAME", File.basename(filename).sub(/\.presentation$/, "")
56
+ )
49
57
  style.comment "\n#{stylesheet}\n"
50
58
  end
51
59
  end
52
60
  end
53
61
 
54
62
  def body_attr
55
- { lang: "#{@lang}" }
63
+ { lang: @lang.to_s }
56
64
  end
57
65
 
58
66
  def make_body(xml, docxml)
@@ -125,7 +133,7 @@ module IsoDoc::Function
125
133
  i = scope isoxml, out, 0
126
134
  i = norm_ref isoxml, out, i
127
135
  i = terms_defs isoxml, out, i
128
- i = symbols_abbrevs isoxml, out, i
136
+ symbols_abbrevs isoxml, out, i
129
137
  clause isoxml, out
130
138
  annex isoxml, out
131
139
  bibliography isoxml, out
@@ -133,7 +141,7 @@ module IsoDoc::Function
133
141
 
134
142
  def boilerplate(node, out)
135
143
  boilerplate = node.at(ns("//boilerplate")) or return
136
- out.div **{class: "authority"} do |s|
144
+ out.div **{ class: "authority" } do |s|
137
145
  boilerplate.children.each do |n|
138
146
  if n.name == "title"
139
147
  s.h1 do |h|
@@ -225,6 +233,9 @@ module IsoDoc::Function
225
233
  when "passthrough" then passthrough_parse(node, out)
226
234
  when "amend" then amend_parse(node, out)
227
235
  when "tab" then clausedelimspace(out) # in Presentation XML only
236
+ when "svg" then svg_parse(node, out) # in Presentation XML only
237
+ when "add" then add_parse(node, out)
238
+ when "del" then del_parse(node, out)
228
239
  else
229
240
  error_parse(node, out)
230
241
  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: 'US-ASCII').lines.map do |l|
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", 'w:UTF-8') { |f| f.write xml }
59
- abort "Malformed Output XML for #{@format}: #{e} (see #{@filename}.#{@format}.err)"
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
- @lang, @script)
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*/>}, ' ').gsub(/<\/?h[123456][^>]*>/, '')
122
- .gsub(/<\/?b[^>]*>/, '')
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(' ') if x.name == 'span' && /mso-tab-count/.match(x['style'])
126
- x.remove if x.name == 'span' && x['class'] == 'MsoCommentReference'
127
- x.remove if x.name == 'a' && x['class'] == 'FootnoteRef'
128
- x.remove if x.name == 'span' && /mso-bookmark/.match(x['style'])
129
- x.replace(x.children) if x.name == 'a'
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(/\&lt;/, '<').gsub(/\&gt;/, '>') if a.size > 2
142
- a.join('')
143
- end.join('')
144
+ a[2] = a[2].gsub(/\&lt;/, "<").gsub(/\&gt;/, ">") 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
- .get
155
- .merge(@labels ? {labels: @labels} : {})
156
- .merge(@meta.labels ? {labels: @meta.labels} : {})
157
- .merge(fonts_options || {})
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
- .gsub('&lt;', '&#x3c;').gsub('&gt;', '&#x3e;').gsub('&amp;', '&#x26;')
163
+ .gsub("&lt;", "&#x3c;").gsub("&gt;", "&#x3e;").gsub("&amp;", "&#x26;")
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]+$/, '') # svg+xml
166
- imgtype = 'png' unless /^[a-z0-9]+$/.match imgtype
167
- Tempfile.open(['image', ".#{imgtype}"]) do |f|
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['src']
177
- save_dataimage(i['src'], false)
178
- elsif %r{^([A-Z]:)?/}.match? i['src']
179
- i['src']
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['src'])
184
+ File.join(@localdir, i["src"])
182
185
  end
183
186
  end
184
187
 
185
188
  def labelled_ancestor(node)
186
- !node.ancestors('example, requirement, recommendation, permission, '\
187
- 'note, table, figure, sourcecode').empty?
189
+ !node.ancestors("example, requirement, recommendation, permission, "\
190
+ "note, table, figure, sourcecode").empty?
188
191
  end
189
192
  end
190
193
  end