canon 0.3.43 → 0.3.44
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/diff_formatter/by_line/xml_formatter.rb +78 -12
- 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: e7b141fefd0f254d40b0ba7621c7400d882f5a0bcee1fc2f96a51424ce4c7c36
|
|
4
|
+
data.tar.gz: '018e400f0949c85ca2db99aa362664e6434834b135e32efc891b9f4b1c794f46'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0d25eaf6dfa12649678fb9e770762fbf1ad51923d7da03b168aa36acbb11fe3242edb958069b9738bf097aa0c90188498b3408f1fd900589bc091394c578d394
|
|
7
|
+
data.tar.gz: e519ee287d5016becf20d31ad057d825d9c6118273305ce713f13c8c0429172283b576fe6a0c477a91cfbda92328b8a4d4f3491b1e6c34e69425d24ff7f12eb1
|
|
@@ -87,25 +87,91 @@ module Canon
|
|
|
87
87
|
end
|
|
88
88
|
return if unlocated.empty?
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
# Place each unlocated node's context after the report
|
|
91
|
+
# context containing its nearest preceding LOCATED node
|
|
92
|
+
# (@differences is comparator-walk order = document order),
|
|
93
|
+
# so the change reads in position instead of trailing.
|
|
91
94
|
unlocated.each do |dn|
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
context = Canon::Diff::DiffContext.new(
|
|
96
|
+
lines: unlocated_lines(dn),
|
|
97
|
+
)
|
|
98
|
+
anchor_index = context_index_after(report, preceding_located(dn))
|
|
99
|
+
report.contexts.insert(anchor_index, context)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Mini-diff of one unlocated node's serialized sides: shared
|
|
104
|
+
# lines render as :unchanged context instead of remove-all +
|
|
105
|
+
# add-all. Blank line numbers throughout — no located position.
|
|
106
|
+
def unlocated_lines(diff_node)
|
|
107
|
+
before = diff_node.serialized_before&.split("\n") || []
|
|
108
|
+
after = diff_node.serialized_after&.split("\n") || []
|
|
109
|
+
fmt = diff_node.formatting?
|
|
110
|
+
lines = []
|
|
111
|
+
require "diff/lcs" unless defined?(::Diff::LCS)
|
|
112
|
+
|
|
113
|
+
::Diff::LCS.sdiff(before, after).each do |change|
|
|
114
|
+
case change.action
|
|
115
|
+
when "="
|
|
94
116
|
lines << Canon::Diff::DiffLine.new(
|
|
95
|
-
line_number: nil, new_position: nil,
|
|
96
|
-
|
|
117
|
+
line_number: nil, new_position: nil,
|
|
118
|
+
content: change.old_element, type: :unchanged,
|
|
119
|
+
diff_node: diff_node
|
|
97
120
|
)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
121
|
+
when "-"
|
|
122
|
+
lines << Canon::Diff::DiffLine.new(
|
|
123
|
+
line_number: nil, new_position: nil,
|
|
124
|
+
content: change.old_element, type: :removed,
|
|
125
|
+
diff_node: diff_node, formatting: fmt
|
|
126
|
+
)
|
|
127
|
+
when "+"
|
|
102
128
|
lines << Canon::Diff::DiffLine.new(
|
|
103
|
-
line_number: nil, new_position: nil,
|
|
104
|
-
|
|
129
|
+
line_number: nil, new_position: nil,
|
|
130
|
+
content: change.new_element, type: :added,
|
|
131
|
+
diff_node: diff_node, formatting: fmt
|
|
105
132
|
)
|
|
133
|
+
when "!"
|
|
134
|
+
lines << Canon::Diff::DiffLine.new(
|
|
135
|
+
line_number: nil, new_position: nil,
|
|
136
|
+
content: change.old_element, type: :removed,
|
|
137
|
+
diff_node: diff_node, formatting: fmt
|
|
138
|
+
)
|
|
139
|
+
lines << Canon::Diff::DiffLine.new(
|
|
140
|
+
line_number: nil, new_position: nil,
|
|
141
|
+
content: change.new_element, type: :added,
|
|
142
|
+
diff_node: diff_node, formatting: fmt
|
|
143
|
+
)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
lines
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# The nearest preceding node (in @differences walk order)
|
|
150
|
+
# that the enricher DID locate.
|
|
151
|
+
def preceding_located(diff_node)
|
|
152
|
+
index = @differences.index(diff_node)
|
|
153
|
+
return nil unless index
|
|
154
|
+
|
|
155
|
+
(index - 1).downto(0) do |i|
|
|
156
|
+
dn = @differences[i]
|
|
157
|
+
return dn if dn.char_ranges && !dn.char_ranges.empty?
|
|
158
|
+
end
|
|
159
|
+
nil
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Index into report.contexts for inserting an unlocated
|
|
163
|
+
# context: after the context holding the anchor node's lines,
|
|
164
|
+
# or at the front when the anchor is nil (nothing precedes).
|
|
165
|
+
def context_index_after(report, anchor_node)
|
|
166
|
+
return 0 if anchor_node.nil?
|
|
167
|
+
|
|
168
|
+
report.contexts.each_with_index do |context, idx|
|
|
169
|
+
has_anchor = context.lines.any? do |dl|
|
|
170
|
+
dl.diff_node&.equal?(anchor_node)
|
|
106
171
|
end
|
|
172
|
+
return idx + 1 if has_anchor
|
|
107
173
|
end
|
|
108
|
-
report.contexts
|
|
174
|
+
report.contexts.length
|
|
109
175
|
end
|
|
110
176
|
|
|
111
177
|
# Format a DiffReport for display
|
data/lib/canon/version.rb
CHANGED