diff --git a/src/utils/vutils.cpp b/src/utils/vutils.cpp index 8d41e500..bd1e420a 100644 --- a/src/utils/vutils.cpp +++ b/src/utils/vutils.cpp @@ -24,6 +24,8 @@ extern VConfigManager vconfig; const QVector> VUtils::c_availableLanguages = {QPair("en_US", "Englisth(US)"), QPair("zh_CN", "Chinese")}; +const QString VUtils::c_imageLinkRegExp = QString("\\!\\[([^\\]]*)\\]\\(([^\\)\"]+)\\s*(\".*\")?\\s*\\)"); + VUtils::VUtils() { } diff --git a/src/utils/vutils.h b/src/utils/vutils.h index eee69e1c..46f93ab6 100644 --- a/src/utils/vutils.h +++ b/src/utils/vutils.h @@ -58,6 +58,14 @@ public: static QChar keyToChar(int p_key); static QString getLocale(); + // Regular expression for image link. + // ![image title]( http://github.com/tamlok/vnote.jpg "alt text" ) + // Captured texts (need to be trimmed): + // 1. Image Alt Text (Title); + // 2. Image URL; + // 3. Image Optional Title with double quotes; + static const QString c_imageLinkRegExp; + private: // static const QVector> c_availableLanguages; diff --git a/src/vimagepreviewer.cpp b/src/vimagepreviewer.cpp index 5f1cff59..db612679 100644 --- a/src/vimagepreviewer.cpp +++ b/src/vimagepreviewer.cpp @@ -10,6 +10,7 @@ #include "utils/vutils.h" #include "vfile.h" #include "vdownloader.h" +#include "hgmarkdownhighlighter.h" extern VConfigManager vconfig; @@ -72,6 +73,11 @@ void VImagePreviewer::handleContentChange(int /* p_position */, m_timer->start(); } +bool VImagePreviewer::isNormalBlock(const QTextBlock &p_block) +{ + return p_block.userState() == HighlightBlockState::Normal; +} + void VImagePreviewer::previewImages() { if (m_isPreviewing) { @@ -86,7 +92,7 @@ void VImagePreviewer::previewImages() while (block.isValid() && m_enablePreview) { if (isImagePreviewBlock(block)) { // Image preview block. Check if it is parentless. - if (!isValidImagePreviewBlock(block)) { + if (!isValidImagePreviewBlock(block) || !isNormalBlock(block)) { QTextBlock nblock = block.next(); removeBlock(block); block = nblock; @@ -96,7 +102,11 @@ void VImagePreviewer::previewImages() } else { clearCorruptedImagePreviewBlock(block); - block = previewImageOfOneBlock(block); + if (isNormalBlock(block)) { + block = previewImageOfOneBlock(block); + } else { + block = block.next(); + } } } @@ -158,7 +168,8 @@ bool VImagePreviewer::isValidImagePreviewBlock(QTextBlock &p_block) QString VImagePreviewer::fetchImageUrlToPreview(const QString &p_text) { - QRegExp regExp("\\!\\[[^\\]]*\\]\\(([^\\)]+)\\)"); + QRegExp regExp(VUtils::c_imageLinkRegExp); + int index = regExp.indexIn(p_text); if (index == -1) { return QString(); @@ -169,7 +180,7 @@ QString VImagePreviewer::fetchImageUrlToPreview(const QString &p_text) return QString(); } - return regExp.capturedTexts()[1]; + return regExp.capturedTexts()[2].trimmed(); } QString VImagePreviewer::fetchImagePathToPreview(const QString &p_text) diff --git a/src/vimagepreviewer.h b/src/vimagepreviewer.h index afd17adc..50ffe864 100644 --- a/src/vimagepreviewer.h +++ b/src/vimagepreviewer.h @@ -93,6 +93,9 @@ private: // Return true if and only if there is update. bool updateImageWidth(QTextImageFormat &p_format); + // Whether it is a normal block or not. + bool isNormalBlock(const QTextBlock &p_block); + VMdEdit *m_edit; QTextDocument *m_document; VFile *m_file;