@memori.ai/memori-react
Version:
[](https://www.npmjs.com/package/@memori.ai/memori-react)   => {
const cleanHref = href ? 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.use(markedLinkifyIt());
marked.use(markedExtendedTables());
export const needsTruncation = (message) => {
return (message.length > MAX_MSG_CHARS || message.split(' ').length > MAX_MSG_WORDS);
};
export const truncateMessage = (message) => {
let truncatedMessage = message;
if (message.length > MAX_MSG_CHARS) {
truncatedMessage = `${message.slice(0, MAX_MSG_CHARS)}\n<br />...`;
}
if (truncatedMessage.split(' ').length > MAX_MSG_WORDS) {
truncatedMessage = truncatedMessage
.split(' ')
.slice(0, MAX_MSG_WORDS)
.join(' ');
}
return truncatedMessage;
};
export 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.use(markedKatex({}));
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.parse(preprocessedText).toString().trim();
parsedText = DOMPurify.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 };
}
};
//# sourceMappingURL=message.js.map