Skip to content

Commit

Permalink
Update: Change line No (one-based) in output of diff.lines to line …
Browse files Browse the repository at this point in the history
…index (zero-based)
  • Loading branch information
sttk committed Sep 9, 2019
1 parent 6f4a853 commit aa4ad79
Show file tree
Hide file tree
Showing 8 changed files with 122 additions and 47 deletions.
67 changes: 65 additions & 2 deletions README.md
Expand Up @@ -109,8 +109,71 @@ The edit info is an object of which properties is as follows:
| `type` | The edit type. This property can have following values: `'a'` (Adding), `'d'` (Deleting), and `'c'` (Changing). |
| `src` | The range of indexies in *srcText* to be editted. This is an object which has two indexes: `start` and `end`. |
| `dest` | The range of indexies in *destText* to be editted. This is an object which has two indexes: `start` and `end`. |
| `lines.src` | The range of line numbers in *srcText* to be editted. This is an object which has two line numbers: `start` and `end`. |
| `lines.dest` | The range of line numbers in *destText* to be editted. This is an object which has two line numbers: `start` and `end`. |
| `lines.src` | The range of line indexes in *srcText* to be editted. This is an object which has two line indexes: `start` and `end`. |
| `lines.dest` | The range of line indexes in *destText* to be editted. This is an object which has two line indexes: `start` and `end`. |

The line index is zero-based. The ways to get lines to be editted are as follows:

```js
const srcText = 'aaa\nbbb\nccc\nddd';
const dstText = 'aaa\nbb\ncccc\ne\nddd';
diff.lines(srcText, dstText).forEach(d => {
const src = srcText.slice(d.src.start, d.src.end);
const dst = dstText.slice(d.dest.start, d.dest.end);

if (src) console.log('< ' + src.replace(/\n/g, '\n< '));
if (src && dst) console.log('---');
if (dst) console.log('> ' + dst.replace(/\n/g, '\n> '));
});
// => < bbb
// < ccc
// ---
// > bb
// > cccc
// > e
```

or

```js
const srcText = 'aaa\nbbb\nccc\nddd';
const dstText = 'aaa\nbb\ncccc\ne\nddd';
diff.lines(srcText, dstText).forEach(d => {
const srcLines = srcText.split('\n')
.slice(d.lines.src.start, d.lines.src.end);
const dstLines = dstText.split('\n')
.slice(d.lines.dest.start, d.lines.dest.end);

console.log(srcLines.map(line => '< ' + line).join('\n'));
if (srcLines.length && dstLines.length) console.log('---');
console.log(dstLines.map(line => '> ' + line).join('\n'));
});
// => < bbb
// < ccc
// ---
// > bb
// > cccc
// > e
```

The way to get line numbers as diff normal format is as follows:

```js
const srcText = 'aaa\nbbb\nccc\nddd';
const dstText = 'aaa\nbb\ncccc\ne\nddd';
function getLineNo(range) {
if (range.start === range.end) return range.start; // Minus line index

var st = range.start + 1; // Plus start line index to start line No.
var ed = range.end; // Plus end line index to last line No.
if (st === ed) return st;
return st + ',' + ed;
}
diff.lines(srcText, dstText).forEach(d => {
console.log(getLineNo(d.lines.src) + d.type + getLineNo(d.lines.dest));
});
// => 2,3c2,4
```

## Checked

Expand Down
2 changes: 1 addition & 1 deletion lib/lines/calc-line-no.js
Expand Up @@ -6,7 +6,7 @@ function plusStart(index, text) {
index++;
}
}
var lineNo = text.slice(0, index).replace(/[^\n]/g, '').length + 1;
var lineNo = text.slice(0, index).replace(/[^\n]/g, '').length;
return {
index: index,
lineNo: lineNo,
Expand Down
74 changes: 37 additions & 37 deletions test/line-no/line-no.plus-start.test.js
Expand Up @@ -18,40 +18,40 @@ function log(result, text, start) {
}

console.log('-- plus range start');
checkPlusStart('', 0, 0, 1);
checkPlusStart('\n', 0, 0, 1);
checkPlusStart('\n\n', 0, 0, 1);
checkPlusStart('\n\n', 1, 1, 2);

checkPlusStart('aaa\nbbb\nccc\n', 0, 0, 1);
checkPlusStart('aaa\nbbb\nccc\n', 3, 4, 2);
checkPlusStart('aaa\nbbb\nccc\n', 4, 4, 2);
checkPlusStart('aaa\nbbb\nccc\n', 7, 8, 3);
checkPlusStart('aaa\nbbb\nccc\n', 8, 8, 3);
checkPlusStart('aaa\nbbb\nccc\n', 11, 12, 4);

checkPlusStart('aaa\nbbb\nccc\nddd', 11, 12, 4);
checkPlusStart('aaa\nbbb\nccc\nddd', 12, 12, 4);

checkPlusStart('\naaa\nbbb\nccc\n', 0, 0, 1);
checkPlusStart('\naaa\nbbb\nccc\n', 1, 1, 2);
checkPlusStart('\naaa\nbbb\nccc\n', 4, 5, 3);
checkPlusStart('\naaa\nbbb\nccc\n', 5, 5, 3);
checkPlusStart('\naaa\nbbb\nccc\n', 8, 9, 4);
checkPlusStart('\naaa\nbbb\nccc\n', 9, 9, 4);

checkPlusStart('\naaa\nbbb\nccc\nddd', 12, 13, 5);
checkPlusStart('\naaa\nbbb\nccc\nddd', 13, 13, 5);

checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 0, 0, 1);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 1, 1, 2);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 2, 2, 3);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 5, 6, 4);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 6, 6, 4);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 7, 7, 5);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 7, 7, 5);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 10, 11, 6);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 11, 11, 6);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 12, 12, 7);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 15, 16, 8);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 16, 16, 8);
checkPlusStart('', 0, 0, 0);
checkPlusStart('\n', 0, 0, 0);
checkPlusStart('\n\n', 0, 0, 0);
checkPlusStart('\n\n', 1, 1, 1);

checkPlusStart('aaa\nbbb\nccc\n', 0, 0, 0);
checkPlusStart('aaa\nbbb\nccc\n', 3, 4, 1);
checkPlusStart('aaa\nbbb\nccc\n', 4, 4, 1);
checkPlusStart('aaa\nbbb\nccc\n', 7, 8, 2);
checkPlusStart('aaa\nbbb\nccc\n', 8, 8, 2);
checkPlusStart('aaa\nbbb\nccc\n', 11, 12, 3);

checkPlusStart('aaa\nbbb\nccc\nddd', 11, 12, 3);
checkPlusStart('aaa\nbbb\nccc\nddd', 12, 12, 3);

checkPlusStart('\naaa\nbbb\nccc\n', 0, 0, 0);
checkPlusStart('\naaa\nbbb\nccc\n', 1, 1, 1);
checkPlusStart('\naaa\nbbb\nccc\n', 4, 5, 2);
checkPlusStart('\naaa\nbbb\nccc\n', 5, 5, 2);
checkPlusStart('\naaa\nbbb\nccc\n', 8, 9, 3);
checkPlusStart('\naaa\nbbb\nccc\n', 9, 9, 3);

checkPlusStart('\naaa\nbbb\nccc\nddd', 12, 13, 4);
checkPlusStart('\naaa\nbbb\nccc\nddd', 13, 13, 4);

checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 0, 0, 0);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 1, 1, 1);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 2, 2, 2);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 5, 6, 3);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 6, 6, 3);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 7, 7, 4);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 7, 7, 4);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 10, 11, 5);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 11, 11, 5);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 12, 12, 6);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 15, 16, 7);
checkPlusStart('\n\naaa\n\nbbb\n\nccc\n\n', 16, 16, 7);
10 changes: 8 additions & 2 deletions test/tool/format-line-diff.js
Expand Up @@ -28,10 +28,16 @@ function formatLineDiff(diffs, text1, text2) {
}

function getRange(range) {
if (range.start === range.end) {
if (range.start === range.end) { // minus line No
return range.start;
}
return range.start + ',' + range.end;

var st = range.start + 1; // start index to first line No (1 origin)
var ed = range.end; // end index to last line No
if (st === ed) {
return st;
}
return st + ',' + ed;
}

function getLineText(mark, text, range) {
Expand Down
10 changes: 8 additions & 2 deletions test/web/browser-test.js
Expand Up @@ -772,10 +772,16 @@ function formatLineDiff(diffs, text1, text2) {
}

function getRange(range) {
if (range.start === range.end) {
if (range.start === range.end) { // minus line No
return range.start;
}
return range.start + ',' + range.end;

var st = range.start + 1; // start index to first line No (1 origin)
var ed = range.end; // end index to last line No
if (st === ed) {
return st;
}
return st + ',' + ed;
}

function getLineText(mark, text, range) {
Expand Down
2 changes: 1 addition & 1 deletion web/fav.text.diff.js
Expand Up @@ -272,7 +272,7 @@ function plusStart(index, text) {
index++;
}
}
var lineNo = text.slice(0, index).replace(/[^\n]/g, '').length + 1;
var lineNo = text.slice(0, index).replace(/[^\n]/g, '').length;
return {
index: index,
lineNo: lineNo,
Expand Down
2 changes: 1 addition & 1 deletion web/fav.text.diff.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit aa4ad79

Please sign in to comment.