0
Fork 0
mirror of https://github.com/fastmail/Squire.git synced 2024-12-22 23:40:35 -05:00
Commit graph

434 commits

Author SHA1 Message Date
Neil Jenkins
b0ac7d32d0 Handle all cases of overwriting content
Modern browsers tell you which character will be inserted with event.key, so
we can make sure we handle content deletion ourselves in these cases too.
2018-03-18 10:40:03 +00:00
Neil Jenkins
9dda7cc845 Fix FF does not leave <a> on space 2018-03-18 10:34:12 +00:00
Neil Jenkins
070f2e52a3 Support pasting images in Edge 2017-12-13 16:43:43 +11:00
Neil Jenkins
50fb7c7c53 Preserve block style if pasting on blank line
If the clipboard contains block contents, e.g.

<blockquote><p>Foo</p></blockquote>

Then if you paste it into a block that already has content we merge the inline
content from the first block and discard its surrounding block.

However, if you paste into an empty block, we'll now keep the block and remove
the empty one in the document. This seems a reasonable heuristic for determining
user intent.
2017-11-01 10:45:21 +11:00
Neil Jenkins
306230d0df Better handling of <pre>
* Pasting <pre> should not attempt to merge with block.
* Hitting enter should produce a new <pre>, otherwise all new lines after the
  break are lost.
2017-09-05 11:42:54 +10:00
Neil Jenkins
033370ebee Don't try to merge table cell into block on paste 2017-09-04 10:22:49 +10:00
Neil Jenkins
c5be1b79dc Fix broken variable reference 2017-08-17 14:12:29 +10:00
Neil Jenkins
833d7dfdbd New (increase|decrease)ListLevel algorithms
Fixes #287
2017-08-15 11:11:48 +10:00
Neil Jenkins
6842cb94eb Fix undo does not always restore cursor position.
If the content hasn't changed before an undo point is requested we ignore the
request, but the cursor position may have changed and users expect undo to
restore the cursor position immediately before the requested change was made.

So in this instance we now still record an undo state, but replace the previous
one if the content is unchanged.
2017-07-19 14:29:36 +02:00
Neil Jenkins
48fabd491a Improved algorithm for inserting tree into range
Fixes #283
2017-07-19 14:29:16 +02:00
Neil Jenkins
239b7d19e9 Ignore saved selection if not in document
The browser will rewrite the range if the nodes it refers to are removed from
the document, so check that it's still in the document before returning.
2017-07-07 11:48:42 +10:00
Neil Jenkins
0ae8322d04 Code tidying 2017-07-07 11:32:37 +10:00
Neil Jenkins
0b59a746f7 Ignore selectionchange events outside of editor
The selectionchange event handler can only be registered on the document
but we are not interested in changes of focus/selection that happen
outside of the editor, so check we have focus before firing the update
path event.
2017-07-07 11:32:18 +10:00
Neil Jenkins
a8f07d9adb Default to allowing URIs with unknown protocols 2017-06-28 16:03:31 +10:00
Neil Jenkins
601043f020 Fire a 'cursor' event so selection end can be monitored 2017-06-21 17:03:14 +10:00
Neil Jenkins
283a7d1d85 Don't consider editor focused if sub-element focused
Fixes #267
2017-05-10 14:22:56 +10:00
Neil Jenkins
632aae016b Code style fixup 2017-05-10 14:00:28 +10:00
kyuwoo.choi
9eacfb7b22 fix: handle insert table by CF_HTML
ms html clipboard format CF_HTML handles table like below if we copy part of table.
it makes problem when copying table from ms product such as ie, excel, powerpoint then pasting to squire.

<TABLE BORDER>
<!--StartFragment-->
<TR><TD>Item 6</TD><TD>Item 7</TD></TR><TR><TD>Item 10</TD><TD>Item 11</TD></TR>
<!--EndFragment-->
</TABLE>

and

<TABLE BORDER><TR>
<!--StartFragment-->
<TD>Item</TD>
<!--EndFragment-->
</TR></TABLE>

https://msdn.microsoft.com/en-us/library/windows/desktop/ms649015(v=vs.85).aspx
#274
2017-05-10 13:59:30 +10:00
Neil Jenkins
bb593e879a Don't insert <br> inside end of <a> on enter
Fixes #271
2017-03-21 17:06:44 +11:00
Neil Jenkins
70a2b48333 Return cached selection if not focused
If an action modifies the selection while the editor is not focused, we cannot
immediately set it in the DOM as this triggers focus. So instead we cache it and
restore on focus. If getSelection is called before the editor is next focused,
we need to return this new selection, not the current DOM selection.

Fixes #259
2017-02-11 09:40:56 -08:00
Neil Jenkins
45fee4c858 Fix potential infinite loop on cut
Common ancestor of range may change while range is manipulated for deletion.
2017-01-19 17:08:39 +11:00
Neil Jenkins
9596f4ecf8 Ensure moving boundaries up tree never passes root 2017-01-13 15:15:59 +11:00
Neil Jenkins
79ffc02557 Unify cut and copy implementations
* Data added to clipboard should now always be the same for cut as for copy
* Fixes bug when cutting across blocks, where not all parents would be included
  in the data added to the clipboard
2017-01-13 10:24:01 +11:00
Neil Jenkins
6f83f23881 Fix delete behaviour
1. Fixes cursor position when deleting starting with a selection at beginning
   of block.
2. Fixes block disappears when whole inline contents is deleted.
2017-01-10 10:06:28 +11:00
Neil Jenkins
066bdd2cde Ignore "cut" if no selection 2017-01-10 10:05:56 +11:00
Neil Jenkins
e645489f5f Fix empty lines missing when copying plain text 2017-01-10 10:05:35 +11:00
Neil Jenkins
e35ad32c09 Fix potential null deref when sanitizing html 2016-12-13 12:15:35 +11:00
Neil Jenkins
c1c63478f0 Check for queued events before disconnecting mutation observer
Fixes #252
2016-12-12 10:35:14 +11:00
Neil Jenkins
3d8cd62edb Improve copying of plain text on windows 2016-12-11 12:32:25 +11:00
Steven Allen
fcb8a4a63c
Use class constants 2016-12-08 21:03:50 -08:00
Neil Jenkins
2c7f7b907c Fix copying when not inside valid doc structure 2016-12-09 10:42:18 +11:00
Neil Jenkins
30dc11fd3c If deleting range to start/end of doc, collapse into a block 2016-12-09 10:41:52 +11:00
Steven Allen
9dcac8c94e Never pass null as root. 2016-12-08 13:11:52 -08:00
Neil Jenkins
65a621abcf null arg to setText(Alignment|Direction) should reset value
Resolves #247
2016-12-07 19:22:28 +11:00
Neil Jenkins
a899c001eb Fix null deref in insertHTML 2016-12-07 19:08:52 +11:00
Neil Jenkins
bb40d03899 Export useful Node helper functions 2016-12-07 18:42:48 +11:00
Neil Jenkins
504b40c857 Add pointer from root node to Squire instance.
Resolves #253
2016-12-07 17:54:13 +11:00
Neil Jenkins
9fac7ffdb6 Make HTML sanitization configurable.
And default to sanitizing setHTML content as well.
2016-12-07 17:24:16 +11:00
Neil Jenkins
801388222d Fix pasting plain text when not first item 2016-11-21 10:59:44 +11:00
Neil Jenkins
0b72f29ce5 Don't bother caching text node category 2016-11-21 10:59:11 +11:00
Neil Jenkins
f46dee1255 Memoize node category with weak map
Fix horrendous performance of isInline etc.
2016-11-15 11:07:15 +11:00
Neil Jenkins
8ab95e0dac Reset ignoreChange flag in modifyDocument method
Resolves #245
2016-11-04 11:17:31 +11:00
Neil Jenkins
c656be7e65 Fix copying plain text in Firefox
Resolves #244
2016-11-02 15:32:06 +11:00
Neil Jenkins
e517f1505b Fix converting OL <-> UL 2016-10-19 14:45:17 +11:00
selvan
23375d4422 Preserve 'bold' font style while copy & pasting from Google Docs. Google docs uses numeric value 700 as font-weight for bold instead of string value 'bold' 2016-09-29 11:37:25 +05:30
selvan
68618b1e5d Preserve cell width while copy & pasting from Goolgle Sheet - added COLGROUP and COL as part of 'allowedBlock' regex 2016-09-29 11:36:14 +05:30
Neil Jenkins
5f8bd2d935 Treat nbsp as content when cleaning DOM tree.
Fixes #240.
2016-09-28 12:02:29 +10:00
Neil Jenkins
0fa4a9b587 Replace block node when creating list
So you get:

<li>Text</li>

instead of

<li><p>Text</p></li>
2016-09-27 06:06:42 +04:00
Islam Sharabash
6a9582c7e7 Allowing arbitrary nesting for bullets
This allows any level of indentation for bullets. It does this by introducing
invalid HTML. In particular, you can make bullets like:

<ul>
  <ul>
    <li>foo</li>
  </ul>
</ul>
2016-09-27 05:50:59 +04:00
Neil Jenkins
4f83b0a8bc Treat inline tags as containers in malformed HTML
Fixes #239.
2016-09-26 11:37:38 +01:00
Neil Jenkins
d8239d2570 Skip placeholder BRs when moving range up/down tree 2016-09-25 21:43:47 +01:00
Neil Jenkins
78b638f79b Ensure root node is never returned by get(Start|End)BlockOfRange
Fixes #237
2016-09-22 09:44:03 +01:00
Neil Jenkins
e1d30b7082 Fix error when copying inline text-only. 2016-09-10 09:24:14 -04:00
Neil Jenkins
26b71dee8e Fix copying inline styles when selection not on boundary.
Resolves #219 properly this time.
2016-09-09 12:14:57 -04:00
Neil Jenkins
9aacad6e3c Make Shift-Ctrl-V paste as plain text.
Fixes #230.
2016-09-04 20:58:49 -04:00
Neil Jenkins
cbde7a9198 Always preserve inline formatting on copy
Fixes #219.
2016-09-04 20:44:36 -04:00
Neil Jenkins
25ff83455e Exports some useful internal functions
This is a rebase/slight tidy of #226.
2016-08-23 20:59:38 +10:00
Islam Sharabash
ead3ea9f39 Fix bug where TIME element was not being counted as inline
This makes inline node detection count the TIME element as an inline element.
This was causing <br> to be inserted into a TIME element incorrectly via fixCursor.
2016-08-22 13:16:05 -07:00
Neil Jenkins
aae328e226 Ensure valid DOM tree is added to clipboard on copy
Fixes #204.
2016-08-10 16:24:13 +10:00
Neil Jenkins
aaaae70504 Tidy code. 2016-08-05 20:49:44 +10:00
Andy Kauffman
6e1b864663 Remove Unneeded ZWS
ZWS are added when formats are added, however these are not cleaned up
if the format is changed. Now they will be cleaned up if they only
contain ZWS and no text.
2016-08-05 20:48:24 +10:00
Neil Jenkins
1a797aca48 Merge pull request #218 from nhnent/leafNodeNames-are-configurable
leafNodeNames are configurable
2016-08-05 20:37:12 +10:00
Sungho Kim
b83d071666 leafNodeNames are configurable 2016-07-27 16:59:15 +09:00
Sungho Kim
c3d4d551ed Fix MSIE detection regex 2016-07-27 16:33:06 +09:00
Sungho Kim
96b03d4aaf Fire focus or blur event manually in focus/blur method for MSIE because
MSIE invoke focus/blur event listener asynchronously
2016-07-27 16:15:42 +09:00
Neil Jenkins
df9b5add68 Explicit attributes should override defaults
Fixes #203
2016-07-16 16:51:24 +10:00
Neil Jenkins
766dea7ccf Merge inlines when inserting node into range 2016-07-14 12:15:06 +10:00
Neil Jenkins
13241028f1 Workaround Android hiding the keyboard on cut. 2016-07-14 11:32:38 +10:00
Neil Jenkins
d4abc182c8 If selection, delete contents before letting brower insert space
Fixes #213
2016-07-14 11:31:11 +10:00
Neil Jenkins
aaf84870aa Ensure focus after paste 2016-07-14 10:39:20 +10:00
Neil Jenkins
6ef4ad96e8 Fix whitespace 2016-07-07 16:11:45 +10:00
Andy Kauffman
964070ee46 Path contains format values
Add values of font size, font face, and color to the path. This allows
us to distinguish path changes to different formats.
2016-07-07 16:11:45 +10:00
Neil Jenkins
db09921d7b Fix multiple firing of updatePathOnEvent 2016-06-27 13:17:18 +10:00
Neil Jenkins
267085e8c1 Don't disable restore selection on input
The only time we don't want to restore selection is if the user explicitly
changes it, by clicking/touching a specific cursor point.

Fixes formatting commands in IE11, where the mutation event first between
calling editor.focus() and the focus event actually firing, rather than
after the focus event as in other browsers.
2016-06-27 12:05:40 +10:00
Neil Jenkins
f060dbf978 Restore selection of focus after call to setHTML. 2016-06-16 14:45:19 +10:00
Neil Jenkins
f593d8ac04 Enforce sane focus/blur events.
Because focus/blur events are fired synchonously, browsers can get confused if
UI code starts focusing other elements while inside a focus/blur handler, and
end up firing events in the wrong order which can cause infinite loops.

This change ensures we only get a focus/blur event when they really are
happening, and you always get one then the other.
2016-06-10 11:02:24 +10:00
Neil Jenkins
84ae8a05f5 Interpret null value for set font/size/colour methods correctly.
Removes any current formatting of the given type.
2016-06-08 15:38:13 +10:00
Neil Jenkins
048a7296b2 changeFormat should always return self. 2016-06-07 16:27:04 +10:00
Andy Kauffman
8eea926e2b Limit the undo stack size
Add an undo configuration.
If the document is larger than the configured threshold, then limit the
number of undo states that can be saved to the configured amount.
Defaults to no limit.

Merged for #200
2016-06-06 18:50:11 +10:00
Neil Jenkins
bd4d377cf0 Sanitise pasted HTML if DOMPurify library present.
This protects against malicious HTML being added to the clipboard, and also
removes unwanted content before insertion.

DOMPurify can be found at https://github.com/cure53/DOMPurify
2016-06-06 12:36:08 +10:00
Andy Kauffman
9dcc4fb79f Cleanup P and Underline tags
node.
2016-05-26 14:16:15 +10:00
Neil Jenkins
8b580ed988 Add undo checkpoint on drop.
Resolves #188.
2016-05-26 13:54:26 +10:00
Neil Jenkins
6deae3c188 Strip HTML surrounding copied fragment added by Edge.
Fixes #181
2016-05-26 13:09:49 +10:00
Neil Jenkins
7ecf75f246 Fix determining if at start of block when at end of doc
Fixes #190
2016-05-26 11:42:53 +10:00
Neil Jenkins
d225f384b7 Use selectionchange event if available.
Fixes #194.
2016-05-26 11:07:11 +10:00
Neil Jenkins
4354b46db9 Don't merge <a> tags.
Fixes #198
2016-05-26 10:33:18 +10:00
Neil Jenkins
aa3857ab77 Use default block config when inserting plain text 2016-05-25 12:41:57 +10:00
Andy Kauffman
4e7e290fbc Fix block boundary issue
If the node is at the end of the document, this method can fail with
'TypeError: Cannot read property 'previousSibling' of null'
2016-05-19 10:28:46 +10:00
Neil Jenkins
f7774c8cf3 Always save selection on blur.
Hopefully fixes #194
2016-05-18 18:07:55 +10:00
Neil Jenkins
1f4baefda4 Remove dragover/drop from custom events list.
Fixes #183
2016-05-05 12:22:56 +10:00
Neil Jenkins
6c4f8e1aaf Add support for default <a> attributes
Resolves #186.
2016-05-05 11:50:36 +10:00
Andy Kauffman
f50962db7f Add a modifyDocument method
There are certain times when it is necessary to modify the document
programmatically, such as to set attributes, add tooltips, etc. Such
edits should not be observed as inputs. This method allows edits to be
ignored by the editor.
2016-05-05 11:30:27 +10:00
Andy Kauffman
64ee5db293 insertElement should register as input for older browsers 2016-05-02 13:47:39 -04:00
Neil Jenkins
0f361d69c6 Add IFRAME to list of inline nodes.
Resolves #180.
2016-05-01 16:36:43 +10:00
Neil Jenkins
6a28aafd2f Add HR as a leaf node name. 2016-05-01 16:33:47 +10:00
Neil Jenkins
e3d0576a38 Workaround Facebook iOS URL copying bug 2016-04-11 16:58:13 +10:00
Neil Jenkins
44a2b5c7a8 Add guard for null nodes in insertTreeFragmentIntoRange 2016-04-08 17:42:47 +10:00
Neil Jenkins
66c0b20702 Squire: Fix possible error when deleting range 2016-04-07 13:08:45 +10:00
Neil Jenkins
d9122222b2 Restore range more accurately from bookmark 2016-03-30 16:39:04 +11:00
Neil Jenkins
ed44d72ca7 Add dragover and drop to custom events list
Since these are fired by the clipboard handler.
2016-03-30 13:23:47 +11:00