@ai-react-markdown/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/index.tsx
32
+ var index_exports = {};
33
+ __export(index_exports, {
34
+ AIMarkdownRenderDisplayOptimizeAbility: () => AIMarkdownRenderDisplayOptimizeAbility,
35
+ AIMarkdownRenderExtraSyntax: () => AIMarkdownRenderExtraSyntax,
36
+ default: () => index_default,
37
+ useAIMarkdownRenderState: () => useAIMarkdownRenderState
38
+ });
39
+ module.exports = __toCommonJS(index_exports);
40
+ var import_react5 = require("react");
41
+
42
+ // src/context.tsx
43
+ var import_react = require("react");
44
+ var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
45
+ var import_mergeWith = __toESM(require("lodash/mergeWith"), 1);
46
+
47
+ // src/defs.ts
48
+ var AIMarkdownRenderExtraSyntax = /* @__PURE__ */ ((AIMarkdownRenderExtraSyntax2) => {
49
+ AIMarkdownRenderExtraSyntax2["HIGHLIGHT"] = "HIGHLIGHT";
50
+ AIMarkdownRenderExtraSyntax2["DEFINITION_LIST"] = "DEFINITION_LIST";
51
+ AIMarkdownRenderExtraSyntax2["SUBSCRIPT"] = "SUBSCRIPT";
52
+ return AIMarkdownRenderExtraSyntax2;
53
+ })(AIMarkdownRenderExtraSyntax || {});
54
+ var AIMarkdownRenderDisplayOptimizeAbility = /* @__PURE__ */ ((AIMarkdownRenderDisplayOptimizeAbility2) => {
55
+ AIMarkdownRenderDisplayOptimizeAbility2["REMOVE_COMMENTS"] = "REMOVE_COMMENTS";
56
+ AIMarkdownRenderDisplayOptimizeAbility2["SMARTYPANTS"] = "SMARTYPANTS";
57
+ AIMarkdownRenderDisplayOptimizeAbility2["PANGU"] = "PANGU";
58
+ return AIMarkdownRenderDisplayOptimizeAbility2;
59
+ })(AIMarkdownRenderDisplayOptimizeAbility || {});
60
+ var defaultMRMarkdownRenderConfig = {
61
+ extraSyntaxSupported: [
62
+ "HIGHLIGHT" /* HIGHLIGHT */,
63
+ "DEFINITION_LIST" /* DEFINITION_LIST */,
64
+ "SUBSCRIPT" /* SUBSCRIPT */
65
+ ],
66
+ displayOptimizeAbilities: [
67
+ "REMOVE_COMMENTS" /* REMOVE_COMMENTS */,
68
+ "SMARTYPANTS" /* SMARTYPANTS */,
69
+ "PANGU" /* PANGU */
70
+ ]
71
+ };
72
+
73
+ // src/context.tsx
74
+ var import_jsx_runtime = require("react/jsx-runtime");
75
+ var AIMarkdownRenderStateContext = (0, import_react.createContext)(null);
76
+ function useAIMarkdownRenderState() {
77
+ const context = (0, import_react.useContext)(AIMarkdownRenderStateContext);
78
+ if (!context) {
79
+ throw new Error("useAIMarkdownRenderState must be used within an <AIMarkdown /> component.");
80
+ }
81
+ return context;
82
+ }
83
+ var configMergeCustomizer = (_objValue, srcValue, _key, _object, _source, _stack) => {
84
+ if (Array.isArray(srcValue)) {
85
+ return srcValue;
86
+ }
87
+ };
88
+ var AIMarkdownRenderStateProvider = ({
89
+ streaming,
90
+ fontSize,
91
+ config,
92
+ metadata,
93
+ children
94
+ }) => {
95
+ const mergedConfig = (0, import_react.useMemo)(
96
+ () => config ? (0, import_mergeWith.default)((0, import_cloneDeep.default)(defaultMRMarkdownRenderConfig), config, configMergeCustomizer) : defaultMRMarkdownRenderConfig,
97
+ [config]
98
+ );
99
+ const state = (0, import_react.useMemo)(
100
+ () => ({
101
+ streaming,
102
+ fontSize,
103
+ config: mergedConfig,
104
+ metadata
105
+ }),
106
+ [streaming, fontSize, mergedConfig, metadata]
107
+ );
108
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AIMarkdownRenderStateContext.Provider, { value: state, children });
109
+ };
110
+ var context_default = AIMarkdownRenderStateProvider;
111
+
112
+ // src/preprocessors/latex.ts
113
+ function escapeMhchemCommands(text) {
114
+ return text.replaceAll("$\\ce{", "$\\\\ce{").replaceAll("$\\pu{", "$\\\\pu{");
115
+ }
116
+ function findCodeBlockRegions(content) {
117
+ const regions = [];
118
+ let inlineStart = -1;
119
+ let multilineStart = -1;
120
+ for (let i = 0; i < content.length; i++) {
121
+ const char = content[i];
122
+ if (char === "`" && i + 2 < content.length && content[i + 1] === "`" && content[i + 2] === "`") {
123
+ if (multilineStart === -1) {
124
+ multilineStart = i;
125
+ i += 2;
126
+ } else {
127
+ regions.push([multilineStart, i + 2]);
128
+ multilineStart = -1;
129
+ i += 2;
130
+ }
131
+ } else if (char === "`" && multilineStart === -1) {
132
+ if (inlineStart === -1) {
133
+ inlineStart = i;
134
+ } else {
135
+ regions.push([inlineStart, i]);
136
+ inlineStart = -1;
137
+ }
138
+ }
139
+ }
140
+ return regions;
141
+ }
142
+ function isInCodeBlock(position, codeRegions) {
143
+ let left = 0;
144
+ let right = codeRegions.length - 1;
145
+ while (left <= right) {
146
+ const mid = Math.floor((left + right) / 2);
147
+ const [start, end] = codeRegions[mid];
148
+ if (position >= start && position <= end) {
149
+ return true;
150
+ } else if (position < start) {
151
+ right = mid - 1;
152
+ } else {
153
+ left = mid + 1;
154
+ }
155
+ }
156
+ return false;
157
+ }
158
+ var CURRENCY_REGEX = /(?<![\\$])\$(?!\$)(?=\d+(?:,\d{3})*(?:\.\d+)?(?:[KMBkmb])?(?:\s|$|[^a-zA-Z\d]))/g;
159
+ var NO_ESCAPED_DOLLAR_REGEX = /(?<![\\$])\$(?!\$)/g;
160
+ var DELIMITERS_REGEX = /\\\[([\S\s]*?[^\\])\\]|\\\((.*?)\\\)/g;
161
+ var UNESCAPED_PIPES_REGEX = /(?<!\\)\|/g;
162
+ var LATEX_BLOCK_REGEX = /\$\$([\S\s]*?)\$\$|(?<![\\$])\$(?!\$)((?:.|\n)*?)(?<![\\`])\$(?!\$)/g;
163
+ var ESCAPE_TEXT_UNDERSCORES_REGEX = /\\text{([^}]*)}/g;
164
+ var SINGLE_DOLLAR_REGEX = /(?<![\\$])\$(?!\$)((?:[^$\n]|\\[$])+?)(?<!\\)(?<!`)\$(?!\$)/g;
165
+ function convertLatexDelimiters(text, codeRegions) {
166
+ return text.replaceAll(
167
+ DELIMITERS_REGEX,
168
+ (match, squareBracket, roundBracket, index) => {
169
+ if (isInCodeBlock(index, codeRegions)) {
170
+ return match;
171
+ }
172
+ if (squareBracket !== void 0) {
173
+ return `$$${squareBracket}$$`;
174
+ } else if (roundBracket !== void 0) {
175
+ return `$${roundBracket}$`;
176
+ }
177
+ return match;
178
+ }
179
+ );
180
+ }
181
+ var replaceUnescapedPipes = (formula) => (
182
+ // Use \vert{} so the control sequence terminates before the next token
183
+ formula.replaceAll(UNESCAPED_PIPES_REGEX, "\\vert{}")
184
+ );
185
+ function escapeLatexPipes(text, codeRegions) {
186
+ return text.replaceAll(LATEX_BLOCK_REGEX, (match, display, inline, index) => {
187
+ if (isInCodeBlock(index, codeRegions)) {
188
+ return match;
189
+ }
190
+ if (display !== void 0) return `$$${replaceUnescapedPipes(display)}$$`;
191
+ if (inline !== void 0) return `$${replaceUnescapedPipes(inline)}$`;
192
+ return match;
193
+ });
194
+ }
195
+ function escapeTextUnderscores(text, codeRegions) {
196
+ return text.replaceAll(ESCAPE_TEXT_UNDERSCORES_REGEX, (match, textContent, index) => {
197
+ if (isInCodeBlock(index, codeRegions)) {
198
+ return match;
199
+ }
200
+ const escapedTextContent = textContent.replaceAll(/(?<!\\)_/g, "\\_");
201
+ return `\\text{${escapedTextContent}}`;
202
+ });
203
+ }
204
+ function preprocessLaTeX(str) {
205
+ if (!str.includes("$") && !str.includes("\\[") && !str.includes("\\(")) return str;
206
+ let processed = str;
207
+ processed = escapeMhchemCommands(processed);
208
+ const codeRegions = findCodeBlockRegions(processed);
209
+ const parts = [];
210
+ let lastIndex = 0;
211
+ const currencyMatchesIterator = processed.matchAll(CURRENCY_REGEX);
212
+ const currencyMatches = Array.from(currencyMatchesIterator);
213
+ for (let i = 0; i < currencyMatches.length; i++) {
214
+ const match = currencyMatches[i];
215
+ parts.push(processed.substring(lastIndex, match.index));
216
+ let needEscape = true;
217
+ if (!isInCodeBlock(match.index, codeRegions)) {
218
+ let restBeforeNextMatchOrEnd = "";
219
+ if (i < currencyMatches.length - 1) {
220
+ const nextMatch = currencyMatches[i + 1];
221
+ if (nextMatch.index - match.index > 1) {
222
+ restBeforeNextMatchOrEnd = processed.substring(match.index + 1, nextMatch.index);
223
+ }
224
+ } else {
225
+ restBeforeNextMatchOrEnd = processed.substring(match.index + 1, processed.length);
226
+ }
227
+ const firstLineBeforeNextMatch = restBeforeNextMatchOrEnd.split(/\r\n|\r|\n/g)[0];
228
+ if (Array.from(firstLineBeforeNextMatch.matchAll(NO_ESCAPED_DOLLAR_REGEX)).length % 2 !== 0) {
229
+ const previousNewCotent = parts.join("");
230
+ const previousLastLineContent = previousNewCotent.split(/\r\n|\r|\n/g).pop();
231
+ const wholeLineBeforeNextMatchWithoutCurrentDollar = previousLastLineContent + firstLineBeforeNextMatch;
232
+ if (Array.from(wholeLineBeforeNextMatchWithoutCurrentDollar.matchAll(NO_ESCAPED_DOLLAR_REGEX)).length % 2 !== 0) {
233
+ needEscape = false;
234
+ }
235
+ }
236
+ } else {
237
+ needEscape = false;
238
+ }
239
+ parts.push(needEscape ? "\\$" : "$");
240
+ lastIndex = match.index + 1;
241
+ }
242
+ parts.push(processed.substring(lastIndex));
243
+ processed = parts.join("");
244
+ console.log("processed", processed);
245
+ processed = convertLatexDelimiters(processed, codeRegions);
246
+ processed = escapeLatexPipes(processed, codeRegions);
247
+ processed = escapeTextUnderscores(processed, codeRegions);
248
+ const result = [];
249
+ lastIndex = 0;
250
+ const singleDollarMatchesIterator = processed.matchAll(SINGLE_DOLLAR_REGEX);
251
+ for (const match of singleDollarMatchesIterator) {
252
+ if (!isInCodeBlock(match.index, codeRegions)) {
253
+ result.push(processed.substring(lastIndex, match.index));
254
+ result.push(`$$${match[1]}$$`);
255
+ lastIndex = match.index + match[0].length;
256
+ }
257
+ }
258
+ result.push(processed.substring(lastIndex));
259
+ return result.join("");
260
+ }
261
+
262
+ // src/preprocessors/index.ts
263
+ function applyPreprocessors(value, ...fns) {
264
+ return fns.reduce((result, fn) => fn(result), value);
265
+ }
266
+ var defaultExtraPreprocessors = [];
267
+ function preprocessAIMDContent(content, extraPreprocessors = defaultExtraPreprocessors) {
268
+ return applyPreprocessors(content, preprocessLaTeX, ...extraPreprocessors);
269
+ }
270
+
271
+ // src/components/MarkdownContent.tsx
272
+ var import_react2 = require("react");
273
+ var import_react_markdown = __toESM(require("react-markdown"), 1);
274
+ var import_rehype_katex = __toESM(require("rehype-katex"), 1);
275
+ var import_rehype_raw = __toESM(require("rehype-raw"), 1);
276
+ var import_rehype_unwrap_images = __toESM(require("rehype-unwrap-images"), 1);
277
+ var import_rehype_sanitize = __toESM(require("rehype-sanitize"), 1);
278
+ var import_remark_breaks = __toESM(require("remark-breaks"), 1);
279
+ var import_remark_cjk_friendly = __toESM(require("remark-cjk-friendly"), 1);
280
+ var import_remark_cjk_friendly_gfm_strikethrough = __toESM(require("remark-cjk-friendly-gfm-strikethrough"), 1);
281
+ var import_remark_emoji = __toESM(require("remark-emoji"), 1);
282
+ var import_remark_gfm = __toESM(require("remark-gfm"), 1);
283
+ var import_remark_math = __toESM(require("remark-math"), 1);
284
+ var import_remark_definition_list = require("remark-definition-list");
285
+ var import_remark_supersub = __toESM(require("remark-supersub"), 1);
286
+ var import_remark_mark_highlight = require("remark-mark-highlight");
287
+ var import_remark_squeeze_paragraphs = __toESM(require("remark-squeeze-paragraphs"), 1);
288
+ var import_remark_smartypants = __toESM(require("remark-smartypants"), 1);
289
+ var import_remark_pangu = __toESM(require("remark-pangu"), 1);
290
+ var import_remark_remove_comments = __toESM(require("remark-remove-comments"), 1);
291
+ var import_jsx_runtime2 = require("react/jsx-runtime");
292
+ var DisplayOptimizeRemarkPluginMap = {
293
+ ["REMOVE_COMMENTS" /* REMOVE_COMMENTS */]: import_remark_remove_comments.default,
294
+ ["SMARTYPANTS" /* SMARTYPANTS */]: import_remark_smartypants.default,
295
+ ["PANGU" /* PANGU */]: import_remark_pangu.default
296
+ };
297
+ var ExtraSyntaxRemarkPluginMap = {
298
+ ["HIGHLIGHT" /* HIGHLIGHT */]: import_remark_mark_highlight.remarkMark,
299
+ ["DEFINITION_LIST" /* DEFINITION_LIST */]: import_remark_definition_list.remarkDefinitionList,
300
+ ["SUBSCRIPT" /* SUBSCRIPT */]: import_remark_supersub.default
301
+ };
302
+ var DefaultCustomComponents = {};
303
+ var AIMarkdownContent = (0, import_react2.memo)(({ content, customComponents }) => {
304
+ const { config } = useAIMarkdownRenderState();
305
+ const { extraSyntaxRemarkPlugins, enableDefinitionList } = (0, import_react2.useMemo)(
306
+ () => ({
307
+ extraSyntaxRemarkPlugins: config.extraSyntaxSupported.map((syntax) => ExtraSyntaxRemarkPluginMap[syntax]),
308
+ enableDefinitionList: config.extraSyntaxSupported.includes("DEFINITION_LIST" /* DEFINITION_LIST */)
309
+ }),
310
+ [config.extraSyntaxSupported]
311
+ );
312
+ const displayOptimizeRemarkPlugins = (0, import_react2.useMemo)(() => {
313
+ return config.displayOptimizeAbilities.map((ability) => DisplayOptimizeRemarkPluginMap[ability]);
314
+ }, [config.displayOptimizeAbilities]);
315
+ const usedComponents = (0, import_react2.useMemo)(() => {
316
+ return customComponents ? { ...DefaultCustomComponents, ...customComponents } : DefaultCustomComponents;
317
+ }, [customComponents]);
318
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
319
+ import_react_markdown.default,
320
+ {
321
+ remarkPlugins: [
322
+ import_remark_gfm.default,
323
+ [
324
+ import_remark_math.default,
325
+ {
326
+ singleDollarTextMath: false
327
+ }
328
+ ],
329
+ ...extraSyntaxRemarkPlugins,
330
+ import_remark_breaks.default,
331
+ import_remark_emoji.default,
332
+ import_remark_squeeze_paragraphs.default,
333
+ import_remark_cjk_friendly.default,
334
+ import_remark_cjk_friendly_gfm_strikethrough.default,
335
+ ...displayOptimizeRemarkPlugins
336
+ ],
337
+ rehypePlugins: [
338
+ [
339
+ import_rehype_raw.default,
340
+ {
341
+ passThrough: []
342
+ }
343
+ ],
344
+ [
345
+ import_rehype_sanitize.default,
346
+ {
347
+ ...import_rehype_sanitize.defaultSchema,
348
+ tagNames: [...import_rehype_sanitize.defaultSchema.tagNames || [], "mark"],
349
+ attributes: {
350
+ ...import_rehype_sanitize.defaultSchema.attributes,
351
+ // The `language-*` regex is allowed by default.
352
+ code: [["className", /^language-./, "math-inline", "math-display"]]
353
+ }
354
+ }
355
+ ],
356
+ import_rehype_katex.default,
357
+ import_rehype_unwrap_images.default
358
+ ],
359
+ remarkRehypeOptions: {
360
+ allowDangerousHtml: true,
361
+ handlers: {
362
+ ...enableDefinitionList ? import_remark_definition_list.defListHastHandlers : {}
363
+ }
364
+ },
365
+ components: usedComponents,
366
+ children: content
367
+ }
368
+ );
369
+ });
370
+ AIMarkdownContent.displayName = "AIMarkdownContent";
371
+ var MarkdownContent_default = AIMarkdownContent;
372
+
373
+ // src/hooks/useStableValue.ts
374
+ var import_react3 = require("react");
375
+ var import_isEqual = __toESM(require("lodash/isEqual"), 1);
376
+ function useStableValue(value) {
377
+ const ref = (0, import_react3.useRef)(value);
378
+ const prev = ref.current;
379
+ const stableValue = (0, import_isEqual.default)(prev, value) ? prev : value;
380
+ (0, import_react3.useEffect)(() => {
381
+ ref.current = stableValue;
382
+ }, [stableValue]);
383
+ return stableValue;
384
+ }
385
+
386
+ // src/components/typography/Default.tsx
387
+ var import_react4 = require("react");
388
+ var import_jsx_runtime3 = require("react/jsx-runtime");
389
+ var DefaultTypography = (0, import_react4.memo)(({ children, fontSize, variant, colorScheme }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
390
+ "div",
391
+ {
392
+ className: `aim-typography-root ${variant ?? ""} ${colorScheme ?? ""}`.trim(),
393
+ style: { width: "100%", fontSize },
394
+ children
395
+ }
396
+ ));
397
+ DefaultTypography.displayName = "DefaultTypography";
398
+ var Default_default = DefaultTypography;
399
+
400
+ // src/index.tsx
401
+ var import_jsx_runtime4 = require("react/jsx-runtime");
402
+ var AIMarkdownComponent = ({
403
+ streaming = false,
404
+ content,
405
+ fontSize,
406
+ contentPreprocessors,
407
+ customComponents,
408
+ config,
409
+ metadata,
410
+ typography: Typography = Default_default,
411
+ extraStyle: ExtraStyle,
412
+ variant = "default",
413
+ colorScheme = "light"
414
+ }) => {
415
+ const usedFontSize = fontSize ? typeof fontSize === "number" ? `${fontSize}px` : fontSize : "0.875rem";
416
+ const stableConfig = useStableValue(config);
417
+ const stablePreprocessors = useStableValue(contentPreprocessors);
418
+ const stableCustomComponents = useStableValue(customComponents);
419
+ const usedContent = (0, import_react5.useMemo)(
420
+ () => content ? preprocessAIMDContent(content, stablePreprocessors) : content,
421
+ [content, stablePreprocessors]
422
+ );
423
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
424
+ context_default,
425
+ {
426
+ streaming,
427
+ fontSize: usedFontSize,
428
+ config: stableConfig,
429
+ metadata,
430
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Typography, { fontSize: usedFontSize, variant, colorScheme, children: ExtraStyle ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ExtraStyle, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MarkdownContent_default, { content: usedContent, customComponents: stableCustomComponents }) }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MarkdownContent_default, { content: usedContent, customComponents: stableCustomComponents }) })
431
+ }
432
+ );
433
+ };
434
+ var AIMarkdown = (0, import_react5.memo)(AIMarkdownComponent);
435
+ AIMarkdown.displayName = "AIMarkdown";
436
+ var index_default = AIMarkdown;
437
+ // Annotate the CommonJS export names for ESM import in node:
438
+ 0 && (module.exports = {
439
+ AIMarkdownRenderDisplayOptimizeAbility,
440
+ AIMarkdownRenderExtraSyntax,
441
+ useAIMarkdownRenderState
442
+ });
443
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/context.tsx","../src/defs.ts","../src/preprocessors/latex.ts","../src/preprocessors/index.ts","../src/components/MarkdownContent.tsx","../src/hooks/useStableValue.ts","../src/components/typography/Default.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, memo } from 'react';\nimport AIMarkdownRenderStateProvider, { AIMarkdownRenderStateProviderProps } from './context';\nimport { AIMDContentPreprocessor } from './preprocessors/defs';\nimport preprocessAIMDContent from './preprocessors';\nimport AIMarkdownContent from './components/MarkdownContent';\nimport { Components } from 'react-markdown';\nimport {\n AIMarkdownRenderConfig,\n AIMarkdownMetadata,\n AIMarkdownTypographyComponent,\n AIMarkdownExtraStyleComponent,\n AIMarkdownVariant,\n AIMarkdownColorScheme,\n} from './defs';\nimport useStableValue from './hooks/useStableValue';\nimport DefaultTypography from './components/typography/Default';\n\nexport interface AIMarkdownProps<\n TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata,\n> extends Omit<AIMarkdownRenderStateProviderProps<TConfig, TRenderData>, 'fontSize'> {\n fontSize?: number | string;\n content: string;\n contentPreprocessors?: AIMDContentPreprocessor[];\n customComponents?: Components;\n typography?: AIMarkdownTypographyComponent;\n extraStyle?: AIMarkdownExtraStyleComponent;\n variant?: AIMarkdownVariant;\n colorScheme?: AIMarkdownColorScheme;\n}\n\nconst AIMarkdownComponent = <\n TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata,\n>({\n streaming = false,\n content,\n fontSize,\n contentPreprocessors,\n customComponents,\n config,\n metadata,\n typography: Typography = DefaultTypography,\n extraStyle: ExtraStyle,\n variant = 'default',\n colorScheme = 'light',\n}: AIMarkdownProps<TConfig, TRenderData>) => {\n const usedFontSize = fontSize ? (typeof fontSize === 'number' ? `${fontSize}px` : fontSize) : '0.875rem';\n\n const stableConfig = useStableValue(config);\n const stablePreprocessors = useStableValue(contentPreprocessors);\n const stableCustomComponents = useStableValue(customComponents);\n\n const usedContent = useMemo(\n () => (content ? preprocessAIMDContent(content, stablePreprocessors) : content),\n [content, stablePreprocessors]\n );\n\n return (\n <AIMarkdownRenderStateProvider<TConfig, TRenderData>\n streaming={streaming}\n fontSize={usedFontSize}\n config={stableConfig}\n metadata={metadata}\n >\n <Typography fontSize={usedFontSize} variant={variant} colorScheme={colorScheme}>\n {ExtraStyle ? (\n <ExtraStyle>\n <AIMarkdownContent content={usedContent} customComponents={stableCustomComponents} />\n </ExtraStyle>\n ) : (\n <AIMarkdownContent content={usedContent} customComponents={stableCustomComponents} />\n )}\n </Typography>\n </AIMarkdownRenderStateProvider>\n );\n};\n\nconst AIMarkdown = memo(AIMarkdownComponent);\nAIMarkdown.displayName = 'AIMarkdown';\n\nexport default AIMarkdown as typeof AIMarkdownComponent;\n\n// Types\nexport type { AIMDContentPreprocessor };\nexport type {\n AIMarkdownRenderConfig,\n AIMarkdownRenderState,\n AIMarkdownMetadata,\n AIMarkdownTypographyProps,\n AIMarkdownTypographyComponent,\n AIMarkdownExtraStyleProps,\n AIMarkdownExtraStyleComponent,\n AIMarkdownVariant,\n AIMarkdownColorScheme,\n} from './defs';\n\n// Enums\nexport { AIMarkdownRenderExtraSyntax, AIMarkdownRenderDisplayOptimizeAbility } from './defs';\n\n// Hook — for custom components to access render state\nexport { useAIMarkdownRenderState } from './context';\n","import { PropsWithChildren, createContext, useContext, useMemo } from 'react';\nimport cloneDeep from 'lodash/cloneDeep';\nimport mergeWith from 'lodash/mergeWith';\nimport {\n AIMarkdownRenderConfig,\n AIMarkdownMetadata,\n AIMarkdownRenderState,\n defaultMRMarkdownRenderConfig,\n} from './defs';\nimport { DeepPartial } from './utils/ts-util';\n\nconst AIMarkdownRenderStateContext = createContext<AIMarkdownRenderState<\n AIMarkdownRenderConfig,\n AIMarkdownMetadata\n> | null>(null);\n\nexport function useAIMarkdownRenderState<\n TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata,\n>() {\n const context = useContext(AIMarkdownRenderStateContext) as AIMarkdownRenderState<TConfig, TMetadata>;\n\n if (!context) {\n throw new Error('useAIMarkdownRenderState must be used within an <AIMarkdown /> component.');\n }\n\n return context;\n}\n\nexport interface AIMarkdownRenderStateProviderProps<\n TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata,\n> extends PropsWithChildren {\n streaming: boolean;\n fontSize: string;\n config?: DeepPartial<TConfig>;\n metadata?: TMetadata;\n}\n\n/**\n * When merging config, arrays from the source (user config) should fully replace\n * the target (default config) instead of being merged by index.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst configMergeCustomizer = (\n _objValue: any,\n srcValue: any,\n _key: string,\n _object: any,\n _source: any,\n _stack: any\n) => {\n if (Array.isArray(srcValue)) {\n return srcValue;\n }\n};\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nconst AIMarkdownRenderStateProvider = <\n RCT extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n RDT extends AIMarkdownMetadata = AIMarkdownMetadata,\n>({\n streaming,\n fontSize,\n config,\n metadata,\n children,\n}: AIMarkdownRenderStateProviderProps<RCT, RDT>) => {\n const mergedConfig = useMemo(\n () =>\n config\n ? mergeWith(cloneDeep(defaultMRMarkdownRenderConfig), config, configMergeCustomizer)\n : defaultMRMarkdownRenderConfig,\n [config]\n );\n\n const state = useMemo(\n () => ({\n streaming,\n fontSize,\n config: mergedConfig,\n metadata,\n }),\n [streaming, fontSize, mergedConfig, metadata]\n );\n\n return <AIMarkdownRenderStateContext.Provider value={state}>{children}</AIMarkdownRenderStateContext.Provider>;\n};\n\nexport default AIMarkdownRenderStateProvider;\n","import { ComponentType, PropsWithChildren } from 'react';\n\nexport enum AIMarkdownRenderExtraSyntax {\n HIGHLIGHT = 'HIGHLIGHT', // support ==Highlight==\n DEFINITION_LIST = 'DEFINITION_LIST', // support Definition List https://michelf.ca/projects/php-markdown/extra/#def-list\n SUBSCRIPT = 'SUBSCRIPT', // support superscript and subscript\n}\n\nexport enum AIMarkdownRenderDisplayOptimizeAbility {\n REMOVE_COMMENTS = 'REMOVE_COMMENTS', // remove comments\n SMARTYPANTS = 'SMARTYPANTS', // make conent more typographic by SmartyPants https://www.npmjs.com/package/smartypants\n PANGU = 'PANGU', // auto add space between CJK and English\n}\n\nexport interface AIMarkdownRenderConfig {\n extraSyntaxSupported: AIMarkdownRenderExtraSyntax[];\n displayOptimizeAbilities: AIMarkdownRenderDisplayOptimizeAbility[];\n}\n\nexport const defaultMRMarkdownRenderConfig: AIMarkdownRenderConfig = {\n extraSyntaxSupported: [\n AIMarkdownRenderExtraSyntax.HIGHLIGHT,\n AIMarkdownRenderExtraSyntax.DEFINITION_LIST,\n AIMarkdownRenderExtraSyntax.SUBSCRIPT,\n ],\n displayOptimizeAbilities: [\n AIMarkdownRenderDisplayOptimizeAbility.REMOVE_COMMENTS,\n AIMarkdownRenderDisplayOptimizeAbility.SMARTYPANTS,\n AIMarkdownRenderDisplayOptimizeAbility.PANGU,\n ],\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AIMarkdownMetadata extends Record<string, any> {}\n\nexport type AIMarkdownVariant = 'default' | (string & {});\nexport type AIMarkdownColorScheme = 'light' | 'dark' | (string & {});\n\nexport interface AIMarkdownTypographyProps extends PropsWithChildren {\n fontSize: string;\n variant?: AIMarkdownVariant;\n colorScheme?: AIMarkdownColorScheme;\n}\nexport type AIMarkdownTypographyComponent = ComponentType<AIMarkdownTypographyProps>;\n\nexport interface AIMarkdownExtraStyleProps extends PropsWithChildren {}\nexport type AIMarkdownExtraStyleComponent = ComponentType<AIMarkdownExtraStyleProps>;\n\nexport interface AIMarkdownRenderState<\n TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig,\n TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata,\n> {\n streaming: boolean;\n fontSize: string;\n config: TConfig;\n metadata?: TMetadata;\n}\n","/**\n * LaTeX preprocess functions\n * Thanks the implementations from the following repositories:\n * - https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n * - https://github.com/danny-avila/LibreChat/blob/main/client/src/utils/latex.ts\n */\n\n/**\n * Escape mhchem commands in LaTeX expressions to ensure proper rendering.\n *\n * @param text Input string containing LaTeX expressions with mhchem commands\n * @returns String with escaped mhchem commands\n * @from https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n */\nfunction escapeMhchemCommands(text: string) {\n return text.replaceAll('$\\\\ce{', '$\\\\\\\\ce{').replaceAll('$\\\\pu{', '$\\\\\\\\pu{');\n}\n\n/**\n * Efficiently finds all code block regions in the content\n * @param content The content to analyze\n * @returns Array of code block regions [start, end]\n * @from https://github.com/danny-avila/LibreChat/blob/main/client/src/utils/latex.ts\n */\nfunction findCodeBlockRegions(content: string): Array<[number, number]> {\n const regions: Array<[number, number]> = [];\n let inlineStart = -1;\n let multilineStart = -1;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n // Check for multiline code blocks\n if (char === '`' && i + 2 < content.length && content[i + 1] === '`' && content[i + 2] === '`') {\n if (multilineStart === -1) {\n multilineStart = i;\n i += 2; // Skip the next two backticks\n } else {\n regions.push([multilineStart, i + 2]);\n multilineStart = -1;\n i += 2;\n }\n }\n // Check for inline code blocks (only if not in multiline)\n else if (char === '`' && multilineStart === -1) {\n if (inlineStart === -1) {\n inlineStart = i;\n } else {\n regions.push([inlineStart, i]);\n inlineStart = -1;\n }\n }\n }\n\n return regions;\n}\n\n/**\n * Checks if a position is inside any code block region using binary search\n * @param position The position to check\n * @param codeRegions Array of code block regions\n * @returns True if position is inside a code block\n * @from https://github.com/danny-avila/LibreChat/blob/main/client/src/utils/latex.ts\n */\nfunction isInCodeBlock(position: number, codeRegions: Array<[number, number]>): boolean {\n let left = 0;\n let right = codeRegions.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const [start, end] = codeRegions[mid];\n\n if (position >= start && position <= end) {\n return true;\n } else if (position < start) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return false;\n}\n\nconst CURRENCY_REGEX = /(?<![\\\\$])\\$(?!\\$)(?=\\d+(?:,\\d{3})*(?:\\.\\d+)?(?:[KMBkmb])?(?:\\s|$|[^a-zA-Z\\d]))/g;\nconst NO_ESCAPED_DOLLAR_REGEX = /(?<![\\\\$])\\$(?!\\$)/g;\nconst DELIMITERS_REGEX = /\\\\\\[([\\S\\s]*?[^\\\\])\\\\]|\\\\\\((.*?)\\\\\\)/g;\nconst UNESCAPED_PIPES_REGEX = /(?<!\\\\)\\|/g;\nconst LATEX_BLOCK_REGEX = /\\$\\$([\\S\\s]*?)\\$\\$|(?<![\\\\$])\\$(?!\\$)((?:.|\\n)*?)(?<![\\\\`])\\$(?!\\$)/g;\nconst ESCAPE_TEXT_UNDERSCORES_REGEX = /\\\\text{([^}]*)}/g;\nconst SINGLE_DOLLAR_REGEX = /(?<![\\\\$])\\$(?!\\$)((?:[^$\\n]|\\\\[$])+?)(?<!\\\\)(?<!`)\\$(?!\\$)/g;\n\n/**\n * Convert LaTeX bracket delimiters to dollar sign delimiters.\n * Converts \\[...\\] to $$...$$ and \\(...\\) to $...$\n * Preserves code blocks during conversion.\n *\n * @param text Input string containing LaTeX expressions\n * @returns String with LaTeX bracket delimiters converted to dollar sign delimiters\n * @modified from https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n */\nfunction convertLatexDelimiters(text: string, codeRegions: Array<[number, number]>): string {\n return text.replaceAll(\n DELIMITERS_REGEX,\n (match: string, squareBracket: string | undefined, roundBracket: string | undefined, index: number): string => {\n if (isInCodeBlock(index, codeRegions)) {\n return match;\n }\n if (squareBracket !== undefined) {\n return `$$${squareBracket}$$`;\n } else if (roundBracket !== undefined) {\n return `$${roundBracket}$`;\n }\n return match;\n }\n );\n}\n\n/**\n * Helper function: replace unescaped pipes with \\vert in LaTeX math fragments\n * @from https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n */\nconst replaceUnescapedPipes = (formula: string): string =>\n // Use \\vert{} so the control sequence terminates before the next token\n formula.replaceAll(UNESCAPED_PIPES_REGEX, '\\\\vert{}');\n/**\n * Escape pipes in LaTeX expressions to prevent them from being interpreted as\n * column separators in markdown tables.\n *\n * @param text Input string containing LaTeX expressions\n * @returns String with pipes escaped in LaTeX expressions\n * @modified from https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n */\nfunction escapeLatexPipes(text: string, codeRegions: Array<[number, number]>): string {\n // Replace unescaped '|' with '\\vert' within LaTeX math ranges so that\n // remark-gfm table parsing doesn't treat them as column separators.\n // Keep code blocks/inline code unchanged.\n return text.replaceAll(LATEX_BLOCK_REGEX, (match, display, inline, index) => {\n if (isInCodeBlock(index, codeRegions)) {\n return match;\n }\n if (display !== undefined) return `$$${replaceUnescapedPipes(display)}$$`;\n if (inline !== undefined) return `$${replaceUnescapedPipes(inline)}$`;\n return match;\n });\n}\n\n/**\n * Escape unescaped underscores within \\text{...} commands in LaTeX expressions.\n * For example, \\text{node_domain} becomes \\text{node\\_domain},\n * but \\text{node\\_domain} remains \\text{node\\_domain}.\n *\n * @param text Input string that may contain LaTeX expressions\n * @returns String with unescaped underscores escaped within \\text{...} commands\n * @modified from https://github.com/lobehub/lobe-ui/blob/master/src/hooks/useMarkdown/latex.ts\n */\nfunction escapeTextUnderscores(text: string, codeRegions: Array<[number, number]>): string {\n return text.replaceAll(ESCAPE_TEXT_UNDERSCORES_REGEX, (match, textContent: string, index: number) => {\n if (isInCodeBlock(index, codeRegions)) {\n return match;\n }\n // textContent is the content within the braces, e.g., \"node_domain\" or \"already\\_escaped\"\n // Replace '_' with '\\_' only when the underscore '_' is not preceded by a backslash '\\'.\n // (?<!\\\\) is a negative lookbehind assertion that ensures the character before '_' is not '\\'.\n const escapedTextContent = textContent.replaceAll(/(?<!\\\\)_/g, '\\\\_');\n return `\\\\text{${escapedTextContent}}`;\n });\n}\n\nexport function preprocessLaTeX(str: string): string {\n // Step 0: return early if no LaTeX patterns are found\n if (!str.includes('$') && !str.includes('\\\\[') && !str.includes('\\\\(')) return str;\n\n let processed = str;\n\n // Step 1: escape mhchem commands\n processed = escapeMhchemCommands(processed);\n\n // Step 2: find code block regions\n const codeRegions = findCodeBlockRegions(processed);\n\n // Step 3: escape currency dollar signs\n const parts = [];\n let lastIndex = 0;\n const currencyMatchesIterator = processed.matchAll(CURRENCY_REGEX);\n const currencyMatches = Array.from(currencyMatchesIterator);\n for (let i = 0; i < currencyMatches.length; i++) {\n const match = currencyMatches[i];\n parts.push(processed.substring(lastIndex, match.index));\n let needEscape = true;\n if (!isInCodeBlock(match.index, codeRegions)) {\n let restBeforeNextMatchOrEnd = '';\n if (i < currencyMatches.length - 1) {\n const nextMatch = currencyMatches[i + 1];\n if (nextMatch.index - match.index > 1) {\n restBeforeNextMatchOrEnd = processed.substring(match.index + 1, nextMatch.index);\n }\n } else {\n restBeforeNextMatchOrEnd = processed.substring(match.index + 1, processed.length);\n }\n const firstLineBeforeNextMatch = restBeforeNextMatchOrEnd.split(/\\r\\n|\\r|\\n/g)[0];\n if (Array.from(firstLineBeforeNextMatch.matchAll(NO_ESCAPED_DOLLAR_REGEX)).length % 2 !== 0) {\n const previousNewCotent = parts.join('');\n const previousLastLineContent = previousNewCotent.split(/\\r\\n|\\r|\\n/g).pop();\n const wholeLineBeforeNextMatchWithoutCurrentDollar = previousLastLineContent + firstLineBeforeNextMatch;\n if (\n Array.from(wholeLineBeforeNextMatchWithoutCurrentDollar.matchAll(NO_ESCAPED_DOLLAR_REGEX)).length % 2 !==\n 0\n ) {\n needEscape = false;\n }\n }\n } else {\n needEscape = false;\n }\n parts.push(needEscape ? '\\\\$' : '$');\n lastIndex = match.index + 1;\n }\n parts.push(processed.substring(lastIndex));\n processed = parts.join('');\n console.log('processed', processed);\n\n // Step 4: convert LaTeX delimiters\n processed = convertLatexDelimiters(processed, codeRegions);\n\n // Step 5: escape LaTeX pipes\n processed = escapeLatexPipes(processed, codeRegions);\n\n // Step 6: escape text underscores\n processed = escapeTextUnderscores(processed, codeRegions);\n\n // Step 7: convert single dollar delimiters to double dollars\n const result: string[] = [];\n lastIndex = 0;\n const singleDollarMatchesIterator = processed.matchAll(SINGLE_DOLLAR_REGEX);\n for (const match of singleDollarMatchesIterator) {\n if (!isInCodeBlock(match.index, codeRegions)) {\n result.push(processed.substring(lastIndex, match.index));\n result.push(`$$${match[1]}$$`);\n lastIndex = match.index + match[0].length;\n }\n }\n result.push(processed.substring(lastIndex));\n\n return result.join('');\n}\n","import { AIMDContentPreprocessor } from './defs';\nimport { preprocessLaTeX } from './latex';\n\nfunction applyPreprocessors(value: string, ...fns: Array<AIMDContentPreprocessor>): string {\n return fns.reduce((result, fn) => fn(result), value);\n}\n\nconst defaultExtraPreprocessors: AIMDContentPreprocessor[] = [];\n\nexport default function preprocessAIMDContent(\n content: string,\n extraPreprocessors: AIMDContentPreprocessor[] = defaultExtraPreprocessors\n) {\n return applyPreprocessors(content, preprocessLaTeX, ...extraPreprocessors);\n}\n","import { memo, useMemo } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeUnwrapImages from 'rehype-unwrap-images';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport remarkBreaks from 'remark-breaks';\nimport remarkCjkFriendly from 'remark-cjk-friendly';\nimport remarkCjkFriendlyGfmStrikethrough from 'remark-cjk-friendly-gfm-strikethrough';\nimport remarkEmoji from 'remark-emoji';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport { remarkDefinitionList, defListHastHandlers } from 'remark-definition-list';\nimport remarkSupersub from 'remark-supersub';\nimport { remarkMark as remarkMarkHighlight } from 'remark-mark-highlight';\nimport remarkSqueezeParagraphs from 'remark-squeeze-paragraphs';\nimport remarkSmartypants from 'remark-smartypants';\nimport remarkPangu from 'remark-pangu';\nimport remarkRemoveComments from 'remark-remove-comments';\nimport { useAIMarkdownRenderState } from '../context';\nimport { AIMarkdownRenderDisplayOptimizeAbility, AIMarkdownRenderExtraSyntax } from '../defs';\n\nconst DisplayOptimizeRemarkPluginMap = {\n [AIMarkdownRenderDisplayOptimizeAbility.REMOVE_COMMENTS]: remarkRemoveComments,\n [AIMarkdownRenderDisplayOptimizeAbility.SMARTYPANTS]: remarkSmartypants,\n [AIMarkdownRenderDisplayOptimizeAbility.PANGU]: remarkPangu,\n};\n\nconst ExtraSyntaxRemarkPluginMap = {\n [AIMarkdownRenderExtraSyntax.HIGHLIGHT]: remarkMarkHighlight,\n [AIMarkdownRenderExtraSyntax.DEFINITION_LIST]: remarkDefinitionList,\n [AIMarkdownRenderExtraSyntax.SUBSCRIPT]: remarkSupersub,\n};\n\nconst DefaultCustomComponents: Components = {};\n\ninterface AIMarkdownContentProps {\n content: string;\n customComponents?: Components;\n}\n\nconst AIMarkdownContent = memo(({ content, customComponents }: AIMarkdownContentProps) => {\n const { config } = useAIMarkdownRenderState();\n\n const { extraSyntaxRemarkPlugins, enableDefinitionList } = useMemo(\n () => ({\n extraSyntaxRemarkPlugins: config.extraSyntaxSupported.map((syntax) => ExtraSyntaxRemarkPluginMap[syntax]),\n enableDefinitionList: config.extraSyntaxSupported.includes(AIMarkdownRenderExtraSyntax.DEFINITION_LIST),\n }),\n [config.extraSyntaxSupported]\n );\n\n const displayOptimizeRemarkPlugins = useMemo(() => {\n return config.displayOptimizeAbilities.map((ability) => DisplayOptimizeRemarkPluginMap[ability]);\n }, [config.displayOptimizeAbilities]);\n\n const usedComponents = useMemo(() => {\n return customComponents ? { ...DefaultCustomComponents, ...customComponents } : DefaultCustomComponents;\n }, [customComponents]);\n\n return (\n <ReactMarkdown\n remarkPlugins={[\n remarkGfm,\n [\n remarkMath,\n {\n singleDollarTextMath: false,\n },\n ],\n ...extraSyntaxRemarkPlugins,\n remarkBreaks,\n remarkEmoji,\n remarkSqueezeParagraphs,\n remarkCjkFriendly,\n remarkCjkFriendlyGfmStrikethrough,\n ...displayOptimizeRemarkPlugins,\n ]}\n rehypePlugins={[\n [\n rehypeRaw,\n {\n passThrough: [],\n },\n ],\n [\n rehypeSanitize,\n {\n ...defaultSchema,\n tagNames: [...(defaultSchema.tagNames || []), 'mark'],\n attributes: {\n ...defaultSchema.attributes,\n // The `language-*` regex is allowed by default.\n code: [['className', /^language-./, 'math-inline', 'math-display']],\n },\n },\n ],\n rehypeKatex,\n rehypeUnwrapImages,\n ]}\n remarkRehypeOptions={{\n allowDangerousHtml: true,\n handlers: {\n ...(enableDefinitionList ? defListHastHandlers : {}),\n },\n }}\n components={usedComponents}\n // By default, the defaultUrlTransform function in Windows environments treats local paths, such as those starting with C:/, as unsafe and replaces them with an empty string. Hence, in this case, it simply returns the URL that it has identified without any modification.\n // urlTransform={(url: string) => url}\n >\n {content}\n </ReactMarkdown>\n );\n});\n\nAIMarkdownContent.displayName = 'AIMarkdownContent';\n\nexport default AIMarkdownContent;\n","import { useRef, useEffect } from 'react';\nimport isEqual from 'lodash/isEqual';\n\nexport default function useStableValue<T>(value: T): T {\n const ref = useRef(value);\n\n // eslint-disable-next-line react-hooks/refs\n const prev = ref.current;\n const stableValue = isEqual(prev, value) ? prev : value;\n\n useEffect(() => {\n ref.current = stableValue;\n }, [stableValue]);\n\n return stableValue;\n}\n","import { memo } from 'react';\nimport type { AIMarkdownTypographyProps } from '../../defs';\n\nconst DefaultTypography = memo(({ children, fontSize, variant, colorScheme }: AIMarkdownTypographyProps) => (\n <div\n className={`aim-typography-root ${variant ?? ''} ${colorScheme ?? ''}`.trim()}\n style={{ width: '100%', fontSize }}\n >\n {children}\n </div>\n));\n\nDefaultTypography.displayName = 'DefaultTypography';\n\nexport default DefaultTypography;\n"],"mappings":"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","names":["import_react","AIMarkdownRenderExtraSyntax","AIMarkdownRenderDisplayOptimizeAbility","mergeWith","cloneDeep","import_react","import_jsx_runtime","remarkRemoveComments","remarkSmartypants","remarkPangu","remarkMarkHighlight","remarkSupersub","ReactMarkdown","remarkGfm","remarkMath","remarkBreaks","remarkEmoji","remarkSqueezeParagraphs","remarkCjkFriendly","remarkCjkFriendlyGfmStrikethrough","rehypeRaw","rehypeSanitize","rehypeKatex","rehypeUnwrapImages","import_react","isEqual","import_react","import_jsx_runtime","import_jsx_runtime"]}
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ComponentType, PropsWithChildren } from 'react';
3
+ import { Components } from 'react-markdown';
4
+
5
+ declare enum AIMarkdownRenderExtraSyntax {
6
+ HIGHLIGHT = "HIGHLIGHT",// support ==Highlight==
7
+ DEFINITION_LIST = "DEFINITION_LIST",// support Definition List https://michelf.ca/projects/php-markdown/extra/#def-list
8
+ SUBSCRIPT = "SUBSCRIPT"
9
+ }
10
+ declare enum AIMarkdownRenderDisplayOptimizeAbility {
11
+ REMOVE_COMMENTS = "REMOVE_COMMENTS",// remove comments
12
+ SMARTYPANTS = "SMARTYPANTS",// make conent more typographic by SmartyPants https://www.npmjs.com/package/smartypants
13
+ PANGU = "PANGU"
14
+ }
15
+ interface AIMarkdownRenderConfig {
16
+ extraSyntaxSupported: AIMarkdownRenderExtraSyntax[];
17
+ displayOptimizeAbilities: AIMarkdownRenderDisplayOptimizeAbility[];
18
+ }
19
+ interface AIMarkdownMetadata extends Record<string, any> {
20
+ }
21
+ type AIMarkdownVariant = 'default' | (string & {});
22
+ type AIMarkdownColorScheme = 'light' | 'dark' | (string & {});
23
+ interface AIMarkdownTypographyProps extends PropsWithChildren {
24
+ fontSize: string;
25
+ variant?: AIMarkdownVariant;
26
+ colorScheme?: AIMarkdownColorScheme;
27
+ }
28
+ type AIMarkdownTypographyComponent = ComponentType<AIMarkdownTypographyProps>;
29
+ interface AIMarkdownExtraStyleProps extends PropsWithChildren {
30
+ }
31
+ type AIMarkdownExtraStyleComponent = ComponentType<AIMarkdownExtraStyleProps>;
32
+ interface AIMarkdownRenderState<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata> {
33
+ streaming: boolean;
34
+ fontSize: string;
35
+ config: TConfig;
36
+ metadata?: TMetadata;
37
+ }
38
+
39
+ type DeepPartial<T> = {
40
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
41
+ };
42
+
43
+ declare function useAIMarkdownRenderState<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata>(): AIMarkdownRenderState<TConfig, TMetadata>;
44
+ interface AIMarkdownRenderStateProviderProps<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata> extends PropsWithChildren {
45
+ streaming: boolean;
46
+ fontSize: string;
47
+ config?: DeepPartial<TConfig>;
48
+ metadata?: TMetadata;
49
+ }
50
+
51
+ type AIMDContentPreprocessor = (content: string) => string;
52
+
53
+ interface AIMarkdownProps<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata> extends Omit<AIMarkdownRenderStateProviderProps<TConfig, TRenderData>, 'fontSize'> {
54
+ fontSize?: number | string;
55
+ content: string;
56
+ contentPreprocessors?: AIMDContentPreprocessor[];
57
+ customComponents?: Components;
58
+ typography?: AIMarkdownTypographyComponent;
59
+ extraStyle?: AIMarkdownExtraStyleComponent;
60
+ variant?: AIMarkdownVariant;
61
+ colorScheme?: AIMarkdownColorScheme;
62
+ }
63
+ declare const AIMarkdownComponent: <TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata>({ streaming, content, fontSize, contentPreprocessors, customComponents, config, metadata, typography: Typography, extraStyle: ExtraStyle, variant, colorScheme, }: AIMarkdownProps<TConfig, TRenderData>) => react_jsx_runtime.JSX.Element;
64
+ declare const _default: typeof AIMarkdownComponent;
65
+
66
+ export { type AIMDContentPreprocessor, type AIMarkdownColorScheme, type AIMarkdownExtraStyleComponent, type AIMarkdownExtraStyleProps, type AIMarkdownMetadata, type AIMarkdownProps, type AIMarkdownRenderConfig, AIMarkdownRenderDisplayOptimizeAbility, AIMarkdownRenderExtraSyntax, type AIMarkdownRenderState, type AIMarkdownTypographyComponent, type AIMarkdownTypographyProps, type AIMarkdownVariant, _default as default, useAIMarkdownRenderState };
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ComponentType, PropsWithChildren } from 'react';
3
+ import { Components } from 'react-markdown';
4
+
5
+ declare enum AIMarkdownRenderExtraSyntax {
6
+ HIGHLIGHT = "HIGHLIGHT",// support ==Highlight==
7
+ DEFINITION_LIST = "DEFINITION_LIST",// support Definition List https://michelf.ca/projects/php-markdown/extra/#def-list
8
+ SUBSCRIPT = "SUBSCRIPT"
9
+ }
10
+ declare enum AIMarkdownRenderDisplayOptimizeAbility {
11
+ REMOVE_COMMENTS = "REMOVE_COMMENTS",// remove comments
12
+ SMARTYPANTS = "SMARTYPANTS",// make conent more typographic by SmartyPants https://www.npmjs.com/package/smartypants
13
+ PANGU = "PANGU"
14
+ }
15
+ interface AIMarkdownRenderConfig {
16
+ extraSyntaxSupported: AIMarkdownRenderExtraSyntax[];
17
+ displayOptimizeAbilities: AIMarkdownRenderDisplayOptimizeAbility[];
18
+ }
19
+ interface AIMarkdownMetadata extends Record<string, any> {
20
+ }
21
+ type AIMarkdownVariant = 'default' | (string & {});
22
+ type AIMarkdownColorScheme = 'light' | 'dark' | (string & {});
23
+ interface AIMarkdownTypographyProps extends PropsWithChildren {
24
+ fontSize: string;
25
+ variant?: AIMarkdownVariant;
26
+ colorScheme?: AIMarkdownColorScheme;
27
+ }
28
+ type AIMarkdownTypographyComponent = ComponentType<AIMarkdownTypographyProps>;
29
+ interface AIMarkdownExtraStyleProps extends PropsWithChildren {
30
+ }
31
+ type AIMarkdownExtraStyleComponent = ComponentType<AIMarkdownExtraStyleProps>;
32
+ interface AIMarkdownRenderState<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata> {
33
+ streaming: boolean;
34
+ fontSize: string;
35
+ config: TConfig;
36
+ metadata?: TMetadata;
37
+ }
38
+
39
+ type DeepPartial<T> = {
40
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
41
+ };
42
+
43
+ declare function useAIMarkdownRenderState<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata>(): AIMarkdownRenderState<TConfig, TMetadata>;
44
+ interface AIMarkdownRenderStateProviderProps<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TMetadata extends AIMarkdownMetadata = AIMarkdownMetadata> extends PropsWithChildren {
45
+ streaming: boolean;
46
+ fontSize: string;
47
+ config?: DeepPartial<TConfig>;
48
+ metadata?: TMetadata;
49
+ }
50
+
51
+ type AIMDContentPreprocessor = (content: string) => string;
52
+
53
+ interface AIMarkdownProps<TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata> extends Omit<AIMarkdownRenderStateProviderProps<TConfig, TRenderData>, 'fontSize'> {
54
+ fontSize?: number | string;
55
+ content: string;
56
+ contentPreprocessors?: AIMDContentPreprocessor[];
57
+ customComponents?: Components;
58
+ typography?: AIMarkdownTypographyComponent;
59
+ extraStyle?: AIMarkdownExtraStyleComponent;
60
+ variant?: AIMarkdownVariant;
61
+ colorScheme?: AIMarkdownColorScheme;
62
+ }
63
+ declare const AIMarkdownComponent: <TConfig extends AIMarkdownRenderConfig = AIMarkdownRenderConfig, TRenderData extends AIMarkdownMetadata = AIMarkdownMetadata>({ streaming, content, fontSize, contentPreprocessors, customComponents, config, metadata, typography: Typography, extraStyle: ExtraStyle, variant, colorScheme, }: AIMarkdownProps<TConfig, TRenderData>) => react_jsx_runtime.JSX.Element;
64
+ declare const _default: typeof AIMarkdownComponent;
65
+
66
+ export { type AIMDContentPreprocessor, type AIMarkdownColorScheme, type AIMarkdownExtraStyleComponent, type AIMarkdownExtraStyleProps, type AIMarkdownMetadata, type AIMarkdownProps, type AIMarkdownRenderConfig, AIMarkdownRenderDisplayOptimizeAbility, AIMarkdownRenderExtraSyntax, type AIMarkdownRenderState, type AIMarkdownTypographyComponent, type AIMarkdownTypographyProps, type AIMarkdownVariant, _default as default, useAIMarkdownRenderState };