isodoc 2.7.0 → 2.7.2

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: 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