isodoc 2.3.1 → 2.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cfc6c450ad2b744b1669dcdbc33ec716c9f1bb2ab8b0923a4e77f17123c9c3b
4
- data.tar.gz: 98efcb5075af4c7a941a7d6855ca074be4ad9e89fc0b9d20f5c7ef96da97b03b
3
+ metadata.gz: 73982c33aa666aee412b32318f01d964e21a7d2dfbb6d3afca3b19c7c0268549
4
+ data.tar.gz: 90fb6621afc2fedcc1c0db06d83a8bc53d96f0d62eb382cdb4d94f773a25c477
5
5
  SHA512:
6
- metadata.gz: d398f662be10cc30b34205c10346d040f36f2217fa6a026304cf8015312f9227e799f4687b044f226ac6884307a03177e184cf5c2a99cad5ed06dd83050ba836
7
- data.tar.gz: f67b3a92994c67c13565a91e822b205e3c2f93f9dacc32effcbf8d35c85ed7f20eb2be85a6f32cd0f2d319e5a6e2f5f3d6948ed1217d18c2535e98ceb8ca08f7
6
+ metadata.gz: 0bb5d3dff4fd0f0ca32f424d3600685d974658a3fa69fa5593c91e59b3b9eb9dbc1f1bb62c28ae43277debf62ced423a4c3bff485411f14ef6777f74c126d999
7
+ data.tar.gz: 6b9e739460d40e0d74129563cbcdce6573348d7838380723dca798411f7e4a0f2882c50bd5a275cd7b3e58ec27cb87014a512dc41b2545707301bfbc007b8894
data/isodoc.gemspec CHANGED
@@ -32,18 +32,18 @@ Gem::Specification.new do |spec|
32
32
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
33
33
 
34
34
  spec.add_dependency "asciimath"
35
- spec.add_dependency "html2doc", "~> 1.4.1"
35
+ spec.add_dependency "html2doc", "~> 1.4.3"
36
36
  spec.add_dependency "htmlentities", "~> 4.3.4"
37
37
  # spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
38
38
  spec.add_dependency "liquid", "~> 4"
39
39
  # spec.add_dependency "metanorma", ">= 1.2.0"
40
40
  spec.add_dependency "emf2svg"
41
41
  spec.add_dependency "mathml2asciimath"
42
- spec.add_dependency "metanorma-utils", "~> 1.4.3"
42
+ spec.add_dependency "metanorma-utils", "~> 1.4.5"
43
43
  spec.add_dependency "mn2pdf"
44
- spec.add_dependency "mn-requirements", "~> 0.1.7"
44
+ spec.add_dependency "mn-requirements", "~> 0.2.0"
45
45
  spec.add_dependency "relaton-cli"
46
- spec.add_dependency "relaton-render", "~> 0.5.0"
46
+ spec.add_dependency "relaton-render", "~> 0.5.2"
47
47
  spec.add_dependency "roman-numerals"
48
48
  spec.add_dependency "thread_safe"
49
49
  spec.add_dependency "twitter_cldr", ">= 6.6.0"
@@ -35,7 +35,7 @@
35
35
  @include blockTitle();
36
36
  }
37
37
 
38
- > img {
38
+ > img, > svg {
39
39
  margin-left: auto;
40
40
  margin-right: auto;
41
41
  display: block;
@@ -60,14 +60,17 @@ module IsoDoc
60
60
  "#{url}##{anchor.text.strip}"
61
61
  end
62
62
 
63
- def eref_url(bibitemid)
64
- return nil if @bibitems.nil? || @bibitems[bibitemid].nil?
63
+ def eref_url(id)
64
+ @bibitems.nil? and return nil
65
65
 
66
- url = @bibitems[bibitemid].at(ns("./uri[@type = 'citation']")) and
66
+ b = @bibitems[id]
67
+ b.nil? and return nil
68
+
69
+ url = b.at(ns("./uri[@type = 'citation'][@language = '#{@lang}']")) and
67
70
  return url.text
68
- @bibitems[bibitemid]["hidden"] == "true" and
69
- return @bibitems[bibitemid].at(ns("./uri"))&.text
70
- "##{bibitemid}"
71
+ url = b.at(ns("./uri[@type = 'citation']")) and return url.text
72
+ b["hidden"] == "true" and return b.at(ns("./uri"))&.text
73
+ "##{id}"
71
74
  end
72
75
 
73
76
  def eref_parse(node, out)
@@ -101,10 +104,9 @@ module IsoDoc
101
104
 
102
105
  def stem_parse(node, out)
103
106
  ooml = case node["type"]
104
- when "AsciiMath"
105
- "#{@openmathdelim}#{HTMLEntities.new.encode(node.text)}"\
106
- "#{@closemathdelim}"
107
- when "MathML" then node.first_element_child.to_s
107
+ when "AsciiMath" then asciimath_parse(node)
108
+ when "MathML" then mathml_parse(node)
109
+ when "LaTeX" then latexmath_parse(node)
108
110
  else HTMLEntities.new.encode(node.text)
109
111
  end
110
112
  out.span **{ class: "stem" } do |span|
@@ -112,6 +114,24 @@ module IsoDoc
112
114
  end
113
115
  end
114
116
 
117
+ MATHML = { "m" => "http://www.w3.org/1998/Math/MathML" }.freeze
118
+
119
+ def mathml_parse(node)
120
+ node.at("./m:math", MATHML)&.to_xml
121
+ end
122
+
123
+ def asciimath_parse(node)
124
+ a = node.at(ns("./asciimath"))&.text || node.text
125
+
126
+ "#{@openmathdelim}#{HTMLEntities.new.encode(a)}"\
127
+ "#{@closemathdelim}"
128
+ end
129
+
130
+ def latexmath_parse(node)
131
+ a = node.at(ns("./latexmath"))&.text || node.text
132
+ HTMLEntities.new.encode(a)
133
+ end
134
+
115
135
  def image_title_parse(out, caption)
116
136
  unless caption.nil?
117
137
  out.p **{ class: "FigureTitle", style: "text-align:center;" } do |p|
@@ -56,15 +56,14 @@ module IsoDoc
56
56
  ret.empty? and
57
57
  ret = bib.xpath(ns("./docidentifier[@primary = 'true']"))
58
58
  ret.empty? and
59
- ret = bib.at(ns("./docidentifier[not(@type = 'DOI' or "\
60
- "@type = 'metanorma' "\
61
- "or @type = 'metanorma-ordinal' or "\
62
- "@type = 'ISSN' or @type = 'ISBN')]"\
63
- "[@language = '#{@lang}']")) ||
64
- bib.at(ns("./docidentifier[not(@type = 'DOI' or "\
65
- "@type = 'metanorma' "\
66
- "or @type = 'metanorma-ordinal' or "\
67
- "@type = 'ISSN' or @type = 'ISBN')]"))
59
+ ret = bib.at(ns(<<~XPATH,
60
+ ./docidentifier[not(@type = 'DOI' or @type = 'metanorma' or @type = 'metanorma-ordinal' or @type = 'ISSN' or @type = 'ISBN')][@language = '#{@lang}']
61
+ XPATH
62
+ )) ||
63
+ bib.at(ns(<<~XPATH,
64
+ ./docidentifier[not(@type = 'DOI' or @type = 'metanorma' or @type = 'metanorma-ordinal' or @type = 'ISSN' or @type = 'ISBN')]
65
+ XPATH
66
+ ))
68
67
  ret
69
68
  end
70
69
 
@@ -210,7 +209,7 @@ module IsoDoc
210
209
  page_break(out)
211
210
  out.div do |div|
212
211
  div.h1 **{ class: "Section3" } do |h1|
213
- f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
212
+ f.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
214
213
  end
215
214
  biblio_list(f, div, true)
216
215
  end
@@ -1,3 +1,5 @@
1
+ require "metanorma-utils"
2
+
1
3
  module IsoDoc
2
4
  module Function
3
5
  module Utils
@@ -18,24 +20,8 @@ module IsoDoc
18
20
  [1..count].each { out << tab }
19
21
  end
20
22
 
21
- # add namespaces for Word fragments
22
- NOKOHEAD = <<~HERE.freeze
23
- <!DOCTYPE html SYSTEM
24
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
25
- <html xmlns="http://www.w3.org/1999/xhtml">
26
- <head> <title></title> <meta charset="UTF-8" /> </head>
27
- <body> </body> </html>
28
- HERE
29
-
30
- # block for processing XML document fragments as XHTML,
31
- # to allow for HTMLentities
32
23
  def noko(&block)
33
- doc = ::Nokogiri::XML.parse(NOKOHEAD)
34
- fragment = doc.fragment("")
35
- ::Nokogiri::XML::Builder.with fragment, &block
36
- fragment.to_xml(encoding: "US-ASCII").lines.map do |l|
37
- l.gsub(/\s*\n/, "")
38
- end
24
+ Metanorma::Utils::noko_html(&block)
39
25
  end
40
26
 
41
27
  def attr_code(attributes)
@@ -44,7 +30,7 @@ module IsoDoc
44
30
  end
45
31
  end
46
32
 
47
- DOCTYPE_HDR = "<!DOCTYPE html SYSTEM "\
33
+ DOCTYPE_HDR = "<!DOCTYPE html SYSTEM " \
48
34
  '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'.freeze
49
35
 
50
36
  def to_xhtml(xml)
@@ -55,19 +41,13 @@ module IsoDoc
55
41
  File.open("#{@filename}.#{@format}.err", "w:UTF-8") do |f|
56
42
  f.write xml
57
43
  end
58
- abort "Malformed Output XML for #{@format}: #{e} "\
44
+ abort "Malformed Output XML for #{@format}: #{e} " \
59
45
  "(see #{@filename}.#{@format}.err)"
60
46
  end
61
47
  end
62
48
 
63
49
  def numeric_escapes(xml)
64
- c = HTMLEntities.new
65
- xml.split(/(&[^ \r\n\t#;]+;)/).map do |t|
66
- if /^(&[^ \t\r\n#;]+;)/.match?(t)
67
- c.encode(c.decode(t), :hexadecimal)
68
- else t
69
- end
70
- end.join
50
+ Metanorma::Utils::numeric_escapes(xml)
71
51
  end
72
52
 
73
53
  def to_xhtml_prep(xml)
@@ -77,8 +57,7 @@ module IsoDoc
77
57
  end
78
58
 
79
59
  def to_xhtml_fragment(xml)
80
- doc = ::Nokogiri::XML.parse(NOKOHEAD)
81
- doc.fragment(xml)
60
+ Metanorma::Utils::to_xhtml_fragment(xml)
82
61
  end
83
62
 
84
63
  def from_xhtml(xml)
@@ -87,11 +66,11 @@ module IsoDoc
87
66
  end
88
67
 
89
68
  CLAUSE_ANCESTOR =
90
- ".//ancestor::*[local-name() = 'annex' or "\
91
- "local-name() = 'definitions' or "\
92
- "local-name() = 'acknowledgements' or local-name() = 'term' or "\
93
- "local-name() = 'appendix' or local-name() = 'foreword' or "\
94
- "local-name() = 'introduction' or local-name() = 'terms' or "\
69
+ ".//ancestor::*[local-name() = 'annex' or " \
70
+ "local-name() = 'definitions' or " \
71
+ "local-name() = 'acknowledgements' or local-name() = 'term' or " \
72
+ "local-name() = 'appendix' or local-name() = 'foreword' or " \
73
+ "local-name() = 'introduction' or local-name() = 'terms' or " \
95
74
  "local-name() = 'clause' or local-name() = 'references']/@id".freeze
96
75
 
97
76
  def get_clause_id(node)
@@ -99,12 +78,12 @@ module IsoDoc
99
78
  end
100
79
 
101
80
  NOTE_CONTAINER_ANCESTOR =
102
- ".//ancestor::*[local-name() = 'annex' or "\
103
- "local-name() = 'foreword' or local-name() = 'appendix' or "\
104
- "local-name() = 'introduction' or local-name() = 'terms' or "\
105
- "local-name() = 'acknowledgements' or local-name() = 'term' or "\
106
- "local-name() = 'clause' or local-name() = 'references' or "\
107
- "local-name() = 'figure' or local-name() = 'formula' or "\
81
+ ".//ancestor::*[local-name() = 'annex' or " \
82
+ "local-name() = 'foreword' or local-name() = 'appendix' or " \
83
+ "local-name() = 'introduction' or local-name() = 'terms' or " \
84
+ "local-name() = 'acknowledgements' or local-name() = 'term' or " \
85
+ "local-name() = 'clause' or local-name() = 'references' or " \
86
+ "local-name() = 'figure' or local-name() = 'formula' or " \
108
87
  "local-name() = 'table' or local-name() = 'example']/@id".freeze
109
88
 
110
89
  # no recursion on references
@@ -121,7 +100,7 @@ module IsoDoc
121
100
 
122
101
  if array.length == 1 then array[0]
123
102
  else
124
- @i18n.l10n("#{array[0..-2].join(', ')} "\
103
+ @i18n.l10n("#{array[0..-2].join(', ')} " \
125
104
  "#{@i18n.and} #{array.last}",
126
105
  @lang, @script)
127
106
  end
@@ -197,7 +176,17 @@ module IsoDoc
197
176
  end
198
177
  end
199
178
 
179
+ def save_svg(img)
180
+ Tempfile.open(["image", ".svg"]) do |f|
181
+ f.write(img.to_xml)
182
+ @tempfile_cache << f # persist to the end
183
+ f.path
184
+ end
185
+ end
186
+
200
187
  def image_localfile(img)
188
+ img.name == "svg" && !img["src"] and
189
+ return save_svg(img)
201
190
  case img["src"]
202
191
  when /^data:/ then save_dataimage(img["src"], false)
203
192
  when %r{^([A-Z]:)?/} then img["src"]
@@ -206,7 +195,7 @@ module IsoDoc
206
195
  end
207
196
 
208
197
  def labelled_ancestor(node)
209
- !node.ancestors("example, requirement, recommendation, permission, "\
198
+ !node.ancestors("example, requirement, recommendation, permission, " \
210
199
  "note, table, figure, sourcecode").empty?
211
200
  end
212
201
 
@@ -1,5 +1,6 @@
1
1
  require "isodoc/html_function/mathvariant_to_plain"
2
2
  require_relative "postprocess_footnotes"
3
+ require_relative "postprocess_cover"
3
4
  require "metanorma-utils"
4
5
 
5
6
  module IsoDoc
@@ -11,16 +12,9 @@ module IsoDoc
11
12
  @files_to_delete.each { |f| FileUtils.rm_rf f }
12
13
  end
13
14
 
14
- def script_cdata(result)
15
- result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
16
- .gsub(%r{\]\]>\s*</script>}, "</script>")
17
- .gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
18
- .gsub(%r{</script>\s*\]\]>}, "</script>")
19
- end
20
-
21
15
  def toHTML(result, filename)
22
16
  result = from_xhtml(html_cleanup(to_xhtml(result)))
23
- result = from_xhtml(move_images(to_xhtml(result)))
17
+ result = from_xhtml(move_images(resize_images(to_xhtml(result))))
24
18
  result = html5(script_cdata(inject_script(result)))
25
19
  File.open(filename, "w:UTF-8") { |f| f.write(result) }
26
20
  end
@@ -56,132 +50,20 @@ module IsoDoc
56
50
  IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
57
51
  end
58
52
 
59
- def htmlstylesheet(file)
60
- return if file.nil?
61
-
62
- file.open if file.is_a?(Tempfile)
63
- stylesheet = file.read
64
- xml = Nokogiri::XML("<style/>")
65
- xml.children.first << Nokogiri::XML::Comment
66
- .new(xml, "\n#{stylesheet}\n")
67
- file.close
68
- file.unlink if file.is_a?(Tempfile)
69
- xml.root.to_s
70
- end
71
-
72
- def htmlstyle(docxml)
73
- return docxml unless @htmlstylesheet
74
-
75
- head = docxml.at("//*[local-name() = 'head']")
76
- head << htmlstylesheet(@htmlstylesheet)
77
- s = htmlstylesheet(@htmlstylesheet_override) and head << s
78
- @bare and
79
- head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
80
- docxml
81
- end
82
-
83
- def html_preface(docxml)
84
- html_cover(docxml) if @htmlcoverpage && !@bare
85
- html_intro(docxml) if @htmlintropage && !@bare
86
- docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
87
- docxml.at("//body") << sourcecode_highlighter
88
- html_main(docxml)
89
- authority_cleanup(docxml)
90
- docxml
91
- end
92
-
93
- def authority_cleanup1(docxml, klass)
94
- dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
95
- auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\
96
- "@class = 'boilerplate-#{klass}']")
97
- auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
98
- auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" }
99
- dest and auth and dest.replace(auth.remove)
100
- end
101
-
102
- def authority_cleanup(docxml)
103
- %w(copyright license legal feedback).each do |t|
104
- authority_cleanup1(docxml, t)
105
- end
106
- coverpage_note_cleanup(docxml)
107
- end
108
-
109
- def coverpage_note_cleanup(docxml)
110
- if dest = docxml.at("//div[@id = 'coverpage-note-destination']")
111
- auth = docxml.xpath("//*[@coverpage]")
112
- if auth.empty? then dest.remove
113
- else
114
- auth.each do |x|
115
- dest << x.remove
116
- end
117
- end
118
- end
119
- docxml.xpath("//*[@coverpage]").each { |x| x.delete("coverpage") }
120
- end
121
-
122
- def html_cover(docxml)
123
- doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
124
- d = docxml.at('//div[@class="title-section"]')
125
- d.children.first.add_previous_sibling(
126
- populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
127
- )
128
- end
129
-
130
- def html_intro(docxml)
131
- doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
132
- d = docxml.at('//div[@class="prefatory-section"]')
133
- d.children.first.add_previous_sibling(
134
- populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
135
- )
136
- end
137
-
138
- def html_toc_entry(level, header)
139
- content = header.at("./following-sibling::p"\
140
- "[@class = 'variant-title-toc']") || header
141
- %(<li class="#{level}"><a href="##{header['id']}">\
142
- #{header_strip(content)}</a></li>)
143
- end
144
-
145
- def toclevel_classes
146
- (1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
147
- end
148
-
149
- def toclevel
150
- ret = toclevel_classes.map do |l|
151
- "#{l}:not(:empty):not(.TermNum):not(.noTOC)"
152
- end
153
- <<~HEAD.freeze
154
- function toclevel() { return "#{ret.join(',')}";}
155
- HEAD
156
- end
157
-
158
- # needs to be same output as toclevel
159
- def html_toc(docxml)
160
- idx = docxml.at("//div[@id = 'toc']") or return docxml
161
- toc = "<ul>"
162
- path = toclevel_classes.map do |l|
163
- "//main//#{l}#{toc_exclude_class}"
164
- end
165
- docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
166
- h["id"] ||= "toc#{tocidx}"
167
- toc += html_toc_entry(h.name, h)
53
+ def resize_images(docxml)
54
+ docxml.xpath("//*[local-name() = 'img' or local-name() = 'svg']")
55
+ .each do |i|
56
+ i["width"], i["height"] = Html2Doc.new({})
57
+ .image_resize(i, image_localfile(i), @maxheight, @maxwidth)
168
58
  end
169
- idx.children = "#{toc}</ul>"
170
59
  docxml
171
60
  end
172
61
 
173
- def toc_exclude_class
174
- "[not(@class = 'TermNum')][not(@class = 'noTOC')]"\
175
- "[string-length(normalize-space(.))>0]"
176
- end
177
-
178
62
  # presupposes that the image source is local
179
63
  def move_images(docxml)
180
64
  FileUtils.rm_rf tmpimagedir
181
65
  FileUtils.mkdir tmpimagedir
182
66
  docxml.xpath("//*[local-name() = 'img']").each do |i|
183
- i["width"], i["height"] = Html2Doc.new({})
184
- .image_resize(i, image_localfile(i), @maxheight, @maxwidth)
185
67
  next if /^data:/.match? i["src"]
186
68
 
187
69
  @datauriimage ? datauri(i) : move_image1(i)
@@ -212,38 +94,6 @@ module IsoDoc
212
94
  img["src"] = File.join(rel_tmpimagedir, fname)
213
95
  end
214
96
 
215
- def inject_script(doc)
216
- return doc unless @scripts
217
-
218
- scripts = File.read(@scripts, encoding: "UTF-8")
219
- scripts_override = ""
220
- @scripts_override and
221
- scripts_override = File.read(@scripts_override, encoding: "UTF-8")
222
- a = doc.split(%r{</body>})
223
- "#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
224
- end
225
-
226
- def sourcecode_highlighter
227
- '<script src="https://cdn.rawgit.com/google/code-prettify/master/'\
228
- 'loader/run_prettify.js"></script>'
229
- end
230
-
231
- MATHJAX_ADDR =
232
- "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js".freeze
233
- MATHJAX = <<~"MATHJAX".freeze
234
- <script type="text/x-mathjax-config">
235
- MathJax.Hub.Config({
236
- "HTML-CSS": { preferredFont: "STIX" },
237
- asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
238
- });
239
- </script>
240
- <script src="#{MATHJAX_ADDR}?config=MML_HTMLorMML-full" async="async"></script>
241
- MATHJAX
242
-
243
- def mathjax(open, close)
244
- MATHJAX.gsub("OPEN", open).gsub("CLOSE", close)
245
- end
246
-
247
97
  def term_header(docxml)
248
98
  %w(h1 h2 h3 h4 h5 h6 h7 h8).each do |h|
249
99
  docxml.xpath("//p[@class = 'TermNum'][../#{h}]").each do |p|
@@ -0,0 +1,167 @@
1
+ require "isodoc/html_function/mathvariant_to_plain"
2
+ require_relative "postprocess_footnotes"
3
+ require "metanorma-utils"
4
+
5
+ module IsoDoc
6
+ module HtmlFunction
7
+ module Html
8
+ def script_cdata(result)
9
+ result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
10
+ .gsub(%r{\]\]>\s*</script>}, "</script>")
11
+ .gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
12
+ .gsub(%r{</script>\s*\]\]>}, "</script>")
13
+ end
14
+
15
+ def htmlstylesheet(file)
16
+ return if file.nil?
17
+
18
+ file.open if file.is_a?(Tempfile)
19
+ stylesheet = file.read
20
+ xml = Nokogiri::XML("<style/>")
21
+ xml.children.first << Nokogiri::XML::Comment
22
+ .new(xml, "\n#{stylesheet}\n")
23
+ file.close
24
+ file.unlink if file.is_a?(Tempfile)
25
+ xml.root.to_s
26
+ end
27
+
28
+ def htmlstyle(docxml)
29
+ return docxml unless @htmlstylesheet
30
+
31
+ head = docxml.at("//*[local-name() = 'head']")
32
+ head << htmlstylesheet(@htmlstylesheet)
33
+ s = htmlstylesheet(@htmlstylesheet_override) and head << s
34
+ @bare and
35
+ head << "<style>body {margin-left: 2em; margin-right: 2em;}</style>"
36
+ docxml
37
+ end
38
+
39
+ def html_preface(docxml)
40
+ html_cover(docxml) if @htmlcoverpage && !@bare
41
+ html_intro(docxml) if @htmlintropage && !@bare
42
+ docxml.at("//body") << mathjax(@openmathdelim, @closemathdelim)
43
+ docxml.at("//body") << sourcecode_highlighter
44
+ html_main(docxml)
45
+ authority_cleanup(docxml)
46
+ docxml
47
+ end
48
+
49
+ def authority_cleanup1(docxml, klass)
50
+ dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
51
+ auth = docxml.at("//div[@id = 'boilerplate-#{klass}' or "\
52
+ "@class = 'boilerplate-#{klass}']")
53
+ auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
54
+ auth&.xpath(".//h1 | .//h2")&.each { |h| h["class"] = "IntroTitle" }
55
+ dest and auth and dest.replace(auth.remove)
56
+ end
57
+
58
+ def authority_cleanup(docxml)
59
+ %w(copyright license legal feedback).each do |t|
60
+ authority_cleanup1(docxml, t)
61
+ end
62
+ coverpage_note_cleanup(docxml)
63
+ end
64
+
65
+ def coverpage_note_cleanup(docxml)
66
+ if dest = docxml.at("//div[@id = 'coverpage-note-destination']")
67
+ auth = docxml.xpath("//*[@coverpage]")
68
+ if auth.empty? then dest.remove
69
+ else
70
+ auth.each do |x|
71
+ dest << x.remove
72
+ end
73
+ end
74
+ end
75
+ docxml.xpath("//*[@coverpage]").each { |x| x.delete("coverpage") }
76
+ end
77
+
78
+ def html_cover(docxml)
79
+ doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
80
+ d = docxml.at('//div[@class="title-section"]')
81
+ d.children.first.add_previous_sibling(
82
+ populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
83
+ )
84
+ end
85
+
86
+ def html_intro(docxml)
87
+ doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
88
+ d = docxml.at('//div[@class="prefatory-section"]')
89
+ d.children.first.add_previous_sibling(
90
+ populate_template(doc.to_xml(encoding: "US-ASCII"), :html),
91
+ )
92
+ end
93
+
94
+ def html_toc_entry(level, header)
95
+ content = header.at("./following-sibling::p"\
96
+ "[@class = 'variant-title-toc']") || header
97
+ %(<li class="#{level}"><a href="##{header['id']}">\
98
+ #{header_strip(content)}</a></li>)
99
+ end
100
+
101
+ def toclevel_classes
102
+ (1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
103
+ end
104
+
105
+ def toclevel
106
+ ret = toclevel_classes.map do |l|
107
+ "#{l}:not(:empty):not(.TermNum):not(.noTOC)"
108
+ end
109
+ <<~HEAD.freeze
110
+ function toclevel() { return "#{ret.join(',')}";}
111
+ HEAD
112
+ end
113
+
114
+ # needs to be same output as toclevel
115
+ def html_toc(docxml)
116
+ idx = docxml.at("//div[@id = 'toc']") or return docxml
117
+ toc = "<ul>"
118
+ path = toclevel_classes.map do |l|
119
+ "//main//#{l}#{toc_exclude_class}"
120
+ end
121
+ docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
122
+ h["id"] ||= "toc#{tocidx}"
123
+ toc += html_toc_entry(h.name, h)
124
+ end
125
+ idx.children = "#{toc}</ul>"
126
+ docxml
127
+ end
128
+
129
+ def toc_exclude_class
130
+ "[not(@class = 'TermNum')][not(@class = 'noTOC')]"\
131
+ "[string-length(normalize-space(.))>0]"
132
+ end
133
+
134
+ def inject_script(doc)
135
+ return doc unless @scripts
136
+
137
+ scripts = File.read(@scripts, encoding: "UTF-8")
138
+ scripts_override = ""
139
+ @scripts_override and
140
+ scripts_override = File.read(@scripts_override, encoding: "UTF-8")
141
+ a = doc.split(%r{</body>})
142
+ "#{a[0]}#{scripts}#{scripts_override}</body>#{a[1]}"
143
+ end
144
+
145
+ def sourcecode_highlighter
146
+ '<script src="https://cdn.rawgit.com/google/code-prettify/master/'\
147
+ 'loader/run_prettify.js"></script>'
148
+ end
149
+
150
+ MATHJAX_ADDR =
151
+ "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js".freeze
152
+ MATHJAX = <<~"MATHJAX".freeze
153
+ <script type="text/x-mathjax-config">
154
+ MathJax.Hub.Config({
155
+ "HTML-CSS": { preferredFont: "STIX" },
156
+ asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
157
+ });
158
+ </script>
159
+ <script src="#{MATHJAX_ADDR}?config=MML_HTMLorMML-full" async="async"></script>
160
+ MATHJAX
161
+
162
+ def mathjax(open, close)
163
+ MATHJAX.gsub("OPEN", open).gsub("CLOSE", close)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -53,7 +53,13 @@ module IsoDoc
53
53
 
54
54
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
55
55
  prefix_name(elem, block_delim,
56
- l10n("#{lower2cap @i18n.figure} #{lbl}"), "name")
56
+ l10n("#{figure_label(elem)} #{lbl}"), "name")
57
+ end
58
+
59
+ def figure_label(elem)
60
+ klass = elem["class"] || "figure"
61
+ klasslbl = @i18n.get[klass] || klass
62
+ lower2cap klasslbl
57
63
  end
58
64
 
59
65
  def eps2svg(img)
@@ -102,6 +108,11 @@ module IsoDoc
102
108
 
103
109
  def svg_to_emf(node)
104
110
  uri = svg_to_emf_uri(node)
111
+ if node.elements&.first&.name == "svg" &&
112
+ (!node["height"] || node["height"] == "auto")
113
+ node["height"] = node.elements.first["height"]
114
+ node["width"] = node.elements.first["width"]
115
+ end
105
116
  ret = imgfile_suffix(uri, "emf")
106
117
  File.exist?(ret) and return ret
107
118
  inkscape_convert(uri, ret, '--export-type="emf"')
@@ -137,7 +148,7 @@ module IsoDoc
137
148
  end
138
149
 
139
150
  def svg_to_emf_uri_convert(node)
140
- if node&.elements&.first&.name == "svg"
151
+ if node.elements&.first&.name == "svg"
141
152
  a = Base64.strict_encode64(node.children.to_xml)
142
153
  "data:image/svg+xml;base64,#{a}"
143
154
  else node["src"]
@@ -212,9 +212,9 @@ module IsoDoc
212
212
  end
213
213
 
214
214
  def variant1(node)
215
- if (!node["lang"] || node["lang"] == @lang) &&
216
- (!node["script"] || node["script"] == @script)
217
- elsif found_matching_variant_sibling(node)
215
+ if !((!node["lang"] || node["lang"] == @lang) &&
216
+ (!node["script"] || node["script"] == @script)) &&
217
+ found_matching_variant_sibling(node)
218
218
  node["remove"] = "true"
219
219
  end
220
220
  end
@@ -101,14 +101,19 @@ module IsoDoc
101
101
  pref = nil
102
102
  term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i|
103
103
  if i.zero? then pref = p
104
- elsif merge_preferred_eligible?(pref, p)
105
- pref.at(ns("./expression/name")) <<
106
- l10n("; #{p.at(ns('./expression/name')).children.to_xml}")
107
- p.remove
104
+ else merge_second_preferred1(pref, p)
108
105
  end
109
106
  end
110
107
  end
111
108
 
109
+ def merge_second_preferred1(pref, second)
110
+ if merge_preferred_eligible?(pref, second)
111
+ n1 = pref.at(ns("./expression/name"))
112
+ n2 = second.remove.at(ns("./expression/name"))
113
+ n1.children = l10n("#{n1.children.to_xml}; #{n2.children.to_xml}")
114
+ end
115
+ end
116
+
112
117
  def merge_preferred_eligible?(first, second)
113
118
  firstex = first.at(ns("./expression")) || {}
114
119
  secondex = second.at(ns("./expression")) || {}
@@ -1,7 +1,8 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
- def prefix_container(container, linkend, _target)
4
- l10n("#{@xrefs.anchor(container, :xref)}, #{linkend}")
3
+ def prefix_container(container, linkend, node, _target)
4
+ # l10n("#{@xrefs.anchor(container, :xref)}, #{linkend}")
5
+ l10n("#{anchor_xref(node, container)}, #{linkend}")
5
6
  end
6
7
 
7
8
  def anchor_value(id)
@@ -24,13 +25,24 @@ module IsoDoc
24
25
  end
25
26
 
26
27
  def anchor_linkend1(node)
27
- linkend = @xrefs.anchor(node["target"], :xref)
28
+ linkend = anchor_xref(node, node["target"])
28
29
  container = @xrefs.anchor(node["target"], :container, false)
29
30
  prefix_container?(container, node) and
30
- linkend = prefix_container(container, linkend, node["target"])
31
+ linkend = prefix_container(container, linkend, node, node["target"])
31
32
  capitalise_xref(node, linkend, anchor_value(node["target"]))
32
33
  end
33
34
 
35
+ def anchor_xref(node, target)
36
+ x = @xrefs.anchor(target, :xref)
37
+ t = @xrefs.anchor(target, :title)
38
+ if node["style"] == "basic" && t then t
39
+ elsif node["style"] == "full" && t
40
+ l10n("#{x}, #{t}")
41
+ else
42
+ x
43
+ end
44
+ end
45
+
34
46
  def prefix_container?(container, node)
35
47
  type = @xrefs.anchor(node["target"], :type)
36
48
  container &&
@@ -55,7 +67,8 @@ module IsoDoc
55
67
  container = @xrefs.anchor(locs.first[:node]["target"], :container,
56
68
  false)
57
69
  prefix_container?(container, locs.first[:node]) and
58
- ret = prefix_container(container, ret, locs.first[:node]["target"])
70
+ ret = prefix_container(container, ret, locs.first[:node],
71
+ locs.first[:node]["target"])
59
72
  ret
60
73
  end
61
74
 
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.3.1".freeze
2
+ VERSION = "2.3.3".freeze
3
3
  end
@@ -38,6 +38,8 @@ module IsoDoc
38
38
  def image_parse(node, out, caption)
39
39
  if emf = node.at(ns("./emf"))
40
40
  node["src"] = emf["src"]
41
+ node["height"] ||= emf["height"]
42
+ node["width"] ||= emf["width"]
41
43
  node["mimetype"] = "image/x-emf"
42
44
  node.children.remove
43
45
  end
@@ -42,8 +42,7 @@ module IsoDoc
42
42
  .gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
43
43
  @wordstylesheet = wordstylesheet_update
44
44
  Html2Doc.new(
45
- filename: filename,
46
- imagedir: @localdir,
45
+ filename: filename, imagedir: @localdir,
47
46
  stylesheet: @wordstylesheet&.path,
48
47
  header_file: header&.path, dir: dir,
49
48
  asciimathdelims: [@openmathdelim, @closemathdelim],
@@ -110,8 +109,8 @@ module IsoDoc
110
109
  t.xpath(".//tr").each_with_index do |tr, r|
111
110
  tr.xpath("./td | ./th").each_with_index do |td, _i|
112
111
  x = 0
113
- rs = td&.attr("rowspan")&.to_i || 1
114
- cs = td&.attr("colspan")&.to_i || 1
112
+ rs = td.attr("rowspan")&.to_i || 1
113
+ cs = td.attr("colspan")&.to_i || 1
115
114
  while cells2d[r][x]
116
115
  x += 1
117
116
  end
@@ -20,22 +20,38 @@ module IsoDoc
20
20
  idx
21
21
  end
22
22
 
23
+ FIGURE_NO_CLASS = <<~XPATH.freeze
24
+ .//figure[not(@class)] | .//figure[@class = 'pseudocode'] | .//sourcecode[not(ancestor::example)]
25
+ XPATH
26
+
23
27
  def sequential_figure_names(clause)
24
28
  c = Counter.new
25
29
  j = 0
26
- clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
27
- .noblank.each do |t|
30
+ clause.xpath(ns(FIGURE_NO_CLASS)).noblank.each do |t|
28
31
  j = subfigure_increment(j, c, t)
29
- sequential_figure_body(j, c, t)
32
+ sequential_figure_body(j, c, t, "figure")
33
+ end
34
+ sequential_figure_class_names(clause)
35
+ end
36
+
37
+ def sequential_figure_class_names(clause)
38
+ c = {}
39
+ j = 0
40
+ clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
41
+ .each do |t|
42
+ c[t["class"]] ||= Counter.new
43
+ j = subfigure_increment(j, c[t["class"]], t)
44
+ sequential_figure_body(j, c[t["class"]], t, t["class"])
30
45
  end
31
46
  end
32
47
 
33
- def sequential_figure_body(subfignum, counter, block)
48
+ def sequential_figure_body(subfignum, counter, block, klass)
34
49
  label = counter.print
35
50
  label &&= label + (subfignum.zero? ? "" : "-#{subfignum}")
36
51
 
37
52
  @anchors[block["id"]] = anchor_struct(
38
- label, nil, @labels["figure"], "figure", block["unnumbered"]
53
+ label, nil, @labels[klass] || klass.capitalize, klass,
54
+ block["unnumbered"]
39
55
  )
40
56
  end
41
57
 
@@ -134,21 +150,32 @@ module IsoDoc
134
150
  def hierarchical_figure_names(clause, num)
135
151
  c = Counter.new
136
152
  j = 0
137
- clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
138
- .noblank.each do |t|
153
+ clause.xpath(ns(FIGURE_NO_CLASS)).noblank.each do |t|
139
154
  # next if labelled_ancestor(t) && t.ancestors("figure").empty?
140
-
141
155
  j = subfigure_increment(j, c, t)
142
- hierarchical_figure_body(num, j, c, t)
156
+ hierarchical_figure_body(num, j, c, t, "figure")
157
+ end
158
+ hierarchical_figure_class_names(clause, num)
159
+ end
160
+
161
+ def hierarchical_figure_class_names(clause, num)
162
+ c = {}
163
+ j = 0
164
+ clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
165
+ .noblank.each do |t|
166
+ c[t["class"]] ||= Counter.new
167
+ j = subfigure_increment(j, c[t["class"]], t)
168
+ hierarchical_figure_body(num, j, c[t["class"]], t, t["class"])
143
169
  end
144
170
  end
145
171
 
146
- def hierarchical_figure_body(num, subfignum, counter, block)
172
+ def hierarchical_figure_body(num, subfignum, counter, block, klass)
147
173
  label = "#{num}#{hiersep}#{counter.print}" +
148
174
  (subfignum.zero? ? "" : "#{hierfigsep}#{subfignum}")
149
175
 
150
- @anchors[block["id"]] = anchor_struct(label, nil, @labels["figure"],
151
- "figure", block["unnumbered"])
176
+ @anchors[block["id"]] =
177
+ anchor_struct(label, nil, @labels[klass] || klass.capitalize,
178
+ klass, block["unnumbered"])
152
179
  end
153
180
 
154
181
  def hierarchical_table_names(clause, num)
@@ -51,8 +51,13 @@ module IsoDoc
51
51
  bookmark_anchor_names(doc)
52
52
  end
53
53
 
54
- def preface_clause_name(clause)
55
- clause.at(ns("./title"))&.text || clause.name.capitalize
54
+ def clause_title(clause, use_elem_name: false)
55
+ ret = clause.at(ns("./title"))&.text
56
+ if use_elem_name && !ret
57
+ clause.name.capitalize
58
+ else
59
+ ret
60
+ end
56
61
  end
57
62
 
58
63
  SUBCLAUSES =
@@ -62,25 +67,30 @@ module IsoDoc
62
67
  def preface_names(clause)
63
68
  return if clause.nil?
64
69
 
65
- @anchors[clause["id"]] =
66
- { label: nil, level: 1, xref: preface_clause_name(clause),
67
- type: "clause", elem: @labels["clause"] }
70
+ preface_name_anchors(clause, 1,
71
+ clause_title(clause, use_elem_name: true))
68
72
  clause.xpath(ns(SUBCLAUSES)).each_with_index do |c, i|
69
73
  preface_names1(c, c.at(ns("./title"))&.text,
70
- "#{preface_clause_name(clause)}, #{i + 1}", 2)
74
+ "#{clause_title(clause)}, #{i + 1}", 2)
71
75
  end
72
76
  end
73
77
 
74
78
  def preface_names1(clause, title, parent_title, level)
75
79
  label = title || parent_title
76
- @anchors[clause["id"]] = { label: nil, level: level, xref: label,
77
- type: "clause", elem: @labels["clause"] }
80
+ preface_name_anchors(clause, level, title || parent_title)
78
81
  clause.xpath(ns(SUBCLAUSES)).each_with_index do |c, i|
79
82
  preface_names1(c, c.at(ns("./title"))&.text, "#{label} #{i + 1}",
80
83
  level + 1)
81
84
  end
82
85
  end
83
86
 
87
+ def preface_name_anchors(clause, level, title)
88
+ @anchors[clause["id"]] =
89
+ { label: nil, level: level,
90
+ xref: title, title: nil,
91
+ type: "clause", elem: @labels["clause"] }
92
+ end
93
+
84
94
  def middle_section_asset_names(doc)
85
95
  middle_sections = "//clause[@type = 'scope'] | "\
86
96
  "#{@klass.norm_ref_xpath} | "\
@@ -90,35 +100,38 @@ module IsoDoc
90
100
  end
91
101
 
92
102
  def clause_names(docxml, num)
93
- docxml.xpath(ns(@klass.middle_clause(docxml))).each_with_index do |c, _i|
103
+ docxml.xpath(ns(@klass.middle_clause(docxml)))
104
+ .each_with_index do |c, _i|
94
105
  section_names(c, num, 1)
95
106
  end
96
107
  end
97
108
 
98
109
  def section_names(clause, num, lvl)
99
- return num if clause.nil?
110
+ clause.nil? and return num
100
111
 
101
112
  num.increment(clause)
102
- @anchors[clause["id"]] =
103
- { label: num.print, xref: l10n("#{@labels['clause']} #{num.print}"),
104
- level: lvl, type: "clause", elem: @labels["clause"] }
105
- i = Counter.new
106
- clause.xpath(ns(SUBCLAUSES)).each do |c|
113
+ section_name_anchors(clause, num.print, lvl)
114
+ clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
107
115
  section_names1(c, "#{num.print}.#{i.increment(c).print}", lvl + 1)
108
116
  end
109
117
  num
110
118
  end
111
119
 
112
120
  def section_names1(clause, num, level)
113
- @anchors[clause["id"]] =
114
- { label: num, level: level, xref: l10n("#{@labels['clause']} #{num}"),
115
- type: "clause", elem: @labels["clause"] }
121
+ section_name_anchors(clause, num, level)
116
122
  i = Counter.new
117
123
  clause.xpath(ns(SUBCLAUSES)).each do |c|
118
124
  section_names1(c, "#{num}.#{i.increment(c).print}", level + 1)
119
125
  end
120
126
  end
121
127
 
128
+ def section_name_anchors(clause, num, level)
129
+ @anchors[clause["id"]] =
130
+ { label: num, xref: l10n("#{@labels['clause']} #{num}"),
131
+ title: clause_title(clause), level: level, type: "clause",
132
+ elem: @labels["clause"] }
133
+ end
134
+
122
135
  def annex_name_lbl(clause, num)
123
136
  obl = l10n("(#{@labels['inform_annex']})")
124
137
  clause["obligation"] == "normative" and
@@ -127,21 +140,23 @@ module IsoDoc
127
140
  l10n("<strong>#{title} #{num}</strong><br/>#{obl}")
128
141
  end
129
142
 
130
- def annex_name_anchors(clause, num)
131
- { label: annex_name_lbl(clause, num),
132
- elem: @labels["annex"], type: "clause",
133
- subtype: "annex", value: num.to_s, level: 1,
134
- xref: "#{@labels['annex']} #{num}" }
143
+ def annex_name_anchors(clause, num, level)
144
+ label = level == 1 ? annex_name_lbl(clause, num) : num
145
+ @anchors[clause["id"]] =
146
+ { label: label,
147
+ elem: @labels["annex"], type: "clause",
148
+ subtype: "annex", value: num.to_s, level: level,
149
+ title: clause_title(clause),
150
+ xref: "#{@labels['annex']} #{num}" }
135
151
  end
136
152
 
137
153
  def annex_names(clause, num)
138
- @anchors[clause["id"]] = annex_name_anchors(clause, num)
154
+ annex_name_anchors(clause, num, 1)
139
155
  if @klass.single_term_clause?(clause)
140
156
  annex_names1(clause.at(ns("./references | ./terms | ./definitions")),
141
157
  num.to_s, 1)
142
158
  else
143
- i = Counter.new
144
- clause.xpath(ns(SUBCLAUSES)).each do |c|
159
+ clause.xpath(ns(SUBCLAUSES)).each_with_object(Counter.new) do |c, i|
145
160
  annex_names1(c, "#{num}.#{i.increment(c).print}", 2)
146
161
  end
147
162
  end
@@ -149,9 +164,7 @@ module IsoDoc
149
164
  end
150
165
 
151
166
  def annex_names1(clause, num, level)
152
- @anchors[clause["id"]] = { xref: "#{@labels['annex']} #{num}",
153
- elem: @labels["annex"], type: "clause",
154
- label: num, level: level, subtype: "annex" }
167
+ annex_name_anchors(clause, num, level)
155
168
  i = Counter.new
156
169
  clause.xpath(ns(SUBCLAUSES)).each do |c|
157
170
  annex_names1(c, "#{num}.#{i.increment(c).print}", level + 1)
@@ -48,6 +48,7 @@ termnote: ملاحظة % للقيد
48
48
  list: قائمة
49
49
  deflist: قائمة تعريف
50
50
  figure: شكل
51
+ diagram: رسم بياني
51
52
  formula: معادلة
52
53
  inequality: عدم مساواة
53
54
  table: جدول
@@ -54,6 +54,7 @@ termnote: Hinweis % zum Eintrag
54
54
  list: Liste
55
55
  deflist: Definitionsliste
56
56
  figure: Abbildung
57
+ diagram: Diagramm
57
58
  formula: Formel
58
59
  inequality: Formel
59
60
  table: Tabelle
@@ -54,13 +54,14 @@ termnote: Note % to entry
54
54
  list: List
55
55
  deflist: Definition List
56
56
  figure: Figure
57
+ diagram: Diagram
57
58
  formula: Formula
58
59
  inequality: Formula
59
60
  table: Table
60
61
  requirement: Requirement
61
62
  recommendation: Recommendation
62
63
  permission: Permission
63
- # OGC
64
+ # Modspec
64
65
  recommendationtest: Recommendation test
65
66
  requirementtest: Requirement test
66
67
  permissiontest: Permission test
@@ -54,6 +54,7 @@ termnote: Nota % a la entrada
54
54
  list: Lista
55
55
  deflist: Lista de definiciones
56
56
  figure: Figura
57
+ diagram: Diagrama
57
58
  formula: Fórmula
58
59
  inequality: Fórmula
59
60
  table: Tabla
@@ -49,6 +49,7 @@ note: NOTE
49
49
  note_xref: Note
50
50
  termnote: Note % à l’article
51
51
  figure: Figure
52
+ diagram: Diagramme
52
53
  formula: Formule
53
54
  inequality: Formule
54
55
  list: Liste
@@ -59,6 +59,7 @@ termnote: Примечание % к определению
59
59
  list: Список
60
60
  deflist: Список определений
61
61
  figure: Рисунок
62
+ diagram: Диаграмма
62
63
  formula: Формула
63
64
  inequality: Формула
64
65
  table: Таблица
@@ -47,6 +47,7 @@ note: 注
47
47
  note_xref: 注
48
48
  termnote: 注%
49
49
  figure: 图
50
+ diagram: 图表
50
51
  formula: 公式
51
52
  inequality: 公式
52
53
  list: 列项
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.3.1
4
+ version: 2.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-26 00:00:00.000000000 Z
11
+ date: 2022-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciimath
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.4.1
33
+ version: 1.4.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.4.1
40
+ version: 1.4.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: htmlentities
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.4.3
103
+ version: 1.4.5
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.4.3
110
+ version: 1.4.5
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: mn2pdf
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.1.7
131
+ version: 0.2.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.1.7
138
+ version: 0.2.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: relaton-cli
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.5.0
159
+ version: 0.5.2
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.5.0
166
+ version: 0.5.2
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: roman-numerals
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -446,6 +446,7 @@ files:
446
446
  - lib/isodoc/html_function/html.rb
447
447
  - lib/isodoc/html_function/mathvariant_to_plain.rb
448
448
  - lib/isodoc/html_function/postprocess.rb
449
+ - lib/isodoc/html_function/postprocess_cover.rb
449
450
  - lib/isodoc/html_function/postprocess_footnotes.rb
450
451
  - lib/isodoc/i18n.rb
451
452
  - lib/isodoc/init.rb