uniword 1.7.4 → 1.7.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: 2a24f8db82e2282b67f93ac3f8c464f60de00a192a783aecf8f36769e945ed4e
4
- data.tar.gz: 6dc5e353053ed9f51c3753952081b05d6d7c2799e604ceb721ed16b90b0ad08e
3
+ metadata.gz: d9c89b0b073e230af38b710f58a44d1f9018d1ae8c55f759ac7fcdefd7b3616c
4
+ data.tar.gz: 38583e3f00b918f4749f5edbc5c6bdd00f56288ddeea09264656142b1ed34bc4
5
5
  SHA512:
6
- metadata.gz: bed041bdc107608b569797dec4b52c58f1ce827d7e8e9a22f6a17d65d1177bbb19ece843254dc1679728171abf3770c9152ff0479a6688cd7c1f7a814c65dc74
7
- data.tar.gz: 2d9b56ccb93f611274fea3756385731e45a1328a6117237b1ebeadf5ad23f08d681016fd758970b8b3e93af6dbd3b21265c0e3537914de25ba7ccfcd25c7340a
6
+ metadata.gz: 88402c903c17f8828d18bf3134f5b7b974e23c611a4b25e03273f416787797f3ee8cf836513ddfbcbd7c9cd165d0905cdcb766243babaa448caa4ca0679de576
7
+ data.tar.gz: 9a8533f5ab5fbfbde3171bc74cefbd628a333ca44cf3382dd3680db7d45b9926664d7e0d043fff12c8a53dd631a72621e52cbc6199b6fc4175188cd73167cdd9
@@ -102,7 +102,10 @@ module Uniword
102
102
  before: before, after: after, line: line, line_rule: rule
103
103
  }.select { |_, value| value }
104
104
  sp = ensure_properties.ensure_spacing(*written.keys)
105
- written.each { |field, value| sp.public_send(:"#{field}=", value) }
105
+ sp.before = before if before
106
+ sp.after = after if after
107
+ sp.line = line if line
108
+ sp.line_rule = rule if rule
106
109
  self
107
110
  end
108
111
 
@@ -106,7 +106,9 @@ module Uniword
106
106
  before: before, after: after, line: line
107
107
  }.select { |_, value| value }
108
108
  sp = ensure_para_props.ensure_spacing(*written.keys)
109
- written.each { |field, value| sp.public_send(:"#{field}=", value) }
109
+ sp.before = before if before
110
+ sp.after = after if after
111
+ sp.line = line if line
110
112
  self
111
113
  end
112
114
 
@@ -158,7 +158,7 @@ module Uniword
158
158
  # Extract alignment (m:jc)
159
159
  jc_node = para_props.at_xpath(".//m:jc", "m" => OMML_NAMESPACE)
160
160
  if jc_node
161
- jc_val = jc_node.attr("m:val")
161
+ jc_val = jc_node["m:val"]
162
162
  properties[:alignment] = normalize_alignment(jc_val)
163
163
  end
164
164
  end
@@ -367,7 +367,12 @@ module Uniword
367
367
  # @return [void]
368
368
  def remove_anchored_elements(paragraph, collection_name, tag,
369
369
  comment_id)
370
- collection = paragraph.public_send(collection_name)
370
+ collection = case collection_name
371
+ when :comment_range_starts
372
+ paragraph.comment_range_starts
373
+ when :comment_range_ends
374
+ paragraph.comment_range_ends
375
+ end
371
376
  matching = collection.select { |element| element.id.to_s == comment_id }
372
377
  matching.each do |element|
373
378
  index = collection.index(element)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Uniword
4
- VERSION = "1.7.4"
4
+ VERSION = "1.7.5"
5
5
  end
@@ -36,7 +36,7 @@ module Uniword
36
36
  #
37
37
  # @return [String, nil] Alternative text, or nil when absent
38
38
  def alt_text
39
- first_non_blank(:descr)
39
+ first_non_blank(&:descr)
40
40
  end
41
41
 
42
42
  # Set the alternative text on whichever frame this drawing carries.
@@ -57,16 +57,17 @@ module Uniword
57
57
  #
58
58
  # @return [String, nil] Title, or nil when absent
59
59
  def alt_title
60
- first_non_blank(:title)
60
+ first_non_blank(&:title)
61
61
  end
62
62
 
63
63
  private
64
64
 
65
- # @param attribute [Symbol] docPr attribute to read
65
+ # @param attribute [#call] reader called on each frame's docPr
66
66
  # @return [String, nil] First non-blank value across the frames
67
- def first_non_blank(attribute)
67
+ def first_non_blank(&attribute)
68
68
  [inline, anchor]
69
- .filter_map { |frame| frame&.doc_properties&.public_send(attribute) }
69
+ .filter_map { |frame| frame&.doc_properties }
70
+ .filter_map(&attribute)
70
71
  .map(&:strip)
71
72
  .find { |text| !text.empty? }
72
73
  end
@@ -381,7 +381,14 @@ module Uniword
381
381
  end
382
382
 
383
383
  entries.drop(1).each do |stale|
384
- clearing.each { |field| stale.public_send(:"#{field}=", nil) }
384
+ clearing.each do |field|
385
+ case field
386
+ when :before then stale.before = nil
387
+ when :after then stale.after = nil
388
+ when :line then stale.line = nil
389
+ when :line_rule then stale.line_rule = nil
390
+ end
391
+ end
385
392
  end
386
393
 
387
394
  entries.first
@@ -9,25 +9,6 @@ module Uniword
9
9
  # (e.g., RunProperties.new(bold: true)) and the wrapper
10
10
  # objects (e.g., Properties::Bold) required by lutaml-model.
11
11
  module Conversion
12
- # Every rPr attribute whose value is an ST_OnOff toggle element.
13
- BOOLEAN_WRAPPERS = {
14
- bold: Properties::Bold,
15
- bold_cs: Properties::BoldCs,
16
- italic: Properties::Italic,
17
- italic_cs: Properties::ItalicCs,
18
- strike: Properties::Strike,
19
- double_strike: Properties::DoubleStrike,
20
- small_caps: Properties::SmallCaps,
21
- caps: Properties::Caps,
22
- hidden: Properties::Vanish,
23
- no_proof: Properties::NoProof,
24
- web_hidden: Properties::WebHidden,
25
- shadow: Properties::Shadow,
26
- emboss: Properties::Emboss,
27
- imprint: Properties::Imprint,
28
- outline: Properties::Outline,
29
- }.freeze
30
-
31
12
  def initialize(attrs = {})
32
13
  # Extract flat convenience keys before super (lutaml-model ignores
33
14
  # unknown keys). These are converted to proper wrapper objects below.
@@ -118,15 +99,46 @@ module Uniword
118
99
  # Wrap every ST_OnOff toggle handed in as a primitive.
119
100
  #
120
101
  # `false` is a value, not an absence: testing truthiness here left a
121
- # raw Ruby false on the attribute and to_xml then died on it.
102
+ # raw Ruby false on the attribute and to_xml then died on it. Each
103
+ # toggle is named explicitly so a new one cannot silently skip
104
+ # conversion; boolean_element_spec asserts the full set converts.
122
105
  def convert_boolean_attrs!
123
- BOOLEAN_WRAPPERS.each do |name, klass|
124
- current = instance_variable_get(:"@#{name}")
125
- next if current.nil? || current.is_a?(klass) ||
126
- Lutaml::Model::Utils.uninitialized?(current)
106
+ self.bold = Properties::Bold.new(val: bold) if wrap_needed?(bold, Properties::Bold)
107
+ self.bold_cs = Properties::BoldCs.new(val: bold_cs) if
108
+ wrap_needed?(bold_cs, Properties::BoldCs)
109
+ self.italic = Properties::Italic.new(val: italic) if
110
+ wrap_needed?(italic, Properties::Italic)
111
+ self.italic_cs = Properties::ItalicCs.new(val: italic_cs) if
112
+ wrap_needed?(italic_cs, Properties::ItalicCs)
113
+ self.strike = Properties::Strike.new(val: strike) if
114
+ wrap_needed?(strike, Properties::Strike)
115
+ self.double_strike = Properties::DoubleStrike.new(val: double_strike) if
116
+ wrap_needed?(double_strike, Properties::DoubleStrike)
117
+ self.small_caps = Properties::SmallCaps.new(val: small_caps) if
118
+ wrap_needed?(small_caps, Properties::SmallCaps)
119
+ self.caps = Properties::Caps.new(val: caps) if
120
+ wrap_needed?(caps, Properties::Caps)
121
+ self.hidden = Properties::Vanish.new(val: hidden) if
122
+ wrap_needed?(hidden, Properties::Vanish)
123
+ self.no_proof = Properties::NoProof.new(val: no_proof) if
124
+ wrap_needed?(no_proof, Properties::NoProof)
125
+ self.web_hidden = Properties::WebHidden.new(val: web_hidden) if
126
+ wrap_needed?(web_hidden, Properties::WebHidden)
127
+ self.shadow = Properties::Shadow.new(val: shadow) if
128
+ wrap_needed?(shadow, Properties::Shadow)
129
+ self.emboss = Properties::Emboss.new(val: emboss) if
130
+ wrap_needed?(emboss, Properties::Emboss)
131
+ self.imprint = Properties::Imprint.new(val: imprint) if
132
+ wrap_needed?(imprint, Properties::Imprint)
133
+ self.outline = Properties::Outline.new(val: outline) if
134
+ wrap_needed?(outline, Properties::Outline)
135
+ end
127
136
 
128
- instance_variable_set(:"@#{name}", klass.new(val: current))
129
- end
137
+ private
138
+
139
+ def wrap_needed?(value, klass)
140
+ !value.nil? && !value.is_a?(klass) &&
141
+ !Lutaml::Model::Utils.uninitialized?(value)
130
142
  end
131
143
 
132
144
  def convert_style_attr!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uniword
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.4
4
+ version: 1.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-11-08 00:00:00.000000000 Z
11
+ date: 2026-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logger
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.9.412
33
+ version: 1.9.414
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.9.412
40
+ version: 1.9.414
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: lutaml-model
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.8.170
47
+ version: 0.8.171
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.8.170
54
+ version: 0.8.171
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: omml
57
57
  requirement: !ruby/object:Gem::Requirement