mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
VWebView: alter copied Html in VWebView to paste correctly in OneNote
This commit is contained in:
parent
00d7f5e013
commit
7986ebe475
@ -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, "宋体";
|
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;
|
color: #ABB2BF;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 30px;
|
padding: 15px;
|
||||||
background: #282C34;
|
background: #282C34;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
color: #E06C75;
|
color: #E06C75;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 24px;
|
margin-top: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,8 +94,8 @@ pre code {
|
|||||||
display: block;
|
display: block;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
border: 1px solid #373E47;
|
|
||||||
color: #98C379;
|
color: #98C379;
|
||||||
|
background-color: #2C313A;
|
||||||
}
|
}
|
||||||
|
|
||||||
aside {
|
aside {
|
||||||
|
@ -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, "宋体";
|
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;
|
color: #363636;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 30px;
|
padding: 15px;
|
||||||
background: #F5F5F5;
|
background: #F5F5F5;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
color: #363636;
|
color: #363636;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 24px;
|
margin-top: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,8 +94,8 @@ pre code {
|
|||||||
display: block;
|
display: block;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
border: 1px solid #D3D3D3;
|
|
||||||
color: #363636;
|
color: #363636;
|
||||||
|
background-color: #E0E0E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
aside {
|
aside {
|
||||||
|
@ -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, "宋体";
|
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;
|
color: #363636;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 30px;
|
padding: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
color: #363636;
|
color: #363636;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
margin-bottom: 24px;
|
margin-top: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,8 +93,8 @@ pre code {
|
|||||||
display: block;
|
display: block;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
border: 1px solid #C0C0C0;
|
|
||||||
color: #363636;
|
color: #363636;
|
||||||
|
background-color: #E0E0E0;
|
||||||
}
|
}
|
||||||
|
|
||||||
aside {
|
aside {
|
||||||
|
@ -47,7 +47,7 @@ void VClipboardUtils::setMimeDataToClipboard(QClipboard *p_clipboard,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static QMimeData *cloneMimeData(const QMimeData *p_mimeData)
|
QMimeData *VClipboardUtils::cloneMimeData(const QMimeData *p_mimeData)
|
||||||
{
|
{
|
||||||
QMimeData *da = new QMimeData();
|
QMimeData *da = new QMimeData();
|
||||||
if (p_mimeData->hasUrls()) {
|
if (p_mimeData->hasUrls()) {
|
||||||
|
@ -18,6 +18,8 @@ public:
|
|||||||
QMimeData *p_mimeData,
|
QMimeData *p_mimeData,
|
||||||
QClipboard::Mode p_mode = QClipboard::Clipboard);
|
QClipboard::Mode p_mode = QClipboard::Clipboard);
|
||||||
|
|
||||||
|
static QMimeData *cloneMimeData(const QMimeData *p_mimeData);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VClipboardUtils()
|
VClipboardUtils()
|
||||||
{
|
{
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QImage>
|
#include <QImage>
|
||||||
|
#include <QRegExp>
|
||||||
#include "vfile.h"
|
#include "vfile.h"
|
||||||
#include "utils/vclipboardutils.h"
|
#include "utils/vclipboardutils.h"
|
||||||
#include "utils/viconutils.h"
|
#include "utils/viconutils.h"
|
||||||
@ -22,9 +23,12 @@ VWebView::VWebView(VFile *p_file, QWidget *p_parent)
|
|||||||
: QWebEngineView(p_parent),
|
: QWebEngineView(p_parent),
|
||||||
m_file(p_file),
|
m_file(p_file),
|
||||||
m_copyImageUrlActionHooked(false),
|
m_copyImageUrlActionHooked(false),
|
||||||
m_copyActionHooked(false)
|
m_needRemoveBackground(false)
|
||||||
{
|
{
|
||||||
setAcceptDrops(false);
|
setAcceptDrops(false);
|
||||||
|
|
||||||
|
connect(QApplication::clipboard(), &QClipboard::changed,
|
||||||
|
this, &VWebView::handleClipboardChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
|
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
|
// 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
|
// the fully-encoded URL to fetch the image while Windows seems to not
|
||||||
// recognize it.
|
// 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.
|
QRegExp reg("(\\s|\")background(-color)?:[^;]+;");
|
||||||
QCoreApplication::processEvents();
|
int size = p_html.size();
|
||||||
|
p_html.replace(reg, "\\1");
|
||||||
|
return p_html.size() != size;
|
||||||
|
}
|
||||||
|
|
||||||
QClipboard *clipboard = QApplication::clipboard();
|
void VWebView::handleCopyWithoutBackgroundAction()
|
||||||
const QMimeData *mimeData = clipboard->mimeData();
|
{
|
||||||
clipboard->setProperty(c_ClipboardPropertyMark.toLatin1(), false);
|
m_needRemoveBackground = true;
|
||||||
qDebug() << clipboard->ownsClipboard() << mimeData->hasHtml();
|
|
||||||
if (clipboard->ownsClipboard()
|
QAction *copyAct = pageAction(QWebEnginePage::Copy);
|
||||||
&& mimeData->hasHtml()) {
|
copyAct->trigger();
|
||||||
QString html = mimeData->html();
|
}
|
||||||
if (html.startsWith("<html>")) {
|
|
||||||
|
void VWebView::handleClipboardChanged(QClipboard::Mode p_mode)
|
||||||
|
{
|
||||||
|
bool removeBackground = m_needRemoveBackground;
|
||||||
|
m_needRemoveBackground = false;
|
||||||
|
|
||||||
|
if (!hasFocus()
|
||||||
|
|| p_mode != QClipboard::Clipboard) {
|
||||||
return;
|
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.
|
// Set new mime data.
|
||||||
QMimeData *data = new QMimeData();
|
QMimeData *data = VClipboardUtils::cloneMimeData(p_mimeData);
|
||||||
data->setHtml(html);
|
data->setHtml(html);
|
||||||
|
|
||||||
if (mimeData->hasUrls()) {
|
VClipboardUtils::setMimeDataToClipboard(p_clipboard, data, QClipboard::Clipboard);
|
||||||
data->setUrls(mimeData->urls());
|
qDebug() << "altered clipboard's Html";
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define VWEBVIEW_H
|
#define VWEBVIEW_H
|
||||||
|
|
||||||
#include <QWebEngineView>
|
#include <QWebEngineView>
|
||||||
|
#include <QClipboard>
|
||||||
|
|
||||||
class VFile;
|
class VFile;
|
||||||
class QMenu;
|
class QMenu;
|
||||||
@ -24,21 +25,27 @@ private slots:
|
|||||||
|
|
||||||
void handleCopyImageUrlAction();
|
void handleCopyImageUrlAction();
|
||||||
|
|
||||||
void handleCopyAction();
|
void handleCopyWithoutBackgroundAction();
|
||||||
|
|
||||||
// Copy the clicked image.
|
// Copy the clicked image.
|
||||||
// Used to replace the default CopyImageToClipboard action.
|
// Used to replace the default CopyImageToClipboard action.
|
||||||
void copyImage();
|
void copyImage();
|
||||||
|
|
||||||
|
void handleClipboardChanged(QClipboard::Mode p_mode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void hideUnusedActions(QMenu *p_menu);
|
void hideUnusedActions(QMenu *p_menu);
|
||||||
|
|
||||||
|
void alterHtmlMimeData(QClipboard *p_clipboard,
|
||||||
|
const QMimeData *p_mimeData,
|
||||||
|
bool p_removeBackground);
|
||||||
|
|
||||||
VFile *m_file;
|
VFile *m_file;
|
||||||
|
|
||||||
// Whether this view has hooked the Copy Image Url action.
|
// Whether this view has hooked the Copy Image Url action.
|
||||||
bool m_copyImageUrlActionHooked;
|
bool m_copyImageUrlActionHooked;
|
||||||
|
|
||||||
bool m_copyActionHooked;
|
bool m_needRemoveBackground;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VWEBVIEW_H
|
#endif // VWEBVIEW_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user