Browse Source

VWebView: alter copied Html in VWebView to paste correctly in OneNote

Le Tan 8 years ago
parent
commit
7986ebe475

+ 4 - 3
src/resources/themes/v_moonlight/v_moonlight.css

@@ -3,14 +3,15 @@ body {
     font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
     color: #ABB2BF;
     line-height: 1;
-    padding: 30px;
+    padding: 15px;
     background: #282C34;
 }
 
 h1, h2, h3, h4, h5, h6 {
     color: #E06C75;
     font-weight: bold;
-    margin-bottom: 24px;
+    margin-top: 20px;
+    margin-bottom: 10px;
     padding: 0;
 }
 
@@ -93,8 +94,8 @@ pre code {
     display: block;
     overflow-x: auto;
     padding: 0.5em;
-    border: 1px solid #373E47;
     color: #98C379;
+    background-color: #2C313A;
 }
 
 aside {

+ 4 - 3
src/resources/themes/v_pure/v_pure.css

@@ -3,14 +3,15 @@ body {
     font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
     color: #363636;
     line-height: 1;
-    padding: 30px;
+    padding: 15px;
     background: #F5F5F5;
 }
 
 h1, h2, h3, h4, h5, h6 {
     color: #363636;
     font-weight: bold;
-    margin-bottom: 24px;
+    margin-top: 20px;
+    margin-bottom: 10px;
     padding: 0;
 }
 
@@ -93,8 +94,8 @@ pre code {
     display: block;
     overflow-x: auto;
     padding: 0.5em;
-    border: 1px solid #D3D3D3;
     color: #363636;
+    background-color: #E0E0E0;
 }
 
 aside {

+ 4 - 3
src/resources/themes/v_white/v_white.css

@@ -3,13 +3,14 @@ body {
     font-family: Helvetica, sans-serif, Tahoma, Arial, Verdana, Geneva, Georgia, Palatino, "Times New Roman", "Hiragino Sans GB", "冬青黑体", "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "WenQuanYi Micro Hei", "文泉驿雅黑", Dengxian, "等线体", STXihei, "华文细黑", "Liberation Sans", "Droid Sans", NSimSun, "新宋体", SimSun, "宋体";
     color: #363636;
     line-height: 1;
-    padding: 30px;
+    padding: 15px;
 }
 
 h1, h2, h3, h4, h5, h6 {
     color: #363636;
     font-weight: bold;
-    margin-bottom: 24px;
+    margin-top: 20px;
+    margin-bottom: 10px;
     padding: 0;
 }
 
@@ -92,8 +93,8 @@ pre code {
     display: block;
     overflow-x: auto;
     padding: 0.5em;
-    border: 1px solid #C0C0C0;
     color: #363636;
+    background-color: #E0E0E0;
 }
 
 aside {

+ 1 - 1
src/utils/vclipboardutils.cpp

@@ -47,7 +47,7 @@ void VClipboardUtils::setMimeDataToClipboard(QClipboard *p_clipboard,
 #endif
 }
 
-static QMimeData *cloneMimeData(const QMimeData *p_mimeData)
+QMimeData *VClipboardUtils::cloneMimeData(const QMimeData *p_mimeData)
 {
     QMimeData *da = new QMimeData();
     if (p_mimeData->hasUrls()) {

+ 2 - 0
src/utils/vclipboardutils.h

@@ -18,6 +18,8 @@ public:
                                        QMimeData *p_mimeData,
                                        QClipboard::Mode p_mode = QClipboard::Clipboard);
 
+    static QMimeData *cloneMimeData(const QMimeData *p_mimeData);
+
 private:
     VClipboardUtils()
     {

+ 72 - 25
src/vwebview.cpp

@@ -10,6 +10,7 @@
 #include <QMimeData>
 #include <QApplication>
 #include <QImage>
+#include <QRegExp>
 #include "vfile.h"
 #include "utils/vclipboardutils.h"
 #include "utils/viconutils.h"
@@ -22,9 +23,12 @@ VWebView::VWebView(VFile *p_file, QWidget *p_parent)
     : QWebEngineView(p_parent),
       m_file(p_file),
       m_copyImageUrlActionHooked(false),
-      m_copyActionHooked(false)
+      m_needRemoveBackground(false)
 {
     setAcceptDrops(false);
+
+    connect(QApplication::clipboard(), &QClipboard::changed,
+            this, &VWebView::handleClipboardChanged);
 }
 
 void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
@@ -65,6 +69,18 @@ void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
         }
     }
 
+    // Add Copy without Background action.
+    QAction *copyAct = pageAction(QWebEnginePage::Copy);
+    if (actions.contains(copyAct)) {
+        QAction *copyWithoutBgAct = new QAction(tr("Copy &without Background"), menu);
+        copyWithoutBgAct->setToolTip(tr("Copy selected content without background styles"));
+        connect(copyWithoutBgAct, &QAction::triggered,
+                this, &VWebView::handleCopyWithoutBackgroundAction);
+        menu->insertAction(copyAct, copyWithoutBgAct);
+        menu->removeAction(copyAct);
+        menu->insertAction(copyWithoutBgAct, copyAct);
+    }
+
     // We need to replace the "Copy Image" action, because the default one use
     // the fully-encoded URL to fetch the image while Windows seems to not
     // recognize it.
@@ -195,38 +211,69 @@ void VWebView::hideUnusedActions(QMenu *p_menu)
     }
 }
 
-void VWebView::handleCopyAction()
+static bool removeBackgroundColor(QString &p_html)
 {
-    // To avoid failure of setting clipboard mime data.
-    QCoreApplication::processEvents();
+    QRegExp reg("(\\s|\")background(-color)?:[^;]+;");
+    int size = p_html.size();
+    p_html.replace(reg, "\\1");
+    return p_html.size() != size;
+}
+
+void VWebView::handleCopyWithoutBackgroundAction()
+{
+    m_needRemoveBackground = true;
+
+    QAction *copyAct = pageAction(QWebEnginePage::Copy);
+    copyAct->trigger();
+}
+
+void VWebView::handleClipboardChanged(QClipboard::Mode p_mode)
+{
+    bool removeBackground = m_needRemoveBackground;
+    m_needRemoveBackground = false;
+
+    if (!hasFocus()
+        || p_mode != QClipboard::Clipboard) {
+        return;
+    }
 
     QClipboard *clipboard = QApplication::clipboard();
     const QMimeData *mimeData = clipboard->mimeData();
-    clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), false);
-    qDebug() << clipboard->ownsClipboard() << mimeData->hasHtml();
-    if (clipboard->ownsClipboard()
-        && mimeData->hasHtml()) {
-        QString html = mimeData->html();
-        if (html.startsWith("<html>")) {
-            return;
-        }
+    if (!clipboard->ownsClipboard()) {
+        return;
+    }
 
-        html = QString("<html><body><!--StartFragment-->%1<!--EndFragment--></body></html>").arg(html);
+    alterHtmlMimeData(clipboard, mimeData, removeBackground);
+}
 
-        // Set new mime data.
-        QMimeData *data = new QMimeData();
-        data->setHtml(html);
+void VWebView::alterHtmlMimeData(QClipboard *p_clipboard,
+                                 const QMimeData *p_mimeData,
+                                 bool p_removeBackground)
+{
+    if (!p_mimeData->hasHtml()) {
+        return;
+    }
 
-        if (mimeData->hasUrls()) {
-            data->setUrls(mimeData->urls());
-        }
+    bool altered = false;
+    QString html = p_mimeData->html();
 
-        if (mimeData->hasText()) {
-            data->setText(mimeData->text());
-        }
+    if (!html.startsWith("<html>")) {
+        altered = true;
+        html = QString("<html><body>%1</body></html>").arg(html);
+    }
 
-        VClipboardUtils::setMimeDataToClipboard(clipboard, data, QClipboard::Clipboard);
-        clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), true);
-        qDebug() << "clipboard copy Html altered" << html;
+    if (p_removeBackground && removeBackgroundColor(html)) {
+        altered = true;
     }
+
+    if (!altered) {
+        return;
+    }
+
+    // Set new mime data.
+    QMimeData *data = VClipboardUtils::cloneMimeData(p_mimeData);
+    data->setHtml(html);
+
+    VClipboardUtils::setMimeDataToClipboard(p_clipboard, data, QClipboard::Clipboard);
+    qDebug() << "altered clipboard's Html";
 }

+ 9 - 2
src/vwebview.h

@@ -2,6 +2,7 @@
 #define VWEBVIEW_H
 
 #include <QWebEngineView>
+#include <QClipboard>
 
 class VFile;
 class QMenu;
@@ -24,21 +25,27 @@ private slots:
 
     void handleCopyImageUrlAction();
 
-    void handleCopyAction();
+    void handleCopyWithoutBackgroundAction();
 
     // Copy the clicked image.
     // Used to replace the default CopyImageToClipboard action.
     void copyImage();
 
+    void handleClipboardChanged(QClipboard::Mode p_mode);
+
 private:
     void hideUnusedActions(QMenu *p_menu);
 
+    void alterHtmlMimeData(QClipboard *p_clipboard,
+                           const QMimeData *p_mimeData,
+                           bool p_removeBackground);
+
     VFile *m_file;
 
     // Whether this view has hooked the Copy Image Url action.
     bool m_copyImageUrlActionHooked;
 
-    bool m_copyActionHooked;
+    bool m_needRemoveBackground;
 };
 
 #endif // VWEBVIEW_H