From 30e3b5721e3a24155af552fd5b14c337a1191b22 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 24 Jun 2021 21:36:47 +0800 Subject: [PATCH] bug fix 1. InsertImageDialog crashes when file does not exist; 2. Use   for leading spaces of

element in Turndown; --- src/core/configmgr.cpp | 2 +- src/data/extra/web/js/turndown.js | 24 ++++++++++++++++++++++- src/widgets/dialogs/imageinsertdialog.cpp | 10 +++++++++- src/widgets/editors/markdowneditor.cpp | 6 +++++- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/core/configmgr.cpp b/src/core/configmgr.cpp index 7bbd859f..6d111662 100644 --- a/src/core/configmgr.cpp +++ b/src/core/configmgr.cpp @@ -24,7 +24,7 @@ using namespace vnotex; #ifndef QT_NO_DEBUG -// #define VX_DEBUG_WEB + #define VX_DEBUG_WEB #endif const QString ConfigMgr::c_orgName = "VNote"; diff --git a/src/data/extra/web/js/turndown.js b/src/data/extra/web/js/turndown.js index cf60fa46..bb8c557f 100644 --- a/src/data/extra/web/js/turndown.js +++ b/src/data/extra/web/js/turndown.js @@ -21,10 +21,13 @@ class TurndownConverter { // TODO: verify and copy several rules from VNote 2.0. this.fixMark(); + + this.fixParagraph(); } turndown(p_html) { - return this.ts.turndown(p_html); + let markdown = this.ts.turndown(p_html); + return markdown; } // Trim a string into 3 parts: leading spaces, content, trailing spaces. @@ -69,6 +72,25 @@ class TurndownConverter { }); } + fixParagraph() { + this.ts.addRule('paragraph', { + filter: 'p', + replacement: function(content) { + // Replace leading spaces with   to avoid being parsed as code block. + let lRe = /^\s+/; + let ret = lRe.exec(content); + if (ret) { + let leadingSpaces = ret[0]; + if (leadingSpaces.length > 3) { + content = ' '.repeat(leadingSpaces.length) + content.slice(leadingSpaces.length); + } + } + + return '\n\n' + content + '\n\n' + } + }); + } + fixImage() { this.ts.addRule('img_fix', { filter: 'img', diff --git a/src/widgets/dialogs/imageinsertdialog.cpp b/src/widgets/dialogs/imageinsertdialog.cpp index fe036816..2d24781c 100644 --- a/src/widgets/dialogs/imageinsertdialog.cpp +++ b/src/widgets/dialogs/imageinsertdialog.cpp @@ -61,6 +61,8 @@ void ImageInsertDialog::setupUI(const QString &p_title, auto gridLayout = new QGridLayout(); mainLayout->addLayout(gridLayout); + mainLayout->addStretch(); + // Image Path. m_imagePathEdit = WidgetsFactory::createLineEdit(p_imagePath, mainWidget); m_imagePathEdit->setReadOnly(!m_browserEnabled); @@ -172,7 +174,13 @@ void ImageInsertDialog::checkImagePathInput() } if (url.isLocalFile()) { - setImage(FileUtils::imageFromFile(url.toLocalFile())); + const auto localFile = url.toLocalFile(); + if (QFileInfo::exists(localFile)) { + setImage(FileUtils::imageFromFile(localFile)); + } else { + setImage(QImage()); + } + m_source = Source::LocalFile; } else { setImage(QImage()); diff --git a/src/widgets/editors/markdowneditor.cpp b/src/widgets/editors/markdowneditor.cpp index f5be84a9..fefbfcff 100644 --- a/src/widgets/editors/markdowneditor.cpp +++ b/src/widgets/editors/markdowneditor.cpp @@ -1049,7 +1049,7 @@ void MarkdownEditor::fetchImagesToLocalAndReplace(QString &p_text) } const QString imageTitle = purifyImageTitle(regExp.cap(1).trimmed()); - const QString imageUrl = regExp.cap(2).trimmed(); + QString imageUrl = regExp.cap(2).trimmed(); const int maxUrlLength = 100; QString urlToDisplay(imageUrl); @@ -1091,6 +1091,10 @@ void MarkdownEditor::fetchImagesToLocalAndReplace(QString &p_text) } } else { // Network path. + // Prepend the protocol if missing. + if (imageUrl.startsWith(QStringLiteral("//"))) { + imageUrl.prepend(QStringLiteral("https:")); + } QByteArray data = vte::Downloader::download(QUrl(imageUrl)); if (!data.isEmpty()) { auto suffix = info.suffix();