diffview = { buildView: function (params) { var baseTextLines = params.baseTextLines; var newTextLines = params.newTextLines; var opcodes = params.opcodes; var baseTextName = params.baseTextName ? params.baseTextName : "Base Text"; var newTextName = params.newTextName ? params.newTextName : "New Text"; var contextSize = params.contextSize; var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0; if (baseTextLines == null) throw "Cannot build diff view; baseTextLines is not defined."; if (newTextLines == null) throw "Cannot build diff view; newTextLines is not defined."; if (!opcodes) throw "Canno build diff view; opcodes is not defined."; function celt(name, clazz) { var e = document.createElement(name); e.className = clazz; return e; } function telt(name, text) { var e = document.createElement(name); e.appendChild(document.createTextNode(text)); return e; } function ctelt(name, clazz, text) { var e = document.createElement(name); e.className = clazz; e.appendChild(document.createTextNode(text)); return e; } var tdata = document.createElement("thead"); var node = document.createElement("tr"); tdata.appendChild(node); if (inline) { node.appendChild(document.createElement("th")); node.appendChild(document.createElement("th")); node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName)); } else { node.appendChild(document.createElement("th")); node.appendChild(ctelt("th", "texttitle", baseTextName)); node.appendChild(document.createElement("th")); node.appendChild(ctelt("th", "texttitle", newTextName)); } tdata = [tdata]; var rows = []; var node2; function addCells(row, tidx, tend, textLines, change) { if (tidx < tend) { row.appendChild(telt("th", (tidx + 1).toString())); row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); return tidx + 1; } else { row.appendChild(document.createElement("th")); row.appendChild(celt("td", "empty")); return tidx; } } function addCellsInline(row, tidx, tidx2, textLines, change) { row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString())); row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString())); row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); } for (var idx = 0; idx < opcodes.length; idx++) { code = opcodes[idx]; change = code[0]; var b = code[1]; var be = code[2]; var n = code[3]; var ne = code[4]; var rowcnt = Math.max(be - b, ne - n); var toprows = []; var botrows = []; for (var i = 0; i < rowcnt; i++) { if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change == "equal") { var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize); if (jump > 1) { toprows.push(node = document.createElement("tr")); b += jump; n += jump; i += jump - 1; node.appendChild(telt("th", "...")); if (!inline) node.appendChild(ctelt("td", "skip", "")); node.appendChild(telt("th", "...")); node.appendChild(ctelt("td", "skip", "")); if (idx + 1 == opcodes.length) { break; } else { continue; } } } toprows.push(node = document.createElement("tr")); if (inline) { if (change == "insert") { addCellsInline(node, null, n++, newTextLines, change); } else if (change == "replace") { botrows.push(node2 = document.createElement("tr")); if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete"); if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert"); } else if (change == "delete") { addCellsInline(node, b++, null, baseTextLines, change); } else { addCellsInline(node, b++, n++, baseTextLines, change); } } else { b = addCells(node, b, be, baseTextLines, change); n = addCells(node, n, ne, newTextLines, change); } } for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]); for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]); } tdata.push(node = document.createElement("tbody")); for (var idx in rows) node.appendChild(rows[idx]); node = celt("table", "diff" + (inline ? " inlinediff" : "")); for (var idx in tdata) node.appendChild(tdata[idx]); return node; } }