mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
export: support custom background, style
This commit is contained in:
parent
ad81e655a5
commit
60635fe5e7
@ -25,6 +25,8 @@ extern VNote *g_vnote;
|
|||||||
|
|
||||||
QString VExportDialog::s_lastOutputFolder;
|
QString VExportDialog::s_lastOutputFolder;
|
||||||
|
|
||||||
|
ExportFormat VExportDialog::s_lastExportFormat = ExportFormat::Markdown;
|
||||||
|
|
||||||
#define LOGERR(x) do { QString msg = (x); \
|
#define LOGERR(x) do { QString msg = (x); \
|
||||||
VUtils::addErrMsg(p_errMsg, msg); \
|
VUtils::addErrMsg(p_errMsg, msg); \
|
||||||
appendLogLine(msg); \
|
appendLogLine(msg); \
|
||||||
@ -79,6 +81,18 @@ void VExportDialog::setupUI()
|
|||||||
m_rendererCB->setToolTip(tr("Choose converter to render Markdown"));
|
m_rendererCB->setToolTip(tr("Choose converter to render Markdown"));
|
||||||
m_rendererCB->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
m_rendererCB->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||||
|
|
||||||
|
// Markdown rendering background.
|
||||||
|
m_renderBgCB = VUtils::getComboBox();
|
||||||
|
m_renderBgCB->setToolTip(tr("Choose rendering background color for Markdown"));
|
||||||
|
|
||||||
|
// Markdown rendering style.
|
||||||
|
m_renderStyleCB = VUtils::getComboBox();
|
||||||
|
m_renderStyleCB->setToolTip(tr("Choose rendering style for Markdown"));
|
||||||
|
|
||||||
|
// Markdown rendering code block style.
|
||||||
|
m_renderCodeBlockStyleCB = VUtils::getComboBox();
|
||||||
|
m_renderCodeBlockStyleCB->setToolTip(tr("Choose rendering code block style for Markdown"));
|
||||||
|
|
||||||
// Output directory.
|
// Output directory.
|
||||||
m_outputEdit = new VLineEdit(s_lastOutputFolder);
|
m_outputEdit = new VLineEdit(s_lastOutputFolder);
|
||||||
connect(m_outputEdit, &QLineEdit::textChanged,
|
connect(m_outputEdit, &QLineEdit::textChanged,
|
||||||
@ -128,6 +142,9 @@ void VExportDialog::setupUI()
|
|||||||
basicLayout->addRow(tr("Notes to export:"), m_srcCB);
|
basicLayout->addRow(tr("Notes to export:"), m_srcCB);
|
||||||
basicLayout->addRow(tr("Target format:"), m_formatCB);
|
basicLayout->addRow(tr("Target format:"), m_formatCB);
|
||||||
basicLayout->addRow(tr("Markdown renderer:"), m_rendererCB);
|
basicLayout->addRow(tr("Markdown renderer:"), m_rendererCB);
|
||||||
|
basicLayout->addRow(tr("Markdown rendering background:"), m_renderBgCB);
|
||||||
|
basicLayout->addRow(tr("Markdown rendering style:"), m_renderStyleCB);
|
||||||
|
basicLayout->addRow(tr("Markdown rendering code block style:"), m_renderCodeBlockStyleCB);
|
||||||
basicLayout->addRow(tr("Output directory:"), outputLayout);
|
basicLayout->addRow(tr("Output directory:"), outputLayout);
|
||||||
|
|
||||||
m_basicBox->setLayout(basicLayout);
|
m_basicBox->setLayout(basicLayout);
|
||||||
@ -209,6 +226,7 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer)
|
|||||||
m_formatCB->addItem(tr("Markdown"), (int)ExportFormat::Markdown);
|
m_formatCB->addItem(tr("Markdown"), (int)ExportFormat::Markdown);
|
||||||
m_formatCB->addItem(tr("HTML"), (int)ExportFormat::HTML);
|
m_formatCB->addItem(tr("HTML"), (int)ExportFormat::HTML);
|
||||||
m_formatCB->addItem(tr("PDF"), (int)ExportFormat::PDF);
|
m_formatCB->addItem(tr("PDF"), (int)ExportFormat::PDF);
|
||||||
|
m_formatCB->setCurrentIndex(m_formatCB->findData((int)s_lastExportFormat));
|
||||||
|
|
||||||
// Markdown renderer.
|
// Markdown renderer.
|
||||||
m_rendererCB->addItem(tr("Hoedown"), MarkdownConverterType::Hoedown);
|
m_rendererCB->addItem(tr("Hoedown"), MarkdownConverterType::Hoedown);
|
||||||
@ -216,6 +234,34 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer)
|
|||||||
m_rendererCB->addItem(tr("Markdown-it"), MarkdownConverterType::MarkdownIt);
|
m_rendererCB->addItem(tr("Markdown-it"), MarkdownConverterType::MarkdownIt);
|
||||||
m_rendererCB->addItem(tr("Showdown"), MarkdownConverterType::Showdown);
|
m_rendererCB->addItem(tr("Showdown"), MarkdownConverterType::Showdown);
|
||||||
m_rendererCB->setCurrentIndex(m_rendererCB->findData(p_renderer));
|
m_rendererCB->setCurrentIndex(m_rendererCB->findData(p_renderer));
|
||||||
|
|
||||||
|
// Markdown rendering background.
|
||||||
|
m_renderBgCB->addItem(tr("System"), "System");
|
||||||
|
const QVector<VColor> &bgColors = g_config->getCustomColors();
|
||||||
|
for (int i = 0; i < bgColors.size(); ++i) {
|
||||||
|
m_renderBgCB->addItem(bgColors[i].m_name, bgColors[i].m_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_renderBgCB->setCurrentIndex(
|
||||||
|
m_renderBgCB->findData(g_config->getCurRenderBackgroundColor()));
|
||||||
|
|
||||||
|
// Markdown rendering style.
|
||||||
|
QList<QString> styles = g_config->getCssStyles();
|
||||||
|
for (auto const &style : styles) {
|
||||||
|
m_renderStyleCB->addItem(style, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_renderStyleCB->setCurrentIndex(
|
||||||
|
m_renderStyleCB->findData(g_config->getCssStyle()));
|
||||||
|
|
||||||
|
// Markdown rendering code block style.
|
||||||
|
QList<QString> cbStyles = g_config->getCodeBlockCssStyles();
|
||||||
|
for (auto const &style : cbStyles) {
|
||||||
|
m_renderCodeBlockStyleCB->addItem(style, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_renderCodeBlockStyleCB->setCurrentIndex(
|
||||||
|
m_renderCodeBlockStyleCB->findData(g_config->getCodeBlockCssStyle()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VExportDialog::startExport()
|
void VExportDialog::startExport()
|
||||||
@ -233,8 +279,13 @@ void VExportDialog::startExport()
|
|||||||
ExportOption opt((ExportSource)m_srcCB->currentData().toInt(),
|
ExportOption opt((ExportSource)m_srcCB->currentData().toInt(),
|
||||||
(ExportFormat)m_formatCB->currentData().toInt(),
|
(ExportFormat)m_formatCB->currentData().toInt(),
|
||||||
(MarkdownConverterType)m_rendererCB->currentData().toInt(),
|
(MarkdownConverterType)m_rendererCB->currentData().toInt(),
|
||||||
|
m_renderBgCB->currentData().toString(),
|
||||||
|
m_renderStyleCB->currentData().toString(),
|
||||||
|
m_renderCodeBlockStyleCB->currentData().toString(),
|
||||||
&m_pageLayout);
|
&m_pageLayout);
|
||||||
|
|
||||||
|
s_lastExportFormat = opt.m_format;
|
||||||
|
|
||||||
m_consoleEdit->clear();
|
m_consoleEdit->clear();
|
||||||
appendLogLine(tr("Export to %1.").arg(outputFolder));
|
appendLogLine(tr("Export to %1.").arg(outputFolder));
|
||||||
|
|
||||||
|
@ -42,10 +42,16 @@ struct ExportOption
|
|||||||
ExportOption(ExportSource p_source,
|
ExportOption(ExportSource p_source,
|
||||||
ExportFormat p_format,
|
ExportFormat p_format,
|
||||||
MarkdownConverterType p_renderer,
|
MarkdownConverterType p_renderer,
|
||||||
|
const QString &p_renderBg,
|
||||||
|
const QString &p_renderStyle,
|
||||||
|
const QString &p_renderCodeBlockStyle,
|
||||||
QPageLayout *p_layout)
|
QPageLayout *p_layout)
|
||||||
: m_source(p_source),
|
: m_source(p_source),
|
||||||
m_format(p_format),
|
m_format(p_format),
|
||||||
m_renderer(p_renderer),
|
m_renderer(p_renderer),
|
||||||
|
m_renderBg(p_renderBg),
|
||||||
|
m_renderStyle(p_renderStyle),
|
||||||
|
m_renderCodeBlockStyle(p_renderCodeBlockStyle),
|
||||||
m_layout(p_layout)
|
m_layout(p_layout)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -53,6 +59,12 @@ struct ExportOption
|
|||||||
ExportSource m_source;
|
ExportSource m_source;
|
||||||
ExportFormat m_format;
|
ExportFormat m_format;
|
||||||
MarkdownConverterType m_renderer;
|
MarkdownConverterType m_renderer;
|
||||||
|
|
||||||
|
// Background name.
|
||||||
|
QString m_renderBg;
|
||||||
|
|
||||||
|
QString m_renderStyle;
|
||||||
|
QString m_renderCodeBlockStyle;
|
||||||
QPageLayout *m_layout;
|
QPageLayout *m_layout;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -132,6 +144,12 @@ private:
|
|||||||
|
|
||||||
QComboBox *m_rendererCB;
|
QComboBox *m_rendererCB;
|
||||||
|
|
||||||
|
QComboBox *m_renderBgCB;
|
||||||
|
|
||||||
|
QComboBox *m_renderStyleCB;
|
||||||
|
|
||||||
|
QComboBox *m_renderCodeBlockStyleCB;
|
||||||
|
|
||||||
VLineEdit *m_outputEdit;
|
VLineEdit *m_outputEdit;
|
||||||
|
|
||||||
QPushButton *m_browseBtn;
|
QPushButton *m_browseBtn;
|
||||||
@ -175,6 +193,9 @@ private:
|
|||||||
|
|
||||||
// Last output folder path.
|
// Last output folder path.
|
||||||
static QString s_lastOutputFolder;
|
static QString s_lastOutputFolder;
|
||||||
|
|
||||||
|
// Last export format.
|
||||||
|
static ExportFormat s_lastExportFormat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VEXPORTDIALOG_H
|
#endif // VEXPORTDIALOG_H
|
||||||
|
@ -150,7 +150,7 @@ ToolsDock=T
|
|||||||
; Close current note
|
; Close current note
|
||||||
CloseNote=X
|
CloseNote=X
|
||||||
; Show shortcuts help document
|
; Show shortcuts help document
|
||||||
ShortcutsHelp=?
|
ShortcutsHelp=Shift+?
|
||||||
; Flush the log file
|
; Flush the log file
|
||||||
FlushLogFile=";"
|
FlushLogFile=";"
|
||||||
; Show opened files list
|
; Show opened files list
|
||||||
@ -234,7 +234,9 @@ Move current tab one split window right.
|
|||||||
Evaluate current cursor word or selected text as magic words.
|
Evaluate current cursor word or selected text as magic words.
|
||||||
- `S`
|
- `S`
|
||||||
Apply a snippet in edit mode.
|
Apply a snippet in edit mode.
|
||||||
- `?`
|
- `O`
|
||||||
|
Export notes.
|
||||||
|
- `Shift+?`
|
||||||
Display shortcuts documentation.
|
Display shortcuts documentation.
|
||||||
|
|
||||||
## Navigation Mode
|
## Navigation Mode
|
||||||
|
@ -151,7 +151,7 @@ ToolsDock=T
|
|||||||
; Close current note
|
; Close current note
|
||||||
CloseNote=X
|
CloseNote=X
|
||||||
; Show shortcuts help document
|
; Show shortcuts help document
|
||||||
ShortcutsHelp=?
|
ShortcutsHelp=Shift+?
|
||||||
; Flush the log file
|
; Flush the log file
|
||||||
FlushLogFile=";"
|
FlushLogFile=";"
|
||||||
; Show opened files list
|
; Show opened files list
|
||||||
@ -235,7 +235,9 @@ RemoveSplit=R
|
|||||||
编辑模式中,将当前光标所在词或者所选文本进行幻词解析。
|
编辑模式中,将当前光标所在词或者所选文本进行幻词解析。
|
||||||
- `S`
|
- `S`
|
||||||
在编辑模式中应用片段。
|
在编辑模式中应用片段。
|
||||||
- `?`
|
- `O`
|
||||||
|
导出笔记。
|
||||||
|
- `Shift+?`
|
||||||
显示本快捷键说明。
|
显示本快捷键说明。
|
||||||
|
|
||||||
## 展览模式
|
## 展览模式
|
||||||
|
@ -88,6 +88,7 @@ code {
|
|||||||
font-family: Consolas, Monaco, Monospace, Courier;
|
font-family: Consolas, Monaco, Monospace, Courier;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: #98C379;
|
color: #98C379;
|
||||||
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre code {
|
pre code {
|
||||||
|
@ -88,6 +88,7 @@ code {
|
|||||||
font-family: Consolas, Monaco, Monospace, Courier;
|
font-family: Consolas, Monaco, Monospace, Courier;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: #8E24AA;
|
color: #8E24AA;
|
||||||
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre code {
|
pre code {
|
||||||
|
@ -87,6 +87,7 @@ code {
|
|||||||
font-family: Consolas, Monaco, Monospace, Courier;
|
font-family: Consolas, Monaco, Monospace, Courier;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: #8E24AA;
|
color: #8E24AA;
|
||||||
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre code {
|
pre code {
|
||||||
|
@ -297,7 +297,7 @@ ToolsDock=T
|
|||||||
; Close current note
|
; Close current note
|
||||||
CloseNote=X
|
CloseNote=X
|
||||||
; Show shortcuts help document
|
; Show shortcuts help document
|
||||||
ShortcutsHelp=?
|
ShortcutsHelp=Shift+?
|
||||||
; Flush the log file
|
; Flush the log file
|
||||||
FlushLogFile=";"
|
FlushLogFile=";"
|
||||||
; Show opened files list
|
; Show opened files list
|
||||||
@ -334,6 +334,8 @@ RemoveSplit=R
|
|||||||
MagicWord=M
|
MagicWord=M
|
||||||
; Prompt for user to apply a snippet
|
; Prompt for user to apply a snippet
|
||||||
ApplySnippet=S
|
ApplySnippet=S
|
||||||
|
; Open export dialog
|
||||||
|
Export=O
|
||||||
|
|
||||||
[external_editors]
|
[external_editors]
|
||||||
; Define external editors which could be called to edit notes
|
; Define external editors which could be called to edit notes
|
||||||
|
@ -572,11 +572,31 @@ DocType VUtils::docTypeFromName(const QString &p_name)
|
|||||||
|
|
||||||
QString VUtils::generateSimpleHtmlTemplate(const QString &p_body)
|
QString VUtils::generateSimpleHtmlTemplate(const QString &p_body)
|
||||||
{
|
{
|
||||||
QString html = VNote::s_simpleHtmlTemplate;
|
QString html(VNote::s_simpleHtmlTemplate);
|
||||||
return html.replace(HtmlHolder::c_bodyHolder, p_body);
|
return html.replace(HtmlHolder::c_bodyHolder, p_body);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exportPdf)
|
QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType)
|
||||||
|
{
|
||||||
|
return generateHtmlTemplate(VNote::s_markdownTemplate, p_conType);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType,
|
||||||
|
const QString &p_renderBg,
|
||||||
|
const QString &p_renderStyle,
|
||||||
|
const QString &p_renderCodeBlockStyle,
|
||||||
|
bool p_isPDF)
|
||||||
|
{
|
||||||
|
QString templ = VNote::generateHtmlTemplate(g_config->getRenderBackgroundColor(p_renderBg),
|
||||||
|
g_config->getCssStyleUrl(p_renderStyle),
|
||||||
|
g_config->getCodeBlockCssStyleUrl(p_renderCodeBlockStyle),
|
||||||
|
p_isPDF);
|
||||||
|
|
||||||
|
return generateHtmlTemplate(templ, p_conType);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VUtils::generateHtmlTemplate(const QString &p_template,
|
||||||
|
MarkdownConverterType p_conType)
|
||||||
{
|
{
|
||||||
QString jsFile, extraFile;
|
QString jsFile, extraFile;
|
||||||
switch (p_conType) {
|
switch (p_conType) {
|
||||||
@ -661,13 +681,7 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exp
|
|||||||
|
|
||||||
extraFile += "<script>var VStylesToInline = '" + g_config->getStylesToInlineWhenCopied() + "';</script>\n";
|
extraFile += "<script>var VStylesToInline = '" + g_config->getStylesToInlineWhenCopied() + "';</script>\n";
|
||||||
|
|
||||||
QString htmlTemplate;
|
QString htmlTemplate(p_template);
|
||||||
if (p_exportPdf) {
|
|
||||||
htmlTemplate = VNote::s_markdownTemplatePDF;
|
|
||||||
} else {
|
|
||||||
htmlTemplate = VNote::s_markdownTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
htmlTemplate.replace(HtmlHolder::c_JSHolder, jsFile);
|
htmlTemplate.replace(HtmlHolder::c_JSHolder, jsFile);
|
||||||
if (!extraFile.isEmpty()) {
|
if (!extraFile.isEmpty()) {
|
||||||
htmlTemplate.replace(HtmlHolder::c_extraHolder, extraFile);
|
htmlTemplate.replace(HtmlHolder::c_extraHolder, extraFile);
|
||||||
|
@ -165,7 +165,14 @@ public:
|
|||||||
static DocType docTypeFromName(const QString &p_name);
|
static DocType docTypeFromName(const QString &p_name);
|
||||||
|
|
||||||
// Generate HTML template.
|
// Generate HTML template.
|
||||||
static QString generateHtmlTemplate(MarkdownConverterType p_conType, bool p_exportPdf);
|
static QString generateHtmlTemplate(MarkdownConverterType p_conType);
|
||||||
|
|
||||||
|
// @p_renderBg is the background name.
|
||||||
|
static QString generateHtmlTemplate(MarkdownConverterType p_conType,
|
||||||
|
const QString &p_renderBg,
|
||||||
|
const QString &p_renderStyle,
|
||||||
|
const QString &p_renderCodeBlockStyle,
|
||||||
|
bool p_isPDF);
|
||||||
|
|
||||||
static QString generateSimpleHtmlTemplate(const QString &p_body);
|
static QString generateSimpleHtmlTemplate(const QString &p_body);
|
||||||
|
|
||||||
@ -338,6 +345,9 @@ private:
|
|||||||
static bool deleteFile(const QString &p_recycleBinFolderPath,
|
static bool deleteFile(const QString &p_recycleBinFolderPath,
|
||||||
const QString &p_path);
|
const QString &p_path);
|
||||||
|
|
||||||
|
static QString generateHtmlTemplate(const QString &p_template,
|
||||||
|
MarkdownConverterType p_conType);
|
||||||
|
|
||||||
// <value, name>
|
// <value, name>
|
||||||
static QVector<QPair<QString, QString>> s_availableLanguages;
|
static QVector<QPair<QString, QString>> s_availableLanguages;
|
||||||
};
|
};
|
||||||
|
@ -859,8 +859,22 @@ QString VConfigManager::getCssStyleUrl() const
|
|||||||
const_cast<VConfigManager *>(this)->m_cssStyle = VPalette::themeCssStyle(getThemeFile());
|
const_cast<VConfigManager *>(this)->m_cssStyle = VPalette::themeCssStyle(getThemeFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString cssPath = getCssStyleUrl(m_cssStyle);
|
||||||
|
qDebug() << "use css style file" << cssPath;
|
||||||
|
return cssPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VConfigManager::getCssStyleUrl(const QString &p_style) const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_themes.isEmpty());
|
||||||
|
Q_ASSERT(!m_cssStyles.isEmpty());
|
||||||
|
|
||||||
|
if (p_style.isEmpty()) {
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
QString cssPath;
|
QString cssPath;
|
||||||
auto it = m_cssStyles.find(m_cssStyle);
|
auto it = m_cssStyles.find(p_style);
|
||||||
if (it != m_cssStyles.end()) {
|
if (it != m_cssStyles.end()) {
|
||||||
cssPath = it.value();
|
cssPath = it.value();
|
||||||
}
|
}
|
||||||
@ -872,7 +886,6 @@ QString VConfigManager::getCssStyleUrl() const
|
|||||||
cssPath = cssUrl.toString();
|
cssPath = cssUrl.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "use css style file" << cssPath;
|
|
||||||
return cssPath;
|
return cssPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -887,8 +900,22 @@ QString VConfigManager::getCodeBlockCssStyleUrl() const
|
|||||||
VPalette::themeCodeBlockCssStyle(getThemeFile());
|
VPalette::themeCodeBlockCssStyle(getThemeFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString cssPath = getCodeBlockCssStyleUrl(m_codeBlockCssStyle);
|
||||||
|
qDebug() << "use code block css style file" << cssPath;
|
||||||
|
return cssPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString VConfigManager::getCodeBlockCssStyleUrl(const QString &p_style) const
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_themes.isEmpty());
|
||||||
|
Q_ASSERT(!m_codeBlockCssStyles.isEmpty());
|
||||||
|
|
||||||
|
if (p_style.isEmpty()) {
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
QString cssPath;
|
QString cssPath;
|
||||||
auto it = m_codeBlockCssStyles.find(m_codeBlockCssStyle);
|
auto it = m_codeBlockCssStyles.find(p_style);
|
||||||
if (it != m_codeBlockCssStyles.end()) {
|
if (it != m_codeBlockCssStyles.end()) {
|
||||||
cssPath = it.value();
|
cssPath = it.value();
|
||||||
}
|
}
|
||||||
@ -900,7 +927,6 @@ QString VConfigManager::getCodeBlockCssStyleUrl() const
|
|||||||
cssPath = cssUrl.toString();
|
cssPath = cssUrl.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "use code block css style file" << cssPath;
|
|
||||||
return cssPath;
|
return cssPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1435,3 +1461,17 @@ void VConfigManager::clearGroupOfSettings(QSettings *p_settings, const QString &
|
|||||||
p_settings->remove("");
|
p_settings->remove("");
|
||||||
p_settings->endGroup();
|
p_settings->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString VConfigManager::getRenderBackgroundColor(const QString &p_bgName) const
|
||||||
|
{
|
||||||
|
if (p_bgName != "System") {
|
||||||
|
for (int i = 0; i < m_customColors.size(); ++i) {
|
||||||
|
if (m_customColors[i].m_name == p_bgName) {
|
||||||
|
return m_customColors[i].m_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -117,8 +117,12 @@ public:
|
|||||||
// Get the css style URL for web view.
|
// Get the css style URL for web view.
|
||||||
QString getCssStyleUrl() const;
|
QString getCssStyleUrl() const;
|
||||||
|
|
||||||
|
QString getCssStyleUrl(const QString &p_style) const;
|
||||||
|
|
||||||
QString getCodeBlockCssStyleUrl() const;
|
QString getCodeBlockCssStyleUrl() const;
|
||||||
|
|
||||||
|
QString getCodeBlockCssStyleUrl(const QString &p_style) const;
|
||||||
|
|
||||||
const QString &getEditorStyle() const;
|
const QString &getEditorStyle() const;
|
||||||
void setEditorStyle(const QString &p_style);
|
void setEditorStyle(const QString &p_style);
|
||||||
|
|
||||||
@ -172,6 +176,9 @@ public:
|
|||||||
const QString &getCurRenderBackgroundColor() const;
|
const QString &getCurRenderBackgroundColor() const;
|
||||||
void setCurRenderBackgroundColor(const QString &colorName);
|
void setCurRenderBackgroundColor(const QString &colorName);
|
||||||
|
|
||||||
|
// Return the color string of background @p_bgName.
|
||||||
|
QString getRenderBackgroundColor(const QString &p_bgName) const;
|
||||||
|
|
||||||
bool getToolsDockChecked() const;
|
bool getToolsDockChecked() const;
|
||||||
void setToolsDockChecked(bool p_checked);
|
void setToolsDockChecked(bool p_checked);
|
||||||
|
|
||||||
|
@ -24,7 +24,11 @@ VExporter::VExporter(QWidget *p_parent)
|
|||||||
|
|
||||||
void VExporter::prepareExport(const ExportOption &p_opt)
|
void VExporter::prepareExport(const ExportOption &p_opt)
|
||||||
{
|
{
|
||||||
m_htmlTemplate = VUtils::generateHtmlTemplate(p_opt.m_renderer, true);
|
m_htmlTemplate = VUtils::generateHtmlTemplate(p_opt.m_renderer,
|
||||||
|
p_opt.m_renderBg,
|
||||||
|
p_opt.m_renderStyle,
|
||||||
|
p_opt.m_renderCodeBlockStyle,
|
||||||
|
p_opt.m_format == ExportFormat::PDF);
|
||||||
m_pageLayout = *(p_opt.m_layout);
|
m_pageLayout = *(p_opt.m_layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +186,10 @@ void VMainWindow::registerCaptainAndNavigationTargets()
|
|||||||
g_config->getCaptainShortcutKeySequence("FlushLogFile"),
|
g_config->getCaptainShortcutKeySequence("FlushLogFile"),
|
||||||
this,
|
this,
|
||||||
flushLogFileByCaptain);
|
flushLogFileByCaptain);
|
||||||
|
m_captain->registerCaptainTarget(tr("Export"),
|
||||||
|
g_config->getCaptainShortcutKeySequence("Export"),
|
||||||
|
this,
|
||||||
|
exportByCaptain);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMainWindow::setupUI()
|
void VMainWindow::setupUI()
|
||||||
@ -774,6 +778,11 @@ void VMainWindow::initHelpMenu()
|
|||||||
|
|
||||||
QAction *shortcutAct = new QAction(tr("&Shortcuts Help"), this);
|
QAction *shortcutAct = new QAction(tr("&Shortcuts Help"), this);
|
||||||
shortcutAct->setToolTip(tr("View information about shortcut keys"));
|
shortcutAct->setToolTip(tr("View information about shortcut keys"));
|
||||||
|
QString keyText = VUtils::getCaptainShortcutSequenceText("ShortcutsHelp");
|
||||||
|
if (!keyText.isEmpty()) {
|
||||||
|
shortcutAct->setText(tr("&Shortcuts Help\t%1").arg(keyText));
|
||||||
|
}
|
||||||
|
|
||||||
connect(shortcutAct, &QAction::triggered,
|
connect(shortcutAct, &QAction::triggered,
|
||||||
this, &VMainWindow::shortcutsHelp);
|
this, &VMainWindow::shortcutsHelp);
|
||||||
|
|
||||||
@ -1002,6 +1011,10 @@ void VMainWindow::initFileMenu()
|
|||||||
// Export as PDF.
|
// Export as PDF.
|
||||||
m_exportAct = new QAction(tr("E&xport"), this);
|
m_exportAct = new QAction(tr("E&xport"), this);
|
||||||
m_exportAct->setToolTip(tr("Export notes"));
|
m_exportAct->setToolTip(tr("Export notes"));
|
||||||
|
QString keyText = VUtils::getCaptainShortcutSequenceText("Export");
|
||||||
|
if (!keyText.isEmpty()) {
|
||||||
|
m_exportAct->setText(tr("E&xport\t%1").arg(keyText));
|
||||||
|
}
|
||||||
connect(m_exportAct, &QAction::triggered,
|
connect(m_exportAct, &QAction::triggered,
|
||||||
this, &VMainWindow::handleExportAct);
|
this, &VMainWindow::handleExportAct);
|
||||||
|
|
||||||
@ -1313,6 +1326,11 @@ void VMainWindow::initDockWindows()
|
|||||||
|
|
||||||
QAction *toggleAct = toolDock->toggleViewAction();
|
QAction *toggleAct = toolDock->toggleViewAction();
|
||||||
toggleAct->setToolTip(tr("Toggle the tools dock widget"));
|
toggleAct->setToolTip(tr("Toggle the tools dock widget"));
|
||||||
|
QString keyText = VUtils::getCaptainShortcutSequenceText("ToolsDock");
|
||||||
|
if (!keyText.isEmpty()) {
|
||||||
|
toggleAct->setText(tr("%1\t%2").arg(toggleAct->text()).arg(keyText));
|
||||||
|
}
|
||||||
|
|
||||||
m_viewMenu->addAction(toggleAct);
|
m_viewMenu->addAction(toggleAct);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2695,6 +2713,16 @@ bool VMainWindow::flushLogFileByCaptain(void *p_target, void *p_data)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VMainWindow::exportByCaptain(void *p_target, void *p_data)
|
||||||
|
{
|
||||||
|
Q_UNUSED(p_data);
|
||||||
|
|
||||||
|
VMainWindow *obj = static_cast<VMainWindow *>(p_target);
|
||||||
|
QTimer::singleShot(50, obj, SLOT(handleExportAct()));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void VMainWindow::promptNewNotebookIfEmpty()
|
void VMainWindow::promptNewNotebookIfEmpty()
|
||||||
{
|
{
|
||||||
if (vnote->getNotebooks().isEmpty()) {
|
if (vnote->getNotebooks().isEmpty()) {
|
||||||
|
@ -286,6 +286,8 @@ private:
|
|||||||
|
|
||||||
static bool flushLogFileByCaptain(void *p_target, void *p_data);
|
static bool flushLogFileByCaptain(void *p_target, void *p_data);
|
||||||
|
|
||||||
|
static bool exportByCaptain(void *p_target, void *p_data);
|
||||||
|
|
||||||
// End Captain mode functions.
|
// End Captain mode functions.
|
||||||
|
|
||||||
VNote *vnote;
|
VNote *vnote;
|
||||||
|
@ -421,7 +421,7 @@ void VMdTab::setupMarkdownViewer()
|
|||||||
|
|
||||||
page->setWebChannel(channel);
|
page->setWebChannel(channel);
|
||||||
|
|
||||||
m_webViewer->setHtml(VUtils::generateHtmlTemplate(m_mdConType, false),
|
m_webViewer->setHtml(VUtils::generateHtmlTemplate(m_mdConType),
|
||||||
m_file->getBaseUrl());
|
m_file->getBaseUrl());
|
||||||
|
|
||||||
m_stacks->addWidget(m_webViewer);
|
m_stacks->addWidget(m_webViewer);
|
||||||
@ -1053,7 +1053,7 @@ void VMdTab::handleFileOrDirectoryChange(bool p_isFile, UpdateAction p_act)
|
|||||||
{
|
{
|
||||||
// Reload the web view with new base URL.
|
// Reload the web view with new base URL.
|
||||||
m_headerFromEditMode = m_currentHeader;
|
m_headerFromEditMode = m_currentHeader;
|
||||||
m_webViewer->setHtml(VUtils::generateHtmlTemplate(m_mdConType, false),
|
m_webViewer->setHtml(VUtils::generateHtmlTemplate(m_mdConType),
|
||||||
m_file->getBaseUrl());
|
m_file->getBaseUrl());
|
||||||
|
|
||||||
if (m_editor) {
|
if (m_editor) {
|
||||||
|
@ -25,8 +25,6 @@ QString VNote::s_simpleHtmlTemplate;
|
|||||||
|
|
||||||
QString VNote::s_markdownTemplate;
|
QString VNote::s_markdownTemplate;
|
||||||
|
|
||||||
QString VNote::s_markdownTemplatePDF;
|
|
||||||
|
|
||||||
QString VNote::s_sloganTemplate = "<div class=\"typewriter\"><h3>Hi Markdown, I'm VNote</h3></div>";
|
QString VNote::s_sloganTemplate = "<div class=\"typewriter\"><h3>Hi Markdown, I'm VNote</h3></div>";
|
||||||
|
|
||||||
const QString VNote::c_hoedownJsFile = ":/resources/hoedown.js";
|
const QString VNote::c_hoedownJsFile = ":/resources/hoedown.js";
|
||||||
@ -95,26 +93,16 @@ void VNote::updateSimpletHtmlTemplate()
|
|||||||
s_simpleHtmlTemplate.replace(cssHolder, g_config->getCssStyleUrl());
|
s_simpleHtmlTemplate.replace(cssHolder, g_config->getCssStyleUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
void VNote::updateTemplate()
|
QString VNote::generateHtmlTemplate(const QString &p_renderBg,
|
||||||
|
const QString &p_renderStyleUrl,
|
||||||
|
const QString &p_codeBlockStyleUrl,
|
||||||
|
bool p_isPDF)
|
||||||
{
|
{
|
||||||
const QString c_markdownTemplatePath(":/resources/markdown_template.html");
|
const QString c_markdownTemplatePath(":/resources/markdown_template.html");
|
||||||
|
|
||||||
// Get background color
|
|
||||||
QString color;
|
|
||||||
const QString &curRenderBg = g_config->getCurRenderBackgroundColor();
|
|
||||||
const QVector<VColor> &customColors = g_config->getCustomColors();
|
|
||||||
if (curRenderBg != "System") {
|
|
||||||
for (int i = 0; i < customColors.size(); ++i) {
|
|
||||||
if (customColors[i].m_name == curRenderBg) {
|
|
||||||
color = customColors[i].m_color;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString cssStyle;
|
QString cssStyle;
|
||||||
if (!color.isEmpty()) {
|
if (!p_renderBg.isEmpty()) {
|
||||||
cssStyle += "body { background-color: " + color + " !important; }\n";
|
cssStyle += "body { background-color: " + p_renderBg + " !important; }\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_config->getEnableImageConstraint()) {
|
if (g_config->getEnableImageConstraint()) {
|
||||||
@ -126,29 +114,42 @@ void VNote::updateTemplate()
|
|||||||
const QString cssHolder("CSS_PLACE_HOLDER");
|
const QString cssHolder("CSS_PLACE_HOLDER");
|
||||||
const QString codeBlockCssHolder("HIGHLIGHTJS_CSS_PLACE_HOLDER");
|
const QString codeBlockCssHolder("HIGHLIGHTJS_CSS_PLACE_HOLDER");
|
||||||
|
|
||||||
s_markdownTemplate = VUtils::readFileFromDisk(c_markdownTemplatePath);
|
QString templ = VUtils::readFileFromDisk(c_markdownTemplatePath);
|
||||||
g_palette->fillStyle(s_markdownTemplate);
|
g_palette->fillStyle(templ);
|
||||||
|
|
||||||
// Must replace the code block holder first.
|
// Must replace the code block holder first.
|
||||||
s_markdownTemplate.replace(codeBlockCssHolder, g_config->getCodeBlockCssStyleUrl());
|
templ.replace(codeBlockCssHolder, p_codeBlockStyleUrl);
|
||||||
s_markdownTemplate.replace(cssHolder, g_config->getCssStyleUrl());
|
templ.replace(cssHolder, p_renderStyleUrl);
|
||||||
|
|
||||||
s_markdownTemplatePDF = s_markdownTemplate;
|
if (p_isPDF) {
|
||||||
|
// Shoudl not display scrollbar in PDF.
|
||||||
|
cssStyle += "pre { white-space: pre-wrap !important; "
|
||||||
|
"word-break: break-all !important; }\n"
|
||||||
|
"pre code { white-space: pre-wrap !important; "
|
||||||
|
"word-break: break-all !important; }\n"
|
||||||
|
"code { word-break: break-all !important; }\n";
|
||||||
|
if (!g_config->getEnableImageConstraint()) {
|
||||||
|
// Constain the image width by force in PDF, otherwise, the PDF will
|
||||||
|
// be cut off.
|
||||||
|
cssStyle += "img { max-width: 100% !important; height: auto !important; }\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!cssStyle.isEmpty()) {
|
if (!cssStyle.isEmpty()) {
|
||||||
s_markdownTemplate.replace(styleHolder, cssStyle);
|
templ.replace(styleHolder, cssStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shoudl not display scrollbar in PDF.
|
return templ;
|
||||||
cssStyle += "pre { white-space: pre-wrap !important; "
|
}
|
||||||
"word-break: break-all !important; }\n";
|
|
||||||
if (!g_config->getEnableImageConstraint()) {
|
|
||||||
// Constain the image width by force in PDF, otherwise, the PDF will
|
|
||||||
// be cut off.
|
|
||||||
cssStyle += "img { max-width: 100% !important; height: auto !important; }\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
s_markdownTemplatePDF.replace(styleHolder, cssStyle);
|
void VNote::updateTemplate()
|
||||||
|
{
|
||||||
|
QString renderBg = g_config->getRenderBackgroundColor(g_config->getCurRenderBackgroundColor());
|
||||||
|
|
||||||
|
s_markdownTemplate = generateHtmlTemplate(renderBg,
|
||||||
|
g_config->getCssStyleUrl(),
|
||||||
|
g_config->getCodeBlockCssStyleUrl(),
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QVector<VNotebook *> &VNote::getNotebooks() const
|
const QVector<VNotebook *> &VNote::getNotebooks() const
|
||||||
|
@ -35,8 +35,6 @@ public:
|
|||||||
|
|
||||||
static QString s_markdownTemplate;
|
static QString s_markdownTemplate;
|
||||||
|
|
||||||
static QString s_markdownTemplatePDF;
|
|
||||||
|
|
||||||
// Hoedown
|
// Hoedown
|
||||||
static const QString c_hoedownJsFile;
|
static const QString c_hoedownJsFile;
|
||||||
|
|
||||||
@ -101,6 +99,12 @@ public:
|
|||||||
|
|
||||||
void freeOrphanFiles();
|
void freeOrphanFiles();
|
||||||
|
|
||||||
|
// @p_renderBg: background color, empty to not specify given color.
|
||||||
|
static QString generateHtmlTemplate(const QString &p_renderBg,
|
||||||
|
const QString &p_renderStyleUrl,
|
||||||
|
const QString &p_codeBlockStyleUrl,
|
||||||
|
bool p_isPDF);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateTemplate();
|
void updateTemplate();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user