From af8f573eb11882f011845a5d1ad1b177b8c34f13 Mon Sep 17 00:00:00 2001 From: inchei Date: Sun, 20 Sep 2026 19:54:28 +1000 Subject: [PATCH] feat(core): add setEnableDiffSemanticCleanup and honor fast-diff templates Semantic cleanup in diffChanges merged small inline changes into one block, hiding per-change highlights for text without word boundaries (e.g. CJK). The cleanup is now opt-out (default on), and prebuilt fast-diff templates are kept at render time when setEnableFastDiffTemplate(true) is set. --- README.md | 11 +++++++++++ packages/core/src/parse/change-range.ts | 14 +++++++++++++- packages/core/src/parse/template.ts | 11 +++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cff330fe..f8418171 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,17 @@ import { setEnableFastDiffTemplate } from '@git-diff-view/core'; setEnableFastDiffTemplate(true); ``` +By default the inline ranges are merged with a semantic cleanup, which may +highlight everything between the first and the last change on a line as a +single block. This is especially visible for text without word boundaries +(e.g. CJK text). Disable the cleanup to highlight each change separately: + +```ts +import { setEnableDiffSemanticCleanup } from '@git-diff-view/core'; + +setEnableDiffSemanticCleanup(false); +``` + | Default | FastDiff | |---------|----------| | ![default](https://raw.githubusercontent.com/MrWangJustToDo/git-diff-view/main/default.png) | ![fastdiff](https://raw.githubusercontent.com/MrWangJustToDo/git-diff-view/main/enableFastDiffTemplate.png) | diff --git a/packages/core/src/parse/change-range.ts b/packages/core/src/parse/change-range.ts index 5fbb676c..51d3498d 100644 --- a/packages/core/src/parse/change-range.ts +++ b/packages/core/src/parse/change-range.ts @@ -40,6 +40,18 @@ export const resetMaxLengthToIgnoreLineDiff = () => { export const getMaxLengthToIgnoreLineDiff = () => maxLengthToIgnoreLineDiff; +let enableDiffSemanticCleanup = true; + +export const getEnableDiffSemanticCleanup = () => enableDiffSemanticCleanup; + +export const setEnableDiffSemanticCleanup = (enable: boolean) => { + enableDiffSemanticCleanup = enable; +}; + +export const resetEnableDiffSemanticCleanup = () => { + enableDiffSemanticCleanup = true; +}; + /** Get the maximum position in the range. */ function rangeMax(range: IRange["range"]): number { return range.location + range.length; @@ -222,7 +234,7 @@ export function diffChanges(addition: DiffLine, deletion: DiffLine): { addRange: }; } - const diffRange = fastDiff(delString, addString, 0, true); + const diffRange = fastDiff(delString, addString, 0, enableDiffSemanticCleanup); let aStart = 0; let bStart = 0; diff --git a/packages/core/src/parse/template.ts b/packages/core/src/parse/template.ts index 11d7581c..91160b3b 100644 --- a/packages/core/src/parse/template.ts +++ b/packages/core/src/parse/template.ts @@ -45,6 +45,8 @@ export const getPlainDiffTemplate = ({ }) => { if (diffLine.plainTemplate && diffLine.plainTemplateMode === "relative") return; + if (diffLine.plainTemplate && diffLine.plainTemplateMode === "fast-diff" && enableFastDiffTemplate) return; + const changes = diffLine.changes; if (!changes || !changes.hasLineChange || !rawLine) return; @@ -149,6 +151,15 @@ export const getSyntaxDiffTemplate = ({ ) return; + if ( + diffLine.syntaxTemplate && + diffLine.syntaxTemplateMode === "fast-diff" && + diffLine.syntaxTemplateName === diffFile._getHighlighterName() && + diffFile._getHighlighterType() === "class" && + enableFastDiffTemplate + ) + return; + const changes = diffLine.changes; if (!changes || !changes.hasLineChange) return;