@winarg/ngx-text-diff
Version:
A Text Diff component for Angular.
1 lines • 43.6 kB
Source Map (JSON)
{"version":3,"file":"winarg-ngx-text-diff.mjs","sources":["../../../projects/ngx-text-diff/src/lib/ngx-text-diff.utils.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.service.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff-container.directive.ts","../../../projects/ngx-text-diff/src/lib/loader-spinner/loader-spinner.component.ts","../../../projects/ngx-text-diff/src/lib/loader-spinner/loader-spinner.component.html","../../../projects/ngx-text-diff/src/lib/format-line.pipe.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.component.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.component.html","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.module.ts","../../../projects/ngx-text-diff/src/public_api.ts","../../../projects/ngx-text-diff/src/winarg-ngx-text-diff.ts"],"sourcesContent":["export const isNil = val => val === undefined || val === null;\r\nexport const isEmpty = val => val == null || !(Object.keys(val) || val).length || (Object.keys(val) || val).length === 0;\r\n","import { Injectable } from '@angular/core';\r\nimport { Diff, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, diff_match_patch } from 'diff-match-patch';\r\nimport { DiffLineResult, DiffPart, DiffTableRowResult } from './ngx-text-diff.model';\r\nimport { isEmpty, isNil } from './ngx-text-diff.utils';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxTextDiffService {\r\n diffParser: any; // diff_match_patch;\r\n\r\n constructor() {\r\n this.initParser();\r\n }\r\n\r\n private initParser() {\r\n this.diffParser = new diff_match_patch();\r\n }\r\n\r\n getDiffsByLines(left: string, right: string): Promise<DiffTableRowResult[]> {\r\n return new Promise<DiffTableRowResult[]>((resolve, reject) => {\r\n const a = this.diffParser.diff_linesToChars_(left, right);\r\n const lineText1 = a.chars1;\r\n const lineText2 = a.chars2;\r\n const linesArray = a.lineArray;\r\n const diffs: Diff[] = this.diffParser.diff_main(lineText1, lineText2, true);\r\n this.diffParser.diff_charsToLines_(diffs, linesArray);\r\n const rows: DiffTableRowResult[] = this.formatOutput(diffs);\r\n if (!rows) {\r\n reject('Error');\r\n }\r\n\r\n resolve(rows);\r\n });\r\n }\r\n\r\n private formatOutput(diffs: Diff[]): DiffTableRowResult[] {\r\n let lineLeft = 1;\r\n let lineRight = 1;\r\n return diffs.reduce((rows: DiffTableRowResult[], diff: Diff) => {\r\n if (!rows) {\r\n rows = [];\r\n }\r\n const diffType: number = diff[0];\r\n const diffValue: string = diff[1];\r\n let leftDiffRow: DiffTableRowResult = null;\r\n let rightDiffRow: DiffTableRowResult = null;\r\n let leftContent: DiffLineResult = null;\r\n let rightContent: DiffLineResult = null;\r\n let rowTemp: DiffTableRowResult = null;\r\n switch (diffType) {\r\n case DIFF_EQUAL: // 0\r\n diffValue\r\n .split('\\n')\r\n .filter((value, index, array) => {\r\n if (index === array.length - 1) {\r\n return !isEmpty(value);\r\n }\r\n return true;\r\n })\r\n .forEach(line => {\r\n leftContent = {\r\n lineNumber: lineLeft,\r\n lineContent: line,\r\n lineDiffs: [],\r\n prefix: ''\r\n };\r\n rightContent = {\r\n lineNumber: lineRight,\r\n lineContent: line,\r\n lineDiffs: [],\r\n prefix: ''\r\n };\r\n rowTemp = {\r\n leftContent,\r\n rightContent,\r\n belongTo: 'both',\r\n hasDiffs: false,\r\n numDiffs: 0,\r\n };\r\n rows.push(rowTemp);\r\n lineRight = lineRight + 1;\r\n lineLeft = lineLeft + 1;\r\n });\r\n break;\r\n case DIFF_DELETE: // -1\r\n diffValue\r\n .split('\\n')\r\n .filter((value, index, array) => {\r\n if (index === array.length - 1) {\r\n return !isEmpty(value);\r\n }\r\n return true;\r\n })\r\n .forEach(line => {\r\n rightDiffRow = rows.find(\r\n row => !row.leftContent && row.rightContent && row.rightContent.lineNumber === lineLeft && row.rightContent.prefix !== ''\r\n );\r\n leftContent = {\r\n lineNumber: lineLeft,\r\n lineContent: line,\r\n lineDiffs: [{ content: line, isDiff: true }],\r\n prefix: '-'\r\n };\r\n if (rightDiffRow) {\r\n rightDiffRow.leftContent = leftContent;\r\n rightDiffRow.leftContent.lineDiffs = this.getDiffParts(\r\n rightDiffRow.leftContent.lineContent,\r\n rightDiffRow.rightContent.lineContent\r\n );\r\n rightDiffRow.rightContent.lineDiffs = this.getDiffParts(\r\n rightDiffRow.rightContent.lineContent,\r\n rightDiffRow.leftContent.lineContent\r\n );\r\n rightDiffRow.belongTo = 'both';\r\n rightDiffRow.numDiffs = this.countDiffs(rightDiffRow);\r\n } else {\r\n rows.push({\r\n leftContent,\r\n rightContent: null,\r\n hasDiffs: true,\r\n belongTo: 'left',\r\n numDiffs: 1,\r\n });\r\n }\r\n lineLeft = lineLeft + 1;\r\n });\r\n break;\r\n case DIFF_INSERT: // 1\r\n diffValue\r\n .split('\\n')\r\n .filter((value, index, array) => {\r\n if (index === array.length - 1) {\r\n return !isEmpty(value);\r\n }\r\n return true;\r\n })\r\n .forEach(line => {\r\n leftDiffRow = rows.find(\r\n row => row.leftContent && !row.rightContent && row.leftContent.lineNumber === lineRight && row.leftContent.prefix !== ''\r\n );\r\n rightContent = {\r\n lineNumber: lineRight,\r\n lineContent: line,\r\n lineDiffs: [{ content: line, isDiff: true }],\r\n prefix: '+'\r\n };\r\n if (leftDiffRow) {\r\n leftDiffRow.rightContent = rightContent;\r\n leftDiffRow.leftContent.lineDiffs = this.getDiffParts(\r\n leftDiffRow.leftContent.lineContent,\r\n leftDiffRow.rightContent.lineContent\r\n );\r\n leftDiffRow.rightContent.lineDiffs = this.getDiffParts(\r\n leftDiffRow.rightContent.lineContent,\r\n leftDiffRow.leftContent.lineContent\r\n );\r\n leftDiffRow.belongTo = 'both';\r\n leftDiffRow.numDiffs = this.countDiffs(leftDiffRow);\r\n } else {\r\n rows.push({\r\n leftContent: null,\r\n rightContent,\r\n hasDiffs: true,\r\n belongTo: 'right',\r\n numDiffs: 1,\r\n });\r\n }\r\n lineRight = lineRight + 1;\r\n });\r\n break;\r\n }\r\n return rows;\r\n }, []);\r\n }\r\n\r\n private countDiffs(result: DiffTableRowResult): number {\r\n let diffCount = 0;\r\n if (result.leftContent) {\r\n diffCount += result.leftContent.lineDiffs.filter(diff => diff.isDiff).length;\r\n }\r\n if (result.leftContent) {\r\n diffCount += result.rightContent.lineDiffs.filter(diff => diff.isDiff).length;\r\n }\r\n return diffCount;\r\n }\r\n\r\n private getDiffParts(value: string, compareValue: string): DiffPart[] {\r\n const diffParts: DiffPart[] = [];\r\n let i = 0;\r\n let j = 0;\r\n let shared = '';\r\n let diff = '';\r\n\r\n while (i < value.length) {\r\n if (value[i] === compareValue[j] && j < compareValue.length) {\r\n if (diff !== '') {\r\n diffParts.push({ content: diff, isDiff: true });\r\n diff = '';\r\n }\r\n shared += value[i];\r\n } else {\r\n if (shared !== '') {\r\n diffParts.push({ content: shared, isDiff: false });\r\n shared = '';\r\n }\r\n diff += value[i];\r\n }\r\n i++;\r\n j++;\r\n }\r\n\r\n if (diff !== '') {\r\n diffParts.push({ content: diff, isDiff: true });\r\n } else if (shared !== '') {\r\n diffParts.push({ content: shared, isDiff: false });\r\n }\r\n\r\n return diffParts;\r\n }\r\n}\r\n","import { Directive, Input, ElementRef } from '@angular/core';\r\n\r\n@Directive({\n selector: '[tdContainer]',\n standalone: false\n})\r\nexport class ContainerDirective {\r\n @Input() id: string;\r\n\r\n element: HTMLTableHeaderCellElement;\r\n\r\n constructor(private _el: ElementRef) {\r\n this.element = _el.nativeElement;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\n selector: 'td-loader-spinner',\n templateUrl: './loader-spinner.component.html',\n styleUrls: ['./loader-spinner.component.css'],\n standalone: false\n})\r\nexport class LoaderSpinnerComponent implements OnInit {\r\n @Input() active = false;\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {}\r\n}\r\n","<div class=\"td-loading-roller\" *ngIf=\"active\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\n name: 'formatLine',\n standalone: false\n})\r\nexport class FormatLinePipe implements PipeTransform {\r\n transform(line: string, diffs?: string[]): string {\r\n if (!line) {\r\n return ' ';\r\n }\r\n if (!!diffs && diffs.length > 0) {\r\n /*diffs.forEach(diff => {\r\n line = line.replace(diff, `<span class=\"highli\">${diff}</span>`);\r\n });*/\r\n }\r\n return line\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/ /g, ' ');\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n EventEmitter,\r\n ViewChildren,\r\n QueryList,\r\n AfterViewInit\r\n} from '@angular/core';\r\nimport { DiffContent, DiffPart, DiffTableFormat, DiffTableFormatOption, DiffTableRowResult, DiffResults } from './ngx-text-diff.model';\r\nimport { NgxTextDiffService } from './ngx-text-diff.service';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { ContainerDirective } from './ngx-text-diff-container.directive';\r\nimport { ScrollDispatcher, CdkScrollable } from '@angular/cdk/scrolling';\r\n\r\n@Component({\n selector: 'td-ngx-text-diff',\n templateUrl: './ngx-text-diff.component.html',\n styleUrls: ['./ngx-text-diff.component.css'],\n standalone: false\n})\r\nexport class NgxTextDiffComponent implements OnInit, AfterViewInit, OnDestroy {\r\n private _hideMatchingLines = false;\r\n @ViewChildren(ContainerDirective) containers: QueryList<ContainerDirective>;\r\n @Input() format: DiffTableFormat = 'SideBySide';\r\n @Input() left = '';\r\n @Input() right = '';\r\n @Input() diffContent: Observable<DiffContent>;\r\n @Input() loading = false;\r\n @Input() showToolbar = true;\r\n @Input() showBtnToolbar = true;\r\n @Input()\r\n get hideMatchingLines() {\r\n return this._hideMatchingLines;\r\n }\r\n\r\n set hideMatchingLines(hide: boolean) {\r\n this.hideMatchingLinesChanged(hide);\r\n }\r\n @Input() outerContainerClass: string;\r\n @Input() outerContainerStyle: any;\r\n @Input() toolbarClass: string;\r\n @Input() toolbarStyle: any;\r\n @Input() compareRowsClass: string;\r\n @Input() compareRowsStyle: any;\r\n @Input() synchronizeScrolling = true;\r\n @Output() compareResults = new EventEmitter<DiffResults>();\r\n subscriptions: Subscription[] = [];\r\n tableRows: DiffTableRowResult[] = [];\r\n filteredTableRows: DiffTableRowResult[] = [];\r\n tableRowsLineByLine: DiffTableRowResult[] = [];\r\n filteredTableRowsLineByLine: DiffTableRowResult[] = [];\r\n diffsCount = 0;\r\n\r\n formatOptions: DiffTableFormatOption[] = [\r\n {\r\n id: 'side-by-side',\r\n name: 'side-by-side',\r\n label: 'Side by Side',\r\n value: 'SideBySide',\r\n icon: 'la-code',\r\n },\r\n {\r\n id: 'line-by-line',\r\n name: 'line-by-line',\r\n label: 'Line by Line',\r\n value: 'LineByLine',\r\n icon: 'la-file-text',\r\n },\r\n ];\r\n\r\n constructor(private scrollService: ScrollDispatcher, private diff: NgxTextDiffService, private cd: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.loading = true;\r\n if (this.diffContent) {\r\n this.subscriptions.push(\r\n this.diffContent.subscribe(content => {\r\n this.loading = true;\r\n this.left = content.leftContent;\r\n this.right = content.rightContent;\r\n this.renderDiffs()\r\n .then(() => {\r\n this.cd.detectChanges();\r\n this.loading = false;\r\n })\r\n .catch(() => (this.loading = false));\r\n })\r\n );\r\n }\r\n this.renderDiffs()\r\n .then(() => (this.loading = false))\r\n .catch(e => (this.loading = false));\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.initScrollListener();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.subscriptions) {\r\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\r\n }\r\n }\r\n\r\n hideMatchingLinesChanged(value: boolean) {\r\n this._hideMatchingLines = value;\r\n if (this.hideMatchingLines) {\r\n this.filteredTableRows = this.tableRows.filter(\r\n row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+')\r\n );\r\n this.filteredTableRowsLineByLine = this.tableRowsLineByLine.filter(\r\n row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+')\r\n );\r\n } else {\r\n this.filteredTableRows = this.tableRows;\r\n this.filteredTableRowsLineByLine = this.tableRowsLineByLine;\r\n }\r\n }\r\n\r\n setDiffTableFormat(format: DiffTableFormat) {\r\n this.format = format;\r\n }\r\n\r\n async renderDiffs() {\r\n try {\r\n this.diffsCount = 0;\r\n this.tableRows = await this.diff.getDiffsByLines(this.left, this.right);\r\n this.tableRowsLineByLine = this.tableRows.reduce((tableLineByLine: DiffTableRowResult[], row: DiffTableRowResult) => {\r\n if (!tableLineByLine) {\r\n tableLineByLine = [];\r\n }\r\n if (row.hasDiffs) {\r\n if (row.leftContent) {\r\n tableLineByLine.push({\r\n leftContent: row.leftContent,\r\n rightContent: null,\r\n belongTo: row.belongTo,\r\n hasDiffs: true,\r\n numDiffs: row.numDiffs,\r\n });\r\n }\r\n if (row.rightContent) {\r\n tableLineByLine.push({\r\n leftContent: null,\r\n rightContent: row.rightContent,\r\n belongTo: row.belongTo,\r\n hasDiffs: true,\r\n numDiffs: row.numDiffs,\r\n });\r\n }\r\n } else {\r\n tableLineByLine.push(row);\r\n }\r\n\r\n return tableLineByLine;\r\n }, []);\r\n this.diffsCount = this.tableRows.filter(row => row.hasDiffs).length;\r\n this.filteredTableRows = this.tableRows;\r\n this.filteredTableRowsLineByLine = this.tableRowsLineByLine;\r\n this.emitCompareResultsEvent();\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n emitCompareResultsEvent() {\r\n const diffResults: DiffResults = {\r\n hasDiff: this.diffsCount > 0,\r\n diffsCount: this.diffsCount,\r\n rowsWithDiff: this.tableRows\r\n .filter(row => row.hasDiffs)\r\n .map(row => ({\r\n leftLineNumber: row.leftContent ? row.leftContent.lineNumber : null,\r\n rightLineNumber: row.rightContent ? row.rightContent.lineNumber : null,\r\n numDiffs: row.numDiffs,\r\n })),\r\n };\r\n\r\n this.compareResults.next(diffResults);\r\n }\r\n\r\n trackTableRows(index, row: DiffTableRowResult) {\r\n return row && row.leftContent ? row.leftContent.lineContent : row && row.rightContent ? row.rightContent.lineContent : undefined;\r\n }\r\n\r\n trackDiffs(index, diff: DiffPart) {\r\n return diff && diff.content ? diff.content : undefined;\r\n }\r\n\r\n private initScrollListener() {\r\n this.subscriptions.push(this.scrollService.scrolled().subscribe((scrollableEv: CdkScrollable) => {\r\n if (scrollableEv && this.synchronizeScrolling) {\r\n const scrollableId = scrollableEv.getElementRef().nativeElement.id;\r\n const nonScrolledContainer: ContainerDirective = this.containers.find(container => container.id !== scrollableId);\r\n if (nonScrolledContainer) {\r\n nonScrolledContainer.element.scrollTo({\r\n top: scrollableEv.measureScrollOffset('top'),\r\n left: scrollableEv.measureScrollOffset('left'),\r\n });\r\n }\r\n }\r\n }));\r\n }\r\n}\r\n","<td-loader-spinner [active]=\"loading\"></td-loader-spinner>\r\n<div class=\"td-wrapper\" [ngClass]=\"outerContainerClass\" [ngStyle]=\"outerContainerStyle\" *ngIf=\"!loading\">\r\n\r\n <div [ngClass]=\"toolbarClass\" [ngStyle]=\"toolbarStyle\" *ngIf=\"showToolbar\">\r\n <div class=\"td-toolbar-show-diff\">\r\n <label class=\"td-checkbox-container\">\r\n Only Show Lines with Differences ({{ diffsCount }})\r\n <input type=\"checkbox\" id=\"showDiffs\" [ngModel]=\"hideMatchingLines\" (ngModelChange)=\"hideMatchingLinesChanged($event)\" />\r\n <span class=\"checkmark\"></span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"td-toolbar-select-format\" *ngIf=\"showToolbar && showBtnToolbar\">\r\n <div class=\"td-btn-group td-btn-group-toggle\" data-toggle=\"buttons\">\r\n <button\r\n *ngFor=\"let option of formatOptions\"\r\n [ngClass]=\"{ active: format === option.value, disabled: !!option.disabled }\"\r\n [name]=\"option.name\"\r\n [id]=\"option.id\"\r\n [disabled]=\"!!option.disabled\"\r\n (click)=\"setDiffTableFormat(option.value)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"td-table-wrapper\" [ngClass]=\"compareRowsClass\" [ngStyle]=\"compareRowsStyle\">\r\n <!-- Right side-by-side -->\r\n <div class=\"td-table-container side-by-side\" *ngIf=\"format === 'SideBySide'\" id=\"td-left-compare-container\" tdContainer cdkScrollable>\r\n <table class=\"td-table\">\r\n <tbody>\r\n <tr *ngFor=\"let row of filteredTableRows; trackBy: trackTableRows\">\r\n <td\r\n scope=\"row\"\r\n class=\"fit-column line-number-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\r\n >\r\n {{ row.leftContent?.lineNumber !== -1 ? row.leftContent?.lineNumber : ' ' }}\r\n </td>\r\n <td\r\n class=\"fit-column prefix-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\r\n >\r\n <span>{{ row.leftContent?.prefix || ' ' }}</span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\r\n *ngIf=\"!row.hasDiffs\"\r\n >\r\n <span [innerHTML]=\"row.leftContent?.lineContent | formatLine\"></span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\r\n *ngIf=\"row.hasDiffs\"\r\n >\r\n <span\r\n [innerHTML]=\"diff.content | formatLine\"\r\n [ngClass]=\"{ highlight: diff.isDiff }\"\r\n *ngFor=\"let diff of row.leftContent?.lineDiffs; trackBy: trackDiffs\"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!-- Left side-by-side -->\r\n <div class=\"td-table-container side-by-side\" *ngIf=\"format === 'SideBySide'\" id=\"td-right-compare-container\" tdContainer cdkScrollable>\r\n <table class=\"td-table\">\r\n <tbody>\r\n <tr *ngFor=\"let row of filteredTableRows; trackBy: trackTableRows\">\r\n <td\r\n scope=\"row\"\r\n class=\"fit-column line-number-col\"\r\n [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\r\n >\r\n {{ row.rightContent?.lineNumber !== -1 ? row.rightContent?.lineNumber : ' ' }}\r\n </td>\r\n <td\r\n class=\"fit-column prefix-col\"\r\n [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\r\n >\r\n <span>{{ row.rightContent?.prefix || ' ' }}</span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\r\n *ngIf=\"!row.hasDiffs\"\r\n >\r\n <span [innerHTML]=\"row.rightContent?.lineContent | formatLine\"></span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\r\n *ngIf=\"row.hasDiffs\"\r\n >\r\n <span\r\n [innerHTML]=\"diff.content | formatLine\"\r\n [ngClass]=\"{ highlight: diff.isDiff }\"\r\n *ngFor=\"let diff of row.rightContent?.lineDiffs; trackBy: trackDiffs\"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!-- Line By Line - combined table -->\r\n <div class=\"td-table-container line-by-line\" *ngIf=\"format === 'LineByLine'\">\r\n <table class=\"td-table\">\r\n <tbody>\r\n <tr *ngFor=\"let row of filteredTableRowsLineByLine; trackBy: trackTableRows\">\r\n <td scope=\"row\" class=\"fit-column line-number-col-left\">{{ row.leftContent?.lineNumber }}</td>\r\n <td scope=\"row\" class=\"fit-column line-number-col\">{{ row.rightContent?.lineNumber }}</td>\r\n <td\r\n class=\"fit-column prefix-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\r\n >\r\n <span>{{ row.leftContent?.prefix || row.rightContent?.prefix || ' ' }}</span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\r\n *ngIf=\"!row.hasDiffs\"\r\n >\r\n <span [innerHTML]=\"row.leftContent?.lineContent | formatLine\"></span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\r\n *ngIf=\"row.hasDiffs && row.leftContent && row.leftContent?.lineDiffs.length !== 0\"\r\n >\r\n <span\r\n [innerHTML]=\"diff.content | formatLine\"\r\n [ngClass]=\"{ highlight: diff.isDiff }\"\r\n *ngFor=\"let diff of row.leftContent?.lineDiffs; trackBy: trackDiffs\"\r\n ></span>\r\n </td>\r\n <td\r\n class=\"content-col\"\r\n [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\r\n *ngIf=\"row.hasDiffs && row.rightContent && row.rightContent?.lineDiffs.length !== 0\"\r\n >\r\n <span\r\n [innerHTML]=\"diff.content | formatLine\"\r\n [ngClass]=\"{ highlight: diff.isDiff }\"\r\n *ngFor=\"let diff of row.rightContent?.lineDiffs; trackBy: trackDiffs\"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxTextDiffComponent } from './ngx-text-diff.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { LoaderSpinnerComponent } from './loader-spinner/loader-spinner.component';\r\nimport { FormatLinePipe } from './format-line.pipe';\r\nimport { ContainerDirective } from './ngx-text-diff-container.directive';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\n\r\n@NgModule({\r\n imports: [CommonModule, FormsModule, ScrollingModule],\r\n declarations: [NgxTextDiffComponent, LoaderSpinnerComponent, FormatLinePipe, ContainerDirective],\r\n exports: [NgxTextDiffComponent],\r\n})\r\nexport class NgxTextDiffModule {}\r\n","/*\r\n * Public API Surface of ngx-text-diff\r\n */\r\n\r\nexport * from './lib/ngx-text-diff.service';\r\nexport * from './lib/ngx-text-diff.component';\r\nexport * from './lib/ngx-text-diff.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i2.NgxTextDiffService","i5.LoaderSpinnerComponent","i6.ContainerDirective","i7.FormatLinePipe"],"mappings":"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"}