slate-react
Advanced tools
Comparing version 0.10.20 to 0.10.21
@@ -6,3 +6,3 @@ 'use strict'; | ||
}); | ||
exports.setEventTransfer = exports.getEventTransfer = exports.getEventRange = exports.findRange = exports.findNode = exports.findDOMRange = exports.findDOMNode = exports.Editor = undefined; | ||
exports.setEventTransfer = exports.getEventTransfer = exports.getEventRange = exports.findRange = exports.findNode = exports.findDOMRange = exports.findDOMNode = exports.cloneFragment = exports.Editor = undefined; | ||
@@ -13,2 +13,6 @@ var _editor = require('./components/editor'); | ||
var _cloneFragment = require('./utils/clone-fragment'); | ||
var _cloneFragment2 = _interopRequireDefault(_cloneFragment); | ||
var _findDomNode = require('./utils/find-dom-node'); | ||
@@ -51,2 +55,3 @@ | ||
exports.Editor = _editor2.default; | ||
exports.cloneFragment = _cloneFragment2.default; | ||
exports.findDOMNode = _findDomNode2.default; | ||
@@ -61,2 +66,3 @@ exports.findDOMRange = _findDomRange2.default; | ||
Editor: _editor2.default, | ||
cloneFragment: _cloneFragment2.default, | ||
findDOMNode: _findDomNode2.default, | ||
@@ -63,0 +69,0 @@ findDOMRange: _findDomRange2.default, |
@@ -43,2 +43,6 @@ 'use strict'; | ||
var _cloneFragment = require('../utils/clone-fragment'); | ||
var _cloneFragment2 = _interopRequireDefault(_cloneFragment); | ||
var _findDomNode = require('../utils/find-dom-node'); | ||
@@ -72,4 +76,2 @@ | ||
var _environment = require('../constants/environment'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -162,3 +164,3 @@ | ||
onCutOrCopy(event, change); | ||
(0, _cloneFragment2.default)(event, change.value); | ||
} | ||
@@ -177,3 +179,3 @@ | ||
onCutOrCopy(event, change); | ||
(0, _cloneFragment2.default)(event, change.value); | ||
var window = (0, _getWindow2.default)(event.target); | ||
@@ -211,132 +213,2 @@ | ||
/** | ||
* On cut or copy. | ||
* | ||
* @param {Event} event | ||
* @param {Change} change | ||
* @param {Editor} editor | ||
*/ | ||
function onCutOrCopy(event, change, editor) { | ||
var window = (0, _getWindow2.default)(event.target); | ||
var native = window.getSelection(); | ||
var value = change.value; | ||
var startKey = value.startKey, | ||
endKey = value.endKey, | ||
startText = value.startText, | ||
endBlock = value.endBlock, | ||
endInline = value.endInline; | ||
var isVoidBlock = endBlock && endBlock.isVoid; | ||
var isVoidInline = endInline && endInline.isVoid; | ||
var isVoid = isVoidBlock || isVoidInline; | ||
// If the selection is collapsed, and it isn't inside a void node, abort. | ||
if (native.isCollapsed && !isVoid) return; | ||
// Create a fake selection so that we can add a Base64-encoded copy of the | ||
// fragment to the HTML, to decode on future pastes. | ||
var fragment = value.fragment; | ||
var encoded = _slateBase64Serializer2.default.serializeNode(fragment); | ||
var range = native.getRangeAt(0); | ||
var contents = range.cloneContents(); | ||
var attach = contents.childNodes[0]; | ||
// If the end node is a void node, we need to move the end of the range from | ||
// the void node's spacer span, to the end of the void node's content. | ||
if (isVoid) { | ||
var _r = range.cloneRange(); | ||
var n = isVoidBlock ? endBlock : endInline; | ||
var node = (0, _findDomNode2.default)(n, window); | ||
_r.setEndAfter(node); | ||
contents = _r.cloneContents(); | ||
attach = contents.childNodes[contents.childNodes.length - 1].firstChild; | ||
} | ||
// COMPAT: in Safari and Chrome when selecting a single marked word, | ||
// marks are not preserved when copying. | ||
// If the attatched is not void, and the startKey and endKey is the same, | ||
// check if there is marks involved. If so, set the range start just before the | ||
// startText node | ||
if ((_environment.IS_CHROME || _environment.IS_SAFARI) && !isVoid && startKey === endKey) { | ||
var hasMarks = startText.characters.slice(value.selection.anchorOffset, value.selection.focusOffset).filter(function (char) { | ||
return char.marks.size !== 0; | ||
}).size !== 0; | ||
if (hasMarks) { | ||
var _r2 = range.cloneRange(); | ||
var _node = (0, _findDomNode2.default)(startText, window); | ||
_r2.setStartBefore(_node); | ||
contents = _r2.cloneContents(); | ||
attach = contents.childNodes[contents.childNodes.length - 1].firstChild; | ||
} | ||
} | ||
// Remove any zero-width space spans from the cloned DOM so that they don't | ||
// show up elsewhere when pasted. | ||
var zws = [].slice.call(contents.querySelectorAll('[data-slate-zero-width]')); | ||
zws.forEach(function (zw) { | ||
return zw.parentNode.removeChild(zw); | ||
}); | ||
// COMPAT: In Chrome and Safari, if the last element in the selection to | ||
// copy has `contenteditable="false"` the copy will fail, and nothing will | ||
// be put in the clipboard. So we remove them all. (2017/05/04) | ||
if (_environment.IS_CHROME || _environment.IS_SAFARI) { | ||
var els = [].slice.call(contents.querySelectorAll('[contenteditable="false"]')); | ||
els.forEach(function (el) { | ||
return el.removeAttribute('contenteditable'); | ||
}); | ||
} | ||
// Set a `data-slate-fragment` attribute on a non-empty node, so it shows up | ||
// in the HTML, and can be used for intra-Slate pasting. If it's a text | ||
// node, wrap it in a `<span>` so we have something to set an attribute on. | ||
if (attach.nodeType == 3) { | ||
var span = window.document.createElement('span'); | ||
// COMPAT: In Chrome and Safari, if we don't add the `white-space` style | ||
// then leading and trailing spaces will be ignored. (2017/09/21) | ||
span.style.whiteSpace = 'pre'; | ||
span.appendChild(attach); | ||
contents.appendChild(span); | ||
attach = span; | ||
} | ||
attach.setAttribute('data-slate-fragment', encoded); | ||
// Add the phony content to the DOM, and select it, so it will be copied. | ||
var body = window.document.querySelector('body'); | ||
var div = window.document.createElement('div'); | ||
div.setAttribute('contenteditable', true); | ||
div.style.position = 'absolute'; | ||
div.style.left = '-9999px'; | ||
// COMPAT: In Firefox, the viewport jumps to find the phony div, so it | ||
// should be created at the current scroll offset with `style.top`. | ||
// The box model attributes which can interact with 'top' are also reset. | ||
div.style.border = '0px'; | ||
div.style.padding = '0px'; | ||
div.style.margin = '0px'; | ||
div.style.top = (window.pageYOffset || window.document.documentElement.scrollTop) + 'px'; | ||
div.appendChild(contents); | ||
body.appendChild(div); | ||
// COMPAT: In Firefox, trying to use the terser `native.selectAllChildren` | ||
// throws an error, so we use the older `range` equivalent. (2016/06/21) | ||
var r = window.document.createRange(); | ||
r.selectNodeContents(div); | ||
native.removeAllRanges(); | ||
native.addRange(r); | ||
// Revert to the previous selection right after copying. | ||
window.requestAnimationFrame(function () { | ||
body.removeChild(div); | ||
native.removeAllRanges(); | ||
native.addRange(range); | ||
}); | ||
} | ||
/** | ||
* On drag end. | ||
@@ -343,0 +215,0 @@ * |
@@ -15,2 +15,4 @@ 'use strict'; | ||
var _environment = require('../constants/environment'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -85,10 +87,18 @@ | ||
// https://bugs.chromium.org/p/chromium/issues/detail?id=435438 | ||
if (range.collapsed && selectionRect.top == 0 && selectionRect.height == 0) { | ||
if (range.startOffset == 0) { | ||
range.setEnd(range.endContainer, 1); | ||
} else { | ||
range.setStart(range.startContainer, range.startOffset - 1); | ||
if (_environment.IS_SAFARI) { | ||
if (range.collapsed && selectionRect.top == 0 && selectionRect.height == 0) { | ||
if (range.startOffset == 0) { | ||
range.setEnd(range.endContainer, 1); | ||
} else { | ||
range.setStart(range.startContainer, range.startOffset - 1); | ||
} | ||
selectionRect = range.getBoundingClientRect(); | ||
if (selectionRect.top == 0 && selectionRect.height == 0) { | ||
if (range.getClientRects().length) { | ||
selectionRect = range.getClientRects()[0]; | ||
} | ||
} | ||
} | ||
selectionRect = range.getBoundingClientRect(); | ||
} | ||
@@ -95,0 +105,0 @@ |
{ | ||
"name": "slate-react", | ||
"description": "A set of React components for building completely customizable rich-text editors.", | ||
"version": "0.10.20", | ||
"version": "0.10.21", | ||
"license": "MIT", | ||
@@ -20,6 +20,6 @@ "repository": "git://github.com/ianstormtaylor/slate.git", | ||
"selection-is-backward": "^1.0.0", | ||
"slate-base64-serializer": "^0.2.15", | ||
"slate-base64-serializer": "^0.2.16", | ||
"slate-dev-logger": "^0.1.36", | ||
"slate-plain-serializer": "^0.4.13", | ||
"slate-prop-types": "^0.4.13" | ||
"slate-plain-serializer": "^0.4.14", | ||
"slate-prop-types": "^0.4.14" | ||
}, | ||
@@ -29,3 +29,3 @@ "peerDependencies": { | ||
"react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0", | ||
"slate": "^0.31.5" | ||
"slate": "^0.31.6" | ||
}, | ||
@@ -36,5 +36,5 @@ "devDependencies": { | ||
"mocha": "^2.5.3", | ||
"slate": "^0.31.5", | ||
"slate-hyperscript": "^0.4.13", | ||
"slate-simulator": "^0.4.13", | ||
"slate": "^0.31.6", | ||
"slate-hyperscript": "^0.4.14", | ||
"slate-simulator": "^0.4.14", | ||
"uglify-js": "^2.7.0" | ||
@@ -41,0 +41,0 @@ }, |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
776147
34
15818