isodoc 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cf4eea4c89d6c8b67907883ac59beb80f11c58ce6a8646b98c78498ab716e09
4
- data.tar.gz: 4645c6421411b736ec194cbf307de7d3285662f708e871356ce355e0fe53f716
3
+ metadata.gz: a8e11539f17ee97d00f3b2f4470b384f1caf06cb5d72b11fc408b731f071e55b
4
+ data.tar.gz: 9f45bc01cc6aa695152e0f237f281bad777eb745836c4f08880467781c722942
5
5
  SHA512:
6
- metadata.gz: eeaa4541fc33975c131cfeb8781319ec97bc952f8bae99ef2f8699e9270a9e8894fef1dcb6f0948fffadac00405d05082ec7c6b03209057ee15986971e26f86f
7
- data.tar.gz: 94788ad30cba5e36df220f2f080c81896d887a774405b5c3a0abc254bda6f70927fccde3a7fbf377b09d6e09331bb5f7a9a095c63599693d637234f4a38a2681
6
+ metadata.gz: 0174b0cb445a70b50ccaeda366c6d843a924fa481a047eb04c6c65c127b42cf789e274270fb4a6573f10040d0830ea7370081bcf0df366055baddaf7c3d991d0
7
+ data.tar.gz: cc9cd1214a0ce46d3cc8bd34646f9c2d629c9e1ce6116e2a03fd19dbca5e1f0c07ba1e20b67a1e5b713e6bbaaf4fbe00ccaa69ed580000b161f5cacaf4158d86
data/isodoc.gemspec CHANGED
@@ -28,12 +28,12 @@ Gem::Specification.new do |spec|
28
28
  end
29
29
  spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
30
30
 
31
- spec.add_dependency "html2doc", "~> 1.7.0"
31
+ spec.add_dependency "html2doc", "~> 1.7.1"
32
32
  spec.add_dependency "htmlentities", "~> 4.3.4"
33
33
  # spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
34
34
  spec.add_dependency "emf2svg"
35
35
  spec.add_dependency "liquid", "~> 5"
36
- spec.add_dependency "relaton-cli"
36
+ #spec.add_dependency "relaton-cli"
37
37
  # spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
38
38
  spec.add_dependency "mn2pdf"
39
39
  spec.add_dependency "mn-requirements", "~> 0.3.4"
@@ -110,7 +110,8 @@ module IsoDoc
110
110
  end
111
111
 
112
112
  def preprocess_xslt(docxml)
113
- extract_preprocess_xslt(docxml).each do |x|
113
+ sheets = extract_preprocess_xslt(docxml)
114
+ sheets.each do |x|
114
115
  docxml = Nokogiri::XSLT(x).transform(docxml)
115
116
  end
116
117
  docxml
@@ -131,8 +132,9 @@ module IsoDoc
131
132
  convert_i18n_init1(docxml)
132
133
  i18n_init(@lang, @script, @locale)
133
134
  @reqt_models = requirements_processor
134
- .new({ default: "default", lang: @lang, script: @script, locale: @locale,
135
- labels: @i18n.get, modspecidentifierbase: @modspecidentifierbase })
135
+ .new({ default: "default", lang: @lang, script: @script,
136
+ locale: @locale, labels: @i18n.get,
137
+ modspecidentifierbase: @modspecidentifierbase })
136
138
  end
137
139
 
138
140
  def convert_i18n_init1(docxml)
@@ -136,24 +136,21 @@ module IsoDoc
136
136
  end
137
137
 
138
138
  def html_toc_entries(docxml, path)
139
- xml = html_toc_entries_prep(docxml, path)
139
+ headers = html_toc_entries_prep(docxml, path)
140
140
  path.each_with_index.with_object([]) do |(p, i), m|
141
- xml.xpath(p.join(" | ")).each do |h|
141
+ docxml.xpath(p.join(" | ")).each do |h|
142
142
  m << { entry: html_toc_entry("h#{i + 1}", h),
143
- line: h.line }
143
+ line: headers[h["id"]] }
144
144
  end
145
145
  end.sort_by { |k| k[:line] }
146
146
  end
147
147
 
148
148
  def html_toc_entries_prep(docxml, path)
149
- path.each do |p|
150
- docxml.xpath(p.join(" | ")).each do |h|
149
+ docxml.xpath(path.join(" | "))
150
+ .each_with_index.with_object({}) do |(h, i), m|
151
151
  h["id"] ||= "_#{UUIDTools::UUID.random_create}"
152
+ m[h["id"]] = i
152
153
  end
153
- end
154
- xml = Nokogiri::XML(docxml.to_xml, &:noblanks)
155
- xml.remove_namespaces!
156
- xml
157
154
  end
158
155
 
159
156
  def toc_exclude_class
data/lib/isodoc/i18n.rb CHANGED
@@ -7,23 +7,26 @@ module IsoDoc
7
7
  class I18n
8
8
  Hash.include Metanorma::Utils::Hash
9
9
 
10
- def load_yaml1(lang, script)
10
+ def yaml_lang(lang, script)
11
11
  case lang
12
12
  when "en", "fr", "ru", "de", "es", "ar", "ja"
13
- load_yaml2(lang)
13
+ lang
14
14
  when "zh"
15
- if script == "Hans" then load_yaml2("zh-Hans")
16
- else load_yaml2("en")
17
- end
18
- else
19
- load_yaml2("en")
15
+ "#{lang}-#{script}"
20
16
  end
21
17
  end
22
18
 
19
+ def load_yaml1(lang, script)
20
+ load_yaml2(yaml_lang(lang, script))
21
+ end
22
+
23
23
  def load_yaml2(str)
24
- YAML.load_file(File.join(File.dirname(__FILE__),
25
- "../isodoc-yaml/i18n-#{str}.yaml"))
24
+ f = File.join(File.dirname(__FILE__),
25
+ "../isodoc-yaml/i18n-#{str}.yaml")
26
+ File.exist?(f) or
27
+ f = File.join(File.dirname(__FILE__),
28
+ "../isodoc-yaml/i18n-en.yaml")
29
+ YAML.load_file(f)
26
30
  end
27
31
  end
28
32
  end
29
-
@@ -15,10 +15,10 @@ module IsoDoc
15
15
  "</localized-strings>"
16
16
  end
17
17
 
18
- def extension_insert(docxml, path = [])
19
- ins = docxml.at(ns("//metanorma-extension")) ||
20
- docxml.at(ns("//bibdata"))&.after("<metanorma-extension/>")&.next_element ||
21
- docxml.root.elements.first.before("<metanorma-extension/>").previous_element
18
+ def extension_insert(xml, path = [])
19
+ ins = xml.at(ns("//metanorma-extension")) ||
20
+ xml.at(ns("//bibdata"))&.after("<metanorma-extension/>")&.next_element ||
21
+ xml.root.elements.first.before("<metanorma-extension/>").previous_element
22
22
  path.each do |n|
23
23
  ins = ins.at(ns("./#{n}")) || ins.add_child("<#{n}/>").first
24
24
  end
@@ -39,24 +39,24 @@ module IsoDoc
39
39
  @output_formats.empty? and return nil
40
40
  @output_formats.each_key.with_object([]) do |k, m|
41
41
  m << <<~XSLT
42
- <preprocess-xslt format="#{k}">
43
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
44
- <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
45
- <xsl:strip-space elements="*"/>
46
- <xsl:template match="@* | node()">
47
- <xsl:copy>
48
- <xsl:apply-templates select="@* | node()"/>
49
- </xsl:copy>
50
- </xsl:template>
51
- <xsl:template match="*[local-name() = 'passthrough']">
52
- <xsl:if test="contains(@formats,',#{k},')"> <!-- delimited -->
53
- <xsl:copy>
54
- <xsl:apply-templates select="@* | node()"/>
55
- </xsl:copy>
56
- </xsl:if>
57
- </xsl:template>
58
- </xsl:stylesheet>
59
- </preprocess-xslt>
42
+ <preprocess-xslt format="#{k}">
43
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
44
+ <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
45
+ <xsl:strip-space elements="*"/>
46
+ <xsl:template match="@* | node()">
47
+ <xsl:copy>
48
+ <xsl:apply-templates select="@* | node()"/>
49
+ </xsl:copy>
50
+ </xsl:template>
51
+ <xsl:template match="*[local-name() = 'passthrough']">
52
+ <xsl:if test="contains(@formats,',#{k},')"> <!-- delimited -->
53
+ <xsl:copy>
54
+ <xsl:apply-templates select="@* | node()"/>
55
+ </xsl:copy>
56
+ </xsl:if>
57
+ </xsl:template>
58
+ </xsl:stylesheet>
59
+ </preprocess-xslt>
60
60
  XSLT
61
61
  end.join("\n")
62
62
  end
@@ -67,8 +67,7 @@ module IsoDoc
67
67
  end
68
68
 
69
69
  def toc_metadata(docxml)
70
- return unless @tocfigures || @toctables || @tocrecommendations
71
-
70
+ @tocfigures || @toctables || @tocrecommendations or return
72
71
  ins = extension_insert(docxml)
73
72
  @tocfigures and
74
73
  ins << "<toc type='figure'><title>#{@i18n.toc_figures}</title></toc>"
@@ -89,17 +88,20 @@ module IsoDoc
89
88
  end
90
89
 
91
90
  def fonts_metadata(xmldoc)
92
- return unless @fontist_fonts
93
-
94
- ins = xmldoc.at(ns("//presentation-metadata")) ||
95
- xmldoc.at(ns("//metanorma-extension")) || xmldoc.at(ns("//bibdata"))
96
- CSV.parse_line(@fontist_fonts, col_sep: ";").map(&:strip).each do |f|
91
+ ins = presmeta_insert_pt(xmldoc)
92
+ @fontist_fonts and CSV.parse_line(@fontist_fonts, col_sep: ";")
93
+ .map(&:strip).reverse.each do |f|
97
94
  ins.next = presmeta("fonts", f)
98
95
  end
99
96
  @fontlicenseagreement and
100
97
  ins.next = presmeta("font-license-agreement", @fontlicenseagreement)
101
98
  end
102
99
 
100
+ def presmeta_insert_pt(xmldoc)
101
+ xmldoc.at(ns("//presentation-metadata")) ||
102
+ xmldoc.at(ns("//metanorma-extension")) || xmldoc.at(ns("//bibdata"))
103
+ end
104
+
103
105
  def presmeta(name, value)
104
106
  "<presentation-metadata><name>#{name}</name><value>#{value}</value>" \
105
107
  "</presentation-metadata>"
@@ -144,9 +146,10 @@ module IsoDoc
144
146
  def edition_translate(bibdata)
145
147
  x = bibdata.at(ns("./edition")) or return
146
148
  /^\d+$/.match?(x.text) or return
149
+ @i18n.edition_ordinal or return
150
+ edn = edition_translate1(x.text.to_i) or return
147
151
  tag_translate(x, @lang,
148
- @i18n.edition_ordinal.sub(/%(Spellout|Ordinal)?/,
149
- edition_translate1(x.text.to_i)))
152
+ @i18n.edition_ordinal.sub(/%(Spellout|Ordinal)?/, edn))
150
153
  end
151
154
 
152
155
  def edition_translate1(num)
@@ -1,4 +1,5 @@
1
1
  require "metanorma-utils"
2
+ require "csv"
2
3
 
3
4
  module IsoDoc
4
5
  class PresentationXMLConvert < ::IsoDoc::Convert
@@ -126,16 +127,18 @@ module IsoDoc
126
127
  elem["formats"] = ",#{elem['formats']},"
127
128
  end
128
129
 
129
- private
130
-
131
130
  def extract_custom_charsets(docxml)
132
- docxml.xpath(ns("//presentation-metadata/custom-charset-font")).
133
- each_with_object({}) do |x, m|
134
- kv = x.text.split(":", 2)
131
+ docxml.xpath(ns("//presentation-metadata/custom-charset-font"))
132
+ .each_with_object({}) do |line, m|
133
+ line.text.split(",").map(&:strip).each do |x|
134
+ kv = x.split(":", 2)
135
135
  m[kv[0]] = kv[1]
136
136
  end
137
+ end
137
138
  end
138
139
 
140
+ private
141
+
139
142
  def found_matching_variant_sibling(node)
140
143
  prev = node.xpath("./preceding-sibling::xmlns:variant")
141
144
  foll = node.xpath("./following-sibling::xmlns:variant")
@@ -1,7 +1,12 @@
1
1
  module IsoDoc
2
2
  class PresentationXMLConvert < ::IsoDoc::Convert
3
- def prefix_container(container, linkend, node, _target)
4
- l10n(@i18n.nested_xref.sub("%1", anchor_xref(node, container))
3
+ def prefix_container(container, linkend, node, target)
4
+ prefix_container?(container, node) or return linkend
5
+ container_container = @xrefs.anchor(container, :container, false)
6
+ container_label =
7
+ prefix_container(container_container, anchor_xref(node, container),
8
+ node, target)
9
+ l10n(@i18n.nested_xref.sub("%1", container_label)
5
10
  .sub("%2", linkend))
6
11
  end
7
12
 
@@ -31,8 +36,7 @@ module IsoDoc
31
36
  def anchor_linkend1(node)
32
37
  linkend = anchor_xref(node, node["target"])
33
38
  container = @xrefs.anchor(node["target"], :container, false)
34
- prefix_container?(container, node) and
35
- linkend = prefix_container(container, linkend, node, node["target"])
39
+ linkend = prefix_container(container, linkend, node, node["target"])
36
40
  capitalise_xref(node, linkend, anchor_value(node["target"]))
37
41
  end
38
42
 
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "2.7.0".freeze
2
+ VERSION = "2.7.2".freeze
3
3
  end
@@ -24,24 +24,25 @@ module IsoDoc
24
24
  .//figure[not(@class)] | .//figure[@class = 'pseudocode'] | .//sourcecode[not(ancestor::example)]
25
25
  XPATH
26
26
 
27
- def sequential_figure_names(clause)
27
+ def sequential_figure_names(clause, container: false)
28
28
  c = Counter.new
29
29
  j = 0
30
30
  clause.xpath(ns(FIGURE_NO_CLASS)).noblank.each do |t|
31
31
  j = subfigure_increment(j, c, t)
32
- sequential_figure_body(j, c, t, "figure")
32
+ sequential_figure_body(j, c, t, "figure", container: container)
33
33
  end
34
- sequential_figure_class_names(clause)
34
+ sequential_figure_class_names(clause, container: container)
35
35
  end
36
36
 
37
- def sequential_figure_class_names(clause)
37
+ def sequential_figure_class_names(clause, container: false)
38
38
  c = {}
39
39
  j = 0
40
40
  clause.xpath(ns(".//figure[@class][not(@class = 'pseudocode')]"))
41
41
  .each do |t|
42
42
  c[t["class"]] ||= Counter.new
43
43
  j = subfigure_increment(j, c[t["class"]], t)
44
- sequential_figure_body(j, c[t["class"]], t, t["class"])
44
+ sequential_figure_body(j, c[t["class"]], t, t["class"],
45
+ container: container)
45
46
  end
46
47
  end
47
48
 
@@ -50,27 +51,28 @@ module IsoDoc
50
51
  "-#{subfignum}"
51
52
  end
52
53
 
53
- def sequential_figure_body(subfignum, counter, block, klass)
54
+ def sequential_figure_body(subfig, counter, elem, klass, container: false)
54
55
  label = counter.print
55
- label &&= label + subfigure_label(subfignum)
56
- @anchors[block["id"]] = anchor_struct(
57
- label, nil, @labels[klass] || klass.capitalize, klass,
58
- block["unnumbered"]
56
+ label &&= label + subfigure_label(subfig)
57
+ @anchors[elem["id"]] = anchor_struct(
58
+ label, container ? elem : nil,
59
+ @labels[klass] || klass.capitalize, klass,
60
+ elem["unnumbered"]
59
61
  )
60
62
  end
61
63
 
62
- def sequential_table_names(clause)
64
+ def sequential_table_names(clause, container: false)
63
65
  c = Counter.new
64
66
  clause.xpath(ns(".//table")).noblank.each do |t|
65
67
  labelled_ancestor(t) and next
66
68
  @anchors[t["id"]] = anchor_struct(
67
- c.increment(t).print, nil,
69
+ c.increment(t).print, container ? t : nil,
68
70
  @labels["table"], "table", t["unnumbered"]
69
71
  )
70
72
  end
71
73
  end
72
74
 
73
- def sequential_formula_names(clause)
75
+ def sequential_formula_names(clause, container: false)
74
76
  c = Counter.new
75
77
  clause.xpath(ns(".//formula")).noblank.each do |t|
76
78
  @anchors[t["id"]] = anchor_struct(
@@ -91,60 +93,63 @@ module IsoDoc
91
93
  ./permission | ./requirement | ./recommendation
92
94
  XPATH
93
95
 
94
- def sequential_permission_names(clause)
96
+ def sequential_permission_names(clause, container: false)
95
97
  c = ReqCounter.new
96
98
  clause.xpath(ns(FIRST_LVL_REQ)).noblank.each do |t|
97
99
  m = @reqt_models.model(t["model"])
98
100
  klass, label = reqt2class_label(t, m)
99
101
  id = c.increment(label, t).print
100
- sequential_permission_body(id, t, label, klass, m)
101
- sequential_permission_children(t, id)
102
+ sequential_permission_body(id, t, label, klass, m,
103
+ container: container)
104
+ sequential_permission_children(t, id, container: container)
102
105
  end
103
106
  end
104
107
 
105
- def sequential_permission_children(block, lbl)
108
+ def sequential_permission_children(elem, lbl, container: false)
106
109
  c = ReqCounter.new
107
- block.xpath(ns(REQ_CHILDREN)).noblank.each do |t|
110
+ elem.xpath(ns(REQ_CHILDREN)).noblank.each do |t|
108
111
  m = @reqt_models.model(t["model"])
109
112
  klass, label = reqt2class_nested_label(t, m)
110
113
  id = "#{lbl}#{hierfigsep}#{c.increment(label, t).print}"
111
- sequential_permission_body(id, t, label, klass, m)
112
- sequential_permission_children(t, id)
114
+ sequential_permission_body(id, t, label, klass, m,
115
+ container: container)
116
+ sequential_permission_children(t, id, container: container)
113
117
  end
114
118
  end
115
119
 
116
- def sequential_permission_body(id, block, label, klass, model)
117
- @anchors[block["id"]] = model.postprocess_anchor_struct(
118
- block, anchor_struct(id, block,
119
- label, klass, block["unnumbered"])
120
+ def sequential_permission_body(id, elem, label, klass, model, container: false)
121
+ @anchors[elem["id"]] = model.postprocess_anchor_struct(
122
+ elem, anchor_struct(id, elem,
123
+ label, klass, elem["unnumbered"])
120
124
  )
121
- model.permission_parts(block, id, label, klass).each do |n|
125
+ model.permission_parts(elem, id, label, klass).each do |n|
122
126
  @anchors[n[:id]] = anchor_struct(n[:number], n[:elem], n[:label],
123
127
  n[:klass], false)
124
128
  end
125
129
  end
126
130
 
127
- def reqt2class_label(block, model)
131
+ def reqt2class_label(elem, model)
128
132
  model.req_class_paths.each do |n|
129
133
  v1 = ns("/#{n[:xpath]}").sub(%r{^/}, "")
130
- block.at("./self::#{v1}") and return [n[:klass], n[:label]]
134
+ elem.at("./self::#{v1}") and return [n[:klass], n[:label]]
131
135
  end
132
136
  [nil, nil]
133
137
  end
134
138
 
135
- def reqt2class_nested_label(block, model)
139
+ def reqt2class_nested_label(elem, model)
136
140
  model.req_nested_class_paths.each do |n|
137
141
  v1 = ns("/#{n[:xpath]}").sub(%r{^/}, "")
138
- block.at("./self::#{v1}") and return [n[:klass], n[:label]]
142
+ elem.at("./self::#{v1}") and return [n[:klass], n[:label]]
139
143
  end
140
144
  [nil, nil]
141
145
  end
142
146
 
143
- def sequential_asset_names(clause)
144
- sequential_table_names(clause)
145
- sequential_figure_names(clause)
146
- sequential_formula_names(clause)
147
- sequential_permission_names(clause)
147
+ # container makes numbering be prefixed with the parent clause reference
148
+ 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)
148
153
  end
149
154
 
150
155
  def hierarchical_figure_names(clause, num)
@@ -129,6 +129,10 @@ module IsoDoc
129
129
 
130
130
  def back_names(clause)
131
131
  unnumbered_names(clause)
132
+ sequential_asset_names(
133
+ Nokogiri::XML::NodeSet.new(clause.document, [clause]),
134
+ container: true,
135
+ )
132
136
  end
133
137
 
134
138
  def unnumbered_names(clause)
@@ -237,8 +241,8 @@ module IsoDoc
237
241
  def reference_names(ref)
238
242
  ids = @klass.bibitem_ref_code(ref)
239
243
  identifiers = @klass.render_identifier(ids)
240
- reference = @klass.
241
- docid_l10n(identifiers[:metanorma] || identifiers[:sdo] ||
244
+ reference = @klass
245
+ .docid_l10n(identifiers[:metanorma] || identifiers[:sdo] ||
242
246
  identifiers[:ordinal] || identifiers[:doi])
243
247
  @anchors[ref["id"]] = { xref: reference }
244
248
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-20 00:00:00.000000000 Z
11
+ date: 2023-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: html2doc
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.7.0
19
+ version: 1.7.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.7.0
26
+ version: 1.7.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: htmlentities
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5'
69
- - !ruby/object:Gem::Dependency
70
- name: relaton-cli
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: mn2pdf
85
71
  requirement: !ruby/object:Gem::Requirement