mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
support Markdown-it option configs
This commit is contained in:
parent
6addbbfedb
commit
5c038e1f76
@ -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) {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user