()
| 38 | ? stringAsLines(options.diff) |
| 39 | : options.diff, |
| 40 | codeBuild = function diffview_opcodes(): opcodes { |
| 41 | const table: difftable = {}, |
| 42 | one: string[] = baseTextArray, |
| 43 | two: string[] = newTextArray; |
| 44 | let lena: number = one.length, |
| 45 | lenb: number = two.length, |
| 46 | a: number = 0, |
| 47 | b: number = 0, |
| 48 | c: number = 0, |
| 49 | d: number = 0, |
| 50 | codes: opcodes = [], |
| 51 | fix = function diffview_opcodes_fix(code:codes): void { |
| 52 | let len:number = codes.length - 1, |
| 53 | prior:[string, number, number, number, number] = codes[len]; |
| 54 | if (prior !== undefined) { |
| 55 | if (prior[0] === code[0]) { |
| 56 | if (code[0] === "replace" || code[0] === "equal") { |
| 57 | prior[2] = code[2]; |
| 58 | prior[4] = code[4]; |
| 59 | } else if (code[0] === "delete") { |
| 60 | prior[2] = code[2]; |
| 61 | } else if (code[0] === "insert") { |
| 62 | prior[4] = code[4]; |
| 63 | } |
| 64 | if (codes.length > 1 && prior[2] === code[2] && prior[4] === code[4]) { |
| 65 | if (prior[0] === "insert" && two[codes[codes.length - 2][4] - (prior[4] - prior[3])] === one[codes[codes.length - 2][1]]) { |
| 66 | codes.pop(); |
| 67 | len = len - 1; |
| 68 | codes[len] = ["insert", -1, -1, codes[len][3], codes[len][4] - (prior[4] - prior[3])]; |
| 69 | if (codes[len][4] < 0) { |
| 70 | codes[len][4] = prior[4] - prior[3]; |
| 71 | } |
| 72 | do { |
| 73 | // one-sided replacement undo, more like undelete |
| 74 | table[one[c]][0] = table[one[c]][0] + 1; |
| 75 | c = c - 1; |
| 76 | } while (c > codes[codes.length - 2][2]); |
| 77 | d = codes[len][4] - 1; |
| 78 | } |
| 79 | } |
| 80 | return; |
| 81 | } |
| 82 | if (prior[0] === "insert" && prior[4] - prior[3] === 1) { |
| 83 | if (code[2] - code[1] === 1) { |
| 84 | if (code[0] === "replace") { |
| 85 | codes[len] = ["replace", code[1], code[2], prior[3], prior[4]]; |
| 86 | prior = codes[len]; |
| 87 | code = ["insert", -1, -2, code[3], code[4]]; |
| 88 | } else if (code[0] === "delete") { |
| 89 | code = ["replace", code[1], code[2], prior[3], prior[4]]; |
| 90 | codes.pop(); |
| 91 | len = len - 1; |
| 92 | prior = codes[len]; |
| 93 | if (codes[len][0] === "replace") { |
| 94 | prior[2] = code[2]; |
| 95 | prior[4] = code[4]; |
| 96 | return; |
| 97 | } |
no test coverage detected