Skip to content

Commit 066b635

Browse files
committed
fixed DiffFromDelta bug where byte slicing was used instead of rune slicing
1 parent 26f1870 commit 066b635

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

diff/dmp.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,43 +1474,38 @@ func (dmp *DiffMatchPatch) DiffFromDelta(text1, delta string) (diffs []Diff, err
14741474
// operation of this token (delete, insert, equality).
14751475
param := token[1:]
14761476

1477-
switch token[0] {
1477+
switch op := token[0]; op {
14781478
case '+':
14791479
// decode would Diff all "+" to " "
14801480
param = strings.Replace(param, "+", "%2b", -1)
14811481
param, _ = url.QueryUnescape(param)
14821482
diffs = append(diffs, Diff{DiffInsert, param})
1483-
break
14841483
case '=', '-':
14851484
n, err := strconv.ParseInt(param, 10, 0)
14861485
if err != nil {
14871486
return diffs, err
1488-
}
1489-
1490-
if n < 0 {
1487+
} else if n < 0 {
14911488
return diffs, errors.New("Negative number in DiffFromDelta: " + param)
14921489
}
14931490

1494-
text := text1[pointer : pointer+int(n)]
1491+
// remember that string slicing is by byte - we want by rune here.
1492+
text := string([]rune(text1)[pointer : pointer+int(n)])
14951493
pointer += int(n)
14961494

1497-
if token[0] == '=' {
1495+
if op == '=' {
14981496
diffs = append(diffs, Diff{DiffEqual, text})
14991497
} else {
15001498
diffs = append(diffs, Diff{DiffDelete, text})
15011499
}
1502-
break
15031500
default:
15041501
// Anything else is an error.
15051502
return diffs, errors.New("Invalid diff operation in DiffFromDelta: " + string(token[0]))
15061503
}
15071504
}
15081505

1509-
if pointer != len(text1) {
1510-
return diffs, errors.New("Delta length (" + string(pointer) + ") smaller than source text length (" + string(len(text1)) + ").")
1506+
if pointer != len([]rune(text1)) {
1507+
return diffs, fmt.Errorf("Delta length (%v) smaller than source text length (%v)", pointer, len(text1))
15111508
}
1512-
fmt.Println("") //text1, pointer, n)
1513-
15141509
return diffs, err
15151510
}
15161511

diff/dmp_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,10 @@ func Test_diffDelta(t *testing.T) {
731731
// Lowercase, due to UrlEncode uses lower.
732732
assert.Equal(t, "=7\t-7\t+%DA%82 %02 %5C %7C", delta)
733733

734-
_res1, _ := dmp.DiffFromDelta(text1, delta)
734+
_res1, err := dmp.DiffFromDelta(text1, delta)
735+
if err != nil {
736+
t.Fatal(err)
737+
}
735738
assertDiffEqual(t, diffs, _res1)
736739

737740
// Verify pool of unchanged characters.

0 commit comments

Comments
 (0)