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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88bb496bdbab5cc434e73d3f353563e110bbaf0b73a76f009886e45743206984
4
- data.tar.gz: c00284c8cc531ed825633e8e2250a1dbead21ec4db083529a6bef5d3b909bd4b
3
+ metadata.gz: e7b141fefd0f254d40b0ba7621c7400d882f5a0bcee1fc2f96a51424ce4c7c36
4
+ data.tar.gz: '018e400f0949c85ca2db99aa362664e6434834b135e32efc891b9f4b1c794f46'
5
5
  SHA512:
6
- metadata.gz: 7e32bb5f265281f3ba69a7b9c130025d84f27578084a8a90267edaefc7e5cc6cedd8b2aa72db0a930d38def70ac07f826fc80e767cda72089d3ebedbc88219f4
7
- data.tar.gz: 82a1b117a2f121dbd436962937b1aec7de7ef691b8d15f51fbf69155d6ff9fe09af5ed5f69efdbfa4724af65dbd3858525a56ac22ebb6d603c91ad9b032ab590
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
- lines = []
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
- fmt = dn.formatting?
93
- dn.serialized_before&.split("\n")&.each do |line|
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, content: line,
96
- type: :removed, diff_node: dn, formatting: fmt
117
+ line_number: nil, new_position: nil,
118
+ content: change.old_element, type: :unchanged,
119
+ diff_node: diff_node
97
120
  )
98
- end
99
- next unless dn.serialized_after
100
-
101
- dn.serialized_after.split("\n").each do |line|
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, content: line,
104
- type: :added, diff_node: dn, formatting: fmt
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 << Canon::Diff::DiffContext.new(lines: lines)
174
+ report.contexts.length
109
175
  end
110
176
 
111
177
  # Format a DiffReport for display
data/lib/canon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Canon
4
- VERSION = "0.3.43"
4
+ VERSION = "0.3.44"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.43
4
+ version: 0.3.44
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.