From 5ee980465f949a48802bf22334359a15af2479c1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 29 Sep 2023 12:05:32 +0530 Subject: [PATCH] fix: Token type `hr` not supported by Markdown parser (#8003) --- .../dashboard/helper/editorHelper.js | 23 ++++++++++++-- .../helper/specs/editorHelper.spec.js | 31 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/javascript/dashboard/helper/editorHelper.js b/app/javascript/dashboard/helper/editorHelper.js index 795c3af1b..6d122d9d5 100644 --- a/app/javascript/dashboard/helper/editorHelper.js +++ b/app/javascript/dashboard/helper/editorHelper.js @@ -3,6 +3,7 @@ import { MessageMarkdownTransformer, MessageMarkdownSerializer, } from '@chatwoot/prosemirror-schema'; +import * as Sentry from '@sentry/browser'; /** * The delimiter used to separate the signature from the rest of the body. @@ -14,9 +15,25 @@ export const SIGNATURE_DELIMITER = '--'; * Parse and Serialize the markdown text to remove any extra spaces or new lines */ export function cleanSignature(signature) { - // convert from markdown to common mark format - const nodes = new MessageMarkdownTransformer(messageSchema).parse(signature); - return MessageMarkdownSerializer.serialize(nodes); + try { + // remove any horizontal rule tokens + signature = signature + .replace(/^( *\* *){3,} *$/gm, '') + .replace(/^( *- *){3,} *$/gm, '') + .replace(/^( *_ *){3,} *$/gm, ''); + + const nodes = new MessageMarkdownTransformer(messageSchema).parse( + signature + ); + return MessageMarkdownSerializer.serialize(nodes); + } catch (e) { + // eslint-disable-next-line no-console + console.warn(e); + Sentry.captureException(e); + // The parser can break on some cases + // for example, Token type `hr` not supported by Markdown parser + return signature; + } } /** diff --git a/app/javascript/dashboard/helper/specs/editorHelper.spec.js b/app/javascript/dashboard/helper/specs/editorHelper.spec.js index 6b1a934b6..cd471d2f8 100644 --- a/app/javascript/dashboard/helper/specs/editorHelper.spec.js +++ b/app/javascript/dashboard/helper/specs/editorHelper.spec.js @@ -85,6 +85,37 @@ describe('appendSignature', () => { }); }); +describe('cleanSignature', () => { + it('removes any instance of horizontal rule', () => { + const options = [ + '---', + '***', + '___', + '- - -', + '* * *', + '_ _ _', + ' ---', + '--- ', + ' --- ', + '-----', + '*****', + '_____', + '- - - -', + '* * * * *', + '_ _ _ _ _ _', + ' - - - - ', + ' * * * * * ', + ' _ _ _ _ _ _', + '- - - - -', + '* * * * * *', + '_ _ _ _ _ _ _', + ]; + options.forEach(option => { + expect(cleanSignature(option)).toBe(''); + }); + }); +}); + describe('removeSignature', () => { it('does not remove signature if not present', () => { Object.keys(DOES_NOT_HAVE_SIGNATURE).forEach(key => {