isodoc 3.7.4.pre.alpha.4 → 3.7.4.pre.alpha.5

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: 2ac7ddfe63cebf2580cf793bda41a563367084ed78ac621f9914bbb1c143eedf
4
+ data.tar.gz: 8771309031dc897df944bb3d0d38b604eca00ef7ffe5f67d0eb17104a72d1627
5
5
  SHA512:
6
- metadata.gz: 4f138eeeb5305716723c2045cf973d9ca9be58c49576158be779d9a641e1fe8fd551cc0f185fafc8f2b1f7bf3eb985245cb589d74e5cfba290c1d2374dcc515e
7
- data.tar.gz: 4dd8f1519c7c64281257a2a79f8f27701248c5e1db63f249af0ca5036f8f08d19f833f8935931a525ae6b3731f26fed2364fa56bb145dc6e9525a37d441c5bfb
6
+ metadata.gz: 74fd307bb5d2b69531726d7c7f05e8fbbc5532921f20e9fa8e98b61d3e292c3328a0a28daf05285f2750cd0ef15cd890a2e137b294b99bafc936b0334c1dbfbe
7
+ data.tar.gz: c022667c987d194c5308817b405b0cba5cdc446bd4caa7f1a046fdd8586e3799191c3a366663af99190575d37927ba09710d5b882468e9213921e053e3847f50
@@ -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.pre.alpha.5".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.pre.alpha.5
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-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64