diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js
index 6567fe28..aac79d6a 100644
--- a/src/resources/markdown-it.js
+++ b/src/resources/markdown-it.js
@@ -35,9 +35,12 @@ var getHeadingLevel = function(h) {
return level;
}
+// There is a VMarkdownitOption struct passed in.
+// var VMarkdownitOption = { html, breaks, linkify };
var mdit = window.markdownit({
- html: true,
- linkify: true,
+ html: VMarkdownitOption.html,
+ breaks: VMarkdownitOption.breaks,
+ linkify: VMarkdownitOption.linkify,
typographer: true,
langPrefix: 'lang-',
highlight: function(str, lang) {
diff --git a/src/resources/vnote.ini b/src/resources/vnote.ini
index 5b621825..329f24dd 100644
--- a/src/resources/vnote.ini
+++ b/src/resources/vnote.ini
@@ -99,6 +99,14 @@ 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
+
[session]
tools_dock_checked=true
diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp
index 9a66e391..c7485d56 100644
--- a/src/utils/vutils.cpp
+++ b/src/utils/vutils.cpp
@@ -504,6 +504,7 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
break;
case MarkdownConverterType::MarkdownIt:
+ {
jsFile = "qrc" + VNote::c_markdownitJsFile;
extraFile = "\n" +
"\n" +
@@ -511,7 +512,17 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
"\n" +
"\n" +
"\n";
+
+ MarkdownitOption opt = g_config->getMarkdownitOption();
+ QString optJs = QString("\n")
+ .arg(opt.m_html ? "true" : "false")
+ .arg(opt.m_breaks ? "true" : "false")
+ .arg(opt.m_linkify ? "true" : "false");
+ extraFile += optJs;
break;
+ }
case MarkdownConverterType::Showdown:
jsFile = "qrc" + VNote::c_showdownJsFile;
diff --git a/src/vconfigmanager.cpp b/src/vconfigmanager.cpp
index a16be28a..0b67331b 100644
--- a/src/vconfigmanager.cpp
+++ b/src/vconfigmanager.cpp
@@ -188,6 +188,15 @@ 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();
}
void VConfigManager::readPredefinedColorsFromSettings()
diff --git a/src/vconfigmanager.h b/src/vconfigmanager.h
index bd384695..78921ea3 100644
--- a/src/vconfigmanager.h
+++ b/src/vconfigmanager.h
@@ -29,6 +29,18 @@ struct VColor
QString rgb; // 'FFFFFF', without '#'
};
+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;
+};
+
class VConfigManager : public QObject
{
public:
@@ -249,6 +261,9 @@ public:
int getToolBarIconSize() const;
+ MarkdownitOption getMarkdownitOption() const;
+ void setMarkdownitOption(const MarkdownitOption &p_opt);
+
// Return the configured key sequence of @p_operation.
// Return empty if there is no corresponding config.
QString getShortcutKeySequence(const QString &p_operation) const;
@@ -507,6 +522,15 @@ 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;
+
// The name of the config file in each directory, obsolete.
// Use c_dirConfigFile instead.
static const QString c_obsoleteDirConfigFile;
@@ -1322,4 +1346,35 @@ inline int VConfigManager::getToolBarIconSize() const
return m_toolBarIconSize;
}
+inline MarkdownitOption VConfigManager::getMarkdownitOption() const
+{
+ return MarkdownitOption(m_markdownitOptHtml,
+ m_markdownitOptBreaks,
+ m_markdownitOptLinkify);
+}
+
+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_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);
+ }
+}
+
#endif // VCONFIGMANAGER_H
diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp
index 06ddef0f..a1967aae 100644
--- a/src/vmainwindow.cpp
+++ b/src/vmainwindow.cpp
@@ -522,58 +522,12 @@ void VMainWindow::initMarkdownMenu()
{
QMenu *markdownMenu = menuBar()->addMenu(tr("&Markdown"));
markdownMenu->setToolTipsVisible(true);
- QMenu *converterMenu = markdownMenu->addMenu(tr("&Converter"));
- converterMenu->setToolTipsVisible(true);
- QActionGroup *converterAct = new QActionGroup(this);
- QAction *markedAct = new QAction(tr("Marked"), converterAct);
- markedAct->setToolTip(tr("Use Marked to convert Markdown to HTML (re-open current tabs to make it work)"));
- markedAct->setCheckable(true);
- markedAct->setData(int(MarkdownConverterType::Marked));
+ initConverterMenu(markdownMenu);
- QAction *hoedownAct = new QAction(tr("Hoedown"), converterAct);
- hoedownAct->setToolTip(tr("Use Hoedown to convert Markdown to HTML (re-open current tabs to make it work)"));
- hoedownAct->setCheckable(true);
- hoedownAct->setData(int(MarkdownConverterType::Hoedown));
+ initMarkdownitOptionMenu(markdownMenu);
- QAction *markdownitAct = new QAction(tr("Markdown-it"), converterAct);
- markdownitAct->setToolTip(tr("Use Markdown-it to convert Markdown to HTML (re-open current tabs to make it work)"));
- markdownitAct->setCheckable(true);
- markdownitAct->setData(int(MarkdownConverterType::MarkdownIt));
-
- QAction *showdownAct = new QAction(tr("Showdown"), converterAct);
- showdownAct->setToolTip(tr("Use Showdown to convert Markdown to HTML (re-open current tabs to make it work)"));
- showdownAct->setCheckable(true);
- showdownAct->setData(int(MarkdownConverterType::Showdown));
-
- connect(converterAct, &QActionGroup::triggered,
- this, &VMainWindow::changeMarkdownConverter);
- converterMenu->addAction(hoedownAct);
- converterMenu->addAction(markedAct);
- converterMenu->addAction(markdownitAct);
- converterMenu->addAction(showdownAct);
-
- MarkdownConverterType converterType = g_config->getMdConverterType();
- switch (converterType) {
- case MarkdownConverterType::Marked:
- markedAct->setChecked(true);
- break;
-
- case MarkdownConverterType::Hoedown:
- hoedownAct->setChecked(true);
- break;
-
- case MarkdownConverterType::MarkdownIt:
- markdownitAct->setChecked(true);
- break;
-
- case MarkdownConverterType::Showdown:
- showdownAct->setChecked(true);
- break;
-
- default:
- Q_ASSERT(false);
- }
+ markdownMenu->addSeparator();
initRenderStyleMenu(markdownMenu);
@@ -1169,6 +1123,107 @@ void VMainWindow::initPredefinedColorPixmaps()
}
}
+void VMainWindow::initConverterMenu(QMenu *p_menu)
+{
+ QMenu *converterMenu = p_menu->addMenu(tr("&Converter"));
+ converterMenu->setToolTipsVisible(true);
+
+ QActionGroup *converterAct = new QActionGroup(this);
+ QAction *markedAct = new QAction(tr("Marked"), converterAct);
+ markedAct->setToolTip(tr("Use Marked to convert Markdown to HTML (re-open current tabs to make it work)"));
+ markedAct->setCheckable(true);
+ markedAct->setData(int(MarkdownConverterType::Marked));
+
+ QAction *hoedownAct = new QAction(tr("Hoedown"), converterAct);
+ hoedownAct->setToolTip(tr("Use Hoedown to convert Markdown to HTML (re-open current tabs to make it work)"));
+ hoedownAct->setCheckable(true);
+ hoedownAct->setData(int(MarkdownConverterType::Hoedown));
+
+ QAction *markdownitAct = new QAction(tr("Markdown-it"), converterAct);
+ markdownitAct->setToolTip(tr("Use Markdown-it to convert Markdown to HTML (re-open current tabs to make it work)"));
+ markdownitAct->setCheckable(true);
+ markdownitAct->setData(int(MarkdownConverterType::MarkdownIt));
+
+ QAction *showdownAct = new QAction(tr("Showdown"), converterAct);
+ showdownAct->setToolTip(tr("Use Showdown to convert Markdown to HTML (re-open current tabs to make it work)"));
+ showdownAct->setCheckable(true);
+ showdownAct->setData(int(MarkdownConverterType::Showdown));
+
+ connect(converterAct, &QActionGroup::triggered,
+ this, &VMainWindow::changeMarkdownConverter);
+ converterMenu->addAction(hoedownAct);
+ converterMenu->addAction(markedAct);
+ converterMenu->addAction(markdownitAct);
+ converterMenu->addAction(showdownAct);
+
+ MarkdownConverterType converterType = g_config->getMdConverterType();
+ switch (converterType) {
+ case MarkdownConverterType::Marked:
+ markedAct->setChecked(true);
+ break;
+
+ case MarkdownConverterType::Hoedown:
+ hoedownAct->setChecked(true);
+ break;
+
+ case MarkdownConverterType::MarkdownIt:
+ markdownitAct->setChecked(true);
+ break;
+
+ case MarkdownConverterType::Showdown:
+ showdownAct->setChecked(true);
+ break;
+
+ default:
+ Q_ASSERT(false);
+ }
+}
+
+void VMainWindow::initMarkdownitOptionMenu(QMenu *p_menu)
+{
+ QMenu *optMenu = p_menu->addMenu(tr("Markdown-it Options"));
+ optMenu->setToolTipsVisible(true);
+
+ MarkdownitOption opt = g_config->getMarkdownitOption();
+
+ QAction *htmlAct = new QAction(tr("HTML"), this);
+ htmlAct->setToolTip(tr("Enable HTML tags in source"));
+ htmlAct->setCheckable(true);
+ htmlAct->setChecked(opt.m_html);
+ connect(htmlAct, &QAction::triggered,
+ this, [this](bool p_checked) {
+ MarkdownitOption opt = g_config->getMarkdownitOption();
+ opt.m_html = p_checked;
+ g_config->setMarkdownitOption(opt);
+ });
+
+ QAction *breaksAct = new QAction(tr("Line Break"), this);
+ breaksAct->setToolTip(tr("Convert '\\n' in paragraphs into line break"));
+ breaksAct->setCheckable(true);
+ breaksAct->setChecked(opt.m_breaks);
+ connect(breaksAct, &QAction::triggered,
+ this, [this](bool p_checked) {
+ MarkdownitOption opt = g_config->getMarkdownitOption();
+ opt.m_breaks = p_checked;
+ g_config->setMarkdownitOption(opt);
+ });
+
+ QAction *linkifyAct = new QAction(tr("Linkify"), this);
+ linkifyAct->setToolTip(tr("Convert URL-like text into links"));
+ linkifyAct->setCheckable(true);
+ linkifyAct->setChecked(opt.m_linkify);
+ connect(linkifyAct, &QAction::triggered,
+ this, [this](bool p_checked) {
+ MarkdownitOption opt = g_config->getMarkdownitOption();
+ opt.m_linkify = p_checked;
+ g_config->setMarkdownitOption(opt);
+ });
+
+ optMenu->addAction(htmlAct);
+ optMenu->addAction(breaksAct);
+ optMenu->addAction(linkifyAct);
+}
+
void VMainWindow::initRenderBackgroundMenu(QMenu *menu)
{
QActionGroup *renderBackgroundAct = new QActionGroup(this);
diff --git a/src/vmainwindow.h b/src/vmainwindow.h
index 0230dd68..f940b1b6 100644
--- a/src/vmainwindow.h
+++ b/src/vmainwindow.h
@@ -154,6 +154,8 @@ private:
void initPredefinedColorPixmaps();
void initRenderBackgroundMenu(QMenu *menu);
void initRenderStyleMenu(QMenu *p_menu);
+ void initConverterMenu(QMenu *p_menu);
+ void initMarkdownitOptionMenu(QMenu *p_menu);
void initEditorBackgroundMenu(QMenu *menu);
// Init the Line Number submenu in Edit menu.