diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 1b503bac..bee629f6 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -6,6 +6,8 @@ var ReactDOM = require('react-dom') const electron = require('electron') const shell = electron.shell +const katex = window.katex + function handleAnchorClick (e) { e.preventDefault() e.stopPropagation() @@ -17,13 +19,27 @@ function stopPropagation (e) { e.stopPropagation() } +function math2Katex (display) { + return function (el) { + try { + katex.render(el.innerHTML, el, {display: display}) + el.className = 'math-rendered' + } catch (e) { + el.innerHTML = e.message + el.className = 'math-failed' + } + } +} + export default class MarkdownPreview extends React.Component { componentDidMount () { this.addListener() + this.renderMath() } componentDidUpdate () { this.addListener() + this.renderMath() } componentWillUnmount () { @@ -34,6 +50,13 @@ export default class MarkdownPreview extends React.Component { this.removeListener() } + renderMath () { + let inline = ReactDOM.findDOMNode(this).querySelectorAll('span.math') + Array.prototype.forEach.call(inline, math2Katex(false)) + let block = ReactDOM.findDOMNode(this).querySelectorAll('div.math') + Array.prototype.forEach.call(block, math2Katex(true)) + } + addListener () { var anchors = ReactDOM.findDOMNode(this).querySelectorAll('a:not(.lineAnchor)') diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 619b9655..e3192fa5 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -1,6 +1,7 @@ import markdownit from 'markdown-it' import hljs from 'highlight.js' import emoji from 'markdown-it-emoji' +import math from 'markdown-it-math' var md = markdownit({ typographer: true, @@ -20,6 +21,14 @@ var md = markdownit({ } }) md.use(emoji) +md.use(math, { + inlineRenderer: function (str) { + return `${str}` + }, + blockRenderer: function (str) { + return `