mirror of
https://github.com/danbulant/Nertivia-Client
synced 2026-06-15 04:21:19 +00:00
72 lines
2.3 KiB
JavaScript
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;
|
|
};
|