isodoc 2.10.5 → 2.10.7

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: 82d1c3ed71a05f100f76c7e3ff42ec7fd4fe27c2a018bb312a2639f27d69e8b1
4
- data.tar.gz: b170bf5e893fb25d9506d34b7ee725c19cf7778270b724f3697a7ac56a487a98
3
+ metadata.gz: 8dfe3b646b2b65d551ff524de95c5960c5dc0d9e607a40b59948deb10832f659
4
+ data.tar.gz: 5230ba55bdba86b34080a412366c26e347f5284151d6099cee23446da6eddfd3
5
5
  SHA512:
6
- metadata.gz: ca60c3933004e3b6b5ebcf1864baf52ebe1702e31dbc2aebe7762451552c4efaad660cbe166a5d4e88e0c25fc431970aa4519e94864a9e54b8c548d65c724831
7
- data.tar.gz: b0b0375281dd5900fe8f328c61d4efb895b13e7965d645a1d551df1afa09144749056ea0e43424732208da5ec0e5a7f2209d685f5851cf9761d0e47662002abf
6
+ metadata.gz: 02e6090e1a7c726ff5024b62f42606aad5ec942e1d8ecd63d576b975d4103b6adfa0cb211d226902f4003e1ad4bec6a00a81ea92edb99c8f1626e6941db8b0fd
7
+ data.tar.gz: ffa9b8ee9be5501fd29cd638b1cde09287f2111a3d6d3a302484e92f2f0d5a035d3765f97d80207edd4119825ebd796f98bde1010eb072ecc16bada797bff310
data/isodoc.gemspec CHANGED
@@ -44,6 +44,7 @@ Gem::Specification.new do |spec|
44
44
  spec.add_dependency "twitter_cldr", ">= 6.6.0"
45
45
  spec.add_dependency "uuidtools"
46
46
 
47
+ spec.add_development_dependency "bigdecimal"
47
48
  spec.add_development_dependency "debug"
48
49
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
49
50
  spec.add_development_dependency "guard", "~> 2.14"
@@ -54,5 +55,6 @@ Gem::Specification.new do |spec|
54
55
  spec.add_development_dependency "sassc", "~> 2.4.0"
55
56
  spec.add_development_dependency "simplecov", "~> 0.15"
56
57
  spec.add_development_dependency "timecop", "~> 0.9"
58
+ spec.add_development_dependency "xml-c14n"
57
59
  # spec.metadata["rubygems_mfa_required"] = "true"
58
60
  end
data/lib/isodoc/css.rb CHANGED
@@ -90,16 +90,14 @@ module IsoDoc
90
90
 
91
91
  # stripwordcss if HTML stylesheet, !stripwordcss if DOC stylesheet
92
92
  def generate_css(filename, stripwordcss)
93
- return nil if filename.nil?
94
-
93
+ filename.nil? and return nil
95
94
  filename = precompiled_style_or_original(filename)
96
95
  stylesheet = File.read(filename, encoding: "UTF-8")
97
96
  stylesheet = populate_template(stylesheet, :word)
98
97
  stylesheet.gsub!(/(\s|\{)mso-[^:]+:[^;]+;/m, "\\1") if stripwordcss
99
98
  stylesheet.gsub!(/--/, "-DOUBLE_HYPHEN_ESCAPE-") unless stripwordcss
100
- if File.extname(filename) == ".scss"
99
+ File.extname(filename) == ".scss" and
101
100
  stylesheet = convert_scss(filename, stylesheet, stripwordcss)
102
- end
103
101
  Tempfile.open([File.basename(filename, ".*"), "css"],
104
102
  mode: File::BINARY | File::SHARE_DELETE,
105
103
  encoding: "utf-8") do |f|
@@ -161,8 +161,7 @@ module IsoDoc
161
161
  def quote_attribution(node, out)
162
162
  author = node.at(ns("./author"))
163
163
  source = node.at(ns("./source"))
164
- return if author.nil? && source.nil?
165
-
164
+ author.nil? && source.nil? and return
166
165
  out.p class: "QuoteAttribution" do |p|
167
166
  p << "&#x2014; #{author.text}" if author
168
167
  p << ", " if author && source
@@ -206,6 +205,18 @@ module IsoDoc
206
205
  end
207
206
  end
208
207
 
208
+ def cross_align_parse(node, out)
209
+ out.table do |t|
210
+ t.tbody do |b|
211
+ node.xpath(ns("./align-cell")).each do |c|
212
+ b.td do |td|
213
+ c.children.each { |n| parse(n, td) }
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+
209
220
  def columnbreak_parse(node, out); end
210
221
  end
211
222
  end
@@ -51,24 +51,31 @@ module IsoDoc
51
51
 
52
52
  # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
53
53
  def bibitem_ref_code(bib)
54
+ id, id1, id2, id3 = bibitem_ref_code_prep(bib)
55
+ id || id1 || id2 || id3 and return [id, id1, id2, id3]
56
+ bib["suppress_identifier"] == "true" and return [nil, nil, nil, nil]
57
+ [nil, no_identifier(bib), nil, nil]
58
+ end
59
+
60
+ def bibitem_ref_code_prep(bib)
54
61
  id = bib.at(ns("./docidentifier[@type = 'metanorma']"))
55
62
  id1 = pref_ref_code(bib)
56
63
  id2 = bib.at(ns("./docidentifier[#{SKIP_DOCID}]"))
57
64
  id3 = bib.at(ns("./docidentifier[@type = 'metanorma-ordinal']"))
58
- return [id, id1, id2, id3] if id || id1 || id2 || id3
59
- return [nil, nil, nil, nil] if bib["suppress_identifier"] == "true"
65
+ [id, id1, id2, id3]
66
+ end
60
67
 
68
+ def no_identifier(bib)
69
+ @i18n.no_identifier or return nil
61
70
  id = Nokogiri::XML::Node.new("docidentifier", bib.document)
62
- id << "(NO ID)"
63
- [nil, id, nil, nil]
71
+ id << @i18n.no_identifier
72
+ id
64
73
  end
65
74
 
66
75
  def bracket_if_num(num)
67
- return nil if num.nil?
68
-
76
+ num.nil? and return nil
69
77
  num = num.text.sub(/^\[/, "").sub(/\]$/, "")
70
- return "[#{num}]" if /^\d+$/.match?(num)
71
-
78
+ /^\d+$/.match?(num) and return "[#{num}]"
72
79
  num
73
80
  end
74
81
 
@@ -18,6 +18,14 @@ module IsoDoc
18
18
  end
19
19
  end
20
20
 
21
+ def freestanding_title(node, out)
22
+ parents = node.ancestors("clause, annex, terms, references, " \
23
+ "definitions, acknowledgements, introduction, " \
24
+ "foreword")
25
+ clause_parse_title(parents.empty? ? node : parents.first,
26
+ out, node, out)
27
+ end
28
+
21
29
  # used for subclauses
22
30
  def clause_parse_title(node, div, title, out, header_class = {})
23
31
  return if title.nil?
@@ -153,6 +153,12 @@ module IsoDoc
153
153
  @meta.get
154
154
  end
155
155
 
156
+ def cross_align(isoxml, out)
157
+ isoxml.xpath(ns("//cross-align")).each do |c|
158
+ parse(c, out)
159
+ end
160
+ end
161
+
156
162
  def boilerplate(node, out)
157
163
  @bare and return
158
164
  boilerplate = node.at(ns("//boilerplate")) or return
@@ -249,9 +255,11 @@ module IsoDoc
249
255
  when "option" then option_parse(node, out)
250
256
  when "textarea" then textarea_parse(node, out)
251
257
  when "toc" then toc_parse(node, out)
258
+ when "title" then freestanding_title(node, out) # not inside clause
252
259
  when "variant-title" then variant_title(node, out)
253
260
  when "span" then span_parse(node, out)
254
261
  when "location" then location_parse(node, out)
262
+ when "cross-align" then cross_align_parse(node, out)
255
263
  when "columnbreak" then columnbreak_parse(node, out)
256
264
  when "ruby" then ruby_parse(node, out)
257
265
  when "rt" then rt_parse(node, out)
@@ -213,10 +213,9 @@ module IsoDoc
213
213
  %w(example requirement recommendation permission
214
214
  note table figure sourcecode).freeze
215
215
 
216
- def labelled_ancestor(elem)
217
- #!elem.path.gsub(/\[\d+\]/, "").split(%r{/})[1..-1]
216
+ def labelled_ancestor(elem, exceptions = [])
218
217
  !elem.ancestors.map(&:name)
219
- .intersection(LABELLED_ANCESTOR_ELEMENTS).empty?
218
+ .intersection(LABELLED_ANCESTOR_ELEMENTS - exceptions).empty?
220
219
  end
221
220
 
222
221
  def emf?(type)
@@ -14,7 +14,7 @@ module IsoDoc
14
14
  end
15
15
 
16
16
  def initialize(lang, script, locale, i18n, fonts_options = {})
17
- @metadata = { lang: lang, script: script }
17
+ @metadata = { lang:, script: }
18
18
  DATETYPES.each { |w| @metadata["#{w.gsub('-', '_')}date".to_sym] = "XXX" }
19
19
  @lang = lang
20
20
  @script = script
@@ -29,10 +29,6 @@ module IsoDoc
29
29
  @metadata
30
30
  end
31
31
 
32
- def labels
33
- @labels
34
- end
35
-
36
32
  def set(key, value)
37
33
  @metadata[key] = value
38
34
  end
@@ -44,12 +40,12 @@ module IsoDoc
44
40
  end
45
41
 
46
42
  def doctype(isoxml, _out)
47
- b = isoxml&.at(ns("//bibdata/ext/doctype#{NOLANG}"))&.text || return
48
- set(:doctype, status_print(b))
49
- b1 = isoxml&.at(ns("//bibdata/ext/doctype#{currlang}"))&.text || b
50
- set(:doctype_display, status_print(b1))
51
- b = isoxml&.at(ns("//bibdata/ext/subdoctype#{NOLANG}"))&.text || return
52
- set(:subdoctype, status_print(b))
43
+ b = isoxml.at(ns("//bibdata/ext/doctype#{NOLANG}")) || return
44
+ set(:doctype, status_print(b.text))
45
+ b1 = isoxml.at(ns("//bibdata/ext/doctype#{currlang}")) || b
46
+ set(:doctype_display, status_print(b1.text))
47
+ b = isoxml.at(ns("//bibdata/ext/subdoctype#{NOLANG}")) || return
48
+ set(:subdoctype, status_print(b.text))
53
49
  end
54
50
 
55
51
  def docstatus(xml, _out)
@@ -59,11 +55,11 @@ module IsoDoc
59
55
  s1 = xml.at(ns("//bibdata/status/stage#{currlang}")) || s
60
56
  set(:stage, status_print(s.text))
61
57
  s1 and set(:stage_display, status_print(s1.text))
62
- (i = xml&.at(ns("//bibdata/status/substage#{NOLANG}"))&.text) and
58
+ (i = xml.at(ns("//bibdata/status/substage#{NOLANG}"))&.text) and
63
59
  set(:substage, i)
64
- (i1 = xml&.at(ns("//bibdata/status/substage#{currlang}"))&.text || i) and
60
+ (i1 = xml.at(ns("//bibdata/status/substage#{currlang}"))&.text || i) and
65
61
  set(:substage_display, i1)
66
- (i2 = xml&.at(ns("//bibdata/status/iteration"))&.text) and
62
+ (i2 = xml.at(ns("//bibdata/status/iteration"))&.text) and
67
63
  set(:iteration, i2)
68
64
  set(:unpublished, unpublished(s.text))
69
65
  unpublished(s.text) && set(:stageabbr, stage_abbr(s.text))
@@ -67,20 +67,15 @@ module IsoDoc
67
67
  publisher = []
68
68
  xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/" \
69
69
  "organization")).each do |org|
70
- name = extract_variant(org.at(ns("./name")))
71
- agency1 = org.at(ns("./abbreviation"))&.text || name
72
- publisher << name if name
70
+ name = org.at(ns("./name[@language = '#{@lang}']")) ||
71
+ org.at(ns("./name"))
72
+ agency1 = org.at(ns("./abbreviation"))&.text || name&.text
73
+ publisher << name.text if name
73
74
  agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
74
75
  end
75
76
  [agency, publisher]
76
77
  end
77
78
 
78
- def extract_variant(node)
79
- node.nil? and return node
80
- x = node.at(ns("./variant[@language = '#{@lang}']")) and node = x
81
- node.text
82
- end
83
-
84
79
  def agency(xml)
85
80
  agency, publisher = agency1(xml)
86
81
  set(:agency, agency.sub(%r{/$}, ""))
@@ -38,9 +38,9 @@ module IsoDoc
38
38
  ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
39
39
  node))
40
40
  node.delete("droploc") unless droploc
41
- eref_localities1({ target: target, number: "pl",
41
+ eref_localities1({ target:, number: "pl",
42
42
  type: refs.first.at(ns("./locality/@type")).text,
43
- from: l10n(ret[1..-1].join), node: node, lang: @lang })
43
+ from: l10n(ret[1..-1].join), node:, lang: @lang })
44
44
  end
45
45
 
46
46
  def can_conflate_eref_rendering?(refs)
@@ -143,9 +143,9 @@ module IsoDoc
143
143
  def eref_localities0(ref, _idx, target, node)
144
144
  if ref["type"] == "whole" then @i18n.wholeoftext
145
145
  else
146
- eref_localities1({ target: target, type: ref["type"], number: "sg",
146
+ eref_localities1({ target:, type: ref["type"], number: "sg",
147
147
  from: ref.at(ns("./referenceFrom"))&.text,
148
- upto: ref.at(ns("./referenceTo"))&.text, node: node,
148
+ upto: ref.at(ns("./referenceTo"))&.text, node:,
149
149
  lang: @lang })
150
150
  end
151
151
  end
@@ -38,23 +38,26 @@ module IsoDoc
38
38
 
39
39
  svg = Base64.strict_decode64(elem["src"]
40
40
  .sub(%r{^data:image/svg\+xml;(charset=[^;]+;)?base64,}, ""))
41
- x = Nokogiri::XML.fragment(svg.sub(/<\?xml[^>]*>/, "")) do |config|
42
- config.huge
43
- end
41
+ x = Nokogiri::XML.fragment(svg.sub(/<\?xml[^>]*>/, ""), &:huge)
44
42
  elem["src"] = ""
45
43
  elem.children = x
46
44
  end
47
45
 
48
46
  def figure1(elem)
49
- return sourcecode1(elem) if elem["class"] == "pseudocode" ||
50
- elem["type"] == "pseudocode"
51
- return if elem.at(ns("./figure")) && !elem.at(ns("./name"))
52
-
47
+ elem["class"] == "pseudocode" || elem["type"] == "pseudocode" and
48
+ return sourcecode1(elem)
49
+ figure_label?(elem) or return nil
53
50
  lbl = @xrefs.anchor(elem["id"], :label, false) or return
51
+ # no xref, no label: this can be set in xref
54
52
  prefix_name(elem, block_delim,
55
53
  l10n("#{figure_label(elem)} #{lbl}"), "name")
56
54
  end
57
55
 
56
+ def figure_label?(elem)
57
+ elem.at(ns("./figure")) && !elem.at(ns("./name")) and return false
58
+ true
59
+ end
60
+
58
61
  def figure_label(elem)
59
62
  klass = elem["class"] || "figure"
60
63
  klasslbl = @i18n.get[klass] || klass
@@ -64,6 +64,7 @@ module IsoDoc
64
64
  get_linkend(node)
65
65
  end
66
66
 
67
+ # there should be no //variant in bibdata now
67
68
  def variant(xml)
68
69
  b = xml.xpath(ns("//bibdata//variant"))
69
70
  (xml.xpath(ns("//variant")) - b).each { |f| variant1(f) }
@@ -28,8 +28,8 @@ module IsoDoc
28
28
  else implicit_number_formatter(x, locale)
29
29
  end
30
30
  rescue ArgumentError
31
- rescue Error => e
32
- warn "Failure to localised MathML/mn\n#{node.parent.to_xml}\n#{e}"
31
+ rescue StandardError, RuntimeError => e
32
+ warn "Failure to localise MathML/mn\n#{node.parent.to_xml}\n#{e}"
33
33
  end
34
34
  end
35
35
 
@@ -40,10 +40,8 @@ module IsoDoc
40
40
  end
41
41
 
42
42
  def implicit_number_formatter(num, locale)
43
- fmt = { digit_count: num_totaldigits(num.text) }.compact
43
+ fmt = { significant: num_totaldigits(num.text) }.compact
44
44
  n = normalise_number(num.text)
45
- # Plurimath confused by exponent notation
46
- #warn "IMPLICIT: precision: #{num_precision(num.text)} ; symbols: #{fmt}, n: #{n}; output: #{@numfmt.localized_number(n, locale:, format: fmt, precision: num_precision(num.text))}"
47
45
  @numfmt.localized_number(n, locale:, format: fmt,
48
46
  precision: num_precision(num.text))
49
47
  end
@@ -57,7 +55,8 @@ module IsoDoc
57
55
  end
58
56
 
59
57
  def numberformat_type(ret)
60
- %i(precision digit_count group_digits fraction_group_digits).each do |i|
58
+ %i(precision significant digit_count group_digits fraction_group_digits)
59
+ .each do |i|
61
60
  ret[i] &&= ret[i].to_i
62
61
  end
63
62
  %i(notation exponent_sign locale).each do |i|
@@ -69,20 +68,20 @@ module IsoDoc
69
68
  def explicit_number_formatter(num, locale, options)
70
69
  ret = numberformat_type(numberformat_extract(options))
71
70
  l = ret[:locale] || locale
72
- precision, symbols, digit_count = explicit_number_formatter_cfg(num, ret)
71
+ precision, symbols, significant = explicit_number_formatter_cfg(num, ret)
73
72
  n = normalise_number(num.text)
74
- # Plurimath confused by exponent notation
75
- #warn "EXPLICIT: precision: #{precision} ; symbols: #{symbols}, n: #{n}; output: #{Plurimath::NumberFormatter.new(l, localizer_symbols: symbols).localized_number(n, precision:, format: symbols.merge(digit_count:))}"
76
- Plurimath::NumberFormatter.new(l, localizer_symbols: symbols)
73
+ Plurimath::NumberFormatter.new(l)
77
74
  .localized_number(n, precision:,
78
- format: symbols.merge(digit_count:))
75
+ format: symbols.merge(significant:))
79
76
  end
80
77
 
81
78
  def explicit_number_formatter_cfg(num, fmt)
82
79
  symbols = twitter_cldr_localiser_symbols.dup.merge(fmt)
83
- precision = symbols[:precision]&.to_i || num_precision(num.text)
84
- symbols[:precision] or digit_count = num_totaldigits(num.text)
85
- [precision, symbols, digit_count]
80
+ precision = symbols[:precision] || num_precision(num.text)
81
+ signif = symbols[:significant]
82
+ (symbols.keys & %i(precision digit_count)).empty? and
83
+ signif ||= num_totaldigits(num.text)
84
+ [precision, symbols, signif]
86
85
  end
87
86
 
88
87
  def num_precision(num)
@@ -96,8 +95,8 @@ module IsoDoc
96
95
  def num_totaldigits(num)
97
96
  totaldigits = nil
98
97
  /\.(?=\d+e)/.match?(num) and
99
- totaldigits = twitter_cldr_localiser_symbols[:digit_count] ||
100
- num.sub(/^.*\./, "").sub(/e.*$/, "").size
98
+ totaldigits = twitter_cldr_localiser_symbols[:significant] ||
99
+ num.sub(/^0\./, ".").sub(/^.*\./, "").sub(/e.*$/, "").size
101
100
  totaldigits
102
101
  end
103
102
 
@@ -109,6 +108,7 @@ module IsoDoc
109
108
  @suppressasciimathdup || node.parent.at(ns("./asciimath")) and return
110
109
  math = node.to_xml.gsub(/ xmlns=["'][^"']+["']/, "")
111
110
  .gsub(%r{<[^:/>]+:}, "<").gsub(%r{</[^:/>]+:}, "</")
111
+ .gsub(%r{ data-metanorma-numberformat="[^"]+"}, "")
112
112
  ret = Plurimath::Math.parse(math, "mathml").to_asciimath
113
113
  node.next = "<asciimath>#{@c.encode(ret, :basic)}</asciimath>"
114
114
  rescue StandardError => e
@@ -116,7 +116,8 @@ module IsoDoc
116
116
  end
117
117
 
118
118
  def maths_just_numeral(node)
119
- mn = node.at(".//m:mn", MATHML).children
119
+ mn = node.at(".//m:mn", MATHML).children.text
120
+ .sub(/\^([0-9+-]+)$/, "<sup>\\1</sup>")
120
121
  if node.parent.name == "stem"
121
122
  node.parent.replace(mn)
122
123
  else
@@ -142,11 +143,24 @@ module IsoDoc
142
143
  OUTPUT
143
144
  end
144
145
 
146
+ # convert any Ascii superscripts to correct(ish) MathML
147
+ # Not bothering to match times, base of 1.0 x 10^-20, just ^-20
148
+ def mn_to_msup(node)
149
+ node.xpath(".//m:mn", MATHML).each do |n|
150
+ m = %r{^(.+)\^([0-9+-]+)$}.match(n.text) or next
151
+ n.replace("<msup><mn>#{m[1]}</mn><mn>#{m[2]}</mn></msup>")
152
+ end
153
+ end
154
+
145
155
  def mathml_number(node, locale)
146
156
  justnumeral = numeric_mathml?(node)
147
157
  justnumeral or asciimath_dup(node)
148
158
  localize_maths(node, locale)
149
- justnumeral and maths_just_numeral(node)
159
+ if justnumeral
160
+ maths_just_numeral(node)
161
+ else
162
+ mn_to_msup(node)
163
+ end
150
164
  end
151
165
 
152
166
  def numeric_mathml?(node)
@@ -22,7 +22,7 @@ module IsoDoc
22
22
  end
23
23
 
24
24
  def save_attachment(attachment, dir)
25
- n = File.join(dir, attachment["name"])
25
+ n = File.join(dir, File.basename(attachment["name"]))
26
26
  c = attachment.text.sub(%r{^data:[^;]+;(?:charset=[^;]+;)?base64,}, "")
27
27
  File.open(n, "wb") { |f| f.write(Base64.strict_decode64(c)) }
28
28
  end
@@ -13,15 +13,21 @@ module IsoDoc
13
13
 
14
14
  def move_norm_ref_to_sections(docxml)
15
15
  docxml.at(ns(@xrefs.klass.norm_ref_xpath)) or return
16
- s = docxml.at(ns("//sections")) ||
17
- docxml.at(ns("//preface"))&.after("<sections/>")&.next_element ||
18
- docxml.at(ns("//annex | //bibliography"))&.before("<sections/>")
19
- &.previous_element or return
16
+ s = move_norm_ref_to_sections_insert_pt(docxml) or return
20
17
  docxml.xpath(ns(@xrefs.klass.norm_ref_xpath)).each do |r|
18
+ r.at("./ancestor::xmlns:bibliography") or next
21
19
  s << r.remove
22
20
  end
23
21
  end
24
22
 
23
+ def move_norm_ref_to_sections_insert_pt(docxml)
24
+ s = docxml.at(ns("//sections")) and return s
25
+ s = docxml.at(ns("//preface")) and
26
+ return s.after("<sections/>").next_element
27
+ docxml.at(ns("//annex | //bibliography"))&.before("<sections/>")
28
+ &.previous_element
29
+ end
30
+
25
31
  def hidden_items(docxml)
26
32
  docxml.xpath(ns("//references[bibitem/@hidden = 'true']")).each do |x|
27
33
  x.at(ns("./bibitem[not(@hidden = 'true')]")) and next
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.10.5".freeze
2
+ VERSION = "2.10.7".freeze
3
3
  end
@@ -137,15 +137,16 @@ module IsoDoc
137
137
  c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
138
138
  list.xpath(ns("./li")).each do |li|
139
139
  bare_label, label =
140
- list_item_value(li, c, depth, { list_anchor: list_anchor, prev_label: prev_label,
140
+ list_item_value(li, c, depth, { list_anchor:, prev_label:,
141
141
  refer_list: depth == 1 ? refer_list : nil })
142
142
  li["id"] and @anchors[li["id"]] =
143
143
  { label: bare_label, bare_xref: "#{label})",
144
144
  xref: "#{label})",
145
- type: "listitem", refer_list: refer_list,
145
+ type: "listitem", refer_list:,
146
146
  container: list_anchor[:container] }
147
147
  (li.xpath(ns(".//ol")) - li.xpath(ns(".//ol//ol"))).each do |ol|
148
- list_item_anchor_names(ol, list_anchor, depth + 1, label, refer_list)
148
+ list_item_anchor_names(ol, list_anchor, depth + 1, label,
149
+ refer_list)
149
150
  end
150
151
  end
151
152
  end
@@ -227,7 +228,7 @@ module IsoDoc
227
228
  def bookmark_anchor_names(xml)
228
229
  xml.xpath(ns(".//bookmark")).noblank.each do |n|
229
230
  _parent, id = id_ancestor(n)
230
- #container = bookmark_container(parent)
231
+ # container = bookmark_container(parent)
231
232
  @anchors[n["id"]] = { type: "bookmark", label: nil, value: nil,
232
233
  xref: @anchors.dig(id, :xref) || "???",
233
234
  container: @anchors.dig(id, :container) }
@@ -28,10 +28,11 @@ module IsoDoc
28
28
  c = Counter.new
29
29
  j = 0
30
30
  clause.xpath(ns(self.class::FIGURE_NO_CLASS)).noblank.each do |t|
31
+ # labelled_ancestor(t, %w(figure)) and next # disable nested figure labelling
31
32
  j = subfigure_increment(j, c, t)
32
- sequential_figure_body(j, c, t, "figure", container: container)
33
+ sequential_figure_body(j, c, t, "figure", container:)
33
34
  end
34
- sequential_figure_class_names(clause, container: container)
35
+ sequential_figure_class_names(clause, container:)
35
36
  end
36
37
 
37
38
  def sequential_figure_class_names(clause, container: false)
@@ -40,15 +41,16 @@ module IsoDoc
40
41
  clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
41
42
  .each do |t|
42
43
  c[t["class"]] ||= Counter.new
44
+ # labelled_ancestor(t, %w(figure)) and next
43
45
  j = subfigure_increment(j, c[t["class"]], t)
44
46
  sequential_figure_body(j, c[t["class"]], t, t["class"],
45
- container: container)
47
+ container:)
46
48
  end
47
49
  end
48
50
 
49
51
  def subfigure_label(subfignum)
50
52
  subfignum.zero? and return ""
51
- "-#{subfignum}"
53
+ "#{hierfigsep}#{subfignum}"
52
54
  end
53
55
 
54
56
  def sequential_figure_body(subfig, counter, elem, klass, container: false)
@@ -100,8 +102,8 @@ module IsoDoc
100
102
  klass, label = reqt2class_label(t, m)
101
103
  id = c.increment(label, t).print
102
104
  sequential_permission_body(id, t, label, klass, m,
103
- container: container)
104
- sequential_permission_children(t, id, container: container)
105
+ container:)
106
+ sequential_permission_children(t, id, container:)
105
107
  end
106
108
  end
107
109
 
@@ -112,12 +114,13 @@ module IsoDoc
112
114
  klass, label = reqt2class_nested_label(t, m)
113
115
  id = "#{lbl}#{hierfigsep}#{c.increment(label, t).print}"
114
116
  sequential_permission_body(id, t, label, klass, m,
115
- container: container)
116
- sequential_permission_children(t, id, container: container)
117
+ container:)
118
+ sequential_permission_children(t, id, container:)
117
119
  end
118
120
  end
119
121
 
120
- def sequential_permission_body(id, elem, label, klass, model, container: false)
122
+ def sequential_permission_body(id, elem, label, klass, model,
123
+ container: false)
121
124
  @anchors[elem["id"]] = model.postprocess_anchor_struct(
122
125
  elem, anchor_struct(id, elem,
123
126
  label, klass, elem["unnumbered"])
@@ -146,17 +149,17 @@ module IsoDoc
146
149
 
147
150
  # container makes numbering be prefixed with the parent clause reference
148
151
  def sequential_asset_names(clause, container: false)
149
- sequential_table_names(clause, container: container)
150
- sequential_figure_names(clause, container: container)
151
- sequential_formula_names(clause, container: container)
152
- sequential_permission_names(clause, container: container)
152
+ sequential_table_names(clause, container:)
153
+ sequential_figure_names(clause, container:)
154
+ sequential_formula_names(clause, container:)
155
+ sequential_permission_names(clause, container:)
153
156
  end
154
157
 
155
158
  def hierarchical_figure_names(clause, num)
156
159
  c = Counter.new
157
160
  j = 0
158
161
  clause.xpath(ns(self.class::FIGURE_NO_CLASS)).noblank.each do |t|
159
- # next if labelled_ancestor(t) && t.ancestors("figure").empty?
162
+ # labelled_ancestor(t, %w(figure)) and next
160
163
  j = subfigure_increment(j, c, t)
161
164
  hierarchical_figure_body(num, j, c, t, "figure")
162
165
  end
@@ -168,6 +171,7 @@ module IsoDoc
168
171
  j = 0
169
172
  clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
170
173
  .noblank.each do |t|
174
+ # labelled_ancestor(t, %w(figure)) and next
171
175
  c[t["class"]] ||= Counter.new
172
176
  j = subfigure_increment(j, c[t["class"]], t)
173
177
  hierarchical_figure_body(num, j, c[t["class"]], t, t["class"])
@@ -19,7 +19,8 @@ module IsoDoc
19
19
 
20
20
  SECTIONS_XPATH =
21
21
  "//foreword | //introduction | //acknowledgements | " \
22
- "//preface/terms | preface/definitions | preface/references | " \
22
+ "//preface/abstract | " \
23
+ "//preface/terms | //preface/definitions | //preface/references | " \
23
24
  "//preface/clause | //sections/terms | //annex | " \
24
25
  "//sections/clause | //sections/definitions | " \
25
26
  "//bibliography/references | //bibliography/clause".freeze
@@ -34,8 +35,8 @@ module IsoDoc
34
35
  "./xmlns:X".gsub("X", asset)
35
36
  end
36
37
 
37
- CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | " \
38
- "./references".freeze
38
+ CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | " \
39
+ "./references".freeze
39
40
  end
40
41
  end
41
42
  end
@@ -75,6 +75,7 @@ modified: معدلة
75
75
  adapted: تكيف
76
76
  deprecated: مهمل
77
77
  source: مصدر
78
+ no_identifier: (لا يوجد معرف)
78
79
  and: و
79
80
  all_parts: كل الأجزاء
80
81
  edition_ordinal: "ﺎﻠﻄﺒﻋﺓ؜ {{ var1 | ordinal_word: 'edition', '' }}"
@@ -88,6 +88,7 @@ adapted: angepasst
88
88
  deprecated: VERALTET
89
89
  source: QUELLE
90
90
  and: und
91
+ no_identifier: (KEIN KENNUNG)
91
92
  all_parts: Alle Teile
92
93
  edition_ordinal: "{{ var1 | ordinal_word: 'edition', '' }} Auflage"
93
94
  edition: Auflage
@@ -68,6 +68,7 @@ requirement: Requirement
68
68
  recommendation: Recommendation
69
69
  permission: Permission
70
70
  box: Box
71
+ no_identifier: (NO ID)
71
72
  # Modspec
72
73
  recommendationtest: Recommendation test
73
74
  requirementtest: Requirement test
@@ -86,6 +86,7 @@ adapted: adaptado
86
86
  deprecated: OBSOLETO
87
87
  source: FUENTE
88
88
  and: y
89
+ no_identifier: (SIN IDENTIFICADOR)
89
90
  all_parts: Todas las partes
90
91
  edition_ordinal: "{{ var1 | ordinal_word: 'edition', '' }} edición"
91
92
  edition: edición
@@ -85,6 +85,7 @@ source: SOURCE
85
85
  edition: édition
86
86
  version: version
87
87
  and: et
88
+ no_identifier: (PAS D'IDENTIFIANT)
88
89
  all_parts: toutes les parties
89
90
  edition_ordinal: "{{ var1 | ordinal_word: 'edition', '' }} édition"
90
91
  edition: édition
@@ -52,28 +52,28 @@ note: 注記
52
52
  note_xref: 注記
53
53
  termnote: 注釈%
54
54
  list: リスト
55
- deflist: Definition List
55
+ deflist: 定義リスト
56
56
  figure: 図
57
57
  diagram: Diagram
58
58
  formula: 式
59
- inequality: Formula
59
+ inequality:
60
60
  table: 表
61
- requirement: 要求事項
62
- recommendation: 推奨事項
63
- permission: 許容事項
61
+ requirement: 要求
62
+ recommendation: 推奨
63
+ permission: 許可
64
64
  box: Box
65
65
  index: 索引
66
66
  standard_no: 規格番号
67
67
  number: 番号
68
68
  # Modspec
69
- recommendationtest: Recommendation test
70
- requirementtest: Requirement test
71
- permissiontest: Permission test
72
- recommendationclass: Recommendations class
73
- requirementclass: Requirements class
74
- permissionclass: Permissions class
75
- abstracttest: Abstract test
76
- conformanceclass: Conformance class
69
+ recommendationtest: 推奨テスト
70
+ requirementtest: 要件テスト
71
+ permissiontest: 許可テスト
72
+ recommendationclass: 推奨群
73
+ requirementclass: 要件群
74
+ permissionclass: 許可群
75
+ abstracttest: 抽象テスト
76
+ conformanceclass: 適合性テスト群
77
77
  key: 記号説明
78
78
  example: 例
79
79
  example_xref: 例
@@ -88,6 +88,7 @@ adapted: 適合しました
88
88
  deprecated: 推奨しない用語
89
89
  source: 出典
90
90
  and: and
91
+ no_identifier: (識別子なし)
91
92
  all_parts: 規格群
92
93
  edition_ordinal: "第{{ var1 }}版"
93
94
  edition: 版
@@ -109,12 +110,12 @@ month_november: November
109
110
  month_december: December
110
111
  obligation: Obligation
111
112
  admonition: {
112
- danger: Danger,
113
+ danger: 危険です,
113
114
  warning: 警告,
114
- caution: Caution,
115
- important: Important,
116
- safety precautions: Safety Precautions,
117
- editorial: Editorial Note
115
+ caution: 注意,
116
+ important: 重要,
117
+ safety precautions: 安全上の注意,
118
+ editorial: 編集者注
118
119
  }
119
120
  locality: {
120
121
  section: Section,
@@ -153,6 +153,7 @@ adapted: адаптированный
153
153
  deprecated: НЕ РЕКОМЕНДУЕТСЯ
154
154
  source: ИСТОЧНИК
155
155
  and: и
156
+ no_identifier: (БЕЗ ИДЕНТИФИКАТОРА)
156
157
  all_parts: Все части
157
158
  edition_ordinal: "{{ var1 | ordinal_word: 'edition', '' }} издание"
158
159
  edition: издание
@@ -77,6 +77,7 @@ adapted: 改编
77
77
  deprecated: 被取代
78
78
  source: 定义
79
79
  and: 和
80
+ no_identifier: (无标识符)
80
81
  all_parts: 所有部分
81
82
  edition_ordinal: "第{{ var1 | ordinal_word: '', '' }}版"
82
83
  edition: 版
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.10.5
4
+ version: 2.10.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-08 00:00:00.000000000 Z
11
+ date: 2024-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: bigdecimal
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: debug
169
183
  requirement: !ruby/object:Gem::Requirement
@@ -304,6 +318,20 @@ dependencies:
304
318
  - - "~>"
305
319
  - !ruby/object:Gem::Version
306
320
  version: '0.9'
321
+ - !ruby/object:Gem::Dependency
322
+ name: xml-c14n
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
307
335
  description: |
308
336
  isodoc converts documents in the IsoDoc document model into
309
337
  Microsoft Word and HTML.