markdown-it: add options for subscript and superscript

This commit is contained in:
Le Tan 2018-03-19 20:05:26 +08:00
parent b3f874577c
commit ff4a2d0b91
7 changed files with 165 additions and 75 deletions

View File

@ -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);
/*
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) {

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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_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

View File

@ -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

View File

@ -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)