isodoc 3.7.4.pre.alpha.4 → 3.7.4

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: f43e74db4fd8114f833bf28698c04fd27a92737c0bc69aa1e84e9c04dc29557c
4
- data.tar.gz: 7ec202df5c46e7778f0c50aa23920cbcd68cb1fffbb1cea682f067d594bedf73
3
+ metadata.gz: 3a9872c3dc80016910e76d8a9b3c97aa04df34a6caab0c198ba568b97a9ec17d
4
+ data.tar.gz: 57b6c1f42c4fbc6c4b8c5537d058779fb75ac2539c63fe9b0e1d5e5d48104dc0
5
5
  SHA512:
6
- metadata.gz: 4f138eeeb5305716723c2045cf973d9ca9be58c49576158be779d9a641e1fe8fd551cc0f185fafc8f2b1f7bf3eb985245cb589d74e5cfba290c1d2374dcc515e
7
- data.tar.gz: 4dd8f1519c7c64281257a2a79f8f27701248c5e1db63f249af0ca5036f8f08d19f833f8935931a525ae6b3731f26fed2364fa56bb145dc6e9525a37d441c5bfb
6
+ metadata.gz: fde157a47858f873f02c57a84d57f8865790154cd05260e01caa89fd0116297e66388ac98524925517b529c0c111160f1ea415f3dc5c1a6d2d06db9ece697063
7
+ data.tar.gz: 75fce4fdc6a222d822831284e6081f6f621df2ca3813d09514b3eeff8f36e0c43bfeef9064ac7a5b364866768646085fc6342ab1c1962e8592b594420de24ea4
data/isodoc.gemspec CHANGED
@@ -33,6 +33,9 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency "html2doc", "~> 1.12"
34
34
  # spec.add_dependency "isodoc-i18n", "~> 1.5" # already in relaton-render and mn-requirements
35
35
  spec.add_dependency "relaton-cli", ">= 3.0.0", "< 3.1"
36
+ # std_docid_semantic parses through the pubid monogem's flavor
37
+ # registry (Pubid.eager_load_flavors!) — 2.x API, no per-flavor gems
38
+ spec.add_dependency "pubid", "~> 2.0"
36
39
  # spec.add_dependency "metanorma-utils", "~> 2.0" # already in isodoc-i18n
37
40
  spec.add_dependency "mn2pdf", ">= 2.13"
38
41
  spec.add_dependency "mn-requirements", "~> 0.5.0"
@@ -86,8 +86,12 @@ module IsoDoc
86
86
  end
87
87
 
88
88
  def annex_delim_override(elem)
89
+ if instance_variable_defined?(:@annex_delim_override)
90
+ return @annex_delim_override
91
+ end
92
+
89
93
  m = elem.document.root.at(ns("//presentation-metadata/annex-delim"))
90
- m ? to_xml(m.children) : annex_delim(elem)
94
+ @annex_delim_override = m ? to_xml(m.children) : annex_delim(elem)
91
95
  end
92
96
 
93
97
  def annex_delim(_elem)
@@ -73,7 +73,18 @@ module IsoDoc
73
73
  def merge_second_preferred1(desgns, term)
74
74
  desgns[1..].each(&:remove)
75
75
  ret = l10n(desgns.map { |x| to_xml(x) }.join("; "))
76
- term.ancestors("fmt-related").empty? and ret = "<p>#{ret}</p>"
76
+ # Node#ancestors(selector) matches via XPath per ancestor; this runs
77
+ # per term, so walk parents directly.
78
+ in_fmt_related = false
79
+ parent = term.parent
80
+ while parent.is_a?(Nokogiri::XML::Element)
81
+ if parent.name == "fmt-related"
82
+ in_fmt_related = true
83
+ break
84
+ end
85
+ parent = parent.parent
86
+ end
87
+ in_fmt_related or ret = "<p>#{ret}</p>"
77
88
  ret
78
89
  end
79
90
 
@@ -78,10 +78,16 @@ module IsoDoc
78
78
  %w(&#x2014;)
79
79
  end
80
80
 
81
+ # Presentation metadata is fixed for the duration of conversion, but
82
+ # this runs per list item: the whole-document XPath per <ul> is
83
+ # quadratic on large documents. Memoize per converter instance.
81
84
  def ul_label_list_from_metadata(docxml)
85
+ if instance_variable_defined?(:@ul_label_list_from_metadata)
86
+ return @ul_label_list_from_metadata
87
+ end
88
+
82
89
  list = docxml.xpath(ns("//presentation-metadata/ul-label-list"))
83
- list.empty? and return nil
84
- list.map(&:text)
90
+ @ul_label_list_from_metadata = list.empty? ? nil : list.map(&:text)
85
91
  end
86
92
 
87
93
  def ul_label(elem)
@@ -92,10 +98,22 @@ module IsoDoc
92
98
  end
93
99
 
94
100
  def ul_label_value(elem)
95
- depth = elem.ancestors("ul, ol").size
101
+ depth = list_nesting_depth(elem)
96
102
  val = ul_label_list_from_metadata(elem.document.root) ||
97
103
  ul_label_list(elem)
98
104
  val[(depth - 1) % val.size]
99
105
  end
106
+
107
+ # Walk parents directly: Node#ancestors(selector) runs an XPath match
108
+ # per ancestor, which is quadratic on deeply nested lists.
109
+ def list_nesting_depth(elem)
110
+ depth = 0
111
+ node = elem.parent
112
+ while node.is_a?(Nokogiri::XML::Element)
113
+ depth += 1 if node.name == "ul" || node.name == "ol"
114
+ node = node.parent
115
+ end
116
+ depth
117
+ end
100
118
  end
101
119
  end
@@ -1,3 +1,3 @@
1
1
  module IsoDoc
2
- VERSION = "3.7.4.pre.alpha.4".freeze
2
+ VERSION = "3.7.4".freeze
3
3
  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: 3.7.4.pre.alpha.4
4
+ version: 3.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-27 00:00:00.000000000 Z
11
+ date: 2026-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "<"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '3.1'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pubid
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: mn2pdf
77
91
  requirement: !ruby/object:Gem::Requirement