const i18nBase = require("../client/assets/translations/i18n"); function getI18n() { try { const { i18n } = require("../views/main_views"); return i18n; } catch (_) { return i18nBase['en'] || {}; } } function renderTextPreview(text, maxLength = 220) { if (!text) return '' let preview = String(text) preview = preview .replace(/```[\s\S]*?```/g, '') .replace(/^>.*$/gm, '') .replace(/^#{1,6}\s*/gm, '') .replace(/^- /gm, '') .replace(/^\d+\. /gm, '') .replace(/\*\*(.*?)\*\*/g, '$1') .replace(/\*(.*?)\*/g, '$1') .replace(/`([^`]+)`/g, '$1') .replace(/!\[.*?\]\(.*?\)/g, '') .replace(/\[.*?\]\(.*?\)/g, '') .replace(/\n+/g, ' ') .trim() if (preview.length > maxLength) { preview = preview.slice(0, maxLength) + '...' } return preview } function renderTextWithStyles(text) { if (!text) return '' const i18n = getI18n() let html = String(text) html = html .replace(/&/g, '&') .replace(//g, '>') html = html .replace(/```([\s\S]*?)```/gim, '
$1
') .replace(/^> (.*)$/gim, '
$1
') .replace(/^---$/gim, '
') .replace(/^### (.*)$/gim, '

$1

') .replace(/^## (.*)$/gim, '

$1

') .replace(/^# (.*)$/gim, '

$1

') html = html .replace(/\*\*(.*?)\*\*/gim, '$1') .replace(/\*(.*?)\*/gim, '$1') .replace(/`([^`]+)`/gim, '$1') html = html .replace(/!\[([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, alt, blob) => `${alt}` ) .replace(/\[video:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, _name, blob) => `` ) .replace(/\[audio:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, _name, blob) => `` ) .replace(/\[pdf:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, name, blob) => `${name || i18n.pdfFallbackLabel || 'PDF'}` ) html = html .replace(/\[@([^\]]+)\]\(@?([A-Za-z0-9+/=.\-]+\.ed25519)\)/g, (_, name, id) => `@${name}` ) .replace(/@([A-Za-z0-9+/=.\-]+\.ed25519)/g, (_, id) => `@${id}` ) const escAttr = (s) => String(s).replace(/"/g, '"').replace(/'/g, ''') html = html .replace(/#(\w+)/g, (_, tag) => `#${escAttr(tag)}` ) .replace(/(https?:\/\/[^\s"'<>]+)/g, url => `${escAttr(url)}` ) .replace(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, email => `${escAttr(email)}` ) const lines = html.split('\n') let result = '' let inUL = false let inOL = false for (let line of lines) { if (/^- /.test(line)) { if (!inUL) { result += '' inUL = false } if (inOL) { result += '' inOL = false } result += line + '
' } if (inUL) result += '' if (inOL) result += '' return result } module.exports = { renderTextWithStyles, renderTextPreview }