slate-react 0.57.2 → 0.57.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/editable.d.ts.map +1 -1
- package/dist/components/slate.d.ts.map +1 -1
- package/dist/index.es.js +146 -140
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +145 -139
- package/dist/index.js.map +1 -1
- package/dist/plugin/react-editor.d.ts +5 -0
- package/dist/plugin/react-editor.d.ts.map +1 -1
- package/dist/plugin/with-react.d.ts.map +1 -1
- package/dist/slate-react.js +159 -144
- package/dist/slate-react.min.js +1 -1
- package/dist/utils/dom.d.ts +7 -0
- package/dist/utils/dom.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/editable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;AACtE,OAAO,EAEL,OAAO,EACP,SAAS,EAET,KAAK,EACL,IAAI,EAEL,MAAM,OAAO,CAAA;AAiCd;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE;QACV,iBAAiB,EAAE,SAAS,CAAA;QAC5B,mBAAmB,CAAC,EAAE,IAAI,CAAA;QAC1B,iBAAiB,CAAC,EAAE,IAAI,CAAA;QACxB,GAAG,CAAC,EAAE,KAAK,CAAA;QACX,GAAG,EAAE,GAAG,CAAA;KACT,CAAA;CACF;AAED;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE;QACV,iBAAiB,EAAE,IAAI,CAAA;KACxB,CAAA;CACF;AAED;;GAEG;AAEH,oBAAY,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,CAAA;IACxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,GAAG,CAAC,OAAO,CAAA;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,GAAG,CAAC,OAAO,CAAA;IACpD,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;CACvB,GAAG,KAAK,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AAEhD;;GAEG;AAEH,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/editable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;AACtE,OAAO,EAEL,OAAO,EACP,SAAS,EAET,KAAK,EACL,IAAI,EAEL,MAAM,OAAO,CAAA;AAiCd;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE;QACV,iBAAiB,EAAE,SAAS,CAAA;QAC5B,mBAAmB,CAAC,EAAE,IAAI,CAAA;QAC1B,iBAAiB,CAAC,EAAE,IAAI,CAAA;QACxB,GAAG,CAAC,EAAE,KAAK,CAAA;QACX,GAAG,EAAE,GAAG,CAAA;KACT,CAAA;CACF;AAED;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE;QACV,iBAAiB,EAAE,IAAI,CAAA;KACxB,CAAA;CACF;AAED;;GAEG;AAEH,oBAAY,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,CAAA;IACxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,GAAG,CAAC,OAAO,CAAA;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,GAAG,CAAC,OAAO,CAAA;IACpD,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;CACvB,GAAG,KAAK,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AAEhD;;GAEG;AAEH,eAAO,MAAM,QAAQ,uCAs0BpB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slate.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/slate.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"slate.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/slate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAMpD;;;GAGG;AAEH,eAAO,MAAM,KAAK;;;;;;iBAqCjB,CAAA"}
|
package/dist/index.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { createContext, useContext, useState, useMemo, useCallback,
|
|
1
|
+
import React, { createContext, useContext, useState, useMemo, useCallback, useEffect, useLayoutEffect, useRef } from 'react';
|
|
2
2
|
import { Editor, Transforms, Range, Path, Node as Node$1, Text as Text$1, Element as Element$1 } from 'slate';
|
|
3
3
|
import throttle from 'lodash/throttle';
|
|
4
4
|
import scrollIntoView from 'scroll-into-view-if-needed';
|
|
@@ -209,6 +209,34 @@ var getEditableChild = (parent, index, direction) => {
|
|
|
209
209
|
|
|
210
210
|
return child;
|
|
211
211
|
};
|
|
212
|
+
/**
|
|
213
|
+
* Get a plaintext representation of the content of a node, accounting for block
|
|
214
|
+
* elements which get a newline appended.
|
|
215
|
+
*
|
|
216
|
+
* The domNode must be attached to the DOM.
|
|
217
|
+
*/
|
|
218
|
+
|
|
219
|
+
var getPlainText = domNode => {
|
|
220
|
+
var text = '';
|
|
221
|
+
|
|
222
|
+
if (isDOMText(domNode) && domNode.nodeValue) {
|
|
223
|
+
return domNode.nodeValue;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (isDOMElement(domNode)) {
|
|
227
|
+
for (var childNode of Array.from(domNode.childNodes)) {
|
|
228
|
+
text += getPlainText(childNode);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
var display = getComputedStyle(domNode).getPropertyValue('display');
|
|
232
|
+
|
|
233
|
+
if (display === 'block' || display === 'list' || domNode.tagName === 'BR') {
|
|
234
|
+
text += '\n';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return text;
|
|
239
|
+
};
|
|
212
240
|
|
|
213
241
|
var ReactEditor = {
|
|
214
242
|
/**
|
|
@@ -350,6 +378,13 @@ var ReactEditor = {
|
|
|
350
378
|
editor.insertData(data);
|
|
351
379
|
},
|
|
352
380
|
|
|
381
|
+
/**
|
|
382
|
+
* Sets data from the currently selected fragment on a `DataTransfer`.
|
|
383
|
+
*/
|
|
384
|
+
setFragmentData(editor, data) {
|
|
385
|
+
editor.setFragmentData(data);
|
|
386
|
+
},
|
|
387
|
+
|
|
353
388
|
/**
|
|
354
389
|
* Find the native DOM element from a Slate node.
|
|
355
390
|
*/
|
|
@@ -426,13 +461,21 @@ var ReactEditor = {
|
|
|
426
461
|
anchor,
|
|
427
462
|
focus
|
|
428
463
|
} = range;
|
|
464
|
+
var isBackward = Range.isBackward(range);
|
|
429
465
|
var domAnchor = ReactEditor.toDOMPoint(editor, anchor);
|
|
430
466
|
var domFocus = Range.isCollapsed(range) ? domAnchor : ReactEditor.toDOMPoint(editor, focus);
|
|
431
467
|
var domRange = window.document.createRange();
|
|
432
|
-
var
|
|
433
|
-
var
|
|
434
|
-
|
|
435
|
-
|
|
468
|
+
var [startNode, startOffset] = isBackward ? domFocus : domAnchor;
|
|
469
|
+
var [endNode, endOffset] = isBackward ? domAnchor : domFocus; // A slate Point at zero-width Leaf always has an offset of 0 but a native DOM selection at
|
|
470
|
+
// zero-width node has an offset of 1 so we have to check if we are in a zero-width node and
|
|
471
|
+
// adjust the offset accordingly.
|
|
472
|
+
|
|
473
|
+
var startEl = isDOMElement(startNode) ? startNode : startNode.parentElement;
|
|
474
|
+
var isStartAtZeroWidth = !!startEl.getAttribute('data-slate-zero-width');
|
|
475
|
+
var endEl = isDOMElement(endNode) ? endNode : endNode.parentElement;
|
|
476
|
+
var isEndAtZeroWidth = !!endEl.getAttribute('data-slate-zero-width');
|
|
477
|
+
domRange.setStart(startNode, isStartAtZeroWidth ? 1 : startOffset);
|
|
478
|
+
domRange.setEnd(endNode, isEndAtZeroWidth ? 1 : endOffset);
|
|
436
479
|
return domRange;
|
|
437
480
|
},
|
|
438
481
|
|
|
@@ -705,6 +748,11 @@ var Slate = props => {
|
|
|
705
748
|
setKey(key + 1);
|
|
706
749
|
}, [key, onChange]);
|
|
707
750
|
EDITOR_TO_ON_CHANGE.set(editor, onContextChange);
|
|
751
|
+
useEffect(() => {
|
|
752
|
+
return () => {
|
|
753
|
+
EDITOR_TO_ON_CHANGE.set(editor, () => {});
|
|
754
|
+
};
|
|
755
|
+
}, []);
|
|
708
756
|
return React.createElement(SlateContext.Provider, {
|
|
709
757
|
value: context
|
|
710
758
|
}, React.createElement(EditorContext.Provider, {
|
|
@@ -794,6 +842,91 @@ var withReact = editor => {
|
|
|
794
842
|
}
|
|
795
843
|
};
|
|
796
844
|
|
|
845
|
+
e.setFragmentData = data => {
|
|
846
|
+
var {
|
|
847
|
+
selection
|
|
848
|
+
} = e;
|
|
849
|
+
|
|
850
|
+
if (!selection) {
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
var [start, end] = Range.edges(selection);
|
|
855
|
+
var startVoid = Editor.void(e, {
|
|
856
|
+
at: start.path
|
|
857
|
+
});
|
|
858
|
+
var endVoid = Editor.void(e, {
|
|
859
|
+
at: end.path
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
if (Range.isCollapsed(selection) && !startVoid) {
|
|
863
|
+
return;
|
|
864
|
+
} // Create a fake selection so that we can add a Base64-encoded copy of the
|
|
865
|
+
// fragment to the HTML, to decode on future pastes.
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
var domRange = ReactEditor.toDOMRange(e, selection);
|
|
869
|
+
var contents = domRange.cloneContents();
|
|
870
|
+
var attach = contents.childNodes[0]; // Make sure attach is non-empty, since empty nodes will not get copied.
|
|
871
|
+
|
|
872
|
+
contents.childNodes.forEach(node => {
|
|
873
|
+
if (node.textContent && node.textContent.trim() !== '') {
|
|
874
|
+
attach = node;
|
|
875
|
+
}
|
|
876
|
+
}); // COMPAT: If the end node is a void node, we need to move the end of the
|
|
877
|
+
// range from the void node's spacer span, to the end of the void node's
|
|
878
|
+
// content, since the spacer is before void's content in the DOM.
|
|
879
|
+
|
|
880
|
+
if (endVoid) {
|
|
881
|
+
var [voidNode] = endVoid;
|
|
882
|
+
var r = domRange.cloneRange();
|
|
883
|
+
var domNode = ReactEditor.toDOMNode(e, voidNode);
|
|
884
|
+
r.setEndAfter(domNode);
|
|
885
|
+
contents = r.cloneContents();
|
|
886
|
+
} // COMPAT: If the start node is a void node, we need to attach the encoded
|
|
887
|
+
// fragment to the void node's content node instead of the spacer, because
|
|
888
|
+
// attaching it to empty `<div>/<span>` nodes will end up having it erased by
|
|
889
|
+
// most browsers. (2018/04/27)
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
if (startVoid) {
|
|
893
|
+
attach = contents.querySelector('[data-slate-spacer]');
|
|
894
|
+
} // Remove any zero-width space spans from the cloned DOM so that they don't
|
|
895
|
+
// show up elsewhere when pasted.
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
Array.from(contents.querySelectorAll('[data-slate-zero-width]')).forEach(zw => {
|
|
899
|
+
var isNewline = zw.getAttribute('data-slate-zero-width') === 'n';
|
|
900
|
+
zw.textContent = isNewline ? '\n' : '';
|
|
901
|
+
}); // Set a `data-slate-fragment` attribute on a non-empty node, so it shows up
|
|
902
|
+
// in the HTML, and can be used for intra-Slate pasting. If it's a text
|
|
903
|
+
// node, wrap it in a `<span>` so we have something to set an attribute on.
|
|
904
|
+
|
|
905
|
+
if (isDOMText(attach)) {
|
|
906
|
+
var span = document.createElement('span'); // COMPAT: In Chrome and Safari, if we don't add the `white-space` style
|
|
907
|
+
// then leading and trailing spaces will be ignored. (2017/09/21)
|
|
908
|
+
|
|
909
|
+
span.style.whiteSpace = 'pre';
|
|
910
|
+
span.appendChild(attach);
|
|
911
|
+
contents.appendChild(span);
|
|
912
|
+
attach = span;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
var fragment = e.getFragment();
|
|
916
|
+
var string = JSON.stringify(fragment);
|
|
917
|
+
var encoded = window.btoa(encodeURIComponent(string));
|
|
918
|
+
attach.setAttribute('data-slate-fragment', encoded);
|
|
919
|
+
data.setData('application/x-slate-fragment', encoded); // Add the content to a <div> so that we can get its inner HTML.
|
|
920
|
+
|
|
921
|
+
var div = document.createElement('div');
|
|
922
|
+
div.appendChild(contents);
|
|
923
|
+
div.setAttribute('hidden', 'true');
|
|
924
|
+
document.body.appendChild(div);
|
|
925
|
+
data.setData('text/html', div.innerHTML);
|
|
926
|
+
data.setData('text/plain', getPlainText(div));
|
|
927
|
+
document.body.removeChild(div);
|
|
928
|
+
};
|
|
929
|
+
|
|
797
930
|
e.insertData = data => {
|
|
798
931
|
var fragment = data.getData('application/x-slate-fragment');
|
|
799
932
|
|
|
@@ -1401,11 +1534,10 @@ var Editable = props => {
|
|
|
1401
1534
|
|
|
1402
1535
|
if (!selection && !hasDomSelection) {
|
|
1403
1536
|
return;
|
|
1404
|
-
}
|
|
1537
|
+
} // If the DOM selection is already correct, we're done.
|
|
1405
1538
|
|
|
1406
|
-
var newDomRange = selection && ReactEditor.toDOMRange(editor, selection); // If the DOM selection is already correct, we're done.
|
|
1407
1539
|
|
|
1408
|
-
if (hasDomSelection &&
|
|
1540
|
+
if (hasDomSelection && selection && Range.equals(ReactEditor.toSlateRange(editor, domSelection), selection)) {
|
|
1409
1541
|
return;
|
|
1410
1542
|
} // Otherwise the DOM selection is out of sync, so update it.
|
|
1411
1543
|
|
|
@@ -1413,6 +1545,7 @@ var Editable = props => {
|
|
|
1413
1545
|
var el = ReactEditor.toDOMNode(editor, editor);
|
|
1414
1546
|
state.isUpdatingSelection = true;
|
|
1415
1547
|
domSelection.removeAllRanges();
|
|
1548
|
+
var newDomRange = selection && ReactEditor.toDOMRange(editor, selection);
|
|
1416
1549
|
|
|
1417
1550
|
if (newDomRange) {
|
|
1418
1551
|
domSelection.addRange(newDomRange);
|
|
@@ -1616,7 +1749,6 @@ var Editable = props => {
|
|
|
1616
1749
|
} = window.document;
|
|
1617
1750
|
var el = ReactEditor.toDOMNode(editor, editor);
|
|
1618
1751
|
var domSelection = window.getSelection();
|
|
1619
|
-
var domRange = domSelection && domSelection.rangeCount > 0 && domSelection.getRangeAt(0);
|
|
1620
1752
|
|
|
1621
1753
|
if (activeElement === el) {
|
|
1622
1754
|
state.latestElement = activeElement;
|
|
@@ -1625,8 +1757,8 @@ var Editable = props => {
|
|
|
1625
1757
|
IS_FOCUSED.delete(editor);
|
|
1626
1758
|
}
|
|
1627
1759
|
|
|
1628
|
-
if (
|
|
1629
|
-
var range = ReactEditor.toSlateRange(editor,
|
|
1760
|
+
if (domSelection && hasEditableTarget(editor, domSelection.anchorNode) && hasEditableTarget(editor, domSelection.focusNode)) {
|
|
1761
|
+
var range = ReactEditor.toSlateRange(editor, domSelection);
|
|
1630
1762
|
Transforms.select(editor, range);
|
|
1631
1763
|
} else {
|
|
1632
1764
|
Transforms.deselect(editor);
|
|
@@ -1771,13 +1903,13 @@ var Editable = props => {
|
|
|
1771
1903
|
onCopy: useCallback(event => {
|
|
1772
1904
|
if (hasEditableTarget(editor, event.target) && !isEventHandled(event, attributes.onCopy)) {
|
|
1773
1905
|
event.preventDefault();
|
|
1774
|
-
setFragmentData(event.clipboardData
|
|
1906
|
+
ReactEditor.setFragmentData(editor, event.clipboardData);
|
|
1775
1907
|
}
|
|
1776
1908
|
}, [attributes.onCopy]),
|
|
1777
1909
|
onCut: useCallback(event => {
|
|
1778
1910
|
if (!readOnly && hasEditableTarget(editor, event.target) && !isEventHandled(event, attributes.onCut)) {
|
|
1779
1911
|
event.preventDefault();
|
|
1780
|
-
setFragmentData(event.clipboardData
|
|
1912
|
+
ReactEditor.setFragmentData(editor, event.clipboardData);
|
|
1781
1913
|
var {
|
|
1782
1914
|
selection
|
|
1783
1915
|
} = editor;
|
|
@@ -1813,7 +1945,7 @@ var Editable = props => {
|
|
|
1813
1945
|
Transforms.select(editor, range);
|
|
1814
1946
|
}
|
|
1815
1947
|
|
|
1816
|
-
setFragmentData(event.dataTransfer
|
|
1948
|
+
ReactEditor.setFragmentData(editor, event.dataTransfer);
|
|
1817
1949
|
}
|
|
1818
1950
|
}, [attributes.onDragStart]),
|
|
1819
1951
|
onDrop: useCallback(event => {
|
|
@@ -2094,14 +2226,6 @@ var Editable = props => {
|
|
|
2094
2226
|
*/
|
|
2095
2227
|
|
|
2096
2228
|
var defaultDecorate = () => [];
|
|
2097
|
-
/**
|
|
2098
|
-
* Check if two DOM range objects are equal.
|
|
2099
|
-
*/
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
var isRangeEqual = (a, b) => {
|
|
2103
|
-
return a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset === b.endOffset || a.startContainer === b.endContainer && a.startOffset === b.endOffset && a.endContainer === b.startContainer && a.endOffset === b.startOffset;
|
|
2104
|
-
};
|
|
2105
2229
|
/**
|
|
2106
2230
|
* Check if the target is in the editor.
|
|
2107
2231
|
*/
|
|
@@ -2146,124 +2270,6 @@ var isDOMEventHandled = (event, handler) => {
|
|
|
2146
2270
|
handler(event);
|
|
2147
2271
|
return event.defaultPrevented;
|
|
2148
2272
|
};
|
|
2149
|
-
/**
|
|
2150
|
-
* Set the currently selected fragment to the clipboard.
|
|
2151
|
-
*/
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
var setFragmentData = (dataTransfer, editor) => {
|
|
2155
|
-
var {
|
|
2156
|
-
selection
|
|
2157
|
-
} = editor;
|
|
2158
|
-
|
|
2159
|
-
if (!selection) {
|
|
2160
|
-
return;
|
|
2161
|
-
}
|
|
2162
|
-
|
|
2163
|
-
var [start, end] = Range.edges(selection);
|
|
2164
|
-
var startVoid = Editor.void(editor, {
|
|
2165
|
-
at: start.path
|
|
2166
|
-
});
|
|
2167
|
-
var endVoid = Editor.void(editor, {
|
|
2168
|
-
at: end.path
|
|
2169
|
-
});
|
|
2170
|
-
|
|
2171
|
-
if (Range.isCollapsed(selection) && !startVoid) {
|
|
2172
|
-
return;
|
|
2173
|
-
} // Create a fake selection so that we can add a Base64-encoded copy of the
|
|
2174
|
-
// fragment to the HTML, to decode on future pastes.
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
var domRange = ReactEditor.toDOMRange(editor, selection);
|
|
2178
|
-
var contents = domRange.cloneContents();
|
|
2179
|
-
var attach = contents.childNodes[0]; // Make sure attach is non-empty, since empty nodes will not get copied.
|
|
2180
|
-
|
|
2181
|
-
contents.childNodes.forEach(node => {
|
|
2182
|
-
if (node.textContent && node.textContent.trim() !== '') {
|
|
2183
|
-
attach = node;
|
|
2184
|
-
}
|
|
2185
|
-
}); // COMPAT: If the end node is a void node, we need to move the end of the
|
|
2186
|
-
// range from the void node's spacer span, to the end of the void node's
|
|
2187
|
-
// content, since the spacer is before void's content in the DOM.
|
|
2188
|
-
|
|
2189
|
-
if (endVoid) {
|
|
2190
|
-
var [voidNode] = endVoid;
|
|
2191
|
-
var r = domRange.cloneRange();
|
|
2192
|
-
var domNode = ReactEditor.toDOMNode(editor, voidNode);
|
|
2193
|
-
r.setEndAfter(domNode);
|
|
2194
|
-
contents = r.cloneContents();
|
|
2195
|
-
} // COMPAT: If the start node is a void node, we need to attach the encoded
|
|
2196
|
-
// fragment to the void node's content node instead of the spacer, because
|
|
2197
|
-
// attaching it to empty `<div>/<span>` nodes will end up having it erased by
|
|
2198
|
-
// most browsers. (2018/04/27)
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
if (startVoid) {
|
|
2202
|
-
attach = contents.querySelector('[data-slate-spacer]');
|
|
2203
|
-
} // Remove any zero-width space spans from the cloned DOM so that they don't
|
|
2204
|
-
// show up elsewhere when pasted.
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
Array.from(contents.querySelectorAll('[data-slate-zero-width]')).forEach(zw => {
|
|
2208
|
-
var isNewline = zw.getAttribute('data-slate-zero-width') === 'n';
|
|
2209
|
-
zw.textContent = isNewline ? '\n' : '';
|
|
2210
|
-
}); // Set a `data-slate-fragment` attribute on a non-empty node, so it shows up
|
|
2211
|
-
// in the HTML, and can be used for intra-Slate pasting. If it's a text
|
|
2212
|
-
// node, wrap it in a `<span>` so we have something to set an attribute on.
|
|
2213
|
-
|
|
2214
|
-
if (isDOMText(attach)) {
|
|
2215
|
-
var span = document.createElement('span'); // COMPAT: In Chrome and Safari, if we don't add the `white-space` style
|
|
2216
|
-
// then leading and trailing spaces will be ignored. (2017/09/21)
|
|
2217
|
-
|
|
2218
|
-
span.style.whiteSpace = 'pre';
|
|
2219
|
-
span.appendChild(attach);
|
|
2220
|
-
contents.appendChild(span);
|
|
2221
|
-
attach = span;
|
|
2222
|
-
}
|
|
2223
|
-
|
|
2224
|
-
var fragment = Node$1.fragment(editor, selection);
|
|
2225
|
-
var string = JSON.stringify(fragment);
|
|
2226
|
-
var encoded = window.btoa(encodeURIComponent(string));
|
|
2227
|
-
attach.setAttribute('data-slate-fragment', encoded);
|
|
2228
|
-
dataTransfer.setData('application/x-slate-fragment', encoded); // Add the content to a <div> so that we can get its inner HTML.
|
|
2229
|
-
|
|
2230
|
-
var div = document.createElement('div');
|
|
2231
|
-
div.appendChild(contents);
|
|
2232
|
-
div.setAttribute('hidden', 'true');
|
|
2233
|
-
document.body.appendChild(div);
|
|
2234
|
-
dataTransfer.setData('text/html', div.innerHTML);
|
|
2235
|
-
dataTransfer.setData('text/plain', getPlainText(div));
|
|
2236
|
-
document.body.removeChild(div);
|
|
2237
|
-
};
|
|
2238
|
-
/**
|
|
2239
|
-
* Get a plaintext representation of the content of a node, accounting for block
|
|
2240
|
-
* elements which get a newline appended.
|
|
2241
|
-
*
|
|
2242
|
-
* The domNode must be attached to the DOM.
|
|
2243
|
-
*/
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
var getPlainText = domNode => {
|
|
2247
|
-
var text = '';
|
|
2248
|
-
|
|
2249
|
-
if (isDOMText(domNode) && domNode.nodeValue) {
|
|
2250
|
-
return domNode.nodeValue;
|
|
2251
|
-
}
|
|
2252
|
-
|
|
2253
|
-
if (isDOMElement(domNode)) {
|
|
2254
|
-
for (var childNode of Array.from(domNode.childNodes)) {
|
|
2255
|
-
text += getPlainText(childNode);
|
|
2256
|
-
}
|
|
2257
|
-
|
|
2258
|
-
var display = getComputedStyle(domNode).getPropertyValue('display');
|
|
2259
|
-
|
|
2260
|
-
if (display === 'block' || display === 'list' || domNode.tagName === 'BR') {
|
|
2261
|
-
text += '\n';
|
|
2262
|
-
}
|
|
2263
|
-
}
|
|
2264
|
-
|
|
2265
|
-
return text;
|
|
2266
|
-
};
|
|
2267
2273
|
|
|
2268
2274
|
export { DefaultElement, DefaultLeaf, Editable, ReactEditor, Slate, useEditor, useFocused, useReadOnly, useSelected, useSlate, withReact };
|
|
2269
2275
|
//# sourceMappingURL=index.es.js.map
|