UNPKG

@pierre/diffs

Version:

71 lines (70 loc) 2.79 kB
import { linesFromFileContents } from "./computeFileOffsets.js"; import { getFiletypeFromFileName } from "./getFiletypeFromFileName.js"; import { appendItems } from "./appendItems.js"; import { createTransformerWithState } from "./createTransformerWithState.js"; import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js"; import { getHighlighterThemeStyles } from "./getHighlighterThemeStyles.js"; import { getLineNodes } from "./getLineNodes.js"; //#region src/utils/renderFileWithHighlighter.ts const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false }; function renderFileWithHighlighter(file, highlighter, { theme, tokenizeMaxLineLength, useTokenTransformer }, { forcePlainText, startingLine, totalLines, lines } = DEFAULT_PLAIN_TEXT_OPTIONS) { if (forcePlainText) { startingLine ??= 0; totalLines ??= Infinity; } else { startingLine = 0; totalLines = Infinity; } const isWindowedHighlight = startingLine > 0 || totalLines < Infinity; const { state, transformers } = createTransformerWithState(useTokenTransformer); const lang = forcePlainText ? "text" : file.lang ?? getFiletypeFromFileName(file.name); const baseThemeType = typeof theme === "string" ? highlighter.getTheme(theme).type : void 0; const themeStyles = getHighlighterThemeStyles({ theme, highlighter }); state.lineInfo = (shikiLineNumber) => ({ type: "context", lineIndex: shikiLineNumber - 1 + startingLine, lineNumber: shikiLineNumber + startingLine }); const hastConfig = (() => { if (typeof theme === "string") return { lang, theme, transformers, defaultColor: false, cssVariablePrefix: formatCSSVariablePrefix("token"), tokenizeMaxLineLength, tokenizeTimeLimit: 0 }; return { lang, themes: theme, transformers, defaultColor: false, cssVariablePrefix: formatCSSVariablePrefix("token"), tokenizeMaxLineLength, tokenizeTimeLimit: 0 }; })(); const highlightedLines = getLineNodes(highlighter.codeToHast(normalizeHighlightLineEndings(isWindowedHighlight ? extractWindowedFileContent(lines ?? linesFromFileContents(file.contents), startingLine, totalLines) : file.contents), hastConfig)); const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines; if (isWindowedHighlight) appendItems(code, highlightedLines); return { code, themeStyles, baseThemeType }; } function normalizeHighlightLineEndings(contents) { return contents.replace(/\r(?!\n)/g, "\n"); } function extractWindowedFileContent(lines, startingLine, totalLines) { if (lines.length === 0) return ""; const endLine = Math.min(startingLine + totalLines, lines.length); return lines.slice(startingLine, endLine).join(""); } //#endregion export { renderFileWithHighlighter }; //# sourceMappingURL=renderFileWithHighlighter.js.map