Content deleted Content added
1.0.5 (August 26, 2014) fix fragment marks (maxWords), fullDiff support |
1.0.5 (August 27, 2014) shorten output: restrict fragment length to max number of lines (good for lists) |
||
Line 2:
// @name wDiff
// @version 1.0.
// @date August
// @description improved word-based diff library with block move detection
// @homepage https://en.wikipedia.org/wiki/User:Cacycle/diff
Line 232:
if (typeof wDiff.blankAfterMin == 'undefined') { wDiff.blankAfterMin = 500; }
if (typeof wDiff.charsAfter == 'undefined') { wDiff.charsAfter = 500; }
// lines before and after diff tag to search for previous heading, paragraph, line break, cut characters
if (typeof wDiff.linesBeforeMax == 'undefined') { wDiff.linesBeforeMax = 10; }
if (typeof wDiff.linesAfterMax == 'undefined') { wDiff.linesAfterMax = 10; }
// maximal fragment distance to join close fragments
if (typeof wDiff.
if (typeof wDiff.fragmentJoinChars == 'undefined') { wDiff.fragmentJoinChars = 1000; }
Line 2,056 ⟶ 2,061:
var rangeEndType = [];
// get line break positions
var lineBreaks = [];
var pos = 0;
do {
lineBreaks.push(pos);
pos = html.indexOf('\n', pos + 1);
} while (pos != -1);
lineBreaks.push(html.length);
// cycle through diff tag start positions
for (var i = 0; i < tagStart.length; i ++) {
var regExpMatch;
// maximal lines to search before diff tag
var rangeStartMin = 0;
for (var j = 0; j < lineBreaks.length - 1; j ++) {
if (tagStart[i] < lineBreaks[j + 1]) {
if (j >= wDiff.linesBeforeMax) {
rangeStartMin = lineBreaks[j - wDiff.linesBeforeMax];
}
break;
}
}
// find last heading before diff tag
var lastPos = tagStart[i] - wDiff.headingBefore;
if (lastPos <
lastPos =
}
regExpHeading.lastIndex = lastPos;
Line 2,077 ⟶ 2,102:
if (rangeStart[i] == null) {
lastPos = tagStart[i] - wDiff.paragraphBefore;
if (lastPos <
lastPos =
}
regExpParagraph.lastIndex = lastPos;
Line 2,093 ⟶ 2,118:
if (rangeStart[i] == null) {
lastPos = tagStart[i] - wDiff.lineBeforeMax;
if (lastPos <
lastPos =
}
regExpLine.lastIndex = lastPos;
Line 2,109 ⟶ 2,134:
if (rangeStart[i] == null) {
lastPos = tagStart[i] - wDiff.blankBeforeMax;
if (lastPos <
lastPos =
}
regExpBlank.lastIndex = lastPos;
Line 2,124 ⟶ 2,149:
// fixed number of chars before diff tag
if (rangeStart[i] == null) {
if (rangeStart[i]
rangeStartType[i] = 'chars';▼
rangeStart[i] = 0;▼
}
}
// fixed number of lines before diff tag
if (rangeStart[i] == null) {
}
// maximal lines to search after diff tag
var pos = tagEnd[i];
for (var j = 0; j < wDiff.linesAfterMax; j ++) {
pos = html.indexOf('\n', pos + 1);
if (pos == -1) {
rangeEndMax = html.length;
break;
}
rangeEndMax = pos;
}
Line 2,134 ⟶ 2,176:
regExpHeading.lastIndex = tagEnd[i];
if ( (regExpMatch = regExpHeading.exec(html)) != null ) {
if ( (regExpMatch.index < tagEnd[i] + wDiff.headingAfter) && (regExpMatch.index < rangeEndMax) ) {
rangeEnd[i] = regExpMatch.index + regExpMatch[0].length;
rangeEndType[i] = 'heading';
Line 2,144 ⟶ 2,186:
regExpParagraph.lastIndex = tagEnd[i];
if ( (regExpMatch = regExpParagraph.exec(html)) != null ) {
if ( (regExpMatch.index < tagEnd[i] + wDiff.paragraphAfter) && (regExpMatch.index < rangeEndMax) ) {
rangeEnd[i] = regExpMatch.index;
rangeEndType[i] = 'paragraph';
Line 2,155 ⟶ 2,197:
regExpLine.lastIndex = tagEnd[i] + wDiff.lineAfterMin;
if ( (regExpMatch = regExpLine.exec(html)) != null ) {
if ( (regExpMatch.index < tagEnd[i] + wDiff.lineAfterMax) && (regExpMatch.index < rangeEndMax) ) {
rangeEnd[i] = regExpMatch.index;
rangeEndType[i] = 'break';
Line 2,161 ⟶ 2,203:
}
}
// find blank after diff tag
Line 2,166 ⟶ 2,209:
regExpBlank.lastIndex = tagEnd[i] + wDiff.blankAfterMin;
if ( (regExpMatch = regExpBlank.exec(html)) != null ) {
if ( (regExpMatch.index < tagEnd[i] + wDiff.blankAfterMax) && (regExpMatch.index < rangeEndMax) ) {
rangeEnd[i] = regExpMatch.index;
rangeEndType[i] = 'blank';
Line 2,175 ⟶ 2,218:
// fixed number of chars after diff tag
if (rangeEnd[i] == null) {
if (rangeEnd[i]
▲ rangeEnd[i] = html.length;
rangeEndType[i] = 'chars';
}
}
// fixed number of lines after diff tag
if (rangeEnd[i] == null) {
rangeEnd[i] = rangeEndMax;
rangeEndType[i] = 'lines';
}
}
Line 2,194 ⟶ 2,242:
var j = 1;
for (var i = 1; i < rangeStart.length; i ++) {
▲ if (rangeStart[i] > fragmentEnd[j - 1] + wDiff.fragmentJoin) {
// get lines between fragments
var join = html.substring(fragmentEnd[j - 1], rangeStart[i]);
var lines = (join.match(/\n/g) || []).length;
if ( (rangeStart[i] > fragmentEnd[j - 1] + wDiff.fragmentJoinChars) || (lines > wDiff.fragmentJoinLines) ) {
fragmentStart[j] = rangeStart[i];
fragmentEnd[j] = rangeEnd[i];
Line 2,212 ⟶ 2,264:
// get text fragment
var fragment = html.substring(fragmentStart[i], fragmentEnd[i]);
// add inline marks for omitted chars and words
|