1 line
No EOL
4.9 KiB
JavaScript
1 line
No EOL
4.9 KiB
JavaScript
!function(window){var ClassVariable;return ClassVariable=function(){function Diff2Html(){}function escape(str){return str.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\t/g," ")}function startsWith(str,start){return 0===str.indexOf(start)}function valueOrEmpty(value){return value?value:""}var CSS_STYLES={INFO:"d2h-info",CONTEXT:"d2h-context",NEW:"d2h-insert",DELETED:"d2h-delete"},BLOCK_HEADER_LINE="...";Diff2Html.prototype.getPrettyHtmlFromDiff=function(diffInput){var diffJson=generateDiffJson(diffInput);return generateJsonHtml(diffJson)},Diff2Html.prototype.getJsonFromDiff=function(diffInput){return generateDiffJson(diffInput)},Diff2Html.prototype.getPrettyHtmlFromJson=function(diffJson){return generateJsonHtml(diffJson)};var instance,generateDiffJson=function(diffInput){var files=[],currentFile=null,currentBlock=null,oldLine=null,newLine=null,saveBlock=function(){currentBlock&&(currentFile.blocks.push(currentBlock),currentBlock=null)},saveFile=function(){currentFile&&(files.push(currentFile),currentFile=null)},startFile=function(line){saveBlock(),saveFile(),currentFile={},currentFile.blocks=[],currentFile.deletedLines=0,currentFile.addedLines=0;var values=/^diff --git a\/(\S+) b\/(\S+).*$/.exec(line);currentFile.oldName=values[1],currentFile.newName=values[2]},startBlock=function(line){saveBlock();var values=/^(@@ -(\d+),(\d+) \+(\d+),(\d+) @@).*/.exec(line);currentBlock={},currentBlock.lines=[],currentBlock.oldStartLine=oldLine=values[2],currentBlock.newStartLine=newLine=values[4];var currentLine={};currentLine.type=CSS_STYLES.INFO,currentLine.content=line,currentLine.oldNumber=BLOCK_HEADER_LINE,currentLine.newNumber=BLOCK_HEADER_LINE,currentBlock.lines.push(currentLine)},createLine=function(line){var isLineWithInserts=/{\+.*?\+}/.exec(line),isLineWithDeletes=/\[-.*?-\]/.exec(line),isNewLine=/^{\+.*?\+}$/.exec(line),isContextLine=!isLineWithInserts&&!isLineWithDeletes,currentLine={};isContextLine?(currentLine={},currentLine.type=CSS_STYLES.CONTEXT,currentLine.oldNumber=oldLine++,currentLine.newNumber=newLine++,currentLine.content=line,currentBlock.lines.push(currentLine)):(isLineWithDeletes&&(currentFile.deletedLines++,currentLine={},currentLine.type=CSS_STYLES.DELETED,currentLine.oldNumber=oldLine++,currentLine.newNumber=null,currentLine.content=line,currentBlock.lines.push(currentLine)),isLineWithInserts&&(currentFile.addedLines++,currentLine={},currentLine.type=CSS_STYLES.NEW,currentLine.oldNumber=null,currentLine.newNumber=newLine++,currentLine.content=line,!isLineWithInserts||isLineWithDeletes||isNewLine||(currentFile.deletedLines++,currentLine.oldNumber=oldLine++),currentBlock.lines.push(currentLine)))},diffLines=diffInput.split("\n");return diffLines.forEach(function(line){!line||startsWith(line,"*")||startsWith(line,"new")||startsWith(line,"index")||startsWith(line,"---")||startsWith(line,"+++")||(startsWith(line,"diff")?startFile(line):currentFile&&startsWith(line,"@@")?startBlock(line):currentBlock&&createLine(line))}),saveBlock(),saveFile(),files},generateJsonHtml=function(diffFiles){return'<div id="d2h-wrapper">\n'+diffFiles.map(function(file){return'<div class="d2h-file-wrapper">\n <div class="d2h-file-header">\n <div class="d2h-file-stats">\n <span class="d2h-lines-added">+'+file.addedLines+'</span>\n <span class="d2h-lines-deleted">-'+file.deletedLines+'</span>\n </div>\n <div class="d2h-file-name">'+getDiffName(file.oldName,file.newName)+'</div>\n </div>\n <div class="d2h-file-diff">\n <div class="d2h-code-wrapper">\n <table class="d2h-diff-table">\n <tbody class="d2h-diff-tbody">\n '+generateFileHtml(file)+" </tbody>\n </table>\n </div>\n </div>\n </div>\n"}).join("\n")+"</div>\n"},getDiffName=function(oldFilename,newFilename){return oldFilename===newFilename?newFilename:oldFilename+" -> "+newFilename},generateFileHtml=function(file){return file.blocks.map(function(block){return block.lines.map(function(line){var oldLine=valueOrEmpty(line.oldNumber),newLine=valueOrEmpty(line.newNumber),escapedLine=escape(line.content);return line.type===CSS_STYLES.NEW?escapedLine=generateLineInsertions(escapedLine):line.type===CSS_STYLES.DELETED&&(escapedLine=generateLineDeletions(escapedLine)),'<tr>\n <td class="d2h-code-linenumber '+line.type+'">'+oldLine+'</td>\n <td class="d2h-code-linenumber '+line.type+'">'+newLine+'</td>\n <td class="d2h-code-line '+line.type+'"><div class="'+line.type+'">'+escapedLine+"</pre></td>\n</tr>\n"}).join("\n")}).join("\n")},generateLineInsertions=function(line){return line.replace(/(\[-.*?-\])/g,"").replace(/({\+(.*?)\+})/g,"<ins>$2</ins>")},generateLineDeletions=function(line){return line.replace(/({\+.*?\+})/g,"").replace(/(\[-(.*?)-\])/g,"<del>$2</del>")};return{getInstance:function(){return void 0===instance&&(instance=new Diff2Html,instance.constructor=null),instance}}}(),window.Diff2Html=ClassVariable.getInstance(),window.Diff2Html}(window); |