diff --git a/manifest.json b/manifest.json index c8fdac1..34eabf7 100644 --- a/manifest.json +++ b/manifest.json @@ -19,5 +19,8 @@ "styles/style.css" ] } + ], + "permissions": [ + "storage" ] -} \ No newline at end of file +} diff --git a/scripts/script.js b/scripts/script.js index c4d344f..22384a9 100644 --- a/scripts/script.js +++ b/scripts/script.js @@ -21,6 +21,14 @@ let numberOfChangedFiles = 0; let numberOfAdditions = 0; let numberOfDeletions = 0; +const VIEW_MODE_SPLIT = "split"; +const VIEW_MODE_UNIFIED = "unified"; +const VIEW_MODE_DEFAULT_VALUE = VIEW_MODE_SPLIT; + +let viewMode = ''; + +let editedLines = ''; + /** * Contains general informations about the patch file * Ex : how many lines are added, deleted, ect.. @@ -58,7 +66,9 @@ class Diff { // If this is a new file, don't print the "old code" bloc if (this.oldCode !== '') { let bloc1 = document.createElement('bloc'); - bloc1.className = 'left-bloc'; + if (viewMode == VIEW_MODE_SPLIT) { + bloc1.className = 'left-bloc'; + } bloc1.innerHTML = this.oldCode; codeBloc.appendChild(bloc1); // Bind scroll event on both code blocs @@ -75,10 +85,12 @@ class Diff { linesAdd.innerHTML = this.newCodeLineNumber; linesDel.innerHTML = this.oldCodeLineNumber; - codeBloc.appendChild(linesBloc); - linesBloc.appendChild(linesDel); - linesBloc.appendChild(linesAdd); - codeBloc.appendChild(bloc2); + if (viewMode == VIEW_MODE_SPLIT) { + codeBloc.appendChild(linesBloc); + linesBloc.appendChild(linesDel); + linesBloc.appendChild(linesAdd); + codeBloc.appendChild(bloc2); + } HtmlElement.appendChild(blocMeta); HtmlElement.appendChild(codeBloc); @@ -87,87 +99,127 @@ class Diff { //@TODO Add function print side by side and print inline } -// Extract optional file's metadata. -extractFileInfo(); +function init() { + document.getElementsByTagName("pre")[0].innerHTML = ''; -lines.forEach(function (line) { + lines = content.split("\n"); - if (line.startsWith('@@ ', 0)) { - updateLastDiff(); + initial = 0; + initialLength = 0; + edited = 0; + editedLength = 0; - let lineSplited = line.split(' '); + newLineDeleted = ''; + newLineAdded = ''; + diffInfoLines = ''; + linesNumberAdded = ''; + linesNumberDeleted = ''; - diffInfoLines += line + '
'; + numberOfChangedFiles = 0; + numberOfAdditions = 0; + numberOfDeletions = 0; - let diff = new Diff(); - diff.meta = diffInfoLines; - diffsArrays.push(diff); - diffInfoLines = ''; + editedLines = ''; - initial = lineSplited[1].split(','); - initialLength = initial[1]; - initial = initial[0].replace('-', ''); + fileInfoLines = ''; - edited = lineSplited[2].split(','); - editedLength = edited[1]; - edited = edited[0].replace('+', ''); + diffsArrays = []; +} - } - else if (line.startsWith('+++ ', 0) || line.startsWith('--- ', 0)) { - diffInfoLines += line + '
'; - } - else if (line.startsWith('+', 0)) { - newLineAdded += '' + line + '\n'; - linesNumberAdded += '' + initial + ''; - initial++; - numberOfAdditions++; - } - else if (line.startsWith('-', 0)) { - newLineDeleted += '' + line + '\n'; - linesNumberDeleted += '' + edited + ''; - edited++; - numberOfDeletions++; - } - else if (line.startsWith(' ', 0)) { - linesNumberAdded += '' + initial + ''; - linesNumberDeleted += '' + edited + ''; - newLineAdded += '' + line + '\n'; - newLineDeleted += '' + line + '\n'; - initial++; - edited++; - } - else if (line.startsWith('diff', 0)) { - line = colorFileName(line); - diffInfoLines += line; - numberOfChangedFiles++; - } - else { - diffInfoLines += line + '
'; - } +function scanLines() { + lines.forEach(function (line) { -}); + if (line.startsWith('@@ ', 0)) { + updateLastDiff(); -// Update the last diff of the diffArray -updateLastDiff(); + let lineSplited = line.split(' '); -// Print the whole diffArray -printCodeBlock(); + diffInfoLines += line + '
'; + + let diff = new Diff(); + diff.meta = diffInfoLines; + diffsArrays.push(diff); + diffInfoLines = ''; + + initial = lineSplited[1].split(','); + initialLength = initial[1]; + initial = initial[0].replace('-', ''); + + edited = lineSplited[2].split(','); + editedLength = edited[1]; + edited = edited[0].replace('+', ''); + + } + else if (line.startsWith('+++ ', 0) || line.startsWith('--- ', 0)) { + diffInfoLines += line + '
'; + } + else if (line.startsWith('+', 0)) { + let editedLine = '' + line + '\n'; + if (viewMode == VIEW_MODE_SPLIT) { + newLineAdded += editedLine; + } else { + editedLines += editedLine; + } + linesNumberAdded += '' + initial + ''; + initial++; + numberOfAdditions++; + } + else if (line.startsWith('-', 0)) { + let editedLine = '' + line + '\n'; + if (viewMode == VIEW_MODE_SPLIT) { + newLineDeleted += editedLine; + } else { + editedLines += editedLine; + } + linesNumberDeleted += '' + edited + ''; + edited++; + numberOfDeletions++; + } + else if (line.startsWith(' ', 0)) { + let editedLine = '' + line + '\n'; + linesNumberAdded += '' + initial + ''; + linesNumberDeleted += '' + edited + ''; + if (viewMode == VIEW_MODE_SPLIT) { + newLineAdded += editedLine; + newLineDeleted += editedLine; + } else { + editedLines += editedLine; + } + initial++; + edited++; + } + else if (line.startsWith('diff', 0)) { + line = colorFileName(line); + diffInfoLines += line; + numberOfChangedFiles++; + } + else { + diffInfoLines += line + '
'; + } + + }); +} /** * Add code to the last diff object of the diffArray. */ function updateLastDiff() { // Check if there is new code to add on the diff object. - if (newLineAdded !== '' || newLineDeleted !== '') { + if ((viewMode == VIEW_MODE_SPLIT && (newLineAdded !== '' || newLineDeleted !== '')) || (viewMode == VIEW_MODE_UNIFIED && editedLines !== '')) { // Get the last diff of the array let diff = diffsArrays[diffsArrays.length - 1]; - diff.oldCode = newLineDeleted; - diff.oldCodeLineNumber = linesNumberDeleted; - diff.newCodeLineNumber = linesNumberAdded; - diff.newCode = newLineAdded; + if (viewMode == VIEW_MODE_SPLIT) { + diff.oldCode = newLineDeleted; + diff.oldCodeLineNumber = linesNumberDeleted; + diff.newCodeLineNumber = linesNumberAdded; + diff.newCode = newLineAdded; + } else { + diff.oldCode = editedLines; + } // Reset the temporary code variables . + editedLines = ''; newLineDeleted = ''; linesNumberDeleted = ''; linesNumberAdded = ''; @@ -258,8 +310,29 @@ function scrollEvent(event) { } } -// Print introduction block -printIntroBlock(); +function changeViewMode(viewModeRequested) { + viewMode = viewModeRequested; + + browser.storage.local.set({ + dpc_view_mode: viewMode + }); + + setSelectedButton(); + + init(); + +// Extract optional file's metadata. + extractFileInfo(); + + scanLines(); + +// Update the last diff of the diffArray + updateLastDiff(); + +// Print the whole diffArray + printCodeBlock(); + +} /** * Print introduction block containing info about number of changed files, additions, and deletions @@ -270,7 +343,12 @@ function printIntroBlock() { return } - let blockIntro = document.createElement('blockIntro'); + +} + +function printHeaderBlock() { + let headerBlock = document.createElement('header'); + headerBlock.innerHTML = ''; // Set text for changed files let changedFilesText = numberOfChangedFiles + ' ' + (numberOfChangedFiles > 1 ? 'files' : 'file') + ' changed'; @@ -281,8 +359,53 @@ function printIntroBlock() { // Set text for deletions let deletionsText = numberOfDeletions + ' ' + (numberOfAdditions > 1 ? 'deletions' : 'deletion') + '(-)'; - // Print the block - blockIntro.innerHTML = "

" + changedFilesText + ", " + - "" + additionsText + " " + deletionsText + "

"; - document.body.insertBefore(blockIntro, document.body.firstChild); + headerBlock.innerHTML += '
' + changedFilesText + ', ' + + '' + additionsText + ' ' + deletionsText + ''; + headerBlock.innerHTML += '
'; + + document.body.insertBefore(headerBlock, document.body.firstChild); + + document.querySelectorAll(".view-mode button").forEach((element) => { + element.addEventListener('click', () => { + changeViewMode(element.id); + }); + }); +} + +function setSelectedButton() { + if (viewMode == VIEW_MODE_SPLIT) { + document.querySelector('.view-mode button#split').classList.add("selected"); + document.querySelector('.view-mode button#unified').classList.remove("selected"); + } else { + document.querySelector('.view-mode button#split').classList.remove("selected"); + document.querySelector('.view-mode button#unified').classList.add("selected"); + } } + +let promises = []; + +promises.push(browser.storage.local.get('dpc_view_mode').then(function (res) { + console.log(viewMode); + viewMode = res.dpc_view_mode; + if (typeof viewMode === 'undefined') { + viewMode = VIEW_MODE_DEFAULT_VALUE; + } + console.log(viewMode); +})); + +Promise.all(promises).then(function() { + // Extract optional file's metadata. + extractFileInfo(); + scanLines(); + + // Update the last diff of the diffArray + updateLastDiff(); + + // Print the whole diffArray + printCodeBlock(); + + // Print header block + printHeaderBlock(); + + setSelectedButton(); +}); diff --git a/styles/style.css b/styles/style.css index 1ef065c..3e6b2cd 100644 --- a/styles/style.css +++ b/styles/style.css @@ -1,7 +1,8 @@ -body { +body{ color: #0F151F; font-family: sans-serif; font-size: 12px; + padding-top: 30px; } codebloc { @@ -97,23 +98,96 @@ b { } /*********************************************************** -INTRO BLOCK +BUTTONS ***********************************************************/ -blockIntro { - display: block; +button { + position: relative; + display: inline-block; + padding: 6px 12px; + font-weight: 600; + line-height: 20px; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-repeat: repeat-x; + background-position: -1px -1px; + background-size: 110% 110%; + border: 1px solid rgba(27,31,35,0.2); + border-top-color: rgba(27, 31, 35, 0.2); + border-right-color: rgba(27, 31, 35, 0.2); + border-right-width: 1px; + border-bottom-color: rgba(27, 31, 35, 0.2); + border-left-color: rgba(27, 31, 35, 0.2); + border-radius: 0.25em; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +button:hover { + background-color: #fff; + background-image: linear-gradient(-180deg,#f0f3f6 0%,#e6ebf1 90%); + background-position: -0.5em; + border-color: rgba(27,31,35,0.35); +} + +button:active, +button.selected { + background-color: #e9ecef; + background-image: none; + border-color: rgba(27,31,35,0.35); + box-shadow: inset 0 0.15em 0.3em rgba(27,31,35,0.15); +} + +/*********************************************************** +HEADER +***********************************************************/ + +header { + position: fixed; background-color: #f6f6f6; - padding: 5px; + display: block; + left: 0; + right: 0; + top: 0; +} + +.view-mode { + float: right; + margin: 5px; +} + +.view-mode button { + border-radius: 0; } -blockIntro p { - margin: 0; +.view-mode button:first-child { + border-right: 0 none; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +.view-mode button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.file-info { + float: left; + display: block; + padding: 10px 0 10px 5px; + height: auto; } -blockIntro .additions { +.file-info .additions { color: rgb(71, 138, 75); } -blockIntro .deletions { +.file-info .deletions { color: rgb(211, 47, 47); }