Skip to content

Commit 039e9c4

Browse files
committed
word level diff
1 parent f728d45 commit 039e9c4

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

diffview.css

+12-3
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,27 @@ table.diff .replace {
6666
background-color:#FD8
6767
}
6868
table.diff .delete {
69-
background-color:#E99;
69+
background-color:#FDD;
7070
}
7171
table.diff .skip {
7272
background-color:#EFEFEF;
7373
border:1px solid #AAA;
7474
border-right:1px solid #BBC;
7575
}
7676
table.diff .insert {
77-
background-color:#9E9
77+
background-color:#CFC
7878
}
7979
table.diff th.author {
8080
text-align:right;
8181
border-top:1px solid #BBC;
8282
background:#EFEFEF
83-
}
83+
}
84+
ins.diff {
85+
background-color: #50FF50;
86+
text-decoration: none;
87+
}
88+
del.diff {
89+
background-color: #fff;
90+
color: #999;
91+
text-decoration: line-through;
92+
}

diffview.js

+54-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ var diffview = {
5151
var baseTextName = params.baseTextName ? params.baseTextName : "Base Text";
5252
var newTextName = params.newTextName ? params.newTextName : "New Text";
5353
var contextSize = params.contextSize;
54-
var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0;
54+
var inline = (params.viewType == 0 || params.viewType >= 1) ? params.viewType : 0;
55+
var wordlevel = params.viewType > 1;
5556

5657
if (baseTextLines == null)
5758
throw "Cannot build diff view; baseTextLines is not defined.";
@@ -78,6 +79,13 @@ var diffview = {
7879
e.appendChild(document.createTextNode(text));
7980
return e;
8081
}
82+
83+
function ctel (name, clazz, node) {
84+
var e = document.createElement(name);
85+
e.className = clazz;
86+
e.appendChild(node);
87+
return e;
88+
}
8189

8290
var tdata = document.createElement("thead");
8391
var node = document.createElement("tr");
@@ -123,7 +131,13 @@ var diffview = {
123131
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString()));
124132
row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
125133
}
126-
134+
135+
function addCellsNode (row, tidx, tidx2, node, change) {
136+
row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString()));
137+
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString()));
138+
row.appendChild(ctel("td", change, node));
139+
}
140+
127141
for (var idx = 0; idx < opcodes.length; idx++) {
128142
code = opcodes[idx];
129143
change = code[0];
@@ -164,8 +178,46 @@ var diffview = {
164178
addCellsInline(node, null, n++, newTextLines, change);
165179
} else if (change == "replace") {
166180
botrows.push(node2 = document.createElement("tr"));
181+
if (wordlevel) {
182+
var baseTextLine = baseTextLines[b];
183+
var newTextLine = newTextLines[n];
184+
var wordrule = /([^\S]+|[a-zA-Z0-9_-]+|.)(?:(?!<)[^\S])?/;
185+
var bw = baseTextLine.split(wordrule);
186+
var nw = newTextLine.split(wordrule);
187+
var wsm = new difflib.SequenceMatcher(bw, nw);
188+
var wopcodes = wsm.get_opcodes();
189+
var bnode = document.createElement('span');
190+
var nnode = document.createElement('span');
191+
for (var k = 0; k < wopcodes.length; k++) {
192+
var wcode = wopcodes[k];
193+
var wchange = wcode[0];
194+
var wb = wcode[1];
195+
var wbe = wcode[2];
196+
var wn = wcode[3];
197+
var wne = wcode[4];
198+
var wcnt = Math.max(wbe - wb, wne - wn);
199+
200+
for (var m = 0; m < wcnt; m++) {
201+
if (wchange == "insert") {
202+
nnode.appendChild(ctelt("ins", "diff", nw[wn++]));
203+
} else if (wchange == "replace") {
204+
if (wb < wbe) bnode.appendChild(ctelt("del", "diff", bw[wb++]));
205+
if (wn < wne) nnode.appendChild(ctelt("ins", "diff", nw[wn++]));
206+
} else if (wchange == "delete") {
207+
bnode.appendChild(ctelt("del", "diff", bw[wb++]));
208+
} else {
209+
// equal
210+
bnode.appendChild(ctelt("span", wchange, bw[wb]));
211+
nnode.appendChild(ctelt("span", wchange, bw[wb++]));
212+
}
213+
}
214+
}
215+
if (b < be) addCellsNode(node, b++, null, bnode, "delete");
216+
if (n < ne) addCellsNode(node2, null, n++, nnode, "insert");
217+
} else {
167218
if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete");
168219
if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert");
220+
}
169221
} else if (change == "delete") {
170222
addCellsInline(node, b++, null, baseTextLines, change);
171223
} else {

0 commit comments

Comments
 (0)