@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 6.03 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","names":["matches: { id: string; index: number; length: number }[]","excludedRanges: { end: number; start: number }[]"],"sources":["../../../src/hooks/useMarkdown/utils.ts"],"sourcesContent":["import { preprocessLaTeX } from './latex';\n\n// Cache configuration\nconst CACHE_SIZE = 50;\n\n/**\n * Cache for storing processed content to avoid redundant processing\n */\nexport const contentCache = new Map<string, string>();\n\n/**\n * Adds content to the cache with size limitation\n * Removes oldest entry if cache size limit is reached\n *\n * @param key The cache key\n * @param value The processed content to store\n */\nexport const addToCache = (key: string, value: string) => {\n if (contentCache.size >= CACHE_SIZE) {\n // Remove the oldest cache entry\n const firstKey = contentCache.keys().next().value;\n if (firstKey) contentCache.delete(firstKey);\n }\n contentCache.set(key, value);\n};\n\n/**\n * Transforms citation references in the format [n] to markdown links\n *\n * @param rawContent The markdown content with citation references\n * @param length The number of citations\n * @returns The content with citations transformed to markdown links\n */\nexport const transformCitations = (rawContent: string, length: number = 0) => {\n if (length === 0) return rawContent;\n\n // 生成引用索引\n const citationIndices = Array.from({ length })\n .fill('')\n .map((_, index) => index + 1);\n\n // 匹配所有潜在的引用\n const pattern = new RegExp(`\\\\[(${citationIndices.join('|')})\\\\]`, 'g');\n const matches: { id: string; index: number; length: number }[] = [];\n\n let match;\n while ((match = pattern.exec(rawContent)) !== null) {\n matches.push({\n id: match[1],\n index: match.index,\n length: match[0].length,\n });\n }\n\n // 识别所有需要排除的区域\n const excludedRanges: { end: number; start: number }[] = [];\n\n // 查找LaTeX块 $$...$$\n let latexBlockRegex = /\\$\\$([\\S\\s]*?)\\$\\$/g;\n while ((match = latexBlockRegex.exec(rawContent)) !== null) {\n excludedRanges.push({\n end: match.index + match[0].length - 1,\n start: match.index,\n });\n }\n\n // 查找行内LaTeX $...$\n let inlineLatexRegex = /\\$([^$]*?)\\$/g;\n while ((match = inlineLatexRegex.exec(rawContent)) !== null) {\n excludedRanges.push({\n end: match.index + match[0].length - 1,\n start: match.index,\n });\n }\n\n // 查找代码块 ```...```\n let codeBlockRegex = /```([\\S\\s]*?)```/g;\n while ((match = codeBlockRegex.exec(rawContent)) !== null) {\n excludedRanges.push({\n end: match.index + match[0].length - 1,\n start: match.index,\n });\n }\n\n // 查找行内代码 `...`\n let inlineCodeRegex = /`([^`]*?)`/g;\n while ((match = inlineCodeRegex.exec(rawContent)) !== null) {\n excludedRanges.push({\n end: match.index + match[0].length - 1,\n start: match.index,\n });\n }\n\n // 过滤掉在排除区域内的引用\n const validMatches = matches.filter((citation) => {\n return !excludedRanges.some(\n (range) => citation.index >= range.start && citation.index <= range.end,\n );\n });\n\n // 从后向前替换,避免索引变化问题\n let result = rawContent;\n for (let i = validMatches.length - 1; i >= 0; i--) {\n const citation = validMatches[i];\n const before = result.slice(0, Math.max(0, citation.index));\n const after = result.slice(Math.max(0, citation.index + citation.length));\n result = before + `[#citation-${citation.id}](citation-${citation.id})` + after;\n }\n\n // 处理连续引用\n return result.replaceAll('][', '] [');\n};\n\n/**\n * Preprocessing options for markdown content\n */\ninterface PreprocessOptions {\n citationsLength?: number;\n enableCustomFootnotes?: boolean;\n enableLatex?: boolean;\n}\n\nexport const preprocessMarkdownContent = (\n str: string,\n { enableCustomFootnotes, enableLatex, citationsLength }: PreprocessOptions = {},\n) => {\n let content = str;\n\n // Process LaTeX expressions\n if (enableLatex) {\n content = preprocessLaTeX(content);\n }\n\n // Process custom footnotes/citations\n if (enableCustomFootnotes) {\n content = transformCitations(content, citationsLength);\n }\n\n return content;\n};\n"],"mappings":";;;AAGA,MAAM,aAAa;;;;AAKnB,MAAa,+BAAe,IAAI,KAAqB;;;;;;;;AASrD,MAAa,cAAc,KAAa,UAAkB;AACxD,KAAI,aAAa,QAAQ,YAAY;EAEnC,MAAM,WAAW,aAAa,MAAM,CAAC,MAAM,CAAC;AAC5C,MAAI,SAAU,cAAa,OAAO,SAAS;;AAE7C,cAAa,IAAI,KAAK,MAAM;;;;;;;;;AAU9B,MAAa,sBAAsB,YAAoB,SAAiB,MAAM;AAC5E,KAAI,WAAW,EAAG,QAAO;CAGzB,MAAM,kBAAkB,MAAM,KAAK,EAAE,QAAQ,CAAC,CAC3C,KAAK,GAAG,CACR,KAAK,GAAG,UAAU,QAAQ,EAAE;CAG/B,MAAM,UAAU,IAAI,OAAO,OAAO,gBAAgB,KAAK,IAAI,CAAC,OAAO,IAAI;CACvE,MAAMA,UAA2D,EAAE;CAEnE,IAAI;AACJ,SAAQ,QAAQ,QAAQ,KAAK,WAAW,MAAM,KAC5C,SAAQ,KAAK;EACX,IAAI,MAAM;EACV,OAAO,MAAM;EACb,QAAQ,MAAM,GAAG;EAClB,CAAC;CAIJ,MAAMC,iBAAmD,EAAE;CAG3D,IAAI,kBAAkB;AACtB,SAAQ,QAAQ,gBAAgB,KAAK,WAAW,MAAM,KACpD,gBAAe,KAAK;EAClB,KAAK,MAAM,QAAQ,MAAM,GAAG,SAAS;EACrC,OAAO,MAAM;EACd,CAAC;CAIJ,IAAI,mBAAmB;AACvB,SAAQ,QAAQ,iBAAiB,KAAK,WAAW,MAAM,KACrD,gBAAe,KAAK;EAClB,KAAK,MAAM,QAAQ,MAAM,GAAG,SAAS;EACrC,OAAO,MAAM;EACd,CAAC;CAIJ,IAAI,iBAAiB;AACrB,SAAQ,QAAQ,eAAe,KAAK,WAAW,MAAM,KACnD,gBAAe,KAAK;EAClB,KAAK,MAAM,QAAQ,MAAM,GAAG,SAAS;EACrC,OAAO,MAAM;EACd,CAAC;CAIJ,IAAI,kBAAkB;AACtB,SAAQ,QAAQ,gBAAgB,KAAK,WAAW,MAAM,KACpD,gBAAe,KAAK;EAClB,KAAK,MAAM,QAAQ,MAAM,GAAG,SAAS;EACrC,OAAO,MAAM;EACd,CAAC;CAIJ,MAAM,eAAe,QAAQ,QAAQ,aAAa;AAChD,SAAO,CAAC,eAAe,MACpB,UAAU,SAAS,SAAS,MAAM,SAAS,SAAS,SAAS,MAAM,IACrE;GACD;CAGF,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;EACjD,MAAM,WAAW,aAAa;EAC9B,MAAM,SAAS,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,MAAM,CAAC;EAC3D,MAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,GAAG,SAAS,QAAQ,SAAS,OAAO,CAAC;AACzE,WAAS,SAAS,cAAc,SAAS,GAAG,aAAa,SAAS,GAAG,KAAK;;AAI5E,QAAO,OAAO,WAAW,MAAM,MAAM;;AAYvC,MAAa,6BACX,KACA,EAAE,uBAAuB,aAAa,oBAAuC,EAAE,KAC5E;CACH,IAAI,UAAU;AAGd,KAAI,YACF,WAAU,gBAAgB,QAAQ;AAIpC,KAAI,sBACF,WAAU,mBAAmB,SAAS,gBAAgB;AAGxD,QAAO"}