Skip to content

Commit d14e4d3

Browse files
custom transform
1 parent 4e8ba7a commit d14e4d3

21 files changed

+616
-95
lines changed

packages/core/index.d.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ declare class File$1 {
1717
hasDoRaw: boolean;
1818
rawLength?: number;
1919
syntaxFile: Record<number, SyntaxLineWithTemplate>;
20+
plainFile: Record<number, {
21+
value: string;
22+
template?: string;
23+
}>;
2024
hasDoSyntax: boolean;
2125
syntaxLength?: number;
2226
highlighterName?: DiffHighlighter["name"];
@@ -93,7 +97,15 @@ export declare class DiffFile {
9397
onAllCollapse: (mode: "split" | "unified") => void;
9498
getOldFileContent: () => string;
9599
getNewFileContent: () => string;
100+
getOldPlainLine: (lineNumber: number) => {
101+
value: string;
102+
template?: string;
103+
};
96104
getOldSyntaxLine: (lineNumber: number) => SyntaxLineWithTemplate;
105+
getNewPlainLine: (lineNumber: number) => {
106+
value: string;
107+
template?: string;
108+
};
97109
getNewSyntaxLine: (lineNumber: number) => SyntaxLineWithTemplate;
98110
subscribe: (listener: (() => void) & {
99111
isSyncExternal?: boolean;
@@ -108,10 +120,18 @@ export declare class DiffFile {
108120
hasBuildUnified: boolean;
109121
oldFileLines: Record<number, string>;
110122
oldFileDiffLines: Record<string, DiffLineItem>;
123+
oldFilePlainLines: Record<number, {
124+
value: string;
125+
template?: string;
126+
}>;
111127
oldFileSyntaxLines: Record<number, SyntaxLineWithTemplate>;
112128
oldFilePlaceholderLines: Record<string, boolean>;
113129
newFileLines: Record<number, string>;
114130
newFileDiffLines: Record<string, DiffLineItem>;
131+
newFilePlainLines: Record<number, {
132+
value: string;
133+
template?: string;
134+
}>;
115135
newFileSyntaxLines: Record<number, SyntaxLineWithTemplate>;
116136
newFilePlaceholderLines: Record<string, boolean>;
117137
splitLineLength: number;
@@ -157,10 +177,18 @@ export declare class DiffFile {
157177
hasBuildUnified: boolean;
158178
oldFileLines: Record<number, string>;
159179
oldFileDiffLines: Record<string, DiffLineItem>;
180+
oldFilePlainLines: Record<number, {
181+
value: string;
182+
template?: string;
183+
}>;
160184
oldFileSyntaxLines: Record<number, SyntaxLineWithTemplate>;
161185
oldFilePlaceholderLines: Record<string, boolean>;
162186
newFileLines: Record<number, string>;
163187
newFileDiffLines: Record<string, DiffLineItem>;
188+
newFilePlainLines: Record<number, {
189+
value: string;
190+
template?: string;
191+
}>;
164192
newFileSyntaxLines: Record<number, SyntaxLineWithTemplate>;
165193
newFilePlaceholderLines: Record<string, boolean>;
166194
splitLineLength: number;
@@ -384,35 +412,64 @@ export declare const checkCurrentLineIsHidden: (diffFile: DiffFile, lineNumber:
384412
};
385413
export declare const checkDiffLineIncludeChange: (diffLine?: DiffLine) => boolean;
386414
export declare const disableCache: () => void;
415+
export declare const doAfterTransform: (content: string) => string;
416+
export declare const doPreTransform: (content: string) => string;
387417
export declare const getDiffRange: (additions: DiffLine[], deletions: DiffLine[], { getAdditionRaw, getDeletionRaw, getAdditionSyntax, getDeletionSyntax, }: {
388418
getAdditionRaw: (lineNumber: number) => string;
389419
getDeletionRaw: (lineNumber: number) => string;
390420
getAdditionSyntax: (lineNumber: number) => SyntaxLineWithTemplate;
391421
getDeletionSyntax: (lineNumber: number) => SyntaxLineWithTemplate;
392422
}) => void;
393423
export declare const getLang: (fileName: string) => string;
394-
export declare const getPlainTemplate: ({ diffLine, rawLine, operator, }: {
424+
export declare const getPlainDiffTemplate: ({ diffLine, rawLine, operator, }: {
395425
diffLine: DiffLine;
396426
rawLine: string;
397427
operator: "add" | "del";
398428
}) => void;
429+
export declare const getPlainLineTemplate: (line: string) => string;
399430
export declare const getSplitContentLines: (diffFile: DiffFile) => DiffSplitContentLineItem[];
400431
export declare const getSplitLines: (diffFile: DiffFile) => DiffSplitLineItem[];
401-
export declare const getSyntaxTemplate: ({ diffLine, syntaxLine, operator, }: {
432+
export declare const getSyntaxDiffTemplate: ({ diffLine, syntaxLine, operator, }: {
402433
diffLine: DiffLine;
403434
syntaxLine: SyntaxLineWithTemplate;
404435
operator: "add" | "del";
405436
}) => void;
437+
export declare const getSyntaxLineTemplate: (line: SyntaxLine) => string;
406438
export declare const getUnifiedContentLine: (diffFile: DiffFile) => DiffUnifiedContentLineItem[];
407439
export declare const getUnifiedLines: (diffFile: DiffFile) => DiffUnifiedLineItem[];
408440
export declare const highlighter: DiffHighlighter;
441+
export declare const isTransformEnabled: () => boolean;
409442
export declare const numIterator: <T>(num: number, cb: (index: number) => T) => T[];
410443
export declare const parseInstance: DiffParser;
411444
export declare const processAST: (ast: DiffAST) => {
412445
syntaxFileObject: Record<number, SyntaxLine>;
413446
syntaxFileLineNumber: number;
414447
};
415448
export declare const resetDefaultComposeLength: () => void;
449+
export declare const resetTransform: () => void;
450+
export declare const setAfterTransform: (fn: (content: string) => string) => void;
451+
/**
452+
* ⚠️ **WARNING: DANGEROUS OPERATION** ⚠️
453+
*
454+
* Sets a pre-transformation function that will be applied to content before processing.
455+
* This is a global state modification that affects all subsequent operations.
456+
*
457+
* **CAUTION**:
458+
* - This function modifies global state and may cause unexpected side effects
459+
* - The transformation will be applied to ALL content processing operations
460+
* - Multiple calls will overwrite the previous transform function
461+
* - Ensure proper error handling in your transform function to avoid breaking the entire pipeline
462+
*
463+
* @param fn - The transformation function to apply before processing content
464+
* @throws {Error} Throws an error if the provided parameter is not a function
465+
*
466+
* @example
467+
* ```typescript
468+
* // Use with caution - this affects global behavior
469+
* setPreTransform((content) => content.trim());
470+
* ```
471+
*/
472+
export declare const setPreTransform: (fn: (content: string) => string) => void;
416473
export declare const versions: string;
417474
export declare enum DiffFileLineType {
418475
hunk = 1,

packages/core/src/diff-file.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ export class DiffFile {
105105

106106
#newFileLines?: File["rawFile"];
107107

108+
#oldFilePlainLines?: File["plainFile"];
109+
110+
#newFilePlainLines?: File["plainFile"];
111+
108112
#oldFileSyntaxLines?: File["syntaxFile"];
109113

110114
#newFileSyntaxLines?: File["syntaxFile"];
@@ -306,10 +310,14 @@ export class DiffFile {
306310

307311
this.#oldFileLines = this.#oldFileResult?.rawFile;
308312

313+
this.#oldFilePlainLines = this.#oldFileResult?.plainFile;
314+
309315
this.#newFileResult?.doRaw();
310316

311317
this.#newFileLines = this.#newFileResult?.rawFile;
312318

319+
this.#newFilePlainLines = this.#newFileResult?.plainFile;
320+
313321
this.fileLineLength = Math.max(
314322
this.fileLineLength,
315323
this.#oldFileResult?.maxLineNumber || 0,
@@ -634,10 +642,18 @@ export class DiffFile {
634642
return this.#oldFileLines?.[lineNumber];
635643
}
636644

645+
#getOldPlainLine(lineNumber: number) {
646+
return this.#oldFilePlainLines?.[lineNumber];
647+
}
648+
637649
#getNewRawLine(lineNumber: number) {
638650
return this.#newFileLines?.[lineNumber];
639651
}
640652

653+
#getNewPlainLine(lineNumber: number) {
654+
return this.#newFilePlainLines?.[lineNumber];
655+
}
656+
641657
#getOldSyntaxLine(lineNumber: number) {
642658
return this.#oldFileSyntaxLines?.[lineNumber];
643659
}
@@ -1349,10 +1365,18 @@ export class DiffFile {
13491365
return this.#newFileResult?.raw;
13501366
};
13511367

1368+
getOldPlainLine = (lineNumber: number) => {
1369+
return this.#oldFilePlainLines?.[lineNumber];
1370+
};
1371+
13521372
getOldSyntaxLine = (lineNumber: number) => {
13531373
return this.#oldFileSyntaxLines?.[lineNumber];
13541374
};
13551375

1376+
getNewPlainLine = (lineNumber: number) => {
1377+
return this.#newFilePlainLines?.[lineNumber];
1378+
};
1379+
13561380
getNewSyntaxLine = (lineNumber: number) => {
13571381
return this.#newFileSyntaxLines?.[lineNumber];
13581382
};
@@ -1393,10 +1417,12 @@ export class DiffFile {
13931417
const hasBuildUnified = this.#hasBuildUnified;
13941418
const oldFileLines = this.#oldFileLines;
13951419
const oldFileDiffLines = this.#oldFileDiffLines;
1420+
const oldFilePlainLines = this.#oldFilePlainLines;
13961421
const oldFileSyntaxLines = this.#oldFileSyntaxLines;
13971422
const oldFilePlaceholderLines = this.#oldFilePlaceholderLines;
13981423
const newFileLines = this.#newFileLines;
13991424
const newFileDiffLines = this.#newFileDiffLines;
1425+
const newFilePlainLines = this.#newFilePlainLines;
14001426
const newFileSyntaxLines = this.#newFileSyntaxLines;
14011427
const newFilePlaceholderLines = this.#newFilePlaceholderLines;
14021428
const splitLineLength = this.splitLineLength;
@@ -1430,10 +1456,12 @@ export class DiffFile {
14301456
hasBuildUnified,
14311457
oldFileLines,
14321458
oldFileDiffLines,
1459+
oldFilePlainLines,
14331460
oldFileSyntaxLines,
14341461
oldFilePlaceholderLines,
14351462
newFileLines,
14361463
newFileDiffLines,
1464+
newFilePlainLines,
14371465
newFileSyntaxLines,
14381466
newFilePlaceholderLines,
14391467
splitLineLength,
@@ -1473,10 +1501,12 @@ export class DiffFile {
14731501

14741502
this.#oldFileLines = data.oldFileLines;
14751503
this.#oldFileDiffLines = data.oldFileDiffLines;
1504+
this.#oldFilePlainLines = data.oldFilePlainLines;
14761505
this.#oldFileSyntaxLines = data.oldFileSyntaxLines;
14771506
this.#oldFilePlaceholderLines = data.oldFilePlaceholderLines;
14781507
this.#newFileLines = data.newFileLines;
14791508
this.#newFileDiffLines = data.newFileDiffLines;
1509+
this.#newFilePlainLines = data.newFilePlainLines;
14801510
this.#newFileSyntaxLines = data.newFileSyntaxLines;
14811511
this.#newFilePlaceholderLines = data.newFilePlaceholderLines;
14821512
this.splitLineLength = data.splitLineLength;

packages/core/src/file.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { highlighter } from "@git-diff-view/lowlight";
22

33
import { Cache } from "./cache";
4-
import { escapeHtml } from "./escape-html";
5-
4+
import { getPlainLineTemplate, getSyntaxLineTemplate } from "./parse";
65

76
import type { DiffAST, DiffHighlighter, DiffHighlighterLang, SyntaxLine } from "@git-diff-view/lowlight";
87

@@ -32,18 +31,6 @@ export type SyntaxLineWithTemplate = SyntaxLine & {
3231
template?: string;
3332
};
3433

35-
const getSyntaxLineTemplate = (line: SyntaxLine) => {
36-
let template = "";
37-
38-
line?.nodeList?.forEach(({ node, wrapper }) => {
39-
template += `<span data-start="${node.startIndex}" data-end="${node.endIndex}" class="${(
40-
wrapper?.properties?.className || []
41-
)?.join(" ")}" style="${wrapper?.properties?.style || ""}">${escapeHtml(node.value)}</span>`;
42-
});
43-
44-
return template;
45-
};
46-
4734
export class File {
4835
ast?: DiffAST;
4936

@@ -55,6 +42,8 @@ export class File {
5542

5643
syntaxFile: Record<number, SyntaxLineWithTemplate> = {};
5744

45+
plainFile: Record<number, { value: string; template?: string }> = {};
46+
5847
hasDoSyntax: boolean = false;
5948

6049
syntaxLength?: number;
@@ -70,13 +59,15 @@ export class File {
7059

7160
file.ast = data?.ast;
7261

73-
file.rawFile = data?.rawFile;
62+
file.rawFile = data?.rawFile || {};
63+
64+
file.plainFile = data?.plainFile || {};
7465

7566
file.hasDoRaw = data?.hasDoRaw;
7667

7768
file.rawLength = data?.rawLength;
7869

79-
file.syntaxFile = data?.syntaxFile;
70+
file.syntaxFile = data?.syntaxFile || {};
8071

8172
file.hasDoSyntax = data?.hasDoSyntax;
8273

@@ -177,8 +168,14 @@ export class File {
177168

178169
this.rawFile = {};
179170

171+
this.plainFile = {};
172+
180173
for (let i = 0; i < rawArray.length; i++) {
181174
this.rawFile[i + 1] = i < rawArray.length - 1 ? rawArray[i] + "\n" : rawArray[i];
175+
this.plainFile[i + 1] = {
176+
value: this.rawFile[i + 1],
177+
template: getPlainLineTemplate(this.rawFile[i + 1]),
178+
}
182179
}
183180

184181
this.hasDoRaw = true;

packages/core/src/parse/diff-tool.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { relativeChanges } from "./change-range";
22
import { DiffLineType } from "./diff-line";
33
import { DiffHunkExpansionType } from "./raw-diff";
4-
import { getPlainTemplate, getSyntaxTemplate } from "./template";
4+
import { getPlainDiffTemplate, getSyntaxDiffTemplate } from "./template";
55

66
import type { SyntaxLineWithTemplate } from "../file";
77
import type { DiffLine } from "./diff-line";
@@ -123,16 +123,16 @@ export const getDiffRange = (
123123
deletion.changes = delRange;
124124
}
125125
if (!addition.plainTemplate || !deletion.plainTemplate) {
126-
getPlainTemplate({ diffLine: addition, rawLine: getAdditionRaw(addition.newLineNumber), operator: "add" });
127-
getPlainTemplate({ diffLine: deletion, rawLine: getDeletionRaw(deletion.oldLineNumber), operator: "del" });
126+
getPlainDiffTemplate({ diffLine: addition, rawLine: getAdditionRaw(addition.newLineNumber), operator: "add" });
127+
getPlainDiffTemplate({ diffLine: deletion, rawLine: getDeletionRaw(deletion.oldLineNumber), operator: "del" });
128128
}
129129
if (!addition.syntaxTemplate || !deletion.syntaxTemplate) {
130-
getSyntaxTemplate({
130+
getSyntaxDiffTemplate({
131131
diffLine: addition,
132132
syntaxLine: getAdditionSyntax(addition.newLineNumber),
133133
operator: "add",
134134
});
135-
getSyntaxTemplate({
135+
getSyntaxDiffTemplate({
136136
diffLine: deletion,
137137
syntaxLine: getDeletionSyntax(deletion.oldLineNumber),
138138
operator: "del",

packages/core/src/parse/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ export * from "./change-range";
33
export * from "./diff-line";
44
export * from "./diff-tool";
55
export * from "./template";
6+
export * from "./transform";
67
// main export
78
export * from "./diff-parse";

0 commit comments

Comments
 (0)