import { DiffLineType, getSyntaxDiffTemplate, getSyntaxLineTemplate, getPlainDiffTemplate, getPlainLineTemplate, } from "@git-diff-view/core"; import { memoFunc, diffFontSizeName, NewLineSymbol } from "@git-diff-view/utils"; import { DiffNoNewLine } from "./DiffNoNewLine"; import type { DiffFile, DiffLine, File } from "@git-diff-view/core"; const temp = {}; const formatStringToCamelCase = (str: string) => { if (str.startsWith("--")) return str; const splitted = str.split("-"); if (splitted.length === 1) return splitted[0]; return ( splitted[0] + splitted .slice(1) .map((word) => word[0].toUpperCase() + word.slice(1)) .join("") ); }; export const getStyleObjectFromString = memoFunc((str: string) => { if (!str) return temp; const style: Record = {}; str.split(";").forEach((el) => { const [property, value] = el.split(":"); if (!property) return; const formattedProperty = formatStringToCamelCase(property.trim()); style[formattedProperty] = value.trim(); }); return style; }); const DiffString = ({ rawLine, diffLine, operator, plainLine, enableWrap, }: { rawLine: string; diffLine?: DiffLine; operator?: "add" | "del"; plainLine?: File["plainFile"][number]; enableWrap?: boolean; }) => { const changes = diffLine?.changes; if (changes?.hasLineChange) { const isNewLineSymbolChanged = changes.newLineSymbol; if (!diffLine?.plainTemplate && typeof getPlainDiffTemplate === "function") { getPlainDiffTemplate({ diffLine: diffLine!, rawLine, operator: operator! }); } if (diffLine?.plainTemplate) { return ( {isNewLineSymbolChanged === NewLineSymbol.NEWLINE && ( )} ); } } if (plainLine && !plainLine?.template) { // eslint-disable-next-line react-hooks/immutability plainLine.template = getPlainLineTemplate(plainLine.value); } if (plainLine?.template) { return ( ); } return {rawLine}; }; const DiffSyntax = ({ rawLine, diffFile, diffLine, operator, syntaxLine, enableWrap, }: { rawLine: string; diffFile: DiffFile; diffLine?: DiffLine; syntaxLine?: File["syntaxFile"][number]; operator?: "add" | "del"; enableWrap?: boolean; }) => { if (!syntaxLine) { return ; } const changes = diffLine?.changes; if (changes?.hasLineChange) { const isNewLineSymbolChanged = changes.newLineSymbol; if (!diffLine?.syntaxTemplate && typeof getSyntaxDiffTemplate === "function") { getSyntaxDiffTemplate({ diffFile, diffLine: diffLine!, syntaxLine, operator: operator! }); } if (diffLine?.syntaxTemplate) { return ( {isNewLineSymbolChanged === NewLineSymbol.NEWLINE && ( )} ); } } if (!syntaxLine.template) { // eslint-disable-next-line react-hooks/immutability syntaxLine.template = getSyntaxLineTemplate(syntaxLine); } if (syntaxLine?.template) { return ( ); } return ( {syntaxLine?.nodeList?.map(({ node, wrapper }, index) => ( {node.value} ))} ); }; export const DiffContent = ({ diffFile, diffLine, rawLine, plainLine, syntaxLine, enableWrap, enableHighlight, }: { rawLine: string; plainLine?: File["plainFile"][number]; syntaxLine?: File["syntaxFile"][number]; diffLine?: DiffLine; diffFile: DiffFile; enableWrap: boolean; enableHighlight: boolean; }) => { const isAdded = diffLine?.type === DiffLineType.Add; const isDelete = diffLine?.type === DiffLineType.Delete; const isMaxLineLengthToIgnoreSyntax = syntaxLine && syntaxLine?.nodeList?.length > 150; return (
{isAdded ? "+" : isDelete ? "-" : " "} {enableHighlight && syntaxLine && !isMaxLineLengthToIgnoreSyntax ? ( ) : ( )}
); };