canon 0.3.59 → 0.3.60
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 +4 -4
- data/lib/canon/tree_diff/adapters/html_adapter.rb +1 -1
- data/lib/canon/tree_diff/core/tree_node.rb +20 -7
- data/lib/canon/tree_diff/matchers/similarity_matcher.rb +1 -1
- data/lib/canon/tree_diff/matchers/structural_propagator.rb +1 -1
- data/lib/canon/tree_diff/operations/operation_detector.rb +5 -6
- data/lib/canon/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f1cbc73f1d667885f1f989a9534d8123dbcc67ae7eda250cc24cba00e7ad24a7
|
|
4
|
+
data.tar.gz: b9a27d00c02f533c6679237e190eb7f6bc6532fe0f945957bdc5d521bb84217b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b060895cd58c7321db7d0640a02ca166f3efb9b5cb4c90d5fafb7d615b3faf6c73f4e29d42533d56ac9fd393e625bac473d9cd122273dc81b3598b0be76b86f9
|
|
7
|
+
data.tar.gz: 4b160273200d229151e61842bc994cd8e1d23f495107f495edde383b2fdccda2e9de150a65160d34c5e3177a7bf236282a6e1bb675c72b2bf667deb200e3dab4
|
|
@@ -196,7 +196,7 @@ module Canon
|
|
|
196
196
|
return false unless Canon::Comparison::NodeInspector.element_node?(element)
|
|
197
197
|
|
|
198
198
|
# List of HTML elements where whitespace is semantically significant
|
|
199
|
-
whitespace_sensitive_tags =
|
|
199
|
+
whitespace_sensitive_tags = Core::TreeNode::WHITESPACE_SENSITIVE_TAGS
|
|
200
200
|
whitespace_sensitive_tags.include?(element.name.downcase)
|
|
201
201
|
end
|
|
202
202
|
|
|
@@ -87,8 +87,9 @@ module Canon
|
|
|
87
87
|
children.empty?
|
|
88
88
|
end
|
|
89
89
|
|
|
90
|
-
# Elements where whitespace is semantically significant
|
|
91
|
-
# text value participates in
|
|
90
|
+
# Elements where whitespace is semantically significant (HTML):
|
|
91
|
+
# their text value participates in signatures and matching.
|
|
92
|
+
# Single source for the tree_diff components.
|
|
92
93
|
WHITESPACE_SENSITIVE_TAGS = %w[pre code textarea script style].freeze
|
|
93
94
|
|
|
94
95
|
def build_signature_path(include_attributes)
|
|
@@ -109,9 +110,17 @@ module Canon
|
|
|
109
110
|
component = label.to_s
|
|
110
111
|
|
|
111
112
|
# Sorted attributes distinguish same-label nodes while
|
|
112
|
-
# ignoring attribute order.
|
|
113
|
+
# ignoring attribute order. Built directly into the
|
|
114
|
+
# component — no intermediate sorted/map/join arrays.
|
|
113
115
|
if include_attributes && !attributes.empty?
|
|
114
|
-
component += "{
|
|
116
|
+
component += "{"
|
|
117
|
+
first = true
|
|
118
|
+
attributes.sort.each do |k, v|
|
|
119
|
+
component << "," unless first
|
|
120
|
+
first = false
|
|
121
|
+
component << k.to_s << "=" << v.to_s
|
|
122
|
+
end
|
|
123
|
+
component << "}"
|
|
115
124
|
end
|
|
116
125
|
|
|
117
126
|
if include_attributes &&
|
|
@@ -165,10 +174,14 @@ module Canon
|
|
|
165
174
|
#
|
|
166
175
|
# @return [Array<TreeNode>]
|
|
167
176
|
def descendants
|
|
177
|
+
# Iterative pre-order walk — the recursive form allocated an
|
|
178
|
+
# intermediate array per level.
|
|
168
179
|
result = []
|
|
169
|
-
children.
|
|
170
|
-
|
|
171
|
-
|
|
180
|
+
stack = children.reverse_each.to_a
|
|
181
|
+
until stack.empty?
|
|
182
|
+
node = stack.pop
|
|
183
|
+
result << node
|
|
184
|
+
stack.concat(node.children.reverse_each.to_a) if node.children.any?
|
|
172
185
|
end
|
|
173
186
|
result
|
|
174
187
|
end
|
|
@@ -158,7 +158,7 @@ module Canon
|
|
|
158
158
|
return false unless node
|
|
159
159
|
|
|
160
160
|
# List of HTML elements where whitespace is semantically significant
|
|
161
|
-
whitespace_sensitive_tags =
|
|
161
|
+
whitespace_sensitive_tags = Core::TreeNode::WHITESPACE_SENSITIVE_TAGS
|
|
162
162
|
|
|
163
163
|
# Check if this node is whitespace-sensitive
|
|
164
164
|
if node.is_a?(Core::TreeNode)
|
|
@@ -211,7 +211,7 @@ module Canon
|
|
|
211
211
|
return false unless node
|
|
212
212
|
|
|
213
213
|
# List of HTML elements where whitespace is semantically significant
|
|
214
|
-
whitespace_sensitive_tags =
|
|
214
|
+
whitespace_sensitive_tags = Core::TreeNode::WHITESPACE_SENSITIVE_TAGS
|
|
215
215
|
|
|
216
216
|
# Check if this node is whitespace-sensitive
|
|
217
217
|
if node.is_a?(Core::TreeNode)
|
|
@@ -205,8 +205,10 @@ module Canon
|
|
|
205
205
|
attrs1 = node1.attributes
|
|
206
206
|
attrs2 = node2.attributes
|
|
207
207
|
|
|
208
|
-
# Check if attribute values differ (ignoring order)
|
|
209
|
-
|
|
208
|
+
# Check if attribute values differ (ignoring order).
|
|
209
|
+
# Identical raw hashes (order included) are trivially equal
|
|
210
|
+
# after sorting — the overwhelmingly common matched case.
|
|
211
|
+
if attrs1 != attrs2 && attrs1.sort.to_h != attrs2.sort.to_h
|
|
210
212
|
# Actual attribute value differences
|
|
211
213
|
changes[:attributes] = {
|
|
212
214
|
old: attrs1,
|
|
@@ -611,15 +613,12 @@ module Canon
|
|
|
611
613
|
def whitespace_sensitive?(node)
|
|
612
614
|
return false unless node
|
|
613
615
|
|
|
614
|
-
# List of HTML elements where whitespace is semantically significant
|
|
615
|
-
whitespace_sensitive_tags = %w[pre code textarea script style]
|
|
616
|
-
|
|
617
616
|
# Check if this node or any ancestor is whitespace-sensitive
|
|
618
617
|
current = node
|
|
619
618
|
while current
|
|
620
619
|
if current.is_a?(Core::TreeNode)
|
|
621
620
|
label = current.label.to_s.downcase
|
|
622
|
-
return true if
|
|
621
|
+
return true if Core::TreeNode::WHITESPACE_SENSITIVE_TAGS.include?(label)
|
|
623
622
|
end
|
|
624
623
|
|
|
625
624
|
current = current.is_a?(Core::TreeNode) ? current.parent : nil
|
data/lib/canon/version.rb
CHANGED