// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
const TextFormatting = require('./text_formatting.jsx');
const Utils = require('./utils.jsx');
const marked = require('marked');
class MattermostInlineLexer extends marked.InlineLexer {
constructor(links, options) {
super(links, options);
this.rules = Object.assign({}, this.rules);
// modified version of the regex that doesn't break up words in snake_case,
// allows for links starting with www, and allows links succounded by parentheses
// the original is /^[\s\S]+?(?=[\\ starting with www.
// the original is /^<([^ >]+(@|:\/)[^ >]+)>/
this.rules.autolink = /^<((?:[^ >]+(@|:\/)|www\.)[^ >]+)>/;
}
}
class MattermostParser extends marked.Parser {
parse(src) {
this.inline = new MattermostInlineLexer(src.links, this.options, this.renderer);
this.tokens = src.reverse();
var out = '';
while (this.next()) {
out += this.tok();
}
return out;
}
}
class MattermostMarkdownRenderer extends marked.Renderer {
constructor(options, formattingOptions = {}) {
super(options);
this.heading = this.heading.bind(this);
this.paragraph = this.paragraph.bind(this);
this.text = this.text.bind(this);
this.formattingOptions = formattingOptions;
}
br() {
if (this.formattingOptions.singleline) {
return ' ';
}
return super.br();
}
heading(text, level, raw) {
const id = `${this.options.headerPrefix}${raw.toLowerCase().replace(/[^\w]+/g, '-')}`;
return `
${text}
`; } return super.paragraph(text); } table(header, body) { return `