Browse Source

markdown-it: add options for subscript and superscript

Le Tan 7 years ago
parent
commit
ff4a2d0b91
7 changed files with 165 additions and 75 deletions
  1. 10 5
      src/resources/markdown-it.js
  2. 8 8
      src/resources/vnote.ini
  3. 20 9
      src/utils/vutils.cpp
  4. 2 8
      src/vconfigmanager.cpp
  5. 9 44
      src/vconfigmanager.h
  6. 91 0
      src/vconstants.h
  7. 25 1
      src/vmainwindow.cpp

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

+ 8 - 8
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 <br/>
-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 <br/>
+; 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
 

+ 20 - 9
src/utils/vutils.cpp

@@ -644,19 +644,30 @@ QString VUtils::generateHtmlTemplate(const QString &p_template,
         extraFile = "<script src=\"qrc" + VNote::c_markdownitExtraFile + "\"></script>\n" +
                     "<script src=\"qrc" + VNote::c_markdownitAnchorExtraFile + "\"></script>\n" +
                     "<script src=\"qrc" + VNote::c_markdownitTaskListExtraFile + "\"></script>\n" +
-                    /*
-                    "<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();
+        const MarkdownitOption &opt = g_config->getMarkdownitOption();
+
+        if (opt.m_sup) {
+            extraFile += "<script src=\"qrc" + VNote::c_markdownitSupExtraFile + "\"></script>\n";
+        }
+
+        if (opt.m_sub) {
+            extraFile += "<script src=\"qrc" + VNote::c_markdownitSubExtraFile + "\"></script>\n";
+        }
+
         QString optJs = QString("<script>var VMarkdownitOption = {"
-                                "html: %1, breaks: %2, linkify: %3};"
+                                "html: %1,\n"
+                                "breaks: %2,\n"
+                                "linkify: %3,\n"
+                                "sub: %4,\n"
+                                "sup: %5 };\n"
                                 "</script>\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;
     }

+ 2 - 8
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();

+ 9 - 44
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 <br>.
-    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_markdownitOptBreaks != p_opt.m_breaks) {
-        m_markdownitOptBreaks = p_opt.m_breaks;
-        setConfigToSettings("global",
-                            "markdownit_opt_breaks",
-                            m_markdownitOptBreaks);
+    if (m_markdownItOpt == p_opt) {
+        return;
     }
 
-    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

+ 91 - 0
src/vconstants.h

@@ -2,6 +2,7 @@
 #define VCONSTANTS_H
 
 #include <QString>
+#include <QStringList>
 
 // 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 <br>.
+    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

+ 25 - 1
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)