diff: correctness fixes
This commit is contained in:
parent
f2155babe0
commit
0fe5b74319
36
diff/diff.go
36
diff/diff.go
@ -1,3 +1,7 @@
|
|||||||
|
// Paul's Simple Diff Algorithm v 0.1
|
||||||
|
// (C) Paul Butler 2007 <http://www.paulbutler.org/>
|
||||||
|
// May be used and distributed under the zlib/libpng license.
|
||||||
|
// https://github.com/paulgb/simplediff/
|
||||||
package diff
|
package diff
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -6,13 +10,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
|
||||||
Paul's Simple Diff Algorithm v 0.1
|
|
||||||
(C) Paul Butler 2007 <http://www.paulbutler.org/>
|
|
||||||
May be used and distributed under the zlib/libpng license.
|
|
||||||
https://github.com/paulgb/simplediff/
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Separator string = "\n"
|
var Separator string = "\n"
|
||||||
|
|
||||||
type Operation int8
|
type Operation int8
|
||||||
@ -29,17 +26,30 @@ type Instruction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *Instruction) RenderHTML() string {
|
func (this *Instruction) RenderHTML() string {
|
||||||
|
sc := strings.Join(this.Content, Separator)
|
||||||
|
if len(sc) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
switch this.Op {
|
switch this.Op {
|
||||||
case OP_INSERTED:
|
case OP_INSERTED:
|
||||||
return `<ins>` + strings.Join(this.Content, Separator) + `</ins>`
|
return `<ins>` + sc + `</ins>`
|
||||||
case OP_REMOVED:
|
case OP_REMOVED:
|
||||||
return `<del>` + strings.Join(this.Content, Separator) + `</del>`
|
return `<del>` + sc + `</del>`
|
||||||
default: //OP_UNCHANGED:
|
default: //OP_UNCHANGED:
|
||||||
return strings.Join(this.Content, Separator)
|
return sc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type twoints struct {
|
||||||
|
O, N int
|
||||||
|
}
|
||||||
|
|
||||||
func Diff(o, n []string) []Instruction {
|
func Diff(o, n []string) []Instruction {
|
||||||
|
if len(o) == 0 && len(n) == 0 {
|
||||||
|
return []Instruction{}
|
||||||
|
}
|
||||||
|
|
||||||
maxl := 0
|
maxl := 0
|
||||||
omax := 0
|
omax := 0
|
||||||
nmax := 0
|
nmax := 0
|
||||||
@ -56,7 +66,7 @@ func Diff(o, n []string) []Instruction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build diff matrix
|
// Build diff matrix
|
||||||
for nindex, _ := range n {
|
for nindex, _ := range nkeys {
|
||||||
if _, ok := matrix[oindex]; !ok {
|
if _, ok := matrix[oindex]; !ok {
|
||||||
matrix[oindex] = make(map[int]int, len(n)+1)
|
matrix[oindex] = make(map[int]int, len(n)+1)
|
||||||
}
|
}
|
||||||
@ -79,9 +89,9 @@ func Diff(o, n []string) []Instruction {
|
|||||||
|
|
||||||
ret := Diff(o[0:omax], n[0:nmax])
|
ret := Diff(o[0:omax], n[0:nmax])
|
||||||
if maxl != nmax {
|
if maxl != nmax {
|
||||||
ret = append(ret, Instruction{OP_UNCHANGED, n[nmax:maxl]})
|
ret = append(ret, Instruction{OP_UNCHANGED, n[nmax : maxl-nmax]})
|
||||||
}
|
}
|
||||||
ret = append(ret, Diff(o[0:omax+maxl], n[0:nmax+maxl])...)
|
ret = append(ret, Diff(o[omax+maxl:], n[nmax+maxl:])...)
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user