penguin/AstroJS

Javascript framework for my blog

commit 9faf2b492184cd4421ed155ccc612b0500655db7

author斟酌 鵬兄 <tgckpg@gmail.com>
date2016-03-30T12:11:48Z
subjectInputEvent carrying range
commit 9faf2b492184cd4421ed155ccc612b0500655db7
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2016-03-30T12:11:48Z

    InputEvent carrying range
---
 botanjs/src/Components/Vim/Controls.js             | 40 ++++++++++++++++------
 botanjs/src/Components/Vim/Syntax/Analyzer.js      |  2 +-
 botanjs/src/Components/Vim/Syntax/Word.js          |  8 ++---
 .../externs/Components.Vim.Controls.InputEvent.js  |  2 ++
 4 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/botanjs/src/Components/Vim/Controls.js b/botanjs/src/Components/Vim/Controls.js
index 76f9bd0..29e86c4 100644
--- a/botanjs/src/Components/Vim/Controls.js
+++ b/botanjs/src/Components/Vim/Controls.js
@@ -128,7 +128,7 @@
 		this.__ccur = this.__cfeeder.cursor;
 	};
 
-	Controls.prototype.__comp = function( kCode, handler )
+	Controls.prototype.__comp = function( e, handler )
 	{
 		if( handler )
 		{
@@ -141,6 +141,8 @@
 			return true;
 		}
 
+		var kCode = e.keyCode;
+
 		for( var i = 0; i < this.__compReg.length; i ++ )
 		{
 			var compReg = this.__compReg[i];
@@ -150,7 +152,7 @@
 			{
 				if( compReg.i == keys.length )
 				{
-					compReg.handler();
+					compReg.handler( e );
 					this.__compReg = null;
 					this.__cMovement = false;
 				}
@@ -249,7 +251,7 @@
 		{
 			if( !e.ModKeys )
 			{
-				this.__comp( kCode );
+				this.__comp( e );
 				return true;
 			}
 		}
@@ -312,23 +314,26 @@
 
 				this.__cMovement = true;
 				// Word boundary
-				this.__comp( kCode, function(){
+				this.__comp( e, function( e2 ) {
 					var WordMatch = analyzer.wordAt( ccur.aPos );
 
 					debug.Info( "Word: "
 						+ ccur.feeder.content.substring( WordMatch.open, WordMatch.close + 1 )
 					);
+
+					e2.__range = WordMatch;
+
 				}, W );
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					debug.Info( "Bracket boundary [" );
 				}, S_BRACKET_L );
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					debug.Info( "Bracket boundary ]" );
 				}, S_BRACKET_R );
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					debug.Info( "Bracket boundary {" );
 				}, SHIFT + S_BRACKET_L );
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					debug.Info( "Bracket boundary }" );
 					analyzer.bracketAt( ccur.aPos );
 				}, SHIFT + S_BRACKET_R );
@@ -336,11 +341,11 @@
 
 			case G: // Go to top
 				this.__cMovement = true;
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					ccur.moveY( -Number.MAX_VALUE );
 					ccur.moveX( -Number.MAX_VALUE, true );
 				}, G );
-				this.__comp( kCode, function(){
+				this.__comp( e, function(){
 					ccur.openRunAction( "PRINT_HEX", e );
 				}, _8 );
 				break;
@@ -420,6 +425,8 @@
 
 		this.__modKeys = c == KEY_SHIFT || c == KEY_CTRL || c == KEY_ALT;
 		this.__key = e.key;
+
+		this.__range = null;
 	};
 
 	__readOnly( InputEvent.prototype, "target", function() { return this.__target; } );
@@ -428,6 +435,19 @@
 	__readOnly( InputEvent.prototype, "ModKeys", function() { return this.__modKeys; } );
 	__readOnly( InputEvent.prototype, "Escape", function() { return this.__escape; } );
 
+	__readOnly( InputEvent.prototype, "range", function() {
+
+		/** @type {Components.Vim.Syntax.TokenMatch} */
+		var r = this.__range;
+
+		if( r && r.open == -1 && r.close == -1 )
+		{
+			return null;
+		}
+
+		return r;
+	} );
+
 	InputEvent.prototype.kMap = function( map )
 	{
 		return this.__kCode == Map( map );
diff --git a/botanjs/src/Components/Vim/Syntax/Analyzer.js b/botanjs/src/Components/Vim/Syntax/Analyzer.js
index c328f59..cb816cf 100644
--- a/botanjs/src/Components/Vim/Syntax/Analyzer.js
+++ b/botanjs/src/Components/Vim/Syntax/Analyzer.js
@@ -262,7 +262,7 @@
 		if( p < Len ) while( word.test( c[ ++ j ] ) );
 
 		var tMatch = new TokenMatch();
-		tMatch.__open = i + 1;
+		tMatch.__open = 0 < i ? i + 1 : 0;
 		tMatch.__close = j - 1;
 
 		return tMatch;
diff --git a/botanjs/src/Components/Vim/Syntax/Word.js b/botanjs/src/Components/Vim/Syntax/Word.js
index 7283d97..d879e59 100644
--- a/botanjs/src/Components/Vim/Syntax/Word.js
+++ b/botanjs/src/Components/Vim/Syntax/Word.js
@@ -20,7 +20,7 @@
 		]
 		,
 		[
-			, [ 0x0250, 0x02AF ] // IPA Extensions
+			[ 0x0250, 0x02AF ] // IPA Extensions
 			, [ 0x02B0, 0x02FF ] // Spacing Modifier Letters
 			, [ 0x0300, 0x036F ] // Combining Diacritical Marks
 			, [ 0x0370, 0x03FF ] // Greek and Coptic
@@ -129,7 +129,7 @@
 		]
 		,
 		[ // CJK scripts and symbols
-			, [ 0x2E80, 0x2EFF ] // CJK Radicals Supplement
+			[ 0x2E80, 0x2EFF ] // CJK Radicals Supplement
 			, [ 0x2F00, 0x2FDF ] // Kangxi Radicals
 			, [ 0x2FF0, 0x2FFF ] // Ideographic Description Characters
 			, [ 0x3000, 0x303F ] // CJK Symbols and Punctuation
@@ -177,7 +177,7 @@
 		]
 		,
 		[ // Surrogates
-			, [ 0xD800, 0xDBFF ] // High Surrogates
+			[ 0xD800, 0xDBFF ] // High Surrogates
 			, [ 0xDC00, 0xDFFF ] // Low Surrogates
 			, [ 0xE000, 0xF8FF ] // Private Use Area
 			, [ 0xF900, 0xFAFF ] // CJK Compatibility Ideographs
@@ -197,7 +197,7 @@
 			// Basic Latin
 			[ 0x0021, 0x002F ], [ 0x003A, 0x0040 ], [ 0x005B, 0x0060 ], [ 0x007B, 0x007E ],
 			// C1 Controls and Latin-1 Supplement (Extended ASCII)
-			[ 0x00A1, 0x00AC ], [ 0x00AE, 0x00BF ],
+			[ 0x00A1, 0x00AC ], [ 0x00AE, 0x00BF ]
 		]
 	];
 
diff --git a/botanjs/src/externs/Components.Vim.Controls.InputEvent.js b/botanjs/src/externs/Components.Vim.Controls.InputEvent.js
index a8e1bdb..afe109d 100644
--- a/botanjs/src/externs/Components.Vim.Controls.InputEvent.js
+++ b/botanjs/src/externs/Components.Vim.Controls.InputEvent.js
@@ -3,6 +3,8 @@ Components.Vim.Controls.InputEvent = function(){};
 
 /** @type {Components.Vim.VimArea} */
 Components.Vim.Controls.InputEvent.target;
+/** @type {Components.Vim.Syntax.TokenMatch} */
+Components.Vim.Controls.InputEvent.range;
 /** @type String */
 Components.Vim.Controls.InputEvent.key;
 /** @type Boolean */