From a9b34955ee935153d6027c97dec9d194f4430567 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 23 Mar 2017 20:16:35 +0800 Subject: [PATCH] support MathJax Work well with Hoedown and Markdown-it. --- src/resources/hoedown.js | 4 ++++ src/resources/markdown-it.js | 3 +++ src/resources/markdown_template.js | 4 ++++ src/resources/marked.js | 3 +++ src/resources/vnote.ini | 1 + src/vconfigmanager.cpp | 4 +++- src/vconfigmanager.h | 20 ++++++++++++++++++++ src/vedittab.cpp | 11 +++++++++++ src/vmainwindow.cpp | 14 ++++++++++++++ src/vmainwindow.h | 1 + src/vnote.cpp | 1 + src/vnote.h | 3 +++ 12 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/resources/hoedown.js b/src/resources/hoedown.js index 1dfa86b7..f9995efa 100644 --- a/src/resources/hoedown.js +++ b/src/resources/hoedown.js @@ -23,5 +23,9 @@ var updateHtml = function(html) { } } } + + if (VEnableMathjax && (typeof MathJax != 'undefined')) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder]); + } } diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js index 21620581..bfd7fc30 100644 --- a/src/resources/markdown-it.js +++ b/src/resources/markdown-it.js @@ -169,5 +169,8 @@ var updateText = function(text) { placeholder.innerHTML = html; handleToc(needToc); renderMermaid('lang-mermaid'); + if (VEnableMathjax) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder]); + } } diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js index 3b2972c0..bc7ef3c6 100644 --- a/src/resources/markdown_template.js +++ b/src/resources/markdown_template.js @@ -24,6 +24,10 @@ if (typeof VEnableMermaid == 'undefined') { }); } +if (typeof VEnableMathjax == 'undefined') { + VEnableMathjax = false; +} + var scrollToAnchor = function(anchor) { var anc = document.getElementById(anchor); if (anc != null) { diff --git a/src/resources/marked.js b/src/resources/marked.js index bcb7d4d0..42450c7b 100644 --- a/src/resources/marked.js +++ b/src/resources/marked.js @@ -122,5 +122,8 @@ var updateText = function(text) { placeholder.innerHTML = html; handleToc(needToc); renderMermaid('lang-mermaid'); + if (VEnableMathjax) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, placeholder]); + } }; diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index 2f5f5134..3f0bede5 100644 --- a/src/resources/vnote.ini +++ b/src/resources/vnote.ini @@ -14,6 +14,7 @@ editor_font_size=12 ; 0 - Hoedown, 1 - Marked, 2 - Markdown-it markdown_converter=2 enable_mermaid=true +enable_mathjax=true [session] tools_dock_checked=true diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp index 32960fe6..13eaf33e 100644 --- a/src/vconfigmanager.cpp +++ b/src/vconfigmanager.cpp @@ -49,7 +49,7 @@ void VConfigManager::initialize() markdownExtensions = hoedown_extensions(HOEDOWN_EXT_TABLES | HOEDOWN_EXT_FENCED_CODE | HOEDOWN_EXT_HIGHLIGHT | HOEDOWN_EXT_AUTOLINK | - HOEDOWN_EXT_QUOTE | HOEDOWN_EXT_MATH); + HOEDOWN_EXT_QUOTE | HOEDOWN_EXT_MATH | HOEDOWN_EXT_MATH_EXPLICIT); mdConverterType = (MarkdownConverterType)getConfigFromSettings("global", "markdown_converter").toInt(); tabStopWidth = getConfigFromSettings("global", "tab_stop_width").toInt(); @@ -85,6 +85,8 @@ void VConfigManager::initialize() m_language = getConfigFromSettings("global", "language").toString(); m_enableMermaid = getConfigFromSettings("global", "enable_mermaid").toBool(); + + m_enableMathjax = getConfigFromSettings("global", "enable_mathjax").toBool(); } void VConfigManager::readPredefinedColorsFromSettings() diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h index 71ad23c6..60e5ec2d 100644 --- a/src/vconfigmanager.h +++ b/src/vconfigmanager.h @@ -120,6 +120,9 @@ public: inline bool getEnableMermaid() const; inline void setEnableMermaid(bool p_enabled); + inline bool getEnableMathjax() const; + inline void setEnableMathjax(bool p_enabled); + private: void updateMarkdownEditStyle(); QVariant getConfigFromSettings(const QString §ion, const QString &key); @@ -181,6 +184,9 @@ private: // Enable Mermaid. bool m_enableMermaid; + // Enable Mathjax. + bool m_enableMathjax; + // The name of the config file in each directory static const QString dirConfigFileName; // The name of the default configuration file @@ -512,4 +518,18 @@ inline void VConfigManager::setEnableMermaid(bool p_enabled) setConfigToSettings("global", "enable_mermaid", m_enableMermaid); } +inline bool VConfigManager::getEnableMathjax() const +{ + return m_enableMathjax; +} + +inline void VConfigManager::setEnableMathjax(bool p_enabled) +{ + if (m_enableMathjax == p_enabled) { + return; + } + m_enableMathjax = p_enabled; + setConfigToSettings("global", "enable_mathjax", m_enableMathjax); +} + #endif // VCONFIGMANAGER_H diff --git a/src/vedittab.cpp b/src/vedittab.cpp index 9700ccbb..ce091358 100644 --- a/src/vedittab.cpp +++ b/src/vedittab.cpp @@ -304,6 +304,17 @@ void VEditTab::setupMarkdownPreview() "\n"; } + if (vconfig.getEnableMathjax()) { + extraFile += "\n" + "\n" + + "\n"; + } + QString htmlTemplate = VNote::s_markdownTemplate; htmlTemplate.replace(jsHolder, jsFile); if (!extraFile.isEmpty()) { diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index 59cb7c47..0b59b05f 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -330,6 +330,15 @@ void VMainWindow::initMarkdownMenu() markdownMenu->addAction(mermaidAct); mermaidAct->setChecked(vconfig.getEnableMermaid()); + + QAction *mathjaxAct = new QAction(tr("Math&jax"), this); + mathjaxAct->setStatusTip(tr("Enable Mathjax for math support in Markdown")); + mathjaxAct->setCheckable(true); + connect(mathjaxAct, &QAction::triggered, + this, &VMainWindow::enableMathjax); + markdownMenu->addAction(mathjaxAct); + + mathjaxAct->setChecked(vconfig.getEnableMathjax()); } void VMainWindow::initViewMenu() @@ -607,6 +616,11 @@ void VMainWindow::enableMermaid(bool p_checked) vconfig.setEnableMermaid(p_checked); } +void VMainWindow::enableMathjax(bool p_checked) +{ + vconfig.setEnableMathjax(p_checked); +} + void VMainWindow::changeHighlightCursorLine(bool p_checked) { vconfig.setHighlightCursorLine(p_checked); diff --git a/src/vmainwindow.h b/src/vmainwindow.h index 60a194ae..8a12f013 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -62,6 +62,7 @@ private slots: void handleFindDialogTextChanged(const QString &p_text, uint p_options); void openFindDialog(); void enableMermaid(bool p_checked); + void enableMathjax(bool p_checked); protected: void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE; diff --git a/src/vnote.cpp b/src/vnote.cpp index de9b2010..e56a5652 100644 --- a/src/vnote.cpp +++ b/src/vnote.cpp @@ -22,6 +22,7 @@ const QString VNote::c_mermaidApiJsFile = ":/utils/mermaid/mermaidAPI.min.js"; const QString VNote::c_mermaidCssFile = ":/utils/mermaid/mermaid.css"; const QString VNote::c_mermaidDarkCssFile = ":/utils/mermaid/mermaid.dark.css"; const QString VNote::c_mermaidForestCssFile = ":/utils/mermaid/mermaid.forest.css"; +const QString VNote::c_mathjaxJsFile = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"; VNote::VNote(QObject *parent) : QObject(parent), m_mainWindow(dynamic_cast(parent)) diff --git a/src/vnote.h b/src/vnote.h index 7c0ddb4d..de488596 100644 --- a/src/vnote.h +++ b/src/vnote.h @@ -46,6 +46,9 @@ public: static const QString c_mermaidDarkCssFile; static const QString c_mermaidForestCssFile; + // Mathjax + static const QString c_mathjaxJsFile; + inline const QVector > &getPalette() const; void initPalette(QPalette palette); QString getColorFromPalette(const QString &p_name) const;