UNPKG

@memori.ai/memori-react

Version:

[![npm version](https://img.shields.io/github/package-json/v/memori-ai/memori-react)](https://www.npmjs.com/package/@memori.ai/memori-react) ![Tests](https://github.com/memori-ai/memori-react/workflows/CI/badge.svg?branch=main) ![TypeScript Support](https

97 lines 4.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderMsg = exports.truncateMessage = exports.needsTruncation = void 0; const tslib_1 = require("tslib"); const marked_1 = require("marked"); const dompurify_1 = tslib_1.__importDefault(require("dompurify")); const constants_1 = require("./constants"); const utils_1 = require("./utils"); const marked_linkify_it_1 = tslib_1.__importDefault(require("marked-linkify-it")); const marked_katex_extension_1 = tslib_1.__importDefault(require("marked-katex-extension")); const markedExtendedTables_1 = tslib_1.__importDefault(require("./markedExtendedTables")); marked_1.marked.use({ async: false, gfm: true, pedantic: false, renderer: { link: ({ href, title, text, }) => { const cleanHref = href ? (0, utils_1.cleanUrl)(href) : null; if (cleanHref === null) { return text; } href = cleanHref; let out = '<a href="' + href + '"'; if (title) { out += ' title="' + title + '"'; } out += ' target="_blank" rel="noopener noreferrer">' + text + '</a>'; return out; }, }, }); marked_1.marked.use((0, marked_linkify_it_1.default)()); marked_1.marked.use((0, markedExtendedTables_1.default)()); const needsTruncation = (message) => { return (message.length > constants_1.MAX_MSG_CHARS || message.split(' ').length > constants_1.MAX_MSG_WORDS); }; exports.needsTruncation = needsTruncation; const truncateMessage = (message) => { let truncatedMessage = message; if (message.length > constants_1.MAX_MSG_CHARS) { truncatedMessage = `${message.slice(0, constants_1.MAX_MSG_CHARS)}\n<br />...`; } if (truncatedMessage.split(' ').length > constants_1.MAX_MSG_WORDS) { truncatedMessage = truncatedMessage .split(' ') .slice(0, constants_1.MAX_MSG_WORDS) .join(' '); } return truncatedMessage; }; exports.truncateMessage = truncateMessage; const renderMsg = (text, useMathFormatting = false, reasoningText = 'Reasoning...', showReasoning = false) => { try { let preprocessedText = text .trim() .replaceAll(/\[([^\]]+)\]\(([^\)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>') .replaceAll(/<think>([\s\S]*?)<\/think>/g, showReasoning ? `<details class="memori-think"><summary>${reasoningText}</summary>$1</details>` : '') .replaceAll(/<document_attachment filename="([^"]+)" type="([^"]+)">([\s\S]*?)<\/document_attachment>/g, '') .replaceAll(/```markdown([^```]+)```/g, '$1') .replaceAll('($', '( $') .replaceAll(':$', ': $') .replaceAll('\frac', '\\frac') .replaceAll('\beta', '\\beta') .replaceAll('cdot', '\\cdot'); if (useMathFormatting) { marked_1.marked.use((0, marked_katex_extension_1.default)({})); preprocessedText = preprocessedText.replace(/\\+\[(.*?)\\*\]/gs, (_, content) => { return `$$${content}$$`; }); preprocessedText = preprocessedText.replace(/\[([^[\]]+?)\]/g, (match, content) => { if (/[\\+a-z0-9_{}^=\-\+\*\/]+/i.test(content) && !match.startsWith('[http') && !match.includes('](')) { return `$$${content}$$`; } return match; }); } let parsedText = marked_1.marked.parse(preprocessedText).toString().trim(); parsedText = dompurify_1.default.sanitize(parsedText, { ADD_ATTR: ['target'], }); const finalText = parsedText .replace(/(<br>)+/g, '<br>') .replace(/<p><\/p>/g, '<br>') .replace(/<p><br><\/p>/g, '<br>'); return { text: finalText }; } catch (e) { console.error('Error rendering message:', e); return { text }; } }; exports.renderMsg = renderMsg; //# sourceMappingURL=message.js.map