From 21b5cda70cb44b1a18b7774616545260fba4e969 Mon Sep 17 00:00:00 2001 From: Artur Delura Date: Fri, 17 Apr 2015 14:21:37 +0200 Subject: [PATCH 1/2] Simplified autocomplete process by using regexp. --- .../js/abstracttoolbarmodifier.js | 6 +- .../js/toolbartextmodifier.js | 85 ++++++++++--------- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js b/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js index 87e882debc3..2707883b419 100644 --- a/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js +++ b/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js @@ -342,8 +342,10 @@ if ( !Object.keys ) { var btns = that.editorInstance.ui.instances; for ( var i in btns ) { - btns[ i ].click = empty; - btns[ i ].onClick = empty; + if ( btns[ i ] ) { + btns[ i ].click = empty; + btns[ i ].onClick = empty; + } } if ( !that.isEditableVisible ) { diff --git a/samples/toolbarconfigurator/js/toolbartextmodifier.js b/samples/toolbarconfigurator/js/toolbartextmodifier.js index f3d3287f347..079a9829a14 100644 --- a/samples/toolbarconfigurator/js/toolbartextmodifier.js +++ b/samples/toolbarconfigurator/js/toolbartextmodifier.js @@ -82,8 +82,13 @@ ].join( '' ); function hint( cm ) { - var data = setupData( cm ), - unused = that.getUnusedButtonsArray( that.actualConfig.toolbar, true, data.charsBetween ), + var data = setupData( cm ); + + if ( data.charsBetween === null ) { + return; + } + + var unused = that.getUnusedButtonsArray( that.actualConfig.toolbar, true, data.charsBetween ), to = cm.getCursor(), from = CodeMirror.Pos( to.line, ( to.ch - ( data.charsBetween.length ) ) ), token = cm.getTokenAt( to ), @@ -109,16 +114,6 @@ this._handlers = []; } - function completeIfNeeded( character ) { - return function completeIfNeeded( cm ) { - return complete( cm, function() { - var data = setupData( cm, character ); - - return data.closestSpecialChar !== character; - }, character ); - }; - } - function setupData( cm, character ) { var result = {}; @@ -127,34 +122,45 @@ result[ 'char' ] = character || result.tok.string.charAt( result.tok.string.length - 1 ); - var curLineTillCur = cm.getRange( CodeMirror.Pos( result.cur.line, 0 ), result.cur ), - currLineTillCurReversed = curLineTillCur.split( '' ).reverse().join( '' ), - closestSpecialCharIndex = currLineTillCurReversed.search( /"|'|\{|\}|\[|\]|,|\:/ ); + // Getting string between begin of line and cursor. + var curLineTillCur = cm.getRange( CodeMirror.Pos( result.cur.line, 0 ), result.cur ); - closestSpecialCharIndex = ( closestSpecialCharIndex == -1 ? -1 : curLineTillCur.length - 1 - closestSpecialCharIndex ); - result.closestSpecialChar = curLineTillCur.charAt( closestSpecialCharIndex ); + // Reverse string. + var currLineTillCurReversed = curLineTillCur.split( '' ).reverse().join( '' ); - //characters between cursor and special character - result.charsBetween = curLineTillCur.substring( closestSpecialCharIndex + 1, result.cur.ch )/* + result.char*/; + // Removing proper string definitions : + // FROM: + // R' ,'odeR' ,'odnU' [ :smeti{ + // ^^^^^^ ^^^^^^ + // TO: + // R' , [ :smeti{ + currLineTillCurReversed = currLineTillCurReversed.replace( /(['|"]\w*['|"])/g, '' ); - return result; - } - - function complete( cm, pred, character ) { - var permitted = ( typeof pred === 'function' ? pred( cm, character ) : true ); + // Matching letters till ' or " character and end string char. + // R' , [ :smeti{ + // ^ + result.charsBetween = currLineTillCurReversed.match( /(^\w*)(['|"])/ ); - if ( permitted ) { - setTimeout( function() { - if ( !cm.state.completionActive ) { - CodeMirror.showHint( cm, hint, { - hintsClass: 'toolbar-modifier', - completeSingle: false - } ); - } + if ( result.charsBetween ) { + result.endChar = result.charsBetween[ 2 ]; - }, 100 ); + // And reverse string (bring to original state). + result.charsBetween = result.charsBetween[ 1 ].split( '' ).reverse().join( '' ); } + return result; + } + + function complete( cm ) { + setTimeout( function() { + if ( !cm.state.completionActive ) { + CodeMirror.showHint( cm, hint, { + hintsClass: 'toolbar-modifier', + completeSingle: false + } ); + } + }, 100 ); + return CodeMirror.Pass; } @@ -174,11 +180,12 @@ indentWithTabs: true, theme: 'neo', extraKeys: { - 'Ctrl-Space': complete, - "'''": completeIfNeeded( "'" ), - "'\"'": completeIfNeeded( '"' ), - Backspace: completeIfNeeded( '"' ), - Delete: completeIfNeeded( '"' ), + 'Left': complete, + 'Right': complete, + "'''": complete, + "'\"'": complete, + Backspace: complete, + Delete: complete, Tab: false, 'Shift-Tab': false } @@ -192,7 +199,7 @@ if ( completionData === undefined ) return; - cm.replaceSelection( data.closestSpecialChar ); + cm.replaceSelection( data.endChar ); } ); this.codeContainer.on( 'change', function() { From 687e1a9de8b168652ac5885d55b64d869b2ce4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?= Date: Mon, 4 May 2015 10:48:17 +0200 Subject: [PATCH 2/2] Changelog entry. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index d38e9bac89a..fc06722fbb6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Fixed Issues: * Toolbar configurators: * [#13185](http://dev.ckeditor.com/ticket/13185): Fixed: Wrong position of the suggestion box if there is not enough space below the caret. * [#13138](http://dev.ckeditor.com/ticket/13138): Fixed: The "Toggle empty elements" button label is unclear. + * [#13136](http://dev.ckeditor.com/ticket/13136): Fixed: Autocompleter is far too intrusive. ## CKEditor 4.5 Beta