support Markdown-it option configs

This commit is contained in:
Le Tan 2017-09-14 20:26:40 +08:00
parent 6addbbfedb
commit 5c038e1f76
7 changed files with 194 additions and 51 deletions

View File

@ -35,9 +35,12 @@ var getHeadingLevel = function(h) {
return level; return level;
} }
// There is a VMarkdownitOption struct passed in.
// var VMarkdownitOption = { html, breaks, linkify };
var mdit = window.markdownit({ var mdit = window.markdownit({
html: true, html: VMarkdownitOption.html,
linkify: true, breaks: VMarkdownitOption.breaks,
linkify: VMarkdownitOption.linkify,
typographer: true, typographer: true,
langPrefix: 'lang-', langPrefix: 'lang-',
highlight: function(str, lang) { highlight: function(str, lang) {

View File

@ -99,6 +99,14 @@ enable_code_block_line_number=false
; The icon size of tool bar (in pixels) ; The icon size of tool bar (in pixels)
tool_bar_icon_size=18 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] [session]
tools_dock_checked=true tools_dock_checked=true

View File

@ -504,6 +504,7 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
break; break;
case MarkdownConverterType::MarkdownIt: case MarkdownConverterType::MarkdownIt:
{
jsFile = "qrc" + VNote::c_markdownitJsFile; jsFile = "qrc" + VNote::c_markdownitJsFile;
extraFile = "<script src=\"qrc" + VNote::c_markdownitExtraFile + "\"></script>\n" + extraFile = "<script src=\"qrc" + VNote::c_markdownitExtraFile + "\"></script>\n" +
"<script src=\"qrc" + VNote::c_markdownitAnchorExtraFile + "\"></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_markdownitSubExtraFile + "\"></script>\n" +
"<script src=\"qrc" + VNote::c_markdownitSupExtraFile + "\"></script>\n" + "<script src=\"qrc" + VNote::c_markdownitSupExtraFile + "\"></script>\n" +
"<script src=\"qrc" + VNote::c_markdownitFootnoteExtraFile + "\"></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; break;
}
case MarkdownConverterType::Showdown: case MarkdownConverterType::Showdown:
jsFile = "qrc" + VNote::c_showdownJsFile; jsFile = "qrc" + VNote::c_showdownJsFile;

View File

@ -188,6 +188,15 @@ void VConfigManager::initialize()
m_toolBarIconSize = getConfigFromSettings("global", m_toolBarIconSize = getConfigFromSettings("global",
"tool_bar_icon_size").toInt(); "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() void VConfigManager::readPredefinedColorsFromSettings()

View File

@ -29,6 +29,18 @@ struct VColor
QString rgb; // 'FFFFFF', without '#' 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 class VConfigManager : public QObject
{ {
public: public:
@ -249,6 +261,9 @@ public:
int getToolBarIconSize() const; int getToolBarIconSize() const;
MarkdownitOption getMarkdownitOption() const;
void setMarkdownitOption(const MarkdownitOption &p_opt);
// Return the configured key sequence of @p_operation. // Return the configured key sequence of @p_operation.
// Return empty if there is no corresponding config. // Return empty if there is no corresponding config.
QString getShortcutKeySequence(const QString &p_operation) const; QString getShortcutKeySequence(const QString &p_operation) const;
@ -507,6 +522,15 @@ private:
// Icon size of tool bar in pixels. // Icon size of tool bar in pixels.
int m_toolBarIconSize; 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. // The name of the config file in each directory, obsolete.
// Use c_dirConfigFile instead. // Use c_dirConfigFile instead.
static const QString c_obsoleteDirConfigFile; static const QString c_obsoleteDirConfigFile;
@ -1322,4 +1346,35 @@ inline int VConfigManager::getToolBarIconSize() const
return m_toolBarIconSize; 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 #endif // VCONFIGMANAGER_H

View File

@ -522,58 +522,12 @@ void VMainWindow::initMarkdownMenu()
{ {
QMenu *markdownMenu = menuBar()->addMenu(tr("&Markdown")); QMenu *markdownMenu = menuBar()->addMenu(tr("&Markdown"));
markdownMenu->setToolTipsVisible(true); markdownMenu->setToolTipsVisible(true);
QMenu *converterMenu = markdownMenu->addMenu(tr("&Converter"));
converterMenu->setToolTipsVisible(true);
QActionGroup *converterAct = new QActionGroup(this); initConverterMenu(markdownMenu);
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); initMarkdownitOptionMenu(markdownMenu);
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); markdownMenu->addSeparator();
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);
}
initRenderStyleMenu(markdownMenu); 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) void VMainWindow::initRenderBackgroundMenu(QMenu *menu)
{ {
QActionGroup *renderBackgroundAct = new QActionGroup(this); QActionGroup *renderBackgroundAct = new QActionGroup(this);

View File

@ -154,6 +154,8 @@ private:
void initPredefinedColorPixmaps(); void initPredefinedColorPixmaps();
void initRenderBackgroundMenu(QMenu *menu); void initRenderBackgroundMenu(QMenu *menu);
void initRenderStyleMenu(QMenu *p_menu); void initRenderStyleMenu(QMenu *p_menu);
void initConverterMenu(QMenu *p_menu);
void initMarkdownitOptionMenu(QMenu *p_menu);
void initEditorBackgroundMenu(QMenu *menu); void initEditorBackgroundMenu(QMenu *menu);
// Init the Line Number submenu in Edit menu. // Init the Line Number submenu in Edit menu.