UNPKG

devops-diff

Version:

devops-diff

203 lines 7.73 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import * as jsDiff from 'diff'; import { unifyPath, hashCode } from './utils'; import * as rematch from './rematch'; import { LineMatchingType, DiffStyleType, LineType } from './types'; export var CSSLineClass = { INSERTS: 'd2h-ins', DELETES: 'd2h-del', CONTEXT: 'd2h-cntx', INFO: 'd2h-info', INSERT_CHANGES: 'd2h-ins d2h-change', DELETE_CHANGES: 'd2h-del d2h-change', }; export var defaultRenderConfig = { matching: LineMatchingType.NONE, matchWordsThreshold: 0.25, maxLineLengthHighlight: 10000, diffStyle: DiffStyleType.WORD, }; var separator = '/'; var distance = rematch.newDistanceFn(function (change) { return change.value; }); var matcher = rematch.newMatcherFn(distance); function isDevNullName(name) { return name.indexOf('dev/null') !== -1; } function removeInsElements(line) { return line.replace(/(<ins[^>]*>((.|\n)*?)<\/ins>)/g, ''); } function removeDelElements(line) { return line.replace(/(<del[^>]*>((.|\n)*?)<\/del>)/g, ''); } export function toCSSClass(lineType) { switch (lineType) { case LineType.CONTEXT: return CSSLineClass.CONTEXT; case LineType.INSERT: return CSSLineClass.INSERTS; case LineType.DELETE: return CSSLineClass.DELETES; } } function prefixLength(isCombined) { return isCombined ? 2 : 1; } export function escapeForHtml(str) { return str .slice(0) .replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/"/g, '&quot;') .replace(/'/g, '&#x27;') .replace(/\//g, '&#x2F;'); } export function deconstructLine(line, isCombined, escape) { if (escape === void 0) { escape = true; } var indexToSplit = prefixLength(isCombined); return { prefix: line.substring(0, indexToSplit), content: escape ? escapeForHtml(line.substring(indexToSplit)) : line.substring(indexToSplit), }; } export function filenameDiff(file) { var oldFilename = unifyPath(file.oldName); var newFilename = unifyPath(file.newName); if (oldFilename !== newFilename && !isDevNullName(oldFilename) && !isDevNullName(newFilename)) { var prefixPaths = []; var suffixPaths = []; var oldFilenameParts = oldFilename.split(separator); var newFilenameParts = newFilename.split(separator); var oldFilenamePartsSize = oldFilenameParts.length; var newFilenamePartsSize = newFilenameParts.length; var i = 0; var j = oldFilenamePartsSize - 1; var k = newFilenamePartsSize - 1; while (i < j && i < k) { if (oldFilenameParts[i] === newFilenameParts[i]) { prefixPaths.push(newFilenameParts[i]); i += 1; } else { break; } } while (j > i && k > i) { if (oldFilenameParts[j] === newFilenameParts[k]) { suffixPaths.unshift(newFilenameParts[k]); j -= 1; k -= 1; } else { break; } } var finalPrefix = prefixPaths.join(separator); var finalSuffix = suffixPaths.join(separator); var oldRemainingPath = oldFilenameParts.slice(i, j + 1).join(separator); var newRemainingPath = newFilenameParts.slice(i, k + 1).join(separator); if (finalPrefix.length && finalSuffix.length) { return (finalPrefix + separator + '{' + oldRemainingPath + ' → ' + newRemainingPath + '}' + separator + finalSuffix); } else if (finalPrefix.length) { return finalPrefix + separator + '{' + oldRemainingPath + ' → ' + newRemainingPath + '}'; } else if (finalSuffix.length) { return '{' + oldRemainingPath + ' → ' + newRemainingPath + '}' + separator + finalSuffix; } return oldFilename + ' → ' + newFilename; } else if (!isDevNullName(newFilename)) { return newFilename; } else { return oldFilename; } } export function getHtmlId(file) { return "d2h-" + hashCode(filenameDiff(file)).toString().slice(-6); } export function getFileIcon(file) { var templateName = 'file-changed'; if (file.isRename) { templateName = 'file-renamed'; } else if (file.isCopy) { templateName = 'file-renamed'; } else if (file.isNew) { templateName = 'file-added'; } else if (file.isDeleted) { templateName = 'file-deleted'; } else if (file.newName !== file.oldName) { templateName = 'file-renamed'; } return templateName; } export function diffHighlight(diffLine1, diffLine2, isCombined, config) { if (config === void 0) { config = {}; } var _a = __assign(__assign({}, defaultRenderConfig), config), matching = _a.matching, maxLineLengthHighlight = _a.maxLineLengthHighlight, matchWordsThreshold = _a.matchWordsThreshold, diffStyle = _a.diffStyle; var line1 = deconstructLine(diffLine1, isCombined, false); var line2 = deconstructLine(diffLine2, isCombined, false); if (line1.content.length > maxLineLengthHighlight || line2.content.length > maxLineLengthHighlight) { return { oldLine: { prefix: line1.prefix, content: escapeForHtml(line1.content), }, newLine: { prefix: line2.prefix, content: escapeForHtml(line2.content), }, }; } var diff = diffStyle === 'char' ? jsDiff.diffChars(line1.content, line2.content) : jsDiff.diffWordsWithSpace(line1.content, line2.content); var changedWords = []; if (diffStyle === 'word' && matching === 'words') { var removed = diff.filter(function (element) { return element.removed; }); var added = diff.filter(function (element) { return element.added; }); var chunks = matcher(added, removed); chunks.forEach(function (chunk) { if (chunk[0].length === 1 && chunk[1].length === 1) { var dist = distance(chunk[0][0], chunk[1][0]); if (dist < matchWordsThreshold) { changedWords.push(chunk[0][0]); changedWords.push(chunk[1][0]); } } }); } var highlightedLine = diff.reduce(function (highlightedLine, part) { var elemType = part.added ? 'ins' : part.removed ? 'del' : null; var addClass = changedWords.indexOf(part) > -1 ? ' class="d2h-change"' : ''; var escapedValue = escapeForHtml(part.value); return elemType !== null ? highlightedLine + "<" + elemType + addClass + ">" + escapedValue + "</" + elemType + ">" : "" + highlightedLine + escapedValue; }, ''); return { oldLine: { prefix: line1.prefix, content: removeInsElements(highlightedLine), }, newLine: { prefix: line2.prefix, content: removeDelElements(highlightedLine), }, }; } //# sourceMappingURL=render-utils.js.map