Browse Source

VWebView: fix img src after copied

Add config web/fix_img_src_when_copied to control the behavior.
Le Tan 8 years ago
parent
commit
db73ab6dfd

+ 1 - 0
src/dialog/vtipsdialog.cpp

@@ -24,6 +24,7 @@ VTipsDialog::VTipsDialog(const QString &p_tipFile,
 void VTipsDialog::setupUI(const QString &p_actionText)
 {
     m_viewer = VUtils::getWebEngineView();
+    m_viewer->setContextMenuPolicy(Qt::NoContextMenu);
 
     m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok);
     connect(m_btnBox, &QDialogButtonBox::accepted, this, &QDialog::accept);

+ 1 - 0
src/dialog/vupdater.cpp

@@ -36,6 +36,7 @@ void VUpdater::setupUI()
     m_proBar->setTextVisible(false);
 
     m_descriptionWV = VUtils::getWebEngineView();
+    m_descriptionWV->setContextMenuPolicy(Qt::NoContextMenu);
     m_descriptionWV->setHtml(VUtils::generateSimpleHtmlTemplate(VNote::s_sloganTemplate));
 
     m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok);

+ 3 - 0
src/resources/vnote.ini

@@ -190,6 +190,9 @@ custom_colors=White:#EEEEEE,Green:#CCE8CF,Wheat:#DFC7B2,LightGrey:#D3D3D3
 ; Location and configuration for Mathjax
 mathjax_javascript=https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML
 
+; Fix local relative image source when copied
+fix_img_src_when_copied=true
+
 [shortcuts]
 ; Define shortcuts here, with each item in the form "operation=keysequence".
 ; Leave keysequence empty to disable the shortcut of an operation.

+ 3 - 0
src/vconfigmanager.cpp

@@ -284,6 +284,9 @@ void VConfigManager::initialize()
 
     m_closeBeforeExternalEditor = getConfigFromSettings("global",
                                                         "close_before_external_editor").toBool();
+
+    m_fixImageSrcInWebWhenCopied = getConfigFromSettings("web",
+                                                         "fix_img_src_when_copied").toBool();
 }
 
 void VConfigManager::initSettings()

+ 10 - 0
src/vconfigmanager.h

@@ -426,6 +426,8 @@ public:
 
     bool getCloseBeforeExternalEditor() const;
 
+    bool getFixImageSrcInWebWhenCopied() const;
+
 private:
     // Look up a config from user and default settings.
     QVariant getConfigFromSettings(const QString &section, const QString &key) const;
@@ -816,6 +818,9 @@ private:
     // Whether user has reset the configurations.
     bool m_hasReset;
 
+    // Whether fix the local relative image src in read mode when copied.
+    bool m_fixImageSrcInWebWhenCopied;
+
     // The name of the config file in each directory, obsolete.
     // Use c_dirConfigFile instead.
     static const QString c_obsoleteDirConfigFile;
@@ -1983,4 +1988,9 @@ inline bool VConfigManager::getCloseBeforeExternalEditor() const
     return m_closeBeforeExternalEditor;
 }
 
+inline bool VConfigManager::getFixImageSrcInWebWhenCopied() const
+{
+    return m_fixImageSrcInWebWhenCopied;
+}
+
 #endif // VCONFIGMANAGER_H

+ 64 - 2
src/vwebview.cpp

@@ -11,9 +11,13 @@
 #include <QApplication>
 #include <QImage>
 #include <QRegExp>
+#include <QFileInfo>
 #include "vfile.h"
 #include "utils/vclipboardutils.h"
 #include "utils/viconutils.h"
+#include "vconfigmanager.h"
+
+extern VConfigManager *g_config;
 
 // We set the property of the clipboard to mark that the URL copied in the
 // clipboard has been altered.
@@ -23,7 +27,8 @@ VWebView::VWebView(VFile *p_file, QWidget *p_parent)
     : QWebEngineView(p_parent),
       m_file(p_file),
       m_copyImageUrlActionHooked(false),
-      m_needRemoveBackground(false)
+      m_needRemoveBackground(false),
+      m_fixImgSrc(g_config->getFixImageSrcInWebWhenCopied())
 {
     setAcceptDrops(false);
 
@@ -246,6 +251,56 @@ void VWebView::handleClipboardChanged(QClipboard::Mode p_mode)
     alterHtmlMimeData(clipboard, mimeData, removeBackground);
 }
 
+bool VWebView::fixImgSrc(QString &p_html)
+{
+    bool changed = false;
+
+#if defined(Q_OS_WIN)
+    QUrl::ComponentFormattingOption strOpt = QUrl::EncodeSpaces;
+#else
+    QUrl::ComponentFormattingOption strOpt = QUrl::FullyEncoded;
+#endif
+
+    QRegExp reg("(<img src=\")([^\"]+)\"");
+    QUrl baseUrl(url());
+
+    int pos = 0;
+    while (pos < p_html.size()) {
+        int idx = p_html.indexOf(reg, pos);
+        if (idx == -1) {
+            break;
+        }
+
+        QString urlStr = reg.cap(2);
+        QUrl imgUrl(urlStr);
+
+        QString fixedStr;
+        if (imgUrl.isRelative()) {
+            fixedStr = baseUrl.resolved(imgUrl).toString(strOpt);
+        } else if (imgUrl.isLocalFile()) {
+            fixedStr = imgUrl.toString(strOpt);
+        } else if (imgUrl.scheme() != "https" && imgUrl.scheme() != "http") {
+            QString tmp = imgUrl.toString();
+            if (QFileInfo::exists(tmp)) {
+                fixedStr = QUrl::fromLocalFile(tmp).toString(strOpt);
+            }
+        }
+
+        pos = idx + reg.matchedLength();
+        if (!fixedStr.isEmpty() && urlStr != fixedStr) {
+            qDebug() << "fix img url" << urlStr << fixedStr;
+            // Insert one more space to avoid fix the url twice.
+            pos = pos + fixedStr.size() + 1 - urlStr.size();
+            p_html.replace(idx,
+                           reg.matchedLength(),
+                           QString("<img  src=\"%1\"").arg(fixedStr));
+            changed = true;
+        }
+    }
+
+    return changed;
+}
+
 void VWebView::alterHtmlMimeData(QClipboard *p_clipboard,
                                  const QMimeData *p_mimeData,
                                  bool p_removeBackground)
@@ -257,15 +312,22 @@ void VWebView::alterHtmlMimeData(QClipboard *p_clipboard,
     bool altered = false;
     QString html = p_mimeData->html();
 
+    // Add surrounded tags.
     if (!html.startsWith("<html>")) {
         altered = true;
         html = QString("<html><body>%1</body></html>").arg(html);
     }
 
+    // Remove background color.
     if (p_removeBackground && removeBackgroundColor(html)) {
         altered = true;
     }
 
+    // Fix local relative images.
+    if (m_fixImgSrc && fixImgSrc(html)) {
+        altered = true;
+    }
+
     if (!altered) {
         return;
     }
@@ -275,5 +337,5 @@ void VWebView::alterHtmlMimeData(QClipboard *p_clipboard,
     data->setHtml(html);
 
     VClipboardUtils::setMimeDataToClipboard(p_clipboard, data, QClipboard::Clipboard);
-    qDebug() << "altered clipboard's Html";
+    qDebug() << "altered clipboard's Html" << html;
 }

+ 4 - 0
src/vwebview.h

@@ -40,12 +40,16 @@ private:
                            const QMimeData *p_mimeData,
                            bool p_removeBackground);
 
+    bool fixImgSrc(QString &p_html);
+
     VFile *m_file;
 
     // Whether this view has hooked the Copy Image Url action.
     bool m_copyImageUrlActionHooked;
 
     bool m_needRemoveBackground;
+
+    bool m_fixImgSrc;
 };
 
 #endif // VWEBVIEW_H