From 2f19481147b12e2ae503ed3d1f28621c94447ac3 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 7 Mar 2022 11:48:53 +0100 Subject: Optimize markdown renderer --- server/helpers/markdown.ts | 54 ++++++++++++++++++++++++---------------- server/tests/helpers/markdown.ts | 6 +++++ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/server/helpers/markdown.ts b/server/helpers/markdown.ts index 25685ec6d..f9291bdad 100644 --- a/server/helpers/markdown.ts +++ b/server/helpers/markdown.ts @@ -7,8 +7,13 @@ const sanitizeHtml = require('sanitize-html') const markdownItEmoji = require('markdown-it-emoji/light') const MarkdownItClass = require('markdown-it') -const markdownItWithHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: true }) -const markdownItWithoutHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: false }) +const markdownItForSafeHtml = new MarkdownItClass('default', { linkify: true, breaks: true, html: true }) + .enable(TEXT_WITH_HTML_RULES) + .use(markdownItEmoji) + +const markdownItForPlainText = new MarkdownItClass('default', { linkify: false, breaks: true, html: false }) + .use(markdownItEmoji) + .use(plainTextPlugin) const toSafeHtml = (text: string) => { if (!text) return '' @@ -17,9 +22,7 @@ const toSafeHtml = (text: string) => { const textWithLineFeed = text.replace(//g, '\r\n') // Convert possible markdown (emojis, emphasis and lists) to html - const html = markdownItWithHTML.enable(TEXT_WITH_HTML_RULES) - .use(markdownItEmoji) - .render(textWithLineFeed) + const html = markdownItForSafeHtml.render(textWithLineFeed) // Convert to safe Html return sanitizeHtml(html, defaultSanitizeOptions) @@ -28,12 +31,10 @@ const toSafeHtml = (text: string) => { const mdToOneLinePlainText = (text: string) => { if (!text) return '' - markdownItWithoutHTML.use(markdownItEmoji) - .use(plainTextPlugin) - .render(text) + markdownItForPlainText.render(text) // Convert to safe Html - return sanitizeHtml(markdownItWithoutHTML.plainText, textOnlySanitizeOptions) + return sanitizeHtml(markdownItForPlainText.plainText, textOnlySanitizeOptions) } // --------------------------------------------------------------------------- @@ -47,30 +48,39 @@ export { // Thanks: https://github.com/wavesheep/markdown-it-plain-text function plainTextPlugin (markdownIt: any) { - let lastSeparator = '' - function plainTextRule (state: any) { const text = scan(state.tokens) - markdownIt.plainText = text.replace(/\s+/g, ' ') + // markdownIt.plainText = text.replace(/\s+/g, ' ') + markdownIt.plainText = text } function scan (tokens: any[]) { + let lastSeparator = '' let text = '' - for (const token of tokens) { - if (token.children !== null) { - text += scan(token.children) - continue - } - + function buildSeparator (token: any) { if (token.type === 'list_item_close') { lastSeparator = ', ' - } else if (/[a-zA-Z]+_close/.test(token.type)) { + } + + if (token.tag === 'br' || token.type === 'paragraph_close') { lastSeparator = ' ' - } else if (token.content) { - text += lastSeparator - text += token.content + } + } + + for (const token of tokens) { + buildSeparator(token) + + if (token.type !== 'inline') continue + + for (const child of token.children) { + buildSeparator(child) + + if (!child.content) continue + + text += lastSeparator + child.content + lastSeparator = '' } } diff --git a/server/tests/helpers/markdown.ts b/server/tests/helpers/markdown.ts index 0488a1a05..8177477f6 100644 --- a/server/tests/helpers/markdown.ts +++ b/server/tests/helpers/markdown.ts @@ -30,5 +30,11 @@ describe('Markdown helpers', function () { expect(result).to.equal('Hello coucou') }) + + it('Should convert tags to plain text', function () { + const result = mdToOneLinePlainText(`#déconversion\n#newage\n#histoire`) + + expect(result).to.equal('#déconversion #newage #histoire') + }) }) }) -- cgit v1.2.3