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

This commit is contained in:
Le Tan 2017-12-28 19:27:39 +08:00
parent 00d7f5e013
commit 7986ebe475
7 changed files with 101 additions and 42 deletions

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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()) {

View File

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

View File

@ -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;
}
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>")) {
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;
}
html = QString("<html><body><!--StartFragment-->%1<!--EndFragment--></body></html>").arg(html);
QClipboard *clipboard = QApplication::clipboard();
const QMimeData *mimeData = clipboard->mimeData();
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("<html>")) {
altered = true;
html = QString("<html><body>%1</body></html>").arg(html);
}
if (p_removeBackground && removeBackgroundColor(html)) {
altered = true;
}
if (!altered) {
return;
}
// Set new mime data.
QMimeData *data = new QMimeData();
QMimeData *data = VClipboardUtils::cloneMimeData(p_mimeData);
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;
}
VClipboardUtils::setMimeDataToClipboard(p_clipboard, data, QClipboard::Clipboard);
qDebug() << "altered clipboard's Html";
}

View File

@ -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