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.