From 7986ebe475a7c685795a5c65973a6898b746ed13 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Thu, 28 Dec 2017 19:27:39 +0800 Subject: [PATCH] VWebView: alter copied Html in VWebView to paste correctly in OneNote --- .../themes/v_moonlight/v_moonlight.css | 7 +- src/resources/themes/v_pure/v_pure.css | 7 +- src/resources/themes/v_white/v_white.css | 7 +- src/utils/vclipboardutils.cpp | 2 +- src/utils/vclipboardutils.h | 2 + src/vwebview.cpp | 107 +++++++++++++----- src/vwebview.h | 11 +- 7 files changed, 101 insertions(+), 42 deletions(-) diff --git a/src/resources/themes/v_moonlight/v_moonlight.css b/src/resources/themes/v_moonlight/v_moonlight.css index cbd9d548..bc6eb452 100644 --- a/src/resources/themes/v_moonlight/v_moonlight.css +++ b/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 { diff --git a/src/resources/themes/v_pure/v_pure.css b/src/resources/themes/v_pure/v_pure.css index 58d1a79f..098a3d0b 100644 --- a/src/resources/themes/v_pure/v_pure.css +++ b/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 { diff --git a/src/resources/themes/v_white/v_white.css b/src/resources/themes/v_white/v_white.css index 94194520..75f3b40b 100644 --- a/src/resources/themes/v_white/v_white.css +++ b/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 { diff --git a/src/utils/vclipboardutils.cpp b/src/utils/vclipboardutils.cpp index b330e62c..c6c04121 100644 --- a/src/utils/vclipboardutils.cpp +++ b/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()) { diff --git a/src/utils/vclipboardutils.h b/src/utils/vclipboardutils.h index e82838ba..1e5beda9 100644 --- a/src/utils/vclipboardutils.h +++ b/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() { diff --git a/src/vwebview.cpp b/src/vwebview.cpp index 9f0cb101..814c9eaa 100644 --- a/src/vwebview.cpp +++ b/src/vwebview.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #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("")) { - return; - } - - html = QString("%1").arg(html); - - // Set new mime data. - QMimeData *data = new QMimeData(); - data->setHtml(html); - - if (mimeData->hasUrls()) { - data->setUrls(mimeData->urls()); - } - - if (mimeData->hasText()) { - data->setText(mimeData->text()); - } - - VClipboardUtils::setMimeDataToClipboard(clipboard, data, QClipboard::Clipboard); - clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), true); - qDebug() << "clipboard copy Html altered" << html; + if (!clipboard->ownsClipboard()) { + return; } + + alterHtmlMimeData(clipboard, mimeData, removeBackground); +} + +void VWebView::alterHtmlMimeData(QClipboard *p_clipboard, + const QMimeData *p_mimeData, + bool p_removeBackground) +{ + if (!p_mimeData->hasHtml()) { + return; + } + + bool altered = false; + QString html = p_mimeData->html(); + + if (!html.startsWith("")) { + altered = true; + html = QString("%1").arg(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"; } diff --git a/src/vwebview.h b/src/vwebview.h index 22d06a6f..c6e8ea36 100644 --- a/src/vwebview.h +++ b/src/vwebview.h @@ -2,6 +2,7 @@ #define VWEBVIEW_H #include +#include 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