diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx
index 6bae0b25b6..dc2f45210b 100644
--- a/src/HtmlUtils.tsx
+++ b/src/HtmlUtils.tsx
@@ -30,6 +30,7 @@ import url from 'url';
import katex from 'katex';
import { AllHtmlEntities } from 'html-entities';
import SettingsStore from './settings/SettingsStore';
+import cheerio from 'cheerio';
import {MatrixClientPeg} from './MatrixClientPeg';
import {tryTransformPermalinkToLocalHref} from "./utils/permalinks/Permalinks";
@@ -414,23 +415,20 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts
if (isHtmlMessage) {
isDisplayedWithHtml = true;
safeBody = sanitizeHtml(formattedBody, sanitizeParams);
- if (SettingsStore.getValue("feature_latex_maths")) {
- const mathDelimiters = [
- { pattern: "
(.|\\s)*?
", display: true },
- { pattern: "(.|\\s)*?", display: false },
- ];
+ const phtml = cheerio.load(safeBody,
+ { _useHtmlParser2: true, decodeEntities: false })
- mathDelimiters.forEach(function(d) {
- safeBody = safeBody.replace(RegExp(d.pattern, "gm"), function(m, p1) {
- return katex.renderToString(
- AllHtmlEntities.decode(p1),
- {
- throwOnError: false,
- displayMode: d.display,
- output: "htmlAndMathml",
- })
- });
+ if (SettingsStore.getValue("feature_latex_maths")) {
+ phtml('div, span[data-mx-maths!=""]').replaceWith(function(i, e) {
+ return katex.renderToString(
+ AllHtmlEntities.decode(phtml(e).attr('data-mx-maths')),
+ {
+ throwOnError: false,
+ displayMode: e.name == 'div',
+ output: "htmlAndMathml",
+ });
});
+ safeBody = phtml.html();
}
}
} finally {