// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import * as TextFormatting from './text_formatting.jsx';
import * as SyntaxHighlighting from './syntax_hightlighting.jsx';
import marked from 'marked';
import katex from 'katex';
import 'katex/dist/katex.min.css';
function markdownImageLoaded(image) {
image.style.height = 'auto';
}
window.markdownImageLoaded = markdownImageLoaded;
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;
}
code(code, language) {
let usedLanguage = language || '';
usedLanguage = usedLanguage.toLowerCase();
if (usedLanguage === 'tex' || usedLanguage === 'latex') {
try {
const html = katex.renderToString(code, {throwOnError: false, displayMode: true});
return '
' + html + '
';
} catch (e) {
// fall through if latex parsing fails and handle below
}
}
// treat html as xml to prevent injection attacks
if (usedLanguage === 'html') {
usedLanguage = 'xml';
}
let className = 'post-code';
if (!usedLanguage) {
className += ' post-code--wrap';
}
let header = '';
if (SyntaxHighlighting.canHighlight(usedLanguage)) {
header = (
'' +
SyntaxHighlighting.getLanguageName(language) +
''
);
}
// if we have to apply syntax highlighting AND highlighting of search terms, create two copies
// of the code block, one with syntax highlighting applied and another with invisible text, but
// search term highlighting and overlap them
const content = SyntaxHighlighting.highlight(usedLanguage, code);
let searchedContent = '';
if (this.formattingOptions.searchTerm) {
const tokens = new Map();
let searched = TextFormatting.sanitizeHtml(code);
searched = TextFormatting.highlightSearchTerms(searched, tokens, this.formattingOptions.searchTerm);
if (tokens.size > 0) {
searched = TextFormatting.replaceTokens(searched, tokens);
searchedContent = (
'