mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 05:49:53 +08:00
MarkdownViewer: expose more configs
This commit is contained in:
parent
99207f570e
commit
a0481f2e5b
@ -21,6 +21,9 @@ QString WebGlobalOptions::toJavascriptObject() const
|
||||
+ QString("webGraphviz: %1,\n").arg(Utils::boolToString(m_webGraphviz))
|
||||
+ QString("constrainImageWidthEnabled: %1,\n").arg(Utils::boolToString(m_constrainImageWidthEnabled))
|
||||
+ QString("protectFromXss: %1,\n").arg(Utils::boolToString(m_protectFromXss))
|
||||
+ QString("htmlTagEnabled: %1,\n").arg(Utils::boolToString(m_htmlTagEnabled))
|
||||
+ QString("autoBreakEnabled: %1,\n").arg(Utils::boolToString(m_autoBreakEnabled))
|
||||
+ QString("linkifyEnabled: %1,\n").arg(Utils::boolToString(m_linkifyEnabled))
|
||||
+ QString("sectionNumberEnabled: %1\n").arg(Utils::boolToString(m_sectionNumberEnabled))
|
||||
+ QStringLiteral("}");
|
||||
}
|
||||
@ -155,6 +158,9 @@ void HtmlTemplateHelper::updateMarkdownViewerTemplate(const MarkdownEditorConfig
|
||||
opts.m_sectionNumberEnabled = p_config.getSectionNumberEnabled();
|
||||
opts.m_constrainImageWidthEnabled = p_config.getConstrainImageWidthEnabled();
|
||||
opts.m_protectFromXss = p_config.getProtectFromXss();
|
||||
opts.m_htmlTagEnabled = p_config.getHtmlTagEnabled();
|
||||
opts.m_autoBreakEnabled = p_config.getAutoBreakEnabled();
|
||||
opts.m_linkifyEnabled = p_config.getLinkifyEnabled();
|
||||
fillGlobalOptions(s_markdownViewerTemplate.m_template, opts);
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,12 @@ namespace vnotex
|
||||
|
||||
bool m_protectFromXss = false;
|
||||
|
||||
bool m_htmlTagEnabled = true;
|
||||
|
||||
bool m_autoBreakEnabled = false;
|
||||
|
||||
bool m_linkifyEnabled = true;
|
||||
|
||||
QString toJavascriptObject() const;
|
||||
};
|
||||
|
||||
|
@ -39,6 +39,9 @@ void MarkdownEditorConfig::init(const QJsonObject &p_app, const QJsonObject &p_u
|
||||
m_zoomFactorInReadMode = READREAL(QStringLiteral("zoom_factor_in_read_mode"));
|
||||
m_fetchImagesInParseAndPaste = READBOOL(QStringLiteral("fetch_images_in_parse_and_paste"));
|
||||
m_protectFromXss = READBOOL(QStringLiteral("protect_from_xss"));
|
||||
m_htmlTagEnabled = READBOOL(QStringLiteral("html_tag"));
|
||||
m_autoBreakEnabled = READBOOL(QStringLiteral("auto_break"));
|
||||
m_linkifyEnabled = READBOOL(QStringLiteral("linkify"));
|
||||
}
|
||||
|
||||
QJsonObject MarkdownEditorConfig::toJson() const
|
||||
@ -56,6 +59,9 @@ QJsonObject MarkdownEditorConfig::toJson() const
|
||||
obj[QStringLiteral("zoom_factor_in_read_mode")] = m_zoomFactorInReadMode;
|
||||
obj[QStringLiteral("fetch_images_in_parse_and_paste")] = m_fetchImagesInParseAndPaste;
|
||||
obj[QStringLiteral("protect_from_xss")] = m_protectFromXss;
|
||||
obj[QStringLiteral("html_tag")] = m_htmlTagEnabled;
|
||||
obj[QStringLiteral("auto_break")] = m_autoBreakEnabled;
|
||||
obj[QStringLiteral("linkify")] = m_linkifyEnabled;
|
||||
return obj;
|
||||
}
|
||||
|
||||
@ -195,3 +201,33 @@ bool MarkdownEditorConfig::getProtectFromXss() const
|
||||
{
|
||||
return m_protectFromXss;
|
||||
}
|
||||
|
||||
bool MarkdownEditorConfig::getHtmlTagEnabled() const
|
||||
{
|
||||
return m_htmlTagEnabled;
|
||||
}
|
||||
|
||||
void MarkdownEditorConfig::setHtmlTagEnabled(bool p_enabled)
|
||||
{
|
||||
updateConfig(m_htmlTagEnabled, p_enabled, this);
|
||||
}
|
||||
|
||||
bool MarkdownEditorConfig::getAutoBreakEnabled() const
|
||||
{
|
||||
return m_autoBreakEnabled;
|
||||
}
|
||||
|
||||
void MarkdownEditorConfig::setAutoBreakEnabled(bool p_enabled)
|
||||
{
|
||||
updateConfig(m_autoBreakEnabled, p_enabled, this);
|
||||
}
|
||||
|
||||
bool MarkdownEditorConfig::getLinkifyEnabled() const
|
||||
{
|
||||
return m_linkifyEnabled;
|
||||
}
|
||||
|
||||
void MarkdownEditorConfig::setLinkifyEnabled(bool p_enabled)
|
||||
{
|
||||
updateConfig(m_linkifyEnabled, p_enabled, this);
|
||||
}
|
||||
|
@ -62,6 +62,15 @@ namespace vnotex
|
||||
|
||||
bool getProtectFromXss() const;
|
||||
|
||||
bool getHtmlTagEnabled() const;
|
||||
void setHtmlTagEnabled(bool p_enabled);
|
||||
|
||||
bool getAutoBreakEnabled() const;
|
||||
void setAutoBreakEnabled(bool p_enabled);
|
||||
|
||||
bool getLinkifyEnabled() const;
|
||||
void setLinkifyEnabled(bool p_enabled);
|
||||
|
||||
private:
|
||||
QSharedPointer<TextEditorConfig> m_textEditorConfig;
|
||||
|
||||
@ -97,6 +106,15 @@ namespace vnotex
|
||||
|
||||
// Whether protect from Cross-Site Scripting.
|
||||
bool m_protectFromXss = false;
|
||||
|
||||
// Whether allow HTML tag in Markdown source.
|
||||
bool m_htmlTagEnabled = true;
|
||||
|
||||
// Whether auto break a line with `\n`.
|
||||
bool m_autoBreakEnabled = false;
|
||||
|
||||
// Whether convert URL-like text to links.
|
||||
bool m_linkifyEnabled = true;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -237,7 +237,13 @@
|
||||
"//comment" : "Whether fetch images to local in Parse To Markdown And Paste",
|
||||
"fetch_images_in_parse_and_paste" : true,
|
||||
"//comment" : "Whether protect from Cross-Site Scripting attack",
|
||||
"protect_from_xss" : false
|
||||
"protect_from_xss" : false,
|
||||
"//comment" : "Whether allow HTML tags in source",
|
||||
"html_tag" : true,
|
||||
"//comment" : "Whether auto break a line with '\\n'",
|
||||
"auto_break" : false,
|
||||
"//comment" : "Whether convert URL-like text to links",
|
||||
"linkify" : true
|
||||
}
|
||||
},
|
||||
"widget" : {
|
||||
|
@ -94,6 +94,12 @@ class MarkdownIt extends VxWorker {
|
||||
this.name = 'markdownit';
|
||||
|
||||
this.options = p_options;
|
||||
if (!this.options) {
|
||||
this.options = new MarkdownItOptions();
|
||||
this.options.enableHtmlTag = window.vxOptions.htmlTagEnabled;
|
||||
this.options.enableAutoBreaks = window.vxOptions.autoBreakEnabled;
|
||||
this.options.enableLinkify = window.vxOptions.linkifyEnabled;
|
||||
}
|
||||
|
||||
// Languages of code blocks that need to skip highlight.
|
||||
this.langsToSkipHighlight = new Set();
|
||||
@ -332,4 +338,4 @@ class MarkdownIt extends VxWorker {
|
||||
}
|
||||
}
|
||||
|
||||
window.vnotex.registerWorker(new MarkdownIt(new MarkdownItOptions()));
|
||||
window.vnotex.registerWorker(new MarkdownIt(null));
|
||||
|
@ -1,7 +1,9 @@
|
||||
#include "markdowneditorpage.h"
|
||||
|
||||
#include <QFormLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QCheckBox>
|
||||
#include <QGroupBox>
|
||||
|
||||
#include <widgets/widgetsfactory.h>
|
||||
#include <core/editorconfig.h>
|
||||
@ -20,57 +22,13 @@ MarkdownEditorPage::MarkdownEditorPage(QWidget *p_parent)
|
||||
|
||||
void MarkdownEditorPage::setupUI()
|
||||
{
|
||||
auto mainLayout = new QFormLayout(this);
|
||||
auto mainLayout = new QVBoxLayout(this);
|
||||
|
||||
{
|
||||
const QString label(tr("Insert file name as title"));
|
||||
m_insertFileNameAsTitleCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||
m_insertFileNameAsTitleCheckBox->setToolTip(tr("Insert file name as title when creating note"));
|
||||
mainLayout->addRow(m_insertFileNameAsTitleCheckBox);
|
||||
addSearchItem(label, m_insertFileNameAsTitleCheckBox->toolTip(), m_insertFileNameAsTitleCheckBox);
|
||||
connect(m_insertFileNameAsTitleCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
auto readBox = setupReadGroup();
|
||||
mainLayout->addWidget(readBox);
|
||||
|
||||
{
|
||||
const QString label(tr("Section number"));
|
||||
m_sectionNumberCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||
m_sectionNumberCheckBox->setToolTip(tr("Display section number of headings in read mode"));
|
||||
mainLayout->addRow(m_sectionNumberCheckBox);
|
||||
addSearchItem(label, m_sectionNumberCheckBox->toolTip(), m_sectionNumberCheckBox);
|
||||
connect(m_sectionNumberCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Constrain image width"));
|
||||
m_constrainImageWidthCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||
m_constrainImageWidthCheckBox->setToolTip(tr("Constrain image width to the window"));
|
||||
mainLayout->addRow(m_constrainImageWidthCheckBox);
|
||||
addSearchItem(label, m_constrainImageWidthCheckBox->toolTip(), m_constrainImageWidthCheckBox);
|
||||
connect(m_constrainImageWidthCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Constrain in-place preview width"));
|
||||
m_constrainInPlacePreviewWidthCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||
m_constrainInPlacePreviewWidthCheckBox->setToolTip(tr("Constrain in-place preview width to the window"));
|
||||
mainLayout->addRow(m_constrainInPlacePreviewWidthCheckBox);
|
||||
addSearchItem(label, m_constrainInPlacePreviewWidthCheckBox->toolTip(), m_constrainInPlacePreviewWidthCheckBox);
|
||||
connect(m_constrainInPlacePreviewWidthCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Fetch images to local in Parse And Paste"));
|
||||
m_fetchImagesToLocalCheckBox = WidgetsFactory::createCheckBox(label, this);
|
||||
m_fetchImagesToLocalCheckBox->setToolTip(tr("Fetch images to local in Parse To Markdown And Paste"));
|
||||
mainLayout->addRow(m_fetchImagesToLocalCheckBox);
|
||||
addSearchItem(label, m_fetchImagesToLocalCheckBox->toolTip(), m_fetchImagesToLocalCheckBox);
|
||||
connect(m_fetchImagesToLocalCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
auto editBox = setupEditGroup();
|
||||
mainLayout->addWidget(editBox);
|
||||
}
|
||||
|
||||
void MarkdownEditorPage::loadInternal()
|
||||
@ -86,6 +44,12 @@ void MarkdownEditorPage::loadInternal()
|
||||
m_constrainInPlacePreviewWidthCheckBox->setChecked(markdownConfig.getConstrainInPlacePreviewWidthEnabled());
|
||||
|
||||
m_fetchImagesToLocalCheckBox->setChecked(markdownConfig.getFetchImagesInParseAndPaste());
|
||||
|
||||
m_htmlTagCheckBox->setChecked(markdownConfig.getHtmlTagEnabled());
|
||||
|
||||
m_autoBreakCheckBox->setChecked(markdownConfig.getAutoBreakEnabled());
|
||||
|
||||
m_linkifyCheckBox->setChecked(markdownConfig.getLinkifyEnabled());
|
||||
}
|
||||
|
||||
void MarkdownEditorPage::saveInternal()
|
||||
@ -102,6 +66,12 @@ void MarkdownEditorPage::saveInternal()
|
||||
|
||||
markdownConfig.setFetchImagesInParseAndPaste(m_fetchImagesToLocalCheckBox->isChecked());
|
||||
|
||||
markdownConfig.setHtmlTagEnabled(m_htmlTagCheckBox->isChecked());
|
||||
|
||||
markdownConfig.setAutoBreakEnabled(m_autoBreakCheckBox->isChecked());
|
||||
|
||||
markdownConfig.setLinkifyEnabled(m_linkifyCheckBox->isChecked());
|
||||
|
||||
EditorPage::notifyEditorConfigChange();
|
||||
}
|
||||
|
||||
@ -109,3 +79,99 @@ QString MarkdownEditorPage::title() const
|
||||
{
|
||||
return tr("Markdown Editor");
|
||||
}
|
||||
|
||||
QGroupBox *MarkdownEditorPage::setupReadGroup()
|
||||
{
|
||||
auto box = new QGroupBox(tr("Read"), this);
|
||||
auto layout = new QFormLayout(box);
|
||||
|
||||
{
|
||||
const QString label(tr("Section number"));
|
||||
m_sectionNumberCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_sectionNumberCheckBox->setToolTip(tr("Display section number of headings in read mode"));
|
||||
layout->addRow(m_sectionNumberCheckBox);
|
||||
addSearchItem(label, m_sectionNumberCheckBox->toolTip(), m_sectionNumberCheckBox);
|
||||
connect(m_sectionNumberCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Constrain image width"));
|
||||
m_constrainImageWidthCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_constrainImageWidthCheckBox->setToolTip(tr("Constrain image width to the window"));
|
||||
layout->addRow(m_constrainImageWidthCheckBox);
|
||||
addSearchItem(label, m_constrainImageWidthCheckBox->toolTip(), m_constrainImageWidthCheckBox);
|
||||
connect(m_constrainImageWidthCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("HTML tag"));
|
||||
m_htmlTagCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_htmlTagCheckBox->setToolTip(tr("Allow HTML tags in source"));
|
||||
layout->addRow(m_htmlTagCheckBox);
|
||||
addSearchItem(label, m_htmlTagCheckBox->toolTip(), m_htmlTagCheckBox);
|
||||
connect(m_htmlTagCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Auto break"));
|
||||
m_autoBreakCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_autoBreakCheckBox->setToolTip(tr("Automatically break a line with '\\n'"));
|
||||
layout->addRow(m_autoBreakCheckBox);
|
||||
addSearchItem(label, m_autoBreakCheckBox->toolTip(), m_autoBreakCheckBox);
|
||||
connect(m_autoBreakCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Linkify"));
|
||||
m_linkifyCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_linkifyCheckBox->setToolTip(tr("Convert URL-like text to links"));
|
||||
layout->addRow(m_linkifyCheckBox);
|
||||
addSearchItem(label, m_linkifyCheckBox->toolTip(), m_linkifyCheckBox);
|
||||
connect(m_linkifyCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
QGroupBox *MarkdownEditorPage::setupEditGroup()
|
||||
{
|
||||
auto box = new QGroupBox(tr("Edit"), this);
|
||||
auto layout = new QFormLayout(box);
|
||||
|
||||
{
|
||||
const QString label(tr("Insert file name as title"));
|
||||
m_insertFileNameAsTitleCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_insertFileNameAsTitleCheckBox->setToolTip(tr("Insert file name as title when creating note"));
|
||||
layout->addRow(m_insertFileNameAsTitleCheckBox);
|
||||
addSearchItem(label, m_insertFileNameAsTitleCheckBox->toolTip(), m_insertFileNameAsTitleCheckBox);
|
||||
connect(m_insertFileNameAsTitleCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Constrain in-place preview width"));
|
||||
m_constrainInPlacePreviewWidthCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_constrainInPlacePreviewWidthCheckBox->setToolTip(tr("Constrain in-place preview width to the window"));
|
||||
layout->addRow(m_constrainInPlacePreviewWidthCheckBox);
|
||||
addSearchItem(label, m_constrainInPlacePreviewWidthCheckBox->toolTip(), m_constrainInPlacePreviewWidthCheckBox);
|
||||
connect(m_constrainInPlacePreviewWidthCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
{
|
||||
const QString label(tr("Fetch images to local in Parse And Paste"));
|
||||
m_fetchImagesToLocalCheckBox = WidgetsFactory::createCheckBox(label, box);
|
||||
m_fetchImagesToLocalCheckBox->setToolTip(tr("Fetch images to local in Parse To Markdown And Paste"));
|
||||
layout->addRow(m_fetchImagesToLocalCheckBox);
|
||||
addSearchItem(label, m_fetchImagesToLocalCheckBox->toolTip(), m_fetchImagesToLocalCheckBox);
|
||||
connect(m_fetchImagesToLocalCheckBox, &QCheckBox::stateChanged,
|
||||
this, &MarkdownEditorPage::pageIsChanged);
|
||||
}
|
||||
|
||||
return box;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "settingspage.h"
|
||||
|
||||
class QCheckBox;
|
||||
class QGroupBox;
|
||||
|
||||
namespace vnotex
|
||||
{
|
||||
@ -23,6 +24,10 @@ namespace vnotex
|
||||
private:
|
||||
void setupUI();
|
||||
|
||||
QGroupBox *setupReadGroup();
|
||||
|
||||
QGroupBox *setupEditGroup();
|
||||
|
||||
QCheckBox *m_insertFileNameAsTitleCheckBox = nullptr;
|
||||
|
||||
QCheckBox *m_sectionNumberCheckBox = nullptr;
|
||||
@ -32,6 +37,12 @@ namespace vnotex
|
||||
QCheckBox *m_constrainInPlacePreviewWidthCheckBox = nullptr;
|
||||
|
||||
QCheckBox *m_fetchImagesToLocalCheckBox = nullptr;
|
||||
|
||||
QCheckBox *m_htmlTagCheckBox = nullptr;
|
||||
|
||||
QCheckBox *m_autoBreakCheckBox = nullptr;
|
||||
|
||||
QCheckBox *m_linkifyCheckBox = nullptr;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,7 @@ void SettingsDialog::setupPageExplorer(QBoxLayout *p_layout, QWidget *p_parent)
|
||||
auto layout = new QVBoxLayout();
|
||||
|
||||
m_searchEdit = WidgetsFactory::createLineEdit(p_parent);
|
||||
m_searchEdit->setPlaceholderText(tr("Type to search"));
|
||||
m_searchEdit->setPlaceholderText(tr("Search"));
|
||||
layout->addWidget(m_searchEdit);
|
||||
|
||||
m_pageExplorer = new TreeWidget(TreeWidget::None, p_parent);
|
||||
|
@ -73,7 +73,7 @@ void FindAndReplaceWidget::setupUI()
|
||||
auto label = new QLabel(tr("Find:"), this);
|
||||
|
||||
m_findLineEdit = WidgetsFactory::createLineEdit(this);
|
||||
m_findLineEdit->setPlaceholderText(tr("Type to search"));
|
||||
m_findLineEdit->setPlaceholderText(tr("Search"));
|
||||
connect(m_findLineEdit, &QLineEdit::textChanged,
|
||||
m_findTextTimer, QOverload<>::of(&QTimer::start));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user