Changeset View
Changeset View
Standalone View
Standalone View
swh/web/assets/src/bundles/revision/diff-utils.js
Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | if (toLine != null) { | ||||
for (let i = 0; i < (maxNumberChars - toLine.length); ++i) { | for (let i = 0; i < (maxNumberChars - toLine.length); ++i) { | ||||
ret += ' '; | ret += ' '; | ||||
} | } | ||||
ret += toLine; | ret += toLine; | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
function adjustCodeBlockLeftMargin(diffElt) { | |||||
let left = $(diffElt).find('.hljs-ln-numbers-container').width(); | |||||
$(diffElt).find('.hljs-ln-code-container').css('margin-left', left + 'px'); | |||||
} | |||||
// to compute diff and process it for display | // to compute diff and process it for display | ||||
export function computeDiff(diffUrl, diffId) { | export function computeDiff(diffUrl, diffId) { | ||||
// force diff computation ? | // force diff computation ? | ||||
let force = diffUrl.indexOf('force=true') !== -1; | let force = diffUrl.indexOf('force=true') !== -1; | ||||
// it no forced computation and diff already computed, do nothing | // it no forced computation and diff already computed, do nothing | ||||
if (!force && computedDiffs.hasOwnProperty(diffId)) { | if (!force && computedDiffs.hasOwnProperty(diffId)) { | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | .then(data => { | ||||
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; | ||||
let codeLineElts = $(`#${diffId} .hljs-ln-code-container`).children(); | |||||
$(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
let lnText = $(codeLineElts[i]).text(); | let lnText = lnElt.nextSibling.innerText; | ||||
let linesInfo = linesInfoRegExp.exec(lnText); | let linesInfo = linesInfoRegExp.exec(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 = parseInt(linesInfo[1]) - 1; | baseFromLine = parseInt(linesInfo[1]) - 1; | ||||
baseToLine = parseInt(linesInfo[3]) - 1; | baseToLine = parseInt(linesInfo[3]) - 1; | ||||
linesOffset = 0; | linesOffset = 0; | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | .then(data => { | ||||
$(`#${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.lineNumbersBlock(block); | ||||
}); | }); | ||||
function highlightDiffLines(diffId) { | // hljs.lineNumbersBlock is asynchronous so we have to postpone our | ||||
let codeLineElts = $(`#${diffId} .hljs-ln-code-container`).children(); | // next treatments by adding it at the end of the current js events queue | ||||
$(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | setTimeout(() => { | ||||
let lnTextElt = codeLineElts[i]; | // diff highlighting for added/removed lines on top of code highlighting | ||||
let lnText = $(lnTextElt).text(); | $(`.${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
let lnText = lnElt.nextSibling.innerText; | |||||
let linesInfo = linesInfoRegExp.exec(lnText); | let linesInfo = linesInfoRegExp.exec(lnText); | ||||
if (linesInfo) { | if (linesInfo) { | ||||
$(lnElt).addClass('swh-diff-lines-info'); | $(lnElt).parent().addClass('swh-diff-lines-info'); | ||||
$(lnTextElt).addClass('swh-diff-lines-info'); | let linesInfoText = $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text(); | ||||
$(lnTextElt).text(''); | $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').children().remove(); | ||||
$(lnTextElt).append(`<span class="hljs-meta">${lnText}</span>`); | $(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>`); | |||||
} else if (lnText.length > 0 && lnText[0] === '-') { | } else if (lnText.length > 0 && lnText[0] === '-') { | ||||
$(lnElt).addClass('swh-diff-removed-line'); | $(lnElt).parent().addClass('swh-diff-removed-line'); | ||||
$(lnTextElt).addClass('swh-diff-removed-line'); | |||||
} else if (lnText.length > 0 && lnText[0] === '+') { | } else if (lnText.length > 0 && lnText[0] === '+') { | ||||
$(lnElt).addClass('swh-diff-added-line'); | $(lnElt).parent().addClass('swh-diff-added-line'); | ||||
$(lnTextElt).addClass('swh-diff-added-line'); | |||||
} | } | ||||
}); | }); | ||||
} | |||||
// 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 | |||||
highlightDiffLines(diffId); | |||||
highlightDiffLines(`${diffId}-from`); | |||||
highlightDiffLines(`${diffId}-to`); | |||||
// set line numbers for unified diff | // set line numbers for unified diff | ||||
$(`#${diffId} .hljs-ln-numbers .hljs-ln-n`).each((i, lnElt) => { | $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).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 .hljs-ln-n`).each((i, lnElt) => { | $(`#${diffId}-from .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).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 .hljs-ln-n`).each((i, lnElt) => { | $(`#${diffId}-to .hljs-ln-numbers`).each((i, lnElt) => { | ||||
$(lnElt).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 | ||||
Show All 22 Lines | .then(data => { | ||||
// 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); | ||||
adjustCodeBlockLeftMargin(`#${diffId}`); | |||||
}); | }); | ||||
}); | }); | ||||
} | } | ||||
}); | }); | ||||
} | } | ||||
function setDiffVisible(diffId) { | function setDiffVisible(diffId) { | ||||
// set the unified diff visible by default | // set the unified diff visible by default | ||||
▲ Show 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | export function showUnifiedDiff(event, diffId) { | ||||
$(`#${diffId}-splitted-diff`).css('display', 'none'); | $(`#${diffId}-splitted-diff`).css('display', 'none'); | ||||
$(`#${diffId}-unified-diff`).css('display', 'block'); | $(`#${diffId}-unified-diff`).css('display', 'block'); | ||||
} | } | ||||
// callback to switch from unified diff to side-by-side one | // callback to switch from unified diff to side-by-side one | ||||
export function showSplittedDiff(event, diffId) { | export function showSplittedDiff(event, diffId) { | ||||
$(`#${diffId}-unified-diff`).css('display', 'none'); | $(`#${diffId}-unified-diff`).css('display', 'none'); | ||||
$(`#${diffId}-splitted-diff`).css('display', 'block'); | $(`#${diffId}-splitted-diff`).css('display', 'block'); | ||||
adjustCodeBlockLeftMargin(`#${diffId}-from`); | |||||
adjustCodeBlockLeftMargin(`#${diffId}-to`); | |||||
} | } | ||||
// callback when the user clicks on the 'Compute all diffs' button | // callback when the user clicks on the 'Compute all diffs' button | ||||
export function computeAllDiffs(event) { | export function computeAllDiffs(event) { | ||||
$(event.currentTarget).addClass('active'); | $(event.currentTarget).addClass('active'); | ||||
for (let diffId in diffsUrls) { | for (let diffId in diffsUrls) { | ||||
if (diffsUrls.hasOwnProperty(diffId)) { | if (diffsUrls.hasOwnProperty(diffId)) { | ||||
computeDiff(diffsUrls[diffId], diffId); | computeDiff(diffsUrls[diffId], diffId); | ||||
▲ Show 20 Lines • Show All 98 Lines • Show Last 20 Lines |