@memori.ai/memori-react
Version:
[](https://www.npmjs.com/package/@memori.ai/memori-react)  ;
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