0
Fork 0
mirror of https://github.com/fastmail/Squire.git synced 2024-12-22 07:13:08 -05:00

Make Shift-Ctrl-V paste as plain text.

Fixes #230.
This commit is contained in:
Neil Jenkins 2016-09-04 20:58:49 -04:00
parent cbde7a9198
commit 9aacad6e3c
4 changed files with 40 additions and 22 deletions

View file

@ -2150,14 +2150,21 @@ var onCopy = function ( event ) {
} }
}; };
// Need to monitor for shift key like this, as event.shiftKey is not available
// in paste event.
function monitorShiftKey ( event ) {
this.isShiftDown = event.shiftKey;
}
var onPaste = function ( event ) { var onPaste = function ( event ) {
var clipboardData = event.clipboardData, var clipboardData = event.clipboardData;
items = clipboardData && clipboardData.items, var items = clipboardData && clipboardData.items;
fireDrop = false, var choosePlain = this.isShiftDown;
hasImage = false, var fireDrop = false;
plainItem = null, var hasImage = false;
self = this, var plainItem = null;
l, item, type, types, data; var self = this;
var l, item, type, types, data;
// Current HTML5 Clipboard interface // Current HTML5 Clipboard interface
// --------------------------------- // ---------------------------------
@ -2170,7 +2177,7 @@ var onPaste = function ( event ) {
while ( l-- ) { while ( l-- ) {
item = items[l]; item = items[l];
type = item.type; type = item.type;
if ( type === 'text/html' ) { if ( !choosePlain && type === 'text/html' ) {
/*jshint loopfunc: true */ /*jshint loopfunc: true */
item.getAsString( function ( html ) { item.getAsString( function ( html ) {
self.insertHTML( html, true ); self.insertHTML( html, true );
@ -2181,7 +2188,7 @@ var onPaste = function ( event ) {
if ( type === 'text/plain' ) { if ( type === 'text/plain' ) {
plainItem = item; plainItem = item;
} }
if ( /^image\/.*/.test( type ) ) { if ( !choosePlain && /^image\/.*/.test( type ) ) {
hasImage = true; hasImage = true;
} }
} }
@ -2233,7 +2240,7 @@ var onPaste = function ( event ) {
// insert plain text instead. On iOS, Facebook (and possibly other // insert plain text instead. On iOS, Facebook (and possibly other
// apps?) copy links as type text/uri-list, but also insert a **blank** // apps?) copy links as type text/uri-list, but also insert a **blank**
// text/plain item onto the clipboard. Why? Who knows. // text/plain item onto the clipboard. Why? Who knows.
if (( data = clipboardData.getData( 'text/html' ) )) { if ( !choosePlain && ( data = clipboardData.getData( 'text/html' ) ) ) {
this.insertHTML( data, true ); this.insertHTML( data, true );
} else if ( } else if (
( data = clipboardData.getData( 'text/plain' ) ) || ( data = clipboardData.getData( 'text/plain' ) ) ||
@ -2434,6 +2441,8 @@ function Squire ( root, config ) {
this._awaitingPaste = false; this._awaitingPaste = false;
this.addEventListener( isIElt11 ? 'beforecut' : 'cut', onCut ); this.addEventListener( isIElt11 ? 'beforecut' : 'cut', onCut );
this.addEventListener( 'copy', onCopy ); this.addEventListener( 'copy', onCopy );
this.addEventListener( 'keydown', monitorShiftKey );
this.addEventListener( 'keyup', monitorShiftKey );
this.addEventListener( isIElt11 ? 'beforepaste' : 'paste', onPaste ); this.addEventListener( isIElt11 ? 'beforepaste' : 'paste', onPaste );
this.addEventListener( 'drop', onDrop ); this.addEventListener( 'drop', onDrop );

File diff suppressed because one or more lines are too long

View file

@ -71,14 +71,21 @@ var onCopy = function ( event ) {
} }
}; };
// Need to monitor for shift key like this, as event.shiftKey is not available
// in paste event.
function monitorShiftKey ( event ) {
this.isShiftDown = event.shiftKey;
}
var onPaste = function ( event ) { var onPaste = function ( event ) {
var clipboardData = event.clipboardData, var clipboardData = event.clipboardData;
items = clipboardData && clipboardData.items, var items = clipboardData && clipboardData.items;
fireDrop = false, var choosePlain = this.isShiftDown;
hasImage = false, var fireDrop = false;
plainItem = null, var hasImage = false;
self = this, var plainItem = null;
l, item, type, types, data; var self = this;
var l, item, type, types, data;
// Current HTML5 Clipboard interface // Current HTML5 Clipboard interface
// --------------------------------- // ---------------------------------
@ -91,7 +98,7 @@ var onPaste = function ( event ) {
while ( l-- ) { while ( l-- ) {
item = items[l]; item = items[l];
type = item.type; type = item.type;
if ( type === 'text/html' ) { if ( !choosePlain && type === 'text/html' ) {
/*jshint loopfunc: true */ /*jshint loopfunc: true */
item.getAsString( function ( html ) { item.getAsString( function ( html ) {
self.insertHTML( html, true ); self.insertHTML( html, true );
@ -102,7 +109,7 @@ var onPaste = function ( event ) {
if ( type === 'text/plain' ) { if ( type === 'text/plain' ) {
plainItem = item; plainItem = item;
} }
if ( /^image\/.*/.test( type ) ) { if ( !choosePlain && /^image\/.*/.test( type ) ) {
hasImage = true; hasImage = true;
} }
} }
@ -154,7 +161,7 @@ var onPaste = function ( event ) {
// insert plain text instead. On iOS, Facebook (and possibly other // insert plain text instead. On iOS, Facebook (and possibly other
// apps?) copy links as type text/uri-list, but also insert a **blank** // apps?) copy links as type text/uri-list, but also insert a **blank**
// text/plain item onto the clipboard. Why? Who knows. // text/plain item onto the clipboard. Why? Who knows.
if (( data = clipboardData.getData( 'text/html' ) )) { if ( !choosePlain && ( data = clipboardData.getData( 'text/html' ) ) ) {
this.insertHTML( data, true ); this.insertHTML( data, true );
} else if ( } else if (
( data = clipboardData.getData( 'text/plain' ) ) || ( data = clipboardData.getData( 'text/plain' ) ) ||

View file

@ -103,6 +103,8 @@ function Squire ( root, config ) {
this._awaitingPaste = false; this._awaitingPaste = false;
this.addEventListener( isIElt11 ? 'beforecut' : 'cut', onCut ); this.addEventListener( isIElt11 ? 'beforecut' : 'cut', onCut );
this.addEventListener( 'copy', onCopy ); this.addEventListener( 'copy', onCopy );
this.addEventListener( 'keydown', monitorShiftKey );
this.addEventListener( 'keyup', monitorShiftKey );
this.addEventListener( isIElt11 ? 'beforepaste' : 'paste', onPaste ); this.addEventListener( isIElt11 ? 'beforepaste' : 'paste', onPaste );
this.addEventListener( 'drop', onDrop ); this.addEventListener( 'drop', onDrop );