diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js index 29b5f756..bce86b45 100644 --- a/src/resources/markdown-it.js +++ b/src/resources/markdown-it.js @@ -36,7 +36,7 @@ var getHeadingLevel = function(h) { } // There is a VMarkdownitOption struct passed in. -// var VMarkdownitOption = { html, breaks, linkify }; +// var VMarkdownitOption = { html, breaks, linkify, sub, sup }; var mdit = window.markdownit({ html: VMarkdownitOption.html, breaks: VMarkdownitOption.breaks, @@ -74,10 +74,15 @@ mdit = mdit.use(window.markdownitHeadingAnchor, { }); mdit = mdit.use(window.markdownitTaskLists); -/* -mdit = mdit.use(window.markdownitSub); -mdit = mdit.use(window.markdownitSup); -*/ + +if (VMarkdownitOption.sub) { + mdit = mdit.use(window.markdownitSub); +} + +if (VMarkdownitOption.sup) { + mdit = mdit.use(window.markdownitSup); +} + mdit = mdit.use(window.markdownitFootnote); var mdHasTocSection = function(markdown) { diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini index 391e6c62..7d03b02c 100644 --- a/src/resources/vnote.ini +++ b/src/resources/vnote.ini @@ -120,14 +120,6 @@ enable_code_block_line_number=false ; The icon size of tool bar (in pixels) tool_bar_icon_size=18 -; Markdown-it options -; Enable HTML tags in source -markdownit_opt_html=true -; Convert '\n' in paragraphs into
-markdownit_opt_breaks=false -; Auto-convert URL-like text to links -markdownit_opt_linkify=true - ; Default name of the recycle bin of notebook recycle_bin_folder=_v_recycle_bin @@ -224,6 +216,14 @@ wkhtmltopdfArgs= custom_export= [web] +; String list containing options for Markdown-it +; html: enable HTML tags in source +; break: convert '\n' in paragraphs into
+; linkify: auto-convert URL-like text to links +; sub: subscript; +; sup: superscript; +markdownit_opt=html,linkify + ; Location and configuration for Mathjax mathjax_javascript=https://cdn.bootcss.com/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_HTMLorMML diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index ae8401f0..90a42011 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -644,19 +644,30 @@ QString VUtils::generateHtmlTemplate(const QString &p_template, extraFile = "\n" + "\n" + "\n" + - /* - "\n" + - "\n" + - */ "\n"; - MarkdownitOption opt = g_config->getMarkdownitOption(); + const MarkdownitOption &opt = g_config->getMarkdownitOption(); + + if (opt.m_sup) { + extraFile += "\n"; + } + + if (opt.m_sub) { + extraFile += "\n"; + } + QString optJs = QString("\n") - .arg(opt.m_html ? "true" : "false") - .arg(opt.m_breaks ? "true" : "false") - .arg(opt.m_linkify ? "true" : "false"); + .arg(opt.m_html ? QStringLiteral("true") : QStringLiteral("false")) + .arg(opt.m_breaks ? QStringLiteral("true") : QStringLiteral("false")) + .arg(opt.m_linkify ? QStringLiteral("true") : QStringLiteral("false")) + .arg(opt.m_sub ? QStringLiteral("true") : QStringLiteral("false")) + .arg(opt.m_sup ? QStringLiteral("true") : QStringLiteral("false")); extraFile += optJs; break; } diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp index e7d06d1a..f380d932 100644 --- a/src/vconfigmanager.cpp +++ b/src/vconfigmanager.cpp @@ -217,14 +217,8 @@ void VConfigManager::initialize() m_toolBarIconSize = getConfigFromSettings("global", "tool_bar_icon_size").toInt(); - m_markdownitOptHtml = getConfigFromSettings("global", - "markdownit_opt_html").toBool(); - - m_markdownitOptBreaks = getConfigFromSettings("global", - "markdownit_opt_breaks").toBool(); - - m_markdownitOptLinkify = getConfigFromSettings("global", - "markdownit_opt_linkify").toBool(); + m_markdownItOpt = MarkdownitOption::fromConfig(getConfigFromSettings("web", + "markdownit_opt").toStringList()); m_recycleBinFolder = getConfigFromSettings("global", "recycle_bin_folder").toString(); diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h index 77fba2f7..24dcd681 100644 --- a/src/vconfigmanager.h +++ b/src/vconfigmanager.h @@ -34,19 +34,6 @@ struct VExternalEditor }; -struct MarkdownitOption -{ - MarkdownitOption(bool p_html, bool p_breaks, bool p_linkify) - : m_html(p_html), m_breaks(p_breaks), m_linkify(p_linkify) - { - } - - bool m_html; - bool m_breaks; - bool m_linkify; -}; - - // Type of heading sequence. enum class HeadingSequenceType { @@ -328,7 +315,7 @@ public: int getToolBarIconSize() const; - MarkdownitOption getMarkdownitOption() const; + const MarkdownitOption &getMarkdownitOption() const; void setMarkdownitOption(const MarkdownitOption &p_opt); const QString &getRecycleBinFolder() const; @@ -774,14 +761,8 @@ private: // Icon size of tool bar in pixels. int m_toolBarIconSize; - // Eanble HTML tags in source. - bool m_markdownitOptHtml; - - // Convert '\n' in paragraphs into
. - bool m_markdownitOptBreaks; - - // Auto-convert URL-like text to links. - bool m_markdownitOptLinkify; + // Markdown-it option. + MarkdownitOption m_markdownItOpt; // Default name of the recycle bin folder of notebook. QString m_recycleBinFolder; @@ -1808,35 +1789,19 @@ inline int VConfigManager::getToolBarIconSize() const return m_toolBarIconSize; } -inline MarkdownitOption VConfigManager::getMarkdownitOption() const +inline const MarkdownitOption &VConfigManager::getMarkdownitOption() const { - return MarkdownitOption(m_markdownitOptHtml, - m_markdownitOptBreaks, - m_markdownitOptLinkify); + return m_markdownItOpt; } inline void VConfigManager::setMarkdownitOption(const MarkdownitOption &p_opt) { - if (m_markdownitOptHtml != p_opt.m_html) { - m_markdownitOptHtml = p_opt.m_html; - setConfigToSettings("global", - "markdownit_opt_html", - m_markdownitOptHtml); + if (m_markdownItOpt == p_opt) { + return; } - if (m_markdownitOptBreaks != p_opt.m_breaks) { - m_markdownitOptBreaks = p_opt.m_breaks; - setConfigToSettings("global", - "markdownit_opt_breaks", - m_markdownitOptBreaks); - } - - if (m_markdownitOptLinkify != p_opt.m_linkify) { - m_markdownitOptLinkify = p_opt.m_linkify; - setConfigToSettings("global", - "markdownit_opt_linkify", - m_markdownitOptLinkify); - } + m_markdownItOpt = p_opt; + setConfigToSettings("web", "markdownit_opt", m_markdownItOpt.toConfig()); } inline const QString &VConfigManager::getRecycleBinFolder() const diff --git a/src/vconstants.h b/src/vconstants.h index f7ce0d1a..80759e38 100644 --- a/src/vconstants.h +++ b/src/vconstants.h @@ -2,6 +2,7 @@ #define VCONSTANTS_H #include +#include // Html: rich text file; // Markdown: Markdown text file; @@ -151,4 +152,94 @@ enum MarkdownConverterType Showdown }; + +struct MarkdownitOption +{ + MarkdownitOption() + : MarkdownitOption(true, + false, + true, + false, + false) + { + } + + MarkdownitOption(bool p_html, + bool p_breaks, + bool p_linkify, + bool p_sub, + bool p_sup) + : m_html(p_html), + m_breaks(p_breaks), + m_linkify(p_linkify), + m_sub(p_sub), + m_sup(p_sup) + { + } + + QStringList toConfig() const + { + QStringList conf; + if (m_html) { + conf << "html"; + } + + if (m_breaks) { + conf << "break"; + } + + if (m_linkify) { + conf << "linkify"; + } + + if (m_sub) { + conf << "sub"; + } + + if (m_sup) { + conf << "sup"; + } + + return conf; + } + + static MarkdownitOption fromConfig(const QStringList &p_conf) + { + return MarkdownitOption(testOption(p_conf, "html"), + testOption(p_conf, "break"), + testOption(p_conf, "linkify"), + testOption(p_conf, "sub"), + testOption(p_conf, "sup")); + } + + bool operator==(const MarkdownitOption &p_opt) const + { + return m_html == p_opt.m_html + && m_breaks == p_opt.m_breaks + && m_linkify == p_opt.m_linkify + && m_sub == p_opt.m_sub + && m_sup == p_opt.m_sup; + } + + // Eanble HTML tags in source. + bool m_html; + + // Convert '\n' in paragraphs into
. + bool m_breaks; + + // Auto-convert URL-like text to links. + bool m_linkify; + + // Enable subscript. + bool m_sub; + + // Enable superscript. + bool m_sup; + +private: + static bool testOption(const QStringList &p_conf, const QString &p_opt) + { + return p_conf.contains(p_opt); + } +}; #endif diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index b75ba839..f3091783 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -1523,7 +1523,7 @@ void VMainWindow::initMarkdownitOptionMenu(QMenu *p_menu) QMenu *optMenu = p_menu->addMenu(tr("Markdown-it Options")); optMenu->setToolTipsVisible(true); - MarkdownitOption opt = g_config->getMarkdownitOption(); + const MarkdownitOption &opt = g_config->getMarkdownitOption(); QAction *htmlAct = new QAction(tr("HTML"), this); htmlAct->setToolTip(tr("Enable HTML tags in source")); @@ -1558,9 +1558,33 @@ void VMainWindow::initMarkdownitOptionMenu(QMenu *p_menu) g_config->setMarkdownitOption(opt); }); + QAction *supAct = new QAction(tr("Superscript"), this); + supAct->setToolTip(tr("Enable superscript via ^^")); + supAct->setCheckable(true); + supAct->setChecked(opt.m_sup); + connect(supAct, &QAction::triggered, + this, [this](bool p_checked) { + MarkdownitOption opt = g_config->getMarkdownitOption(); + opt.m_sup = p_checked; + g_config->setMarkdownitOption(opt); + }); + + QAction *subAct = new QAction(tr("Subscript"), this); + subAct->setToolTip(tr("Enable subscript via ~~")); + subAct->setCheckable(true); + subAct->setChecked(opt.m_sub); + connect(subAct, &QAction::triggered, + this, [this](bool p_checked) { + MarkdownitOption opt = g_config->getMarkdownitOption(); + opt.m_sub = p_checked; + g_config->setMarkdownitOption(opt); + }); + optMenu->addAction(htmlAct); optMenu->addAction(breaksAct); optMenu->addAction(linkifyAct); + optMenu->addAction(supAct); + optMenu->addAction(subAct); } void VMainWindow::initRenderBackgroundMenu(QMenu *menu)