3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# File 'lib/strokedb/sync/diff/string.rb', line 3
def stroke_diff(to)
return super(to) unless to.is_a?(String)
return nil if self == to
_f = self[0,2]
_t = to[0,2]
pfx = "@#"
return super(to) if _f == _t && _t == pfx
return super(to) if _f == pfx || _t == pfx
lcs_diff = ::Diff::LCS.diff(self, to)
patchset = lcs_diff.map do |changes|
parts = []
last_part = changes.inject(nil) do |part, change|
if part && part[0] == change.action && part[3] == change.position - 1
part[3] += 1
part[2] << change.element
part
else
parts << part if part
[change.action, change.position, change.element, change.position]
end
end
parts << last_part if last_part
parts.empty? ? nil : parts
end.compact.inject([]) do |patches, ps|
ps.map do |p|
patches << if p[0] == '+'
[PATCH_PLUS, p[1], p[2]] else
[PATCH_MINUS, p[1], p[2].size] end
end
patches
end
patchset.empty? ? nil : patchset
end
|