enable MathJax in fenced code block

This commit is contained in:
Le Tan 2018-01-07 18:59:47 +08:00
parent c9b1801a5a
commit b9e8bc0eb4
9 changed files with 92 additions and 17 deletions

View File

@ -39,6 +39,9 @@ var updateHtml = function(html) {
--i; --i;
continue; continue;
} }
} else if (VEnableMathjax && code.classList.contains('language-mathjax')) {
// Mathjax code block.
continue;
} }
if (listContainsRegex(code.classList, /language-.*/)) { if (listContainsRegex(code.classList, /language-.*/)) {
@ -55,7 +58,7 @@ var updateHtml = function(html) {
// MathJax may be not loaded for now. // MathJax may be not loaded for now.
if (VEnableMathjax && (typeof MathJax != "undefined")) { if (VEnableMathjax && (typeof MathJax != "undefined")) {
try { try {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, finishLogics]); MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, postProcessMathJax]);
} catch (err) { } catch (err) {
content.setLog("err: " + err); content.setLog("err: " + err);
finishLogics(); finishLogics();

View File

@ -44,17 +44,20 @@ var mdit = window.markdownit({
typographer: true, typographer: true,
langPrefix: 'lang-', langPrefix: 'lang-',
highlight: function(str, lang) { highlight: function(str, lang) {
if (lang) { if (lang
&& (!VEnableMathjax || lang != 'mathjax')
&& (!VEnableMermaid || lang != 'mermaid')
&& (!VEnableFlowchart || lang != 'flowchart')) {
if (hljs.getLanguage(lang)) { if (hljs.getLanguage(lang)) {
return hljs.highlight(lang, str).value; return hljs.highlight(lang, str).value;
} else { } else {
return hljs.highlightAuto(str).value; return hljs.highlightAuto(str).value;
} }
} else { }
// Use external default escaping. // Use external default escaping.
return ''; return '';
} }
}
}); });
mdit = mdit.use(window.markdownitHeadingAnchor, { mdit = mdit.use(window.markdownitHeadingAnchor, {
@ -111,7 +114,7 @@ var updateText = function(text) {
// finishLoading logic. // finishLoading logic.
if (VEnableMathjax) { if (VEnableMathjax) {
try { try {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, finishLogics]); MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, postProcessMathJax]);
} catch (err) { } catch (err) {
content.setLog("err: " + err); content.setLog("err: " + err);
finishLogics(); finishLogics();

View File

@ -890,7 +890,12 @@ var renderCodeBlockLineNumber = function() {
var codes = document.getElementsByTagName('code'); var codes = document.getElementsByTagName('code');
for (var i = 0; i < codes.length; ++i) { for (var i = 0; i < codes.length; ++i) {
var code = codes[i]; var code = codes[i];
if (code.parentElement.tagName.toLowerCase() == 'pre') { var pare = code.parentElement;
if (pare.tagName.toLowerCase() == 'pre') {
if (VEnableMathjax && pare.classList.contains("lang-mathjax")) {
continue;
}
hljs.lineNumbersBlock(code); hljs.lineNumbersBlock(code);
} }
} }
@ -911,8 +916,17 @@ var addClassToCodeBlock = function() {
var codes = document.getElementsByTagName('code'); var codes = document.getElementsByTagName('code');
for (var i = 0; i < codes.length; ++i) { for (var i = 0; i < codes.length; ++i) {
var code = codes[i]; var code = codes[i];
if (code.parentElement.tagName.toLowerCase() == 'pre') { var pare = code.parentElement;
if (pare.tagName.toLowerCase() == 'pre') {
code.classList.add(hljsClass); code.classList.add(hljsClass);
if (VEnableMathjax
&& (code.classList.contains("lang-mathjax")
|| code.classList.contains("language-mathjax"))) {
// Add the class to pre.
pare.classList.add("lang-mathjax");
pare.classList.add("language-mathjax");
}
} }
} }
}; };
@ -990,3 +1004,17 @@ var getHtmlWithInlineStyles = function(container) {
return container.innerHTML; return container.innerHTML;
}; };
// Will be called after MathJax rendering finished.
var postProcessMathJax = function() {
var all = MathJax.Hub.getAllJax();
for (var i = 0; i < all.length; ++i) {
var node = all[i].SourceElement().parentNode;
if (node.tagName.toLowerCase() == 'code') {
node.classList.remove('hljs');
node.classList.add('mathjax-code');
}
}
finishLogics();
};

View File

@ -17,7 +17,10 @@ renderer.heading = function(text, level) {
// Highlight.js to highlight code block // Highlight.js to highlight code block
marked.setOptions({ marked.setOptions({
highlight: function(code, lang) { highlight: function(code, lang) {
if (lang) { if (lang
&& (!VEnableMathjax || lang != 'mathjax')
&& (!VEnableMermaid || lang != 'mermaid')
&& (!VEnableFlowchart || lang != 'flowchart')) {
if (hljs.getLanguage(lang)) { if (hljs.getLanguage(lang)) {
return hljs.highlight(lang, code).value; return hljs.highlight(lang, code).value;
} else { } else {
@ -60,7 +63,7 @@ var updateText = function(text) {
// finishLoading logic. // finishLoading logic.
if (VEnableMathjax) { if (VEnableMathjax) {
try { try {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, finishLogics]); MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, postProcessMathJax]);
} catch (err) { } catch (err) {
content.setLog("err: " + err); content.setLog("err: " + err);
finishLogics(); finishLogics();

View File

@ -49,7 +49,7 @@ var mdHasTocSection = function(markdown) {
return n != -1; return n != -1;
}; };
var highlightCodeBlocks = function(doc, enableMermaid, enableFlowchart) { var highlightCodeBlocks = function(doc, enableMermaid, enableFlowchart, enableMathJax) {
var codes = doc.getElementsByTagName('code'); var codes = doc.getElementsByTagName('code');
for (var i = 0; i < codes.length; ++i) { for (var i = 0; i < codes.length; ++i) {
var code = codes[i]; var code = codes[i];
@ -57,9 +57,12 @@ var highlightCodeBlocks = function(doc, enableMermaid, enableFlowchart) {
if (enableMermaid && code.classList.contains('language-mermaid')) { if (enableMermaid && code.classList.contains('language-mermaid')) {
// Mermaid code block. // Mermaid code block.
continue; continue;
} if (enableFlowchart && code.classList.contains('language-flowchart')) { } else if (enableFlowchart && code.classList.contains('language-flowchart')) {
// Flowchart code block. // Flowchart code block.
continue; continue;
} else if (enableMathJax && code.classList.contains('language-mathjax')) {
// MathJax code block.
continue;
} }
if (listContainsRegex(code.classList, /language-.*/)) { if (listContainsRegex(code.classList, /language-.*/)) {
@ -75,7 +78,7 @@ var updateText = function(text) {
placeholder.innerHTML = html; placeholder.innerHTML = html;
handleToc(needToc); handleToc(needToc);
insertImageCaption(); insertImageCaption();
highlightCodeBlocks(document, VEnableMermaid, VEnableFlowchart); highlightCodeBlocks(document, VEnableMermaid, VEnableFlowchart, VEnableMathjax);
renderMermaid('language-mermaid'); renderMermaid('language-mermaid');
renderFlowchart('language-flowchart'); renderFlowchart('language-flowchart');
addClassToCodeBlock(); addClassToCodeBlock();
@ -85,7 +88,7 @@ var updateText = function(text) {
// finishLoading logic. // finishLoading logic.
if (VEnableMathjax) { if (VEnableMathjax) {
try { try {
MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, finishLogics]); MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder, postProcessMathJax]);
} catch (err) { } catch (err) {
content.setLog("err: " + err); content.setLog("err: " + err);
finishLogics(); finishLogics();
@ -100,7 +103,7 @@ var highlightText = function(text, id, timeStamp) {
var parser = new DOMParser(); var parser = new DOMParser();
var htmlDoc = parser.parseFromString("<div id=\"showdown-container\">" + html + "</div>", 'text/html'); var htmlDoc = parser.parseFromString("<div id=\"showdown-container\">" + html + "</div>", 'text/html');
highlightCodeBlocks(htmlDoc, false, false); highlightCodeBlocks(htmlDoc, false, false, false);
html = htmlDoc.getElementById('showdown-container').innerHTML; html = htmlDoc.getElementById('showdown-container').innerHTML;
@ -114,7 +117,7 @@ var textToHtml = function(text) {
var parser = new DOMParser(); var parser = new DOMParser();
var htmlDoc = parser.parseFromString("<div id=\"showdown-container\">" + html + "</div>", 'text/html'); var htmlDoc = parser.parseFromString("<div id=\"showdown-container\">" + html + "</div>", 'text/html');
highlightCodeBlocks(htmlDoc, false, false); highlightCodeBlocks(htmlDoc, false, false, false);
html = htmlDoc.getElementById('showdown-container').innerHTML; html = htmlDoc.getElementById('showdown-container').innerHTML;

View File

@ -98,6 +98,17 @@ pre code {
background-color: #2C313A; background-color: #2C313A;
} }
code.mathjax-code {
display: inherit;
overflow-x: inherit;
padding: inherit;
color: inherit;
background: inherit;
font-size: 100%;
font-family: inherit;
line-height: inherit;
}
aside { aside {
display: block; display: block;
float: right; float: right;

View File

@ -98,6 +98,17 @@ pre code {
background-color: #E0E0E0; background-color: #E0E0E0;
} }
code.mathjax-code {
display: inherit;
overflow-x: inherit;
padding: inherit;
color: inherit;
background: inherit;
font-size: 100%;
font-family: inherit;
line-height: inherit;
}
aside { aside {
display: block; display: block;
float: right; float: right;

View File

@ -97,6 +97,17 @@ pre code {
background-color: #E0E0E0; background-color: #E0E0E0;
} }
code.mathjax-code {
display: inherit;
overflow-x: inherit;
padding: inherit;
color: inherit;
background: inherit;
font-size: 100%;
font-family: inherit;
line-height: inherit;
}
aside { aside {
display: block; display: block;
float: right; float: right;

View File

@ -649,7 +649,9 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
if (g_config->getEnableMathjax()) { if (g_config->getEnableMathjax()) {
extraFile += "<script type=\"text/x-mathjax-config\">" extraFile += "<script type=\"text/x-mathjax-config\">"
"MathJax.Hub.Config({\n" "MathJax.Hub.Config({\n"
" tex2jax: {inlineMath: [['$','$'], ['\\\\(','\\\\)']]},\n" " tex2jax: {inlineMath: [['$','$'], ['\\\\(','\\\\)']],\n"
"processEscapes: true,\n"
"processClass: \"tex2jax_process|language-mathjax|lang-mathjax\"},\n"
" showProcessingMessages: false,\n" " showProcessingMessages: false,\n"
" messageStyle: \"none\"});\n" " messageStyle: \"none\"});\n"
"</script>\n" "</script>\n"