pad

minimal etherpad alternative  https://pad.ce9e.org
git clone https://git.ce9e.org/pad.git

commit
13fb1e81ed10a826560fe7fe46821651e22cf318
parent
fd81e691916458ec287958a3227df93b80ef945c
Author
OpenCode <opencode@example.com>
Date
2026-10-31 22:59
fix bound diff merges

Diffstat

M static/diff.js 10 ++++++----
M static/test.js 1 +

2 files changed, 7 insertions, 4 deletions


diff --git a/static/diff.js b/static/diff.js

@@ -65,15 +65,17 @@ export var diff = function(text1, text2, ctx) {
   65    65 
   66    66 export var merge = function([start1, end1, before1, after1], [start2, end2, before2, after2]) {
   67    67 	if (start1 + after1.length + end1 === start2 + before2.length + end2) {
   -1    68 		var d = start2 - start1;
   -1    69 
   68    70 		// merge subsequent inserts
   69    -1 		if (start2 >= start1 && after1.slice(start2 - start1).startsWith(before2)) {
   70    -1 			var after = _apply(after1, [start2 - start1, before2, after2]);
   -1    71 		if (d >= 0 && d <= after1.length && after1.slice(d).startsWith(before2)) {
   -1    72 			var after = _apply(after1, [d, before2, after2]);
   71    73 			return [[start1, end1, before1, after]];
   72    74 		}
   73    75 
   74    76 		// merge subsequent deletes (inverse insert)
   75    -1 		if (start1 >= start2 && before2.slice(start1 - start2).startsWith(after1)) {
   76    -1 			var before = _apply(before2, [start1 - start2, after1, before1]);
   -1    77 		if (-d >= 0 && -d <= before2.length && before2.slice(-d).startsWith(after1)) {
   -1    78 			var before = _apply(before2, [-d, after1, before1]);
   77    79 			return [[start2, end2, before, after2]];
   78    80 		}
   79    81 	}

diff --git a/static/test.js b/static/test.js

@@ -25,3 +25,4 @@ assertEqual(diff.diff('xxasdz', 'xxasz', 3), [1, 0, 'xasdz', 'xasz'], 'diff dele
   25    25 
   26    26 assertEqual(diff.merge([1, 0, 'foobaz', 'foobbaz'], [2, 1, 'oobba', 'oobaba']), [[1, 0, 'foobaz', 'foobabaz']], 'merge insert');
   27    27 assertEqual(diff.merge([1, 1, 'fooba', 'foba'], [0, 0, 'Xfobaz', 'Xfbaz']), [[0, 0, 'Xfoobaz', 'Xfbaz']], 'merge delete');
   -1    28 assertEqual(diff.merge([0, 2, 'a', 'b'], [2, 0, 'a', 'b']), [[0, 2, 'a', 'b'], [2, 0, 'a', 'b']], 'do not merge separate changes');