import mila from 'markdown-it-link-attributes'; import mentionPlugin from './markdownIt/link'; const md = require('markdown-it')({ html: false, xhtmlOut: true, breaks: true, langPrefix: 'language-', linkify: true, typographer: true, quotes: '\u201c\u201d\u2018\u2019', maxNesting: 20, }) .use(mentionPlugin) .use(mila, { attrs: { class: 'link', rel: 'noreferrer noopener nofollow', target: '_blank', }, }); const TWITTER_USERNAME_REGEX = /(^|[^@\w])@(\w{1,15})\b/g; const TWITTER_USERNAME_REPLACEMENT = '$1[@$2](http://twitter.com/$2)'; const TWITTER_HASH_REGEX = /(^|\s)#(\w+)/g; const TWITTER_HASH_REPLACEMENT = '$1[#$2](https://twitter.com/hashtag/$2)'; class MessageFormatter { constructor(message, isATweet = false, isAPrivateNote = false) { this.message = message || ''; this.isAPrivateNote = isAPrivateNote; this.isATweet = isATweet; } formatMessage() { let updatedMessage = this.message; if (this.isATweet && !this.isAPrivateNote) { updatedMessage = updatedMessage.replace( TWITTER_USERNAME_REGEX, TWITTER_USERNAME_REPLACEMENT ); updatedMessage = updatedMessage.replace( TWITTER_HASH_REGEX, TWITTER_HASH_REPLACEMENT ); } return md.render(updatedMessage); } get formattedMessage() { return this.formatMessage(); } get plainText() { const strippedOutHtml = new DOMParser().parseFromString( this.formattedMessage, 'text/html' ); return strippedOutHtml.body.textContent || ''; } } export default MessageFormatter;