forked from cryptpad/cryptpad
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ansuz
committed
Feb 1, 2018
1 parent
970122b
commit 0672c2f
Showing
1 changed file
with
61 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
define([ | ||
'/bower_components/chainpad/chainpad.dist.js', | ||
], function (ChainPad) { | ||
var Diff = ChainPad.Diff; | ||
|
||
var isSpace = function (S, i) { | ||
return /^\s$/.test(S.charAt(i)); | ||
}; | ||
|
||
var leadingBoundary = function (S, offset) { | ||
if (/\s/.test(S.charAt(offset))) { return offset; } | ||
while (offset > 0) { | ||
offset--; | ||
if (isSpace(S, offset)) { offset++; break; } | ||
} | ||
return offset; | ||
}; | ||
|
||
var trailingBoundary = function (S, offset) { | ||
if (isSpace(S, offset)) { return offset; } | ||
while (offset < S.length && !/\s/.test(S.charAt(offset))) { | ||
offset++; | ||
} | ||
return offset; | ||
}; | ||
|
||
var opsToWords = function (last, current) { | ||
var output = []; | ||
Diff.diff(A, B).forEach(function (op) { | ||
// ignore deleted sections... | ||
var offset = op.offset; | ||
var toInsert = op.toInsert; | ||
|
||
// given an operation, check whether it is a word fragment, | ||
// if it is, expand it to its word boundaries | ||
var first = B.slice(leadingBoundary(B, offset), offset); | ||
var last = B.slice(offset + toInsert.length, trailingBoundary(B, offset + toInsert.length)); | ||
|
||
var result = first + toInsert + last; | ||
// concat-in-place | ||
Array.prototype.push.apply(output, result.split(/\s+/)); | ||
}); | ||
return output; | ||
}; | ||
|
||
var runningDiff = function (getter, f, time) { | ||
var last = getter(); | ||
// first time through, send all the words :D | ||
f(opsToWords("", last)); | ||
return setInterval(function () { | ||
var current = getter(); | ||
|
||
// find inserted words... | ||
var words = opsToWords(last, current); | ||
last = current; | ||
f(words); | ||
}, time); | ||
}; | ||
|
||
return runningDiff; | ||
}); |