Nertivia-Client/src/utils/messageFormatter.js
2019-11-20 15:11:10 +00:00

72 lines
2.3 KiB
JavaScript

import twemoji from "twemoji";
import emojiParser from "@/utils/emojiParser";
import config from "@/config.js";
import * as SimpleMarkdown from 'simple-markdown'
import { htmlTag as h } from 'simple-markdown'
import codeblock from './markdown-rules/codeblock'
import underline from './markdown-rules/underline'
import strikeout from './markdown-rules/strikeout'
import inlineCodeblock from './markdown-rules/inlineCodeblock'
import link from './markdown-rules/link'
import customEmoji from './markdown-rules/customEmoji'
let order = 0; // order the below rules as declared below rather than by the original defaultRules order:
const rules = {
inlineCodeblock: inlineCodeblock(order++),
codeblock: codeblock(order++),
underline: underline(order++),
strikeout: strikeout(order++),
link: link(order++),
customEmoji: customEmoji(order++),
strong: Object.assign({}, SimpleMarkdown.defaultRules.strong, {
order: order++,
}),
em: Object.assign({}, SimpleMarkdown.defaultRules.em, {
order: order++,
}),
inlineCode: Object.assign({}, SimpleMarkdown.defaultRules.inlineCode, {
order: order++,
html: function(node, parse, state) {
return SimpleMarkdown.htmlTag("code", SimpleMarkdown.sanitizeText(node.content), {
class: "inline-code"
})
}
}),
text: Object.assign({}, SimpleMarkdown.defaultRules.text, {
order: order++,
match: function(source) {
// copied and modified from simple-markdown.js
return /^[\s\S][0-9A-Za-z\u00c0-\uffff]*\s?/.exec(source);
},
parse: SimpleMarkdown.defaultRules.text.parse,
html: SimpleMarkdown.defaultRules.text.html,
}),
};
const parse = SimpleMarkdown.parserFor(rules);
const output = SimpleMarkdown.outputFor(rules, 'html');
const markdownToHtml = function(source, state) {
// if you don't have a paragraph rule, you probably want to default `state.inline` to true, to
// indicate to the bold rule that it is parsing inline text:
if (rules.paragraph == null) {
state.inline = true;
}
const parsedContentTree = parse(source, state);
return output(parsedContentTree, state);
};
export default message => {
message = markdownToHtml(message || '', { inline: false })
message = emojiParser.replaceEmojis(message);
return message;
};