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)