diff --git a/src/dialog/vexportdialog.cpp b/src/dialog/vexportdialog.cpp
index 0c41efc0..116a67b0 100644
--- a/src/dialog/vexportdialog.cpp
+++ b/src/dialog/vexportdialog.cpp
@@ -208,6 +208,10 @@ QWidget *VExportDialog::setupPDFAdvancedSettings()
updatePageLayoutLabel();
+ // Enable table of contents.
+ m_tableOfContentsCB = new QCheckBox(tr("Enable Table Of Contents"));
+ m_tableOfContentsCB->setToolTip(tr("Add a table of contents to the document"));
+
// Use wkhtmltopdf.
m_wkhtmltopdfCB = new QCheckBox(tr("Use wkhtmltopdf"));
m_wkhtmltopdfCB->setToolTip(tr("Use wkhtmltopdf tool to generate PDF (wkhtmltopdf needed to be installed)"));
@@ -217,7 +221,6 @@ QWidget *VExportDialog::setupPDFAdvancedSettings()
m_wkPathEdit->setEnabled(checked);
m_wkPathBrowseBtn->setEnabled(checked);
m_wkBackgroundCB->setEnabled(checked);
- m_wkTableOfContentsCB->setEnabled(checked);
m_wkPageNumberCB->setEnabled(checked);
m_wkExtraArgsEdit->setEnabled(checked);
});
@@ -257,11 +260,6 @@ QWidget *VExportDialog::setupPDFAdvancedSettings()
m_wkBackgroundCB->setToolTip(tr("Enable background when printing"));
m_wkBackgroundCB->setEnabled(m_wkhtmltopdfCB->isChecked());
- // wkhtmltopdf enable table of contents.
- m_wkTableOfContentsCB = new QCheckBox(tr("Enable Table Of Contents"));
- m_wkTableOfContentsCB->setToolTip(tr("Add a table of contents to the document"));
- m_wkTableOfContentsCB->setEnabled(m_wkhtmltopdfCB->isChecked());
-
// wkhtmltopdf page number.
m_wkPageNumberCB = VUtils::getComboBox();
m_wkPageNumberCB->setToolTip(tr("Append page number as footer"));
@@ -277,6 +275,7 @@ QWidget *VExportDialog::setupPDFAdvancedSettings()
advLayout->addWidget(new QLabel(tr("Page layout:")), 0, 0);
advLayout->addWidget(m_layoutLabel, 0, 1);
advLayout->addWidget(layoutBtn, 0, 2);
+ advLayout->addWidget(m_tableOfContentsCB, 0, 4, 1, 2);
advLayout->addWidget(m_wkhtmltopdfCB, 1, 1, 1, 2);
advLayout->addWidget(wkBtn, 1, 4, 1, 2);
@@ -291,14 +290,12 @@ QWidget *VExportDialog::setupPDFAdvancedSettings()
advLayout->addWidget(new QLabel(tr("Output file name:")), 3, 3);
advLayout->addWidget(m_wkTargetFileNameEdit, 3, 4, 1, 2);
- advLayout->addWidget(m_wkBackgroundCB, 4, 1, 1, 2);
- advLayout->addWidget(m_wkTableOfContentsCB, 4, 4, 1, 2);
+ advLayout->addWidget(new QLabel(tr("Page number:")), 4, 0);
+ advLayout->addWidget(m_wkPageNumberCB, 4, 1, 1, 2);
+ advLayout->addWidget(m_wkBackgroundCB, 4, 4, 1, 2);
- advLayout->addWidget(new QLabel(tr("Page number:")), 5, 0);
- advLayout->addWidget(m_wkPageNumberCB, 5, 1, 1, 2);
-
- advLayout->addWidget(new QLabel(tr("Additional options:")), 6, 0);
- advLayout->addWidget(m_wkExtraArgsEdit, 6, 1, 1, 5);
+ advLayout->addWidget(new QLabel(tr("Additional options:")), 5, 0);
+ advLayout->addWidget(m_wkExtraArgsEdit, 5, 1, 1, 5);
advLayout->setContentsMargins(0, 0, 0, 0);
@@ -437,6 +434,8 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer)
m_mimeHTMLCB->setChecked(s_opt.m_htmlOpt.m_mimeHTML);
+ m_tableOfContentsCB->setChecked(s_opt.m_pdfOpt.m_enableTableOfContents);
+
m_wkhtmltopdfCB->setChecked(s_opt.m_pdfOpt.m_wkhtmltopdf);
// wkhtmltopdf path.
@@ -444,8 +443,6 @@ void VExportDialog::initUIFields(MarkdownConverterType p_renderer)
m_wkBackgroundCB->setChecked(s_opt.m_pdfOpt.m_wkEnableBackground);
- m_wkTableOfContentsCB->setChecked(s_opt.m_pdfOpt.m_wkEnableTableOfContents);
-
// wkhtmltopdf page number.
m_wkPageNumberCB->addItem(tr("None"), (int)ExportPageNumber::None);
m_wkPageNumberCB->addItem(tr("Left"), (int)ExportPageNumber::Left);
@@ -507,7 +504,7 @@ void VExportDialog::startExport()
m_wkhtmltopdfCB->isChecked(),
QDir::toNativeSeparators(m_wkPathEdit->text()),
m_wkBackgroundCB->isChecked(),
- m_wkTableOfContentsCB->isChecked(),
+ m_tableOfContentsCB->isChecked(),
m_wkTitleEdit->text(),
m_wkTargetFileNameEdit->text(),
(ExportPageNumber)m_wkPageNumberCB->currentData().toInt(),
diff --git a/src/dialog/vexportdialog.h b/src/dialog/vexportdialog.h
index 8a2423da..64c88000 100644
--- a/src/dialog/vexportdialog.h
+++ b/src/dialog/vexportdialog.h
@@ -81,7 +81,7 @@ struct ExportPDFOption
: m_layout(NULL),
m_wkhtmltopdf(false),
m_wkEnableBackground(true),
- m_wkEnableTableOfContents(false),
+ m_enableTableOfContents(false),
m_wkPageNumber(ExportPageNumber::None)
{
}
@@ -90,7 +90,7 @@ struct ExportPDFOption
bool p_wkhtmltopdf,
const QString &p_wkPath,
bool p_wkEnableBackground,
- bool p_wkEnableTableOfContents,
+ bool p_enableTableOfContents,
const QString &p_wkTitle,
const QString &p_wkTargetFileName,
ExportPageNumber p_wkPageNumber,
@@ -99,7 +99,7 @@ struct ExportPDFOption
m_wkhtmltopdf(p_wkhtmltopdf),
m_wkPath(p_wkPath),
m_wkEnableBackground(p_wkEnableBackground),
- m_wkEnableTableOfContents(p_wkEnableTableOfContents),
+ m_enableTableOfContents(p_enableTableOfContents),
m_wkTitle(p_wkTitle),
m_wkTargetFileName(p_wkTargetFileName),
m_wkPageNumber(p_wkPageNumber),
@@ -111,7 +111,7 @@ struct ExportPDFOption
bool m_wkhtmltopdf;
QString m_wkPath;
bool m_wkEnableBackground;
- bool m_wkEnableTableOfContents;
+ bool m_enableTableOfContents;;
QString m_wkTitle;
QString m_wkTargetFileName;
ExportPageNumber m_wkPageNumber;
@@ -315,7 +315,7 @@ private:
QCheckBox *m_wkBackgroundCB;
- QCheckBox *m_wkTableOfContentsCB;
+ QCheckBox *m_tableOfContentsCB;
QComboBox *m_wkPageNumberCB;
diff --git a/src/main.cpp b/src/main.cpp
index 1c872ce4..b16cd2c5 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -149,6 +149,7 @@ int main(int argc, char *argv[])
for (int i = 1; i < argc; ++i) {
if (!qstrcmp(argv[i], "-d")) {
g_debugLog = true;
+ break;
}
}
diff --git a/src/resources/markdown-it.js b/src/resources/markdown-it.js
index 68417360..93d33770 100644
--- a/src/resources/markdown-it.js
+++ b/src/resources/markdown-it.js
@@ -100,6 +100,10 @@ var markdownToHtml = function(markdown, needToc) {
};
var updateText = function(text) {
+ if (VAddTOC) {
+ text = "[TOC]\n\n" + text;
+ }
+
var needToc = mdHasTocSection(text);
var html = markdownToHtml(text, needToc);
placeholder.innerHTML = html;
diff --git a/src/resources/markdown_template.js b/src/resources/markdown_template.js
index 90a74480..9ab07da7 100644
--- a/src/resources/markdown_template.js
+++ b/src/resources/markdown_template.js
@@ -48,6 +48,10 @@ if (typeof VRemoveMathjaxScript == 'undefined') {
VRemoveMathjaxScript = false;
}
+if (typeof VAddTOC == 'undefined') {
+ VAddTOC = false;
+}
+
var getUrlScheme = function(url) {
var idx = url.indexOf(':');
if (idx > -1) {
@@ -805,11 +809,17 @@ var handleToc = function(needToc) {
var tocTree = tocToTree(toPerfectToc(toc, baseLevel), baseLevel);
content.setToc(tocTree, baseLevel);
+ var removeToc = toc.length == 0;
+
// Add it to html
if (needToc) {
var eles = document.getElementsByClassName('vnote-toc');
for (var i = 0; i < eles.length; ++i) {
- eles[i].innerHTML = tocTree;
+ if (removeToc) {
+ eles[i].parentNode.removeChild(eles[i]);
+ } else {
+ eles[i].innerHTML = tocTree;
+ }
}
}
};
diff --git a/src/resources/marked.js b/src/resources/marked.js
index 813c898f..9d7a150a 100644
--- a/src/resources/marked.js
+++ b/src/resources/marked.js
@@ -49,6 +49,10 @@ var mdHasTocSection = function(markdown) {
};
var updateText = function(text) {
+ if (VAddTOC) {
+ text = "[TOC]\n\n" + text;
+ }
+
var needToc = mdHasTocSection(text);
var html = markdownToHtml(text, needToc);
placeholder.innerHTML = html;
diff --git a/src/resources/showdown.js b/src/resources/showdown.js
index 9c135f7d..4e8f4578 100644
--- a/src/resources/showdown.js
+++ b/src/resources/showdown.js
@@ -73,6 +73,10 @@ var highlightCodeBlocks = function(doc, enableMermaid, enableFlowchart, enableMa
};
var updateText = function(text) {
+ if (VAddTOC) {
+ text = "[TOC]\n\n" + text;
+ }
+
var needToc = mdHasTocSection(text);
var html = markdownToHtml(text, needToc);
placeholder.innerHTML = html;
diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp
index ae3c2f9a..50326ee0 100644
--- a/src/utils/vutils.cpp
+++ b/src/utils/vutils.cpp
@@ -602,7 +602,8 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType,
const QString &p_renderStyle,
const QString &p_renderCodeBlockStyle,
bool p_isPDF,
- bool p_wkhtmltopdf)
+ bool p_wkhtmltopdf,
+ bool p_addToc)
{
Q_ASSERT((p_isPDF && p_wkhtmltopdf) || !p_wkhtmltopdf);
@@ -611,12 +612,13 @@ QString VUtils::generateHtmlTemplate(MarkdownConverterType p_conType,
g_config->getCodeBlockCssStyleUrl(p_renderCodeBlockStyle),
p_isPDF);
- return generateHtmlTemplate(templ, p_conType, p_wkhtmltopdf);
+ return generateHtmlTemplate(templ, p_conType, p_wkhtmltopdf, p_addToc);
}
QString VUtils::generateHtmlTemplate(const QString &p_template,
MarkdownConverterType p_conType,
- bool p_wkhtmltopdf)
+ bool p_wkhtmltopdf,
+ bool p_addToc)
{
QString jsFile, extraFile;
switch (p_conType) {
@@ -715,6 +717,17 @@ QString VUtils::generateHtmlTemplate(const QString &p_template,
extraFile += "\n";
}
+ if (p_addToc) {
+ extraFile += "\n";
+ extraFile += "";
+ }
+
extraFile += "\n";
QString htmlTemplate(p_template);
diff --git a/src/utils/vutils.h b/src/utils/vutils.h
index 494ed398..6f5a939e 100644
--- a/src/utils/vutils.h
+++ b/src/utils/vutils.h
@@ -177,7 +177,8 @@ public:
const QString &p_renderStyle,
const QString &p_renderCodeBlockStyle,
bool p_isPDF,
- bool p_wkhtmltopdf = false);
+ bool p_wkhtmltopdf = false,
+ bool p_addToc = false);
// @p_renderBg is the background name.
static QString generateExportHtmlTemplate(const QString &p_renderBg, bool p_includeMathJax);
@@ -359,7 +360,8 @@ private:
static QString generateHtmlTemplate(const QString &p_template,
MarkdownConverterType p_conType,
- bool p_wkhtmltopdf = false);
+ bool p_wkhtmltopdf = false,
+ bool p_addToc = false);
//
static QVector> s_availableLanguages;
diff --git a/src/vexporter.cpp b/src/vexporter.cpp
index 4cdf46d4..6f683902 100644
--- a/src/vexporter.cpp
+++ b/src/vexporter.cpp
@@ -41,13 +41,17 @@ void VExporter::prepareExport(const ExportOption &p_opt)
{
bool isPdf = p_opt.m_format == ExportFormat::PDF
|| p_opt.m_format == ExportFormat::OnePDF;
+ bool extraToc = isPdf
+ && !p_opt.m_pdfOpt.m_wkhtmltopdf
+ && p_opt.m_pdfOpt.m_enableTableOfContents;
m_htmlTemplate = VUtils::generateHtmlTemplate(p_opt.m_renderer,
p_opt.m_renderBg,
p_opt.m_renderStyle,
p_opt.m_renderCodeBlockStyle,
isPdf,
- isPdf && p_opt.m_pdfOpt.m_wkhtmltopdf);
+ isPdf && p_opt.m_pdfOpt.m_wkhtmltopdf,
+ extraToc);
m_exportHtmlTemplate = VUtils::generateExportHtmlTemplate(p_opt.m_renderBg,
isPdf && p_opt.m_pdfOpt.m_wkhtmltopdf);
@@ -153,7 +157,7 @@ void VExporter::prepareWKArguments(const ExportPDFOption &p_opt)
}
// TOC option.
- if (p_opt.m_wkEnableTableOfContents) {
+ if (p_opt.m_enableTableOfContents) {
m_wkArgs << "toc" << "--toc-text-size-shrink" << "1.0";
}
}
@@ -203,6 +207,17 @@ void VExporter::initWebViewer(VFile *p_file, const ExportOption &p_opt)
QString html = mdConverter.generateHtml(p_file->getContent(),
g_config->getMarkdownExtensions(),
toc);
+ bool isPdf = p_opt.m_format == ExportFormat::PDF
+ || p_opt.m_format == ExportFormat::OnePDF;
+ bool extraToc = isPdf
+ && !p_opt.m_pdfOpt.m_wkhtmltopdf
+ && p_opt.m_pdfOpt.m_enableTableOfContents;
+ if (extraToc && !toc.isEmpty()) {
+ // Add toc to html.
+ QString div = "" + toc + "
\n";
+ html = div + html;
+ }
+
m_webDocument->setHtml(html);
}