MarkdownViewer: expose more configs

This commit is contained in:
Le Tan 2020-12-22 20:07:16 +08:00
parent 99207f570e
commit a0481f2e5b
10 changed files with 208 additions and 53 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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" : {

View File

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

View File

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

View File

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

View File

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

View File

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