Browse Source

support Markdown-it option configs

Le Tan 8 years ago
parent
commit
5c038e1f76
7 changed files with 194 additions and 51 deletions
  1. 5 2
      src/resources/markdown-it.js
  2. 8 0
      src/resources/vnote.ini
  3. 11 0
      src/utils/vutils.cpp
  4. 9 0
      src/vconfigmanager.cpp
  5. 55 0
      src/vconfigmanager.h
  6. 104 49
      src/vmainwindow.cpp
  7. 2 0
      src/vmainwindow.h

+ 5 - 2
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) {

+ 8 - 0
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 <br>
+markdownit_opt_breaks=false
+; Auto-convert URL-like text to links
+markdownit_opt_linkify=true
+
 [session]
 tools_dock_checked=true
 

+ 11 - 0
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 = "<script src=\"qrc" + VNote::c_markdownitExtraFile + "\"></script>\n" +
                     "<script src=\"qrc" + VNote::c_markdownitAnchorExtraFile + "\"></script>\n" +
@@ -511,7 +512,17 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
                     "<script src=\"qrc" + VNote::c_markdownitSubExtraFile + "\"></script>\n" +
                     "<script src=\"qrc" + VNote::c_markdownitSupExtraFile + "\"></script>\n" +
                     "<script src=\"qrc" + VNote::c_markdownitFootnoteExtraFile + "\"></script>\n";
+
+        MarkdownitOption opt = g_config->getMarkdownitOption();
+        QString optJs = QString("<script>var VMarkdownitOption = {"
+                                "html: %1, breaks: %2, linkify: %3};"
+                                "</script>\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;

+ 9 - 0
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()

+ 55 - 0
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 <br>.
+    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

+ 104 - 49
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));
-
-    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));
+    initMarkdownitOptionMenu(markdownMenu);
 
-    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);

+ 2 - 0
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.