From b7e6301136e5dd371e0995eaebf48da66f835751 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Sun, 25 Feb 2018 14:37:13 +0800 Subject: [PATCH] export: add option EmbedCssStyle for HTML --- src/dialog/vexportdialog.cpp | 37 ++++++++++++++++++++++++++---- src/dialog/vexportdialog.h | 15 +++++++++--- src/resources/export_template.html | 4 ++++ src/resources/markdown_template.js | 10 ++++---- src/vconstants.h | 1 + src/vdocument.cpp | 6 +++-- src/vdocument.h | 5 +++- src/vexporter.cpp | 15 ++++++++++-- src/vexporter.h | 1 + 9 files changed, 75 insertions(+), 19 deletions(-) diff --git a/src/dialog/vexportdialog.cpp b/src/dialog/vexportdialog.cpp index e57c97c8..68f96652 100644 --- a/src/dialog/vexportdialog.cpp +++ b/src/dialog/vexportdialog.cpp @@ -150,9 +150,11 @@ void VExportDialog::setupUI() m_basicBox->setLayout(basicLayout); // Settings box. + m_htmlSettings = setupHTMLAdvancedSettings(); m_pdfSettings = setupPDFAdvancedSettings(); QVBoxLayout *advLayout = new QVBoxLayout(); + advLayout->addWidget(m_htmlSettings); advLayout->addWidget(m_pdfSettings); m_settingBox->setLayout(advLayout); @@ -172,20 +174,20 @@ QWidget *VExportDialog::setupPDFAdvancedSettings() { // Page layout settings. m_layoutLabel = new QLabel(); - m_layoutBtn = new QPushButton(tr("Settings")); + QPushButton *layoutBtn = new QPushButton(tr("Settings")); #ifndef QT_NO_PRINTER - connect(m_layoutBtn, &QPushButton::clicked, + connect(layoutBtn, &QPushButton::clicked, this, &VExportDialog::handleLayoutBtnClicked); #else - m_layoutBtn->hide(); + layoutBtn->hide(); #endif updatePageLayoutLabel(); QHBoxLayout *layoutLayout = new QHBoxLayout(); layoutLayout->addWidget(m_layoutLabel); - layoutLayout->addWidget(m_layoutBtn); + layoutLayout->addWidget(layoutBtn); layoutLayout->addStretch(); QFormLayout *advLayout = new QFormLayout(); @@ -199,6 +201,24 @@ QWidget *VExportDialog::setupPDFAdvancedSettings() return wid; } +QWidget *VExportDialog::setupHTMLAdvancedSettings() +{ + // Embed CSS styles. + m_embedStyleCB = new QCheckBox(tr("Embed CSS styles"), this); + m_embedStyleCB->setToolTip(tr("Embed CSS styles in HTML file")); + m_embedStyleCB->setChecked(true); + + QFormLayout *advLayout = new QFormLayout(); + advLayout->addRow(m_embedStyleCB); + + advLayout->setContentsMargins(0, 0, 0, 0); + + QWidget *wid = new QWidget(); + wid->setLayout(advLayout); + + return wid; +} + void VExportDialog::initUIFields(MarkdownConverterType p_renderer) { // Notes to export. @@ -282,7 +302,8 @@ void VExportDialog::startExport() m_renderBgCB->currentData().toString(), m_renderStyleCB->currentData().toString(), m_renderCodeBlockStyleCB->currentData().toString(), - &m_pageLayout); + &m_pageLayout, + m_embedStyleCB->isChecked()); s_lastExportFormat = opt.m_format; @@ -709,6 +730,7 @@ void VExportDialog::updatePageLayoutLabel() void VExportDialog::handleCurrentFormatChanged(int p_index) { bool pdfEnabled = false; + bool htmlEnabled = false; if (p_index >= 0) { switch (m_formatCB->currentData().toInt()) { @@ -716,10 +738,15 @@ void VExportDialog::handleCurrentFormatChanged(int p_index) pdfEnabled = true; break; + case (int)ExportFormat::HTML: + htmlEnabled = true; + break; + default: break; } } m_pdfSettings->setVisible(pdfEnabled); + m_htmlSettings->setVisible(htmlEnabled); } diff --git a/src/dialog/vexportdialog.h b/src/dialog/vexportdialog.h index 24ec5a33..e37607a3 100644 --- a/src/dialog/vexportdialog.h +++ b/src/dialog/vexportdialog.h @@ -18,6 +18,7 @@ class VDirectory; class VFile; class VCart; class VExporter; +class QCheckBox; enum class ExportSource @@ -45,14 +46,16 @@ struct ExportOption const QString &p_renderBg, const QString &p_renderStyle, const QString &p_renderCodeBlockStyle, - QPageLayout *p_layout) + QPageLayout *p_layout, + bool p_embedCssStyle) : m_source(p_source), m_format(p_format), m_renderer(p_renderer), m_renderBg(p_renderBg), m_renderStyle(p_renderStyle), m_renderCodeBlockStyle(p_renderCodeBlockStyle), - m_layout(p_layout) + m_layout(p_layout), + m_embedCssStyle(p_embedCssStyle) { } @@ -66,6 +69,8 @@ struct ExportOption QString m_renderStyle; QString m_renderCodeBlockStyle; QPageLayout *m_layout; + + bool m_embedCssStyle; }; @@ -96,6 +101,8 @@ private: QWidget *setupPDFAdvancedSettings(); + QWidget *setupHTMLAdvancedSettings(); + void initUIFields(MarkdownConverterType p_renderer); QString getOutputDirectory() const; @@ -165,6 +172,8 @@ private: QWidget *m_pdfSettings; + QWidget *m_htmlSettings; + QPlainTextEdit *m_consoleEdit; QDialogButtonBox *m_btnBox; @@ -175,7 +184,7 @@ private: QLabel *m_layoutLabel; - QPushButton *m_layoutBtn; + QCheckBox *m_embedStyleCB; VNotebook *m_notebook; diff --git a/src/resources/export_template.html b/src/resources/export_template.html index f52d39d3..da2b9751 100644 --- a/src/resources/export_template.html +++ b/src/resources/export_template.html @@ -6,6 +6,10 @@ /* BACKGROUND_PLACE_HOLDER */ + + diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js index dfefc1a9..e0156925 100644 --- a/src/resources/markdown_template.js +++ b/src/resources/markdown_template.js @@ -40,9 +40,8 @@ if (typeof VEnableImageCaption == 'undefined') { VEnableImageCaption = false; } -var headContent = function() { - var styles = ""; return styles; -}; +} var htmlContent = function() { - content.htmlContentCB(headContent(), placeholder.innerHTML); + content.htmlContentCB("", styleContent(), placeholder.innerHTML); }; new QWebChannel(qt.webChannelTransport, diff --git a/src/vconstants.h b/src/vconstants.h index 60aee913..f7ce0d1a 100644 --- a/src/vconstants.h +++ b/src/vconstants.h @@ -38,6 +38,7 @@ namespace HtmlHolder static const QString c_extraHolder = ""; static const QString c_bodyHolder = ""; static const QString c_headHolder = ""; + static const QString c_styleHolder = "/* STYLE_PLACE_HOLDER */"; } // Directory Config file items. diff --git a/src/vdocument.cpp b/src/vdocument.cpp index 3240f146..61890a8e 100644 --- a/src/vdocument.cpp +++ b/src/vdocument.cpp @@ -114,7 +114,9 @@ void VDocument::finishLogics() emit logicsFinished(); } -void VDocument::htmlContentCB(const QString &p_head, const QString &p_body) +void VDocument::htmlContentCB(const QString &p_head, + const QString &p_style, + const QString &p_body) { - emit htmlContentFinished(p_head, p_body); + emit htmlContentFinished(p_head, p_style, p_body); } diff --git a/src/vdocument.h b/src/vdocument.h index fb791ea9..84f5a6ae 100644 --- a/src/vdocument.h +++ b/src/vdocument.h @@ -70,7 +70,9 @@ public slots: // But the page may not finish loading, such as images. void finishLogics(); - void htmlContentCB(const QString &p_head, const QString &p_body); + void htmlContentCB(const QString &p_head, + const QString &p_style, + const QString &p_body); signals: void textChanged(const QString &text); @@ -103,6 +105,7 @@ signals: void requestHtmlContent(); void htmlContentFinished(const QString &p_headContent, + const QString &p_styleContent, const QString &p_bodyContent); private: diff --git a/src/vexporter.cpp b/src/vexporter.cpp index b8e5ec6e..7387ffd7 100644 --- a/src/vexporter.cpp +++ b/src/vexporter.cpp @@ -200,6 +200,7 @@ bool VExporter::exportViaWebView(VFile *p_file, case ExportFormat::HTML: exportRet = exportToHTML(m_webViewer, m_webDocument, + p_opt.m_embedCssStyle, p_outputFile); break; @@ -235,13 +236,16 @@ exit: bool VExporter::exportToHTML(VWebView *p_webViewer, VDocument *p_webDocument, + bool p_embedCssStyle, const QString &p_filePath) { Q_UNUSED(p_webViewer); int htmlExported = 0; connect(p_webDocument, &VDocument::htmlContentFinished, - this, [&, this](const QString &p_headContent, const QString &p_bodyContent) { + this, [&, this](const QString &p_headContent, + const QString &p_styleContent, + const QString &p_bodyContent) { if (p_bodyContent.isEmpty() || this->m_state == ExportState::Cancelled) { htmlExported = -1; return; @@ -257,7 +261,14 @@ bool VExporter::exportToHTML(VWebView *p_webViewer, } QString html(m_exportHtmlTemplate); - html.replace(HtmlHolder::c_headHolder, p_headContent); + if (!p_styleContent.isEmpty() && p_embedCssStyle) { + html.replace(HtmlHolder::c_styleHolder, p_styleContent); + } + + if (!p_headContent.isEmpty()) { + html.replace(HtmlHolder::c_headHolder, p_headContent); + } + html.replace(HtmlHolder::c_bodyHolder, p_bodyContent); file.write(html.toUtf8()); diff --git a/src/vexporter.h b/src/vexporter.h index caca42db..e8439ccf 100644 --- a/src/vexporter.h +++ b/src/vexporter.h @@ -74,6 +74,7 @@ private: bool exportToHTML(VWebView *p_webViewer, VDocument *p_webDocument, + bool p_embedCssStyle, const QString &p_filePath); QPageLayout m_pageLayout;