Changeset View
Changeset View
Standalone View
Standalone View
swh/web/assets/src/bundles/revision/diff-utils.js
Show First 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | .then(data => { | ||||
$(`.${diffId}`).addClass(data.language); | $(`.${diffId}`).addClass(data.language); | ||||
// set unified diff text | // set unified diff text | ||||
$(`#${diffId}`).text(data.diff_str); | $(`#${diffId}`).text(data.diff_str); | ||||
// code highlighting for unified diff | // code highlighting for unified diff | ||||
$(`#${diffId}`).each((i, block) => { | $(`#${diffId}`).each((i, block) => { | ||||
hljs.highlightBlock(block); | hljs.highlightBlock(block); | ||||
hljs.lineNumbersBlock(block); | hljs.lineNumbersBlockSync(block); | ||||
}); | }); | ||||
// hljs.lineNumbersBlock is asynchronous so we have to postpone our | |||||
// next treatments by adding it at the end of the current js events queue | |||||
setTimeout(() => { | |||||
// process unified diff lines in order to generate side-by-side diffs text | // process unified diff lines in order to generate side-by-side diffs text | ||||
// but also compute line numbers for unified and side-by-side diffs | // but also compute line numbers for unified and side-by-side diffs | ||||
let baseFromLine = ''; | let baseFromLine = ''; | ||||
let baseToLine = ''; | let baseToLine = ''; | ||||
let fromToLines = []; | let fromToLines = []; | ||||
let fromLines = []; | let fromLines = []; | ||||
let toLines = []; | let toLines = []; | ||||
let maxNumberChars = 0; | let maxNumberChars = 0; | ||||
let diffFromStr = ''; | let diffFromStr = ''; | ||||
let diffToStr = ''; | let diffToStr = ''; | ||||
let linesOffset = 0; | let linesOffset = 0; | ||||
$(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
let lnText = lnElt.nextSibling.innerText; | let lnText = lnElt.nextSibling.innerText; | ||||
let linesInfo = parseDiffHunkRangeIfAny(lnText); | let linesInfo = parseDiffHunkRangeIfAny(lnText); | ||||
let fromLine = ''; | let fromLine = ''; | ||||
let toLine = ''; | let toLine = ''; | ||||
// parsed lines info from the diff output | // parsed lines info from the diff output | ||||
if (linesInfo) { | if (linesInfo) { | ||||
baseFromLine = linesInfo[0]; | baseFromLine = linesInfo[0]; | ||||
baseToLine = linesInfo[1]; | baseToLine = linesInfo[1]; | ||||
linesOffset = 0; | linesOffset = 0; | ||||
diffFromStr += (lnText + '\n'); | diffFromStr += (lnText + '\n'); | ||||
diffToStr += (lnText + '\n'); | diffToStr += (lnText + '\n'); | ||||
fromLines.push(''); | fromLines.push(''); | ||||
toLines.push(''); | toLines.push(''); | ||||
// line removed in the from file | // line removed in the from file | ||||
} else if (lnText.length > 0 && lnText[0] === '-') { | } else if (lnText.length > 0 && lnText[0] === '-') { | ||||
baseFromLine = baseFromLine + 1; | baseFromLine = baseFromLine + 1; | ||||
fromLine = baseFromLine.toString(); | fromLine = baseFromLine.toString(); | ||||
fromLines.push(fromLine); | fromLines.push(fromLine); | ||||
++nbDeletions; | ++nbDeletions; | ||||
diffFromStr += (lnText + '\n'); | diffFromStr += (lnText + '\n'); | ||||
++linesOffset; | ++linesOffset; | ||||
// line added in the to file | // line added in the to file | ||||
} else if (lnText.length > 0 && lnText[0] === '+') { | } else if (lnText.length > 0 && lnText[0] === '+') { | ||||
baseToLine = baseToLine + 1; | baseToLine = baseToLine + 1; | ||||
toLine = baseToLine.toString(); | toLine = baseToLine.toString(); | ||||
toLines.push(toLine); | toLines.push(toLine); | ||||
++nbAdditions; | ++nbAdditions; | ||||
diffToStr += (lnText + '\n'); | diffToStr += (lnText + '\n'); | ||||
--linesOffset; | --linesOffset; | ||||
// line present in both files | // line present in both files | ||||
} else { | } else { | ||||
baseFromLine = baseFromLine + 1; | baseFromLine = baseFromLine + 1; | ||||
baseToLine = baseToLine + 1; | baseToLine = baseToLine + 1; | ||||
fromLine = baseFromLine.toString(); | fromLine = baseFromLine.toString(); | ||||
toLine = baseToLine.toString(); | toLine = baseToLine.toString(); | ||||
for (let j = 0; j < Math.abs(linesOffset); ++j) { | for (let j = 0; j < Math.abs(linesOffset); ++j) { | ||||
if (linesOffset > 0) { | if (linesOffset > 0) { | ||||
diffToStr += '\n'; | diffToStr += '\n'; | ||||
toLines.push(''); | toLines.push(''); | ||||
} else { | } else { | ||||
diffFromStr += '\n'; | diffFromStr += '\n'; | ||||
fromLines.push(''); | fromLines.push(''); | ||||
} | } | ||||
} | } | ||||
linesOffset = 0; | linesOffset = 0; | ||||
diffFromStr += (lnText + '\n'); | diffFromStr += (lnText + '\n'); | ||||
diffToStr += (lnText + '\n'); | diffToStr += (lnText + '\n'); | ||||
toLines.push(toLine); | toLines.push(toLine); | ||||
fromLines.push(fromLine); | fromLines.push(fromLine); | ||||
} | } | ||||
if (!baseFromLine) { | if (!baseFromLine) { | ||||
fromLine = ''; | fromLine = ''; | ||||
} | } | ||||
if (!baseToLine) { | if (!baseToLine) { | ||||
toLine = ''; | toLine = ''; | ||||
} | } | ||||
fromToLines[i] = [fromLine, toLine]; | fromToLines[i] = [fromLine, toLine]; | ||||
maxNumberChars = Math.max(maxNumberChars, fromLine.length); | maxNumberChars = Math.max(maxNumberChars, fromLine.length); | ||||
maxNumberChars = Math.max(maxNumberChars, toLine.length); | maxNumberChars = Math.max(maxNumberChars, toLine.length); | ||||
}); | }); | ||||
// set side-by-side diffs text | // set side-by-side diffs text | ||||
$(`#${diffId}-from`).text(diffFromStr); | $(`#${diffId}-from`).text(diffFromStr); | ||||
$(`#${diffId}-to`).text(diffToStr); | $(`#${diffId}-to`).text(diffToStr); | ||||
// code highlighting for side-by-side diffs | // code highlighting for side-by-side diffs | ||||
$(`#${diffId}-from, #${diffId}-to`).each((i, block) => { | $(`#${diffId}-from, #${diffId}-to`).each((i, block) => { | ||||
hljs.highlightBlock(block); | hljs.highlightBlock(block); | ||||
hljs.lineNumbersBlock(block); | hljs.lineNumbersBlockSync(block); | ||||
}); | }); | ||||
// hljs.lineNumbersBlock is asynchronous so we have to postpone our | |||||
// next treatments by adding it at the end of the current js events queue | |||||
setTimeout(() => { | |||||
// diff highlighting for added/removed lines on top of code highlighting | // diff highlighting for added/removed lines on top of code highlighting | ||||
$(`.${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | $(`.${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
let lnText = lnElt.nextSibling.innerText; | let lnText = lnElt.nextSibling.innerText; | ||||
if (lnText.startsWith('@@')) { | if (lnText.startsWith('@@')) { | ||||
$(lnElt).parent().addClass('swh-diff-lines-info'); | $(lnElt).parent().addClass('swh-diff-lines-info'); | ||||
let linesInfoText = $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text(); | let linesInfoText = $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text(); | ||||
$(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').children().remove(); | $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').children().remove(); | ||||
$(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text(''); | $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text(''); | ||||
$(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').append(`<span class="hljs-meta">${linesInfoText}</span>`); | $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').append(`<span class="hljs-meta">${linesInfoText}</span>`); | ||||
} else if (lnText.length > 0 && lnText[0] === '-') { | } else if (lnText.length > 0 && lnText[0] === '-') { | ||||
$(lnElt).parent().addClass('swh-diff-removed-line'); | $(lnElt).parent().addClass('swh-diff-removed-line'); | ||||
} else if (lnText.length > 0 && lnText[0] === '+') { | } else if (lnText.length > 0 && lnText[0] === '+') { | ||||
$(lnElt).parent().addClass('swh-diff-added-line'); | $(lnElt).parent().addClass('swh-diff-added-line'); | ||||
} | } | ||||
}); | }); | ||||
// set line numbers for unified diff | // set line numbers for unified diff | ||||
$(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).children().attr( | $(lnElt).children().attr( | ||||
'data-line-number', | 'data-line-number', | ||||
formatDiffLineNumbers(fromToLines[i][0], fromToLines[i][1], | formatDiffLineNumbers(fromToLines[i][0], fromToLines[i][1], | ||||
maxNumberChars)); | maxNumberChars)); | ||||
}); | }); | ||||
// set line numbers for the from side-by-side diff | // set line numbers for the from side-by-side diff | ||||
$(`#${diffId}-from .hljs-ln-numbers`).each((i, lnElt) => { | $(`#${diffId}-from .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).children().attr( | $(lnElt).children().attr( | ||||
'data-line-number', | 'data-line-number', | ||||
formatDiffLineNumbers(fromLines[i], null, | formatDiffLineNumbers(fromLines[i], null, | ||||
maxNumberChars)); | maxNumberChars)); | ||||
}); | }); | ||||
// set line numbers for the to side-by-side diff | // set line numbers for the to side-by-side diff | ||||
$(`#${diffId}-to .hljs-ln-numbers`).each((i, lnElt) => { | $(`#${diffId}-to .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).children().attr( | $(lnElt).children().attr( | ||||
'data-line-number', | 'data-line-number', | ||||
formatDiffLineNumbers(null, toLines[i], | formatDiffLineNumbers(null, toLines[i], | ||||
maxNumberChars)); | maxNumberChars)); | ||||
}); | }); | ||||
// last processing: | // last processing: | ||||
// - remove the '+' and '-' at the beginning of the diff lines | // - remove the '+' and '-' at the beginning of the diff lines | ||||
// from code highlighting | // from code highlighting | ||||
// - add the "no new line at end of file marker" if needed | // - add the "no new line at end of file marker" if needed | ||||
$(`.${diffId} .hljs-ln-code`).each((i, lnElt) => { | $(`.${diffId} .hljs-ln-code`).each((i, lnElt) => { | ||||
if (lnElt.firstChild) { | if (lnElt.firstChild) { | ||||
if (lnElt.firstChild.nodeName !== '#text') { | if (lnElt.firstChild.nodeName !== '#text') { | ||||
let lineText = lnElt.firstChild.innerHTML; | let lineText = lnElt.firstChild.innerHTML; | ||||
if (lineText[0] === '-' || lineText[0] === '+') { | if (lineText[0] === '-' || lineText[0] === '+') { | ||||
lnElt.firstChild.innerHTML = lineText.substr(1); | lnElt.firstChild.innerHTML = lineText.substr(1); | ||||
let newTextNode = document.createTextNode(lineText[0]); | let newTextNode = document.createTextNode(lineText[0]); | ||||
$(lnElt).prepend(newTextNode); | $(lnElt).prepend(newTextNode); | ||||
} | } | ||||
} | } | ||||
$(lnElt).contents().filter((i, elt) => { | $(lnElt).contents().filter((i, elt) => { | ||||
return elt.nodeType === 3; // Node.TEXT_NODE | return elt.nodeType === 3; // Node.TEXT_NODE | ||||
}).each((i, textNode) => { | }).each((i, textNode) => { | ||||
let swhNoNewLineMarker = '[swh-no-nl-marker]'; | let swhNoNewLineMarker = '[swh-no-nl-marker]'; | ||||
if (textNode.textContent.indexOf(swhNoNewLineMarker) !== -1) { | if (textNode.textContent.indexOf(swhNoNewLineMarker) !== -1) { | ||||
textNode.textContent = textNode.textContent.replace(swhNoNewLineMarker, ''); | textNode.textContent = textNode.textContent.replace(swhNoNewLineMarker, ''); | ||||
$(lnElt).append($(noNewLineMarker)); | $(lnElt).append($(noNewLineMarker)); | ||||
} | } | ||||
}); | }); | ||||
} | } | ||||
}); | }); | ||||
// hide the diff mode switch button in case of not generated diffs | // hide the diff mode switch button in case of not generated diffs | ||||
if (data.diff_str.indexOf('Diffs are not generated for non textual content') !== 0) { | if (data.diff_str.indexOf('Diffs are not generated for non textual content') !== 0) { | ||||
$(`#panel_${diffId} .diff-styles`).css('visibility', 'visible'); | $(`#panel_${diffId} .diff-styles`).css('visibility', 'visible'); | ||||
} | } | ||||
setDiffVisible(diffId); | setDiffVisible(diffId); | ||||
}); | |||||
}); | |||||
} | } | ||||
}); | }); | ||||
} | } | ||||
function setDiffVisible(diffId) { | function setDiffVisible(diffId) { | ||||
// set the unified diff visible by default | // set the unified diff visible by default | ||||
$(`#${diffId}-loading`).css('display', 'none'); | $(`#${diffId}-loading`).css('display', 'none'); | ||||
$(`#${diffId}-highlightjs`).css('display', 'block'); | $(`#${diffId}-highlightjs`).css('display', 'block'); | ||||
▲ Show 20 Lines • Show All 218 Lines • Show Last 20 Lines |