From 33bbe102511030996d64391aa1fed025144787d8 Mon Sep 17 00:00:00 2001 From: largeden Date: Wed, 8 Jul 2020 20:45:45 +0900 Subject: [PATCH] =?UTF-8?q?https://github.com/rhymix/rhymix/issues/1244=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=20iOS=2013.5.1=EC=97=90=EC=84=9C=20=ED=95=9C?= =?UTF-8?q?=EA=B8=80=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=EC=97=94=ED=84=B0?= =?UTF-8?q?=ED=82=A4=20=ED=98=B8=ED=99=98=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ckeditor/plugins/ios_enterkey/plugin.js | 138 +++++++++++++++--- 1 file changed, 120 insertions(+), 18 deletions(-) diff --git a/common/js/plugins/ckeditor/ckeditor/plugins/ios_enterkey/plugin.js b/common/js/plugins/ckeditor/ckeditor/plugins/ios_enterkey/plugin.js index cb2921cf8..8eaf74580 100644 --- a/common/js/plugins/ckeditor/ckeditor/plugins/ios_enterkey/plugin.js +++ b/common/js/plugins/ckeditor/ckeditor/plugins/ios_enterkey/plugin.js @@ -3,22 +3,124 @@ * * https://github.com/rhymix/rhymix/issues/932 */ -CKEDITOR.plugins.add( 'ios_enterkey', -{ - icons: 'ios_enterkey', - init: function(editor) - { - editor.on('contentDom', function() - { - var editable = editor.editable(); - editable.attachListener(editable, 'keyup', function(e) - { - if(e.data.getKey() === 13) - { - $(editor.document.$).find('.cke_wysiwyg_div').blur(); - $(editor.document.$).find('.cke_wysiwyg_div').focus(); - } - }); - }); - } +CKEDITOR.plugins.add( 'ios_enterkey', { + icons: 'ios_enterkey', + init: function(editor) { + editor.setKeystroke( [ + [ 13, '' ], + [ CKEDITOR.SHIFT + 13, '' ] + ] ); + + editor.on('contentDom', function() { + var selection; + var bookmarks; + var range; + var data; + var shift = false; + + var editable = editor.editable(); + editable.attachListener(editable, 'keyup', function(e) { + + if(e.data.getKey() === 13) { + var eventData = { + dataValue: data + }; + editor.fire( 'afterSetData', eventData ); + + range.moveToBookmark(bookmarks[0]); + range.collapse( true ); + range.select(); + + if(shift) { + shiftEnter(editor); + } else { + enter(editor); + } + + shift = false; + } + }); + + editable.attachListener(editable, 'keydown', function(e) { + if(e.data.getKey() === 13) { + selection = editor.getSelection(); + bookmarks = selection.createBookmarks(true); + data = editor.getData(); + range = selection.getRanges()[0]; + + if(e.data.$.shiftKey) shift = true; + } + }); + }); + + plugin = CKEDITOR.plugins.enterkey; + enterBr = plugin.enterBr; + enterBlock = plugin.enterBlock; + headerTagRegex = /^h[1-6]$/; + + function shiftEnter( editor ) { + // On SHIFT+ENTER: + // 1. We want to enforce the mode to be respected, instead + // of cloning the current block. (https://dev.ckeditor.com/ticket/77) + return enter( editor, editor.activeShiftEnterMode, 1 ); + } + + function enter( editor, mode, forceMode ) { + forceMode = editor.config.forceEnterMode || forceMode; + + // Only effective within document. + if ( editor.mode != 'wysiwyg' ) + return; + + if ( !mode ) + mode = editor.activeEnterMode; + + // TODO this should be handled by setting editor.activeEnterMode on selection change. + // Check path block specialities: + // 1. Cannot be a un-splittable element, e.g. table caption; + var path = editor.elementPath(); + + if ( path && !path.isContextFor( 'p' ) ) { + mode = CKEDITOR.ENTER_BR; + forceMode = 1; + } + + editor.fire( 'saveSnapshot' ); // Save undo step. + + if ( mode == CKEDITOR.ENTER_BR ) + enterBr( editor, mode, null, forceMode ); + else + enterBlock( editor, mode, null, forceMode ); + + editor.fire( 'saveSnapshot' ); + } + + function getRange( editor ) { + // Get the selection ranges. + var ranges = editor.getSelection().getRanges( true ); + + // Delete the contents of all ranges except the first one. + for ( var i = ranges.length - 1; i > 0; i-- ) { + ranges[ i ].deleteContents(); + } + + // Return the first range. + return ranges[ 0 ]; + } + + function replaceRangeWithClosestEditableRoot( range ) { + var closestEditable = range.startContainer.getAscendant( function( node ) { + return node.type == CKEDITOR.NODE_ELEMENT && node.getAttribute( 'contenteditable' ) == 'true'; + }, true ); + + if ( range.root.equals( closestEditable ) ) { + return range; + } else { + var newRange = new CKEDITOR.dom.range( closestEditable ); + + newRange.moveToRange( range ); + return newRange; + } + } + } });