Comparing version 3.0.1 to 3.1.0
@@ -1,191 +0,179 @@ | ||
(function() { | ||
"use strict"; | ||
var $$keybindings$$$__Array$prototype$slice = Array.prototype.slice; | ||
var $$keybindings$$$__Object$defineProperties = Object.defineProperties; | ||
var $$keybindings$$A = 65; | ||
(function (global, factory) { | ||
if (typeof define === 'function' && define.amd) { | ||
define('InputSim', ['exports'], factory); | ||
} else if (typeof exports !== 'undefined') { | ||
factory(exports); | ||
} else { | ||
var mod = { | ||
exports: {} | ||
}; | ||
factory(mod.exports); | ||
global.InputSim = mod.exports; | ||
} | ||
})(this, function (exports) { | ||
/*! jshint esnext:true, undef:true, unused:true */ | ||
/** @private */ | ||
var $$keybindings$$Y = 89; | ||
/** @private */ | ||
'use strict'; | ||
/** @private */ | ||
var $$keybindings$$Z = 90; | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
/** @private */ | ||
var $$keybindings$$ZERO = 48; | ||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); | ||
/** @private */ | ||
var $$keybindings$$NINE = 57; | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
/** @private */ | ||
var $$keybindings$$LEFT = 37; | ||
var A = 65; | ||
/** @private */ | ||
var Y = 89; | ||
/** @private */ | ||
var Z = 90; | ||
/** @private */ | ||
var ZERO = 48; | ||
/** @private */ | ||
var NINE = 57; | ||
/** @private */ | ||
var LEFT = 37; | ||
/** @private */ | ||
var RIGHT = 39; | ||
/** @private */ | ||
var UP = 38; | ||
/** @private */ | ||
var DOWN = 40; | ||
/** @private */ | ||
var BACKSPACE = 8; | ||
/** @private */ | ||
var DELETE = 46; | ||
/** @private */ | ||
var TAB = 9; | ||
/** @private */ | ||
var ENTER = 13; | ||
/** @private */ | ||
var $$keybindings$$RIGHT = 39; | ||
/** | ||
* @namespace KEYS | ||
*/ | ||
var KEYS = { | ||
A: A, | ||
Y: Y, | ||
Z: Z, | ||
ZERO: ZERO, | ||
NINE: NINE, | ||
LEFT: LEFT, | ||
RIGHT: RIGHT, | ||
UP: UP, | ||
DOWN: DOWN, | ||
BACKSPACE: BACKSPACE, | ||
DELETE: DELETE, | ||
TAB: TAB, | ||
ENTER: ENTER, | ||
/** @private */ | ||
var $$keybindings$$UP = 38; | ||
/** | ||
* @param {number} keyCode | ||
* @returns {boolean} | ||
*/ | ||
isDigit: function isDigit(keyCode) { | ||
return ZERO <= keyCode && keyCode <= NINE; | ||
}, | ||
/** @private */ | ||
var $$keybindings$$DOWN = 40; | ||
/** | ||
* Is an arrow keyCode. | ||
* | ||
* @param {number} keyCode | ||
* @returns {boolean} | ||
*/ | ||
isDirectional: function isDirectional(keyCode) { | ||
return keyCode === LEFT || keyCode === RIGHT || keyCode === UP || keyCode === DOWN; | ||
} | ||
}; | ||
/** @private */ | ||
var $$keybindings$$BACKSPACE = 8; | ||
var CTRL = 1 << 0; | ||
var META = 1 << 1; | ||
var ALT = 1 << 2; | ||
var SHIFT = 1 << 3; | ||
/** @private */ | ||
var $$keybindings$$DELETE = 46; | ||
var cache = {}; | ||
/** @private */ | ||
var $$keybindings$$TAB = 9; | ||
/** | ||
* Builds a BindingSet based on the current platform. | ||
* | ||
* @param {string} platform A string name of a platform (e.g. "OSX"). | ||
* @returns {BindingSet} keybindings appropriate for the given platform. | ||
*/ | ||
function keyBindingsForPlatform(platform) { | ||
var osx = platform === 'OSX'; | ||
var ctrl = osx ? META : CTRL; | ||
/** @private */ | ||
var $$keybindings$$ENTER = 13; | ||
if (!cache[platform]) { | ||
cache[platform] = build(function (bind) { | ||
bind(A, ctrl, 'selectAll'); | ||
bind(LEFT, null, 'moveLeft'); | ||
bind(LEFT, ALT, 'moveWordLeft'); | ||
bind(LEFT, SHIFT, 'moveLeftAndModifySelection'); | ||
bind(LEFT, ALT | SHIFT, 'moveWordLeftAndModifySelection'); | ||
bind(RIGHT, null, 'moveRight'); | ||
bind(RIGHT, ALT, 'moveWordRight'); | ||
bind(RIGHT, SHIFT, 'moveRightAndModifySelection'); | ||
bind(RIGHT, ALT | SHIFT, 'moveWordRightAndModifySelection'); | ||
bind(UP, null, 'moveUp'); | ||
bind(UP, ALT, 'moveToBeginningOfParagraph'); | ||
bind(UP, SHIFT, 'moveUpAndModifySelection'); | ||
bind(UP, ALT | SHIFT, 'moveParagraphBackwardAndModifySelection'); | ||
bind(DOWN, null, 'moveDown'); | ||
bind(DOWN, ALT, 'moveToEndOfParagraph'); | ||
bind(DOWN, SHIFT, 'moveDownAndModifySelection'); | ||
bind(DOWN, ALT | SHIFT, 'moveParagraphForwardAndModifySelection'); | ||
bind(BACKSPACE, null, 'deleteBackward'); | ||
bind(BACKSPACE, SHIFT, 'deleteBackward'); | ||
bind(BACKSPACE, ALT, 'deleteWordBackward'); | ||
bind(BACKSPACE, ALT | SHIFT, 'deleteWordBackward'); | ||
bind(BACKSPACE, ctrl, 'deleteBackwardToBeginningOfLine'); | ||
bind(BACKSPACE, ctrl | SHIFT, 'deleteBackwardToBeginningOfLine'); | ||
bind(DELETE, null, 'deleteForward'); | ||
bind(DELETE, ALT, 'deleteWordForward'); | ||
bind(TAB, null, 'insertTab'); | ||
bind(TAB, SHIFT, 'insertBackTab'); | ||
bind(ENTER, null, 'insertNewline'); | ||
bind(Z, ctrl, 'undo'); | ||
var $$keybindings$$KEYS = { | ||
A: $$keybindings$$A, | ||
Y: $$keybindings$$Y, | ||
Z: $$keybindings$$Z, | ||
ZERO: $$keybindings$$ZERO, | ||
NINE: $$keybindings$$NINE, | ||
LEFT: $$keybindings$$LEFT, | ||
RIGHT: $$keybindings$$RIGHT, | ||
UP: $$keybindings$$UP, | ||
DOWN: $$keybindings$$DOWN, | ||
BACKSPACE: $$keybindings$$BACKSPACE, | ||
DELETE: $$keybindings$$DELETE, | ||
TAB: $$keybindings$$TAB, | ||
ENTER: $$keybindings$$ENTER, | ||
/** | ||
* @param {number} keyCode | ||
* @returns {boolean} | ||
*/ | ||
isDigit: function(keyCode) { | ||
return $$keybindings$$ZERO <= keyCode && keyCode <= $$keybindings$$NINE; | ||
}, | ||
/** | ||
* Is an arrow keyCode. | ||
* | ||
* @param {number} keyCode | ||
* @returns {boolean} | ||
*/ | ||
isDirectional: function(keyCode) { | ||
return keyCode === $$keybindings$$LEFT || keyCode === $$keybindings$$RIGHT || keyCode === $$keybindings$$UP || keyCode === $$keybindings$$DOWN; | ||
} | ||
}; | ||
var $$keybindings$$CTRL = 1 << 0; | ||
var $$keybindings$$META = 1 << 1; | ||
var $$keybindings$$ALT = 1 << 2; | ||
var $$keybindings$$SHIFT = 1 << 3; | ||
var $$keybindings$$cache = {}; | ||
function $$keybindings$$keyBindingsForPlatform(platform) { | ||
var osx = platform === 'OSX'; | ||
var ctrl = osx ? $$keybindings$$META : $$keybindings$$CTRL; | ||
if (!$$keybindings$$cache[platform]) { | ||
$$keybindings$$cache[platform] = $$keybindings$$build(function(bind) { | ||
bind($$keybindings$$A , ctrl , 'selectAll'); | ||
bind($$keybindings$$LEFT , null , 'moveLeft'); | ||
bind($$keybindings$$LEFT , $$keybindings$$ALT , 'moveWordLeft'); | ||
bind($$keybindings$$LEFT , $$keybindings$$SHIFT , 'moveLeftAndModifySelection'); | ||
bind($$keybindings$$LEFT , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveWordLeftAndModifySelection'); | ||
bind($$keybindings$$RIGHT , null , 'moveRight'); | ||
bind($$keybindings$$RIGHT , $$keybindings$$ALT , 'moveWordRight'); | ||
bind($$keybindings$$RIGHT , $$keybindings$$SHIFT , 'moveRightAndModifySelection'); | ||
bind($$keybindings$$RIGHT , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveWordRightAndModifySelection'); | ||
bind($$keybindings$$UP , null , 'moveUp'); | ||
bind($$keybindings$$UP , $$keybindings$$ALT , 'moveToBeginningOfParagraph'); | ||
bind($$keybindings$$UP , $$keybindings$$SHIFT , 'moveUpAndModifySelection'); | ||
bind($$keybindings$$UP , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveParagraphBackwardAndModifySelection'); | ||
bind($$keybindings$$DOWN , null , 'moveDown'); | ||
bind($$keybindings$$DOWN , $$keybindings$$ALT , 'moveToEndOfParagraph'); | ||
bind($$keybindings$$DOWN , $$keybindings$$SHIFT , 'moveDownAndModifySelection'); | ||
bind($$keybindings$$DOWN , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveParagraphForwardAndModifySelection'); | ||
bind($$keybindings$$BACKSPACE , null , 'deleteBackward'); | ||
bind($$keybindings$$BACKSPACE , $$keybindings$$SHIFT , 'deleteBackward'); | ||
bind($$keybindings$$BACKSPACE , $$keybindings$$ALT , 'deleteWordBackward'); | ||
bind($$keybindings$$BACKSPACE , $$keybindings$$ALT|$$keybindings$$SHIFT , 'deleteWordBackward'); | ||
bind($$keybindings$$BACKSPACE , ctrl , 'deleteBackwardToBeginningOfLine'); | ||
bind($$keybindings$$BACKSPACE , ctrl|$$keybindings$$SHIFT , 'deleteBackwardToBeginningOfLine'); | ||
bind($$keybindings$$DELETE , null , 'deleteForward'); | ||
bind($$keybindings$$DELETE , $$keybindings$$ALT , 'deleteWordForward'); | ||
bind($$keybindings$$TAB , null , 'insertTab'); | ||
bind($$keybindings$$TAB , $$keybindings$$SHIFT , 'insertBackTab'); | ||
bind($$keybindings$$ENTER , null , 'insertNewline'); | ||
bind($$keybindings$$Z , ctrl , 'undo'); | ||
if (osx) { | ||
bind($$keybindings$$LEFT , $$keybindings$$META , 'moveToBeginningOfLine'); | ||
bind($$keybindings$$LEFT , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToBeginningOfLineAndModifySelection'); | ||
bind($$keybindings$$RIGHT , $$keybindings$$META , 'moveToEndOfLine'); | ||
bind($$keybindings$$RIGHT , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToEndOfLineAndModifySelection'); | ||
bind($$keybindings$$UP , $$keybindings$$META , 'moveToBeginningOfDocument'); | ||
bind($$keybindings$$UP , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToBeginningOfDocumentAndModifySelection'); | ||
bind($$keybindings$$DOWN , $$keybindings$$META , 'moveToEndOfDocument'); | ||
bind($$keybindings$$DOWN , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToEndOfDocumentAndModifySelection'); | ||
bind($$keybindings$$BACKSPACE , $$keybindings$$CTRL , 'deleteBackwardByDecomposingPreviousCharacter'); | ||
bind($$keybindings$$BACKSPACE , $$keybindings$$CTRL|$$keybindings$$SHIFT , 'deleteBackwardByDecomposingPreviousCharacter'); | ||
bind($$keybindings$$Z , $$keybindings$$META|$$keybindings$$SHIFT , 'redo'); | ||
} else { | ||
bind($$keybindings$$Y , $$keybindings$$CTRL , 'redo'); | ||
} | ||
}); | ||
} | ||
return $$keybindings$$cache[platform]; | ||
} | ||
function $$keybindings$$build(callback) { | ||
var result = new $$keybindings$$BindingSet(); | ||
callback(function() { | ||
var $__0; | ||
var $__arguments = arguments; | ||
var args = [].slice.call($__arguments, 0); | ||
return ($__0 = result).bind.apply($__0, $$keybindings$$$__Array$prototype$slice.call(args)); | ||
if (osx) { | ||
bind(LEFT, META, 'moveToBeginningOfLine'); | ||
bind(LEFT, META | SHIFT, 'moveToBeginningOfLineAndModifySelection'); | ||
bind(RIGHT, META, 'moveToEndOfLine'); | ||
bind(RIGHT, META | SHIFT, 'moveToEndOfLineAndModifySelection'); | ||
bind(UP, META, 'moveToBeginningOfDocument'); | ||
bind(UP, META | SHIFT, 'moveToBeginningOfDocumentAndModifySelection'); | ||
bind(DOWN, META, 'moveToEndOfDocument'); | ||
bind(DOWN, META | SHIFT, 'moveToEndOfDocumentAndModifySelection'); | ||
bind(BACKSPACE, CTRL, 'deleteBackwardByDecomposingPreviousCharacter'); | ||
bind(BACKSPACE, CTRL | SHIFT, 'deleteBackwardByDecomposingPreviousCharacter'); | ||
bind(Z, META | SHIFT, 'redo'); | ||
} else { | ||
bind(Y, CTRL, 'redo'); | ||
} | ||
}); | ||
return result; | ||
} | ||
var $$keybindings$$BindingSet = function() { | ||
"use strict"; | ||
return cache[platform]; | ||
} | ||
function BindingSet() { | ||
this.bindings = {}; | ||
} | ||
function build(callback) { | ||
var result = new BindingSet(); | ||
callback(function () { | ||
return result.bind.apply(result, arguments); | ||
}); | ||
return result; | ||
} | ||
$$keybindings$$$__Object$defineProperties(BindingSet.prototype, { | ||
bind: { | ||
value: function(keyCode, modifiers, action) { | ||
if (!this.bindings[keyCode]) { this.bindings[keyCode] = {}; } | ||
this.bindings[keyCode][modifiers || 0] = action; | ||
}, | ||
/** | ||
* @private | ||
*/ | ||
enumerable: false, | ||
writable: true | ||
}, | ||
var BindingSet = (function () { | ||
function BindingSet() { | ||
_classCallCheck(this, BindingSet); | ||
actionForEvent: { | ||
value: function(event) { | ||
var bindingsForKeyCode = this.bindings[event.keyCode]; | ||
if (bindingsForKeyCode) { | ||
var modifiers = 0; | ||
if (event.altKey) { modifiers |= $$keybindings$$ALT; } | ||
if (event.ctrlKey) { modifiers |= $$keybindings$$CTRL; } | ||
if (event.metaKey) { modifiers |= $$keybindings$$META; } | ||
if (event.shiftKey) { modifiers |= $$keybindings$$SHIFT; } | ||
return bindingsForKeyCode[modifiers]; | ||
} | ||
}, | ||
this.bindings = {}; | ||
} | ||
enumerable: false, | ||
writable: true | ||
} | ||
}); | ||
return BindingSet; | ||
}(); | ||
var $$input$sim$$$__Object$defineProperties = Object.defineProperties; | ||
/** | ||
@@ -198,835 +186,1307 @@ * Enum for text direction affinity. | ||
*/ | ||
var $$input$sim$$Affinity = { | ||
UPSTREAM: 0, | ||
DOWNSTREAM: 1, | ||
NONE: null | ||
}; | ||
/** | ||
* Tests is string passed in is a single word. | ||
* | ||
* @param {string} chr | ||
* @returns {boolean} | ||
* @private | ||
* @param {number} keyCode | ||
* @param {number} modifiers | ||
* @param {string} action | ||
*/ | ||
function $$input$sim$$isWordChar(chr) { | ||
return chr && /^\w$/.test(chr); | ||
} | ||
/** | ||
* Checks if char to the left of {index} in {string} | ||
* is a break (non-char). | ||
* | ||
* @param {string} text | ||
* @param {number} index | ||
* @returns {boolean} | ||
* @private | ||
*/ | ||
function $$input$sim$$hasLeftWordBreakAtIndex(text, index) { | ||
if (index === 0) { | ||
return true; | ||
} else { | ||
return !$$input$sim$$isWordChar(text[index - 1]) && $$input$sim$$isWordChar(text[index]); | ||
_createClass(BindingSet, [{ | ||
key: 'bind', | ||
value: function bind(keyCode, modifiers, action) { | ||
if (!this.bindings[keyCode]) { | ||
this.bindings[keyCode] = {}; | ||
} | ||
this.bindings[keyCode][modifiers || 0] = action; | ||
} | ||
} | ||
/** | ||
* Checks if char to the right of {index} in {string} | ||
* is a break (non-char). | ||
* | ||
* @param {string} text | ||
* @param {number} index | ||
* @returns {boolean} | ||
* @private | ||
*/ | ||
function $$input$sim$$hasRightWordBreakAtIndex(text, index) { | ||
if (index === text.length - 1) { | ||
return true; | ||
} else { | ||
return $$input$sim$$isWordChar(text[index]) && !$$input$sim$$isWordChar(text[index + 1]); | ||
} | ||
} | ||
var $$input$sim$$Input = function() { | ||
"use strict"; | ||
function Input(value, range) { | ||
this._value = ''; | ||
this._selectedRange = { | ||
start: 0, | ||
length: 0 | ||
}; | ||
this.shouldCancelEvents = true; | ||
this.selectionAffinity = $$input$sim$$Affinity.NONE; | ||
if(value) { | ||
this.setText(value); | ||
/** | ||
* @param {Event} event | ||
* @returns {?string} | ||
*/ | ||
}, { | ||
key: 'actionForEvent', | ||
value: function actionForEvent(event) { | ||
var bindingsForKeyCode = this.bindings[event.keyCode]; | ||
if (bindingsForKeyCode) { | ||
var modifiers = 0; | ||
if (event.altKey) { | ||
modifiers |= ALT; | ||
} | ||
if (event.ctrlKey) { | ||
modifiers |= CTRL; | ||
} | ||
if (event.metaKey) { | ||
modifiers |= META; | ||
} | ||
if (event.shiftKey) { | ||
modifiers |= SHIFT; | ||
} | ||
return bindingsForKeyCode[modifiers]; | ||
} | ||
if(range) { | ||
this.setSelectedRange(range); | ||
} | ||
this._buildKeybindings(); | ||
} | ||
}]); | ||
$$input$sim$$$__Object$defineProperties(Input.prototype, { | ||
clearSelection: { | ||
value: function() { | ||
this.replaceSelection(''); | ||
}, | ||
return BindingSet; | ||
})(); | ||
enumerable: false, | ||
writable: true | ||
}, | ||
var Affinity = { | ||
UPSTREAM: 0, | ||
DOWNSTREAM: 1, | ||
NONE: null | ||
}; | ||
deleteBackward: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length === 0) { | ||
range.start--; | ||
range.length++; | ||
this.setSelectedRange(range); | ||
} | ||
this.clearSelection(); | ||
}, | ||
/** | ||
* Tests is string passed in is a single word. | ||
* | ||
* @param {string} chr | ||
* @returns {boolean} | ||
* @private | ||
*/ | ||
function isWordChar(chr) { | ||
return chr && /^\w$/.test(chr); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Checks if char to the left of {index} in {string} | ||
* is a break (non-char). | ||
* | ||
* @param {string} text | ||
* @param {number} index | ||
* @returns {boolean} | ||
* @private | ||
*/ | ||
function hasLeftWordBreakAtIndex(text, index) { | ||
if (index === 0) { | ||
return true; | ||
} else { | ||
return !isWordChar(text[index - 1]) && isWordChar(text[index]); | ||
} | ||
} | ||
deleteWordBackward: { | ||
value: function(event) { | ||
if (this.hasSelection()) { | ||
this.deleteBackward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var start = this._lastWordBreakBeforeIndex(range.start); | ||
range.length += range.start - start; | ||
range.start = start; | ||
this.setSelectedRange(range); | ||
this.clearSelection(); | ||
} | ||
}, | ||
/** | ||
* Checks if char to the right of {index} in {string} | ||
* is a break (non-char). | ||
* | ||
* @param {string} text | ||
* @param {number} index | ||
* @returns {boolean} | ||
* @private | ||
*/ | ||
function hasRightWordBreakAtIndex(text, index) { | ||
if (index === text.length - 1) { | ||
return true; | ||
} else { | ||
return isWordChar(text[index]) && !isWordChar(text[index + 1]); | ||
} | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
var Input = (function () { | ||
/** | ||
* Sets up the initial properties of the TextField and | ||
* sets up the event listeners | ||
* | ||
* @param {string} value | ||
* @param {Object} range ({start: 0, length: 0}) | ||
*/ | ||
deleteBackwardByDecomposingPreviousCharacter: { | ||
value: function(event) { | ||
this.deleteBackward(event); | ||
}, | ||
function Input(value, range) { | ||
_classCallCheck(this, Input); | ||
enumerable: false, | ||
writable: true | ||
}, | ||
this._value = ''; | ||
this._selectedRange = { | ||
start: 0, | ||
length: 0 | ||
}; | ||
this.shouldCancelEvents = true; | ||
this.selectionAffinity = Affinity.NONE; | ||
deleteBackwardToBeginningOfLine: { | ||
value: function(event) { | ||
if (this.hasSelection()) { | ||
this.deleteBackward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = range.start; | ||
range.start = 0; | ||
this.setSelectedRange(range); | ||
this.clearSelection(); | ||
} | ||
}, | ||
if (value) { | ||
this.setText(value); | ||
} | ||
if (range) { | ||
this.setSelectedRange(range); | ||
} | ||
this._buildKeybindings(); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Clears all characters in the existing selection. | ||
* | ||
* @example | ||
* // 12|34567|8 | ||
* clearSelection(); | ||
* // 12|8 | ||
* | ||
*/ | ||
deleteForward: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length === 0) { | ||
range.length++; | ||
this.setSelectedRange(range); | ||
} | ||
this.clearSelection(); | ||
}, | ||
_createClass(Input, [{ | ||
key: 'clearSelection', | ||
value: function clearSelection() { | ||
this.replaceSelection(''); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Deletes backward one character or clears a non-empty selection. | ||
* | ||
* @example | ||
* | ||
* // |What's up, doc? | ||
* deleteBackward(event); | ||
* // |What's up, doc? | ||
* | ||
* // What'|s up, doc? | ||
* deleteBackward(event); | ||
* // What|s up, doc? | ||
* | ||
* // |What's| up, doc? | ||
* deleteBackward(event); | ||
* // | up, doc? | ||
*/ | ||
}, { | ||
key: 'deleteBackward', | ||
value: function deleteBackward(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length === 0) { | ||
range.start--; | ||
range.length++; | ||
this.setSelectedRange(range); | ||
} | ||
this.clearSelection(); | ||
} | ||
deleteWordForward: { | ||
value: function(event) { | ||
if (this.hasSelection()) { | ||
return this.deleteForward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var end = this._nextWordBreakAfterIndex(range.start + range.length); | ||
this.setSelectedRange({ | ||
start: range.start, | ||
length: end - range.start | ||
}); | ||
this.clearSelection(); | ||
} | ||
}, | ||
/** | ||
* Deletes backward one word or clears a non-empty selection. | ||
* | ||
* @example | ||
* // |What's up, doc? | ||
* deleteWordBackward(event); | ||
* // |What's up, doc? | ||
* | ||
* // What'|s up, doc? | ||
* deleteWordBackward(event); | ||
* // |s up, doc? | ||
* | ||
* // |What's| up, doc? | ||
* deleteWordBackward(event); | ||
* // | up, doc? | ||
*/ | ||
}, { | ||
key: 'deleteWordBackward', | ||
value: function deleteWordBackward(event) { | ||
if (this.hasSelection()) { | ||
this.deleteBackward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var start = this._lastWordBreakBeforeIndex(range.start); | ||
range.length += range.start - start; | ||
range.start = start; | ||
this.setSelectedRange(range); | ||
this.clearSelection(); | ||
} | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Deletes backward one character, clears a non-empty selection, or decomposes | ||
* an accented character to its simple form. | ||
* | ||
* @TODO Make this work as described. | ||
* | ||
* @example | ||
* // |fiancée | ||
* deleteBackwardByDecomposingPreviousCharacter(event); | ||
* // |What's up, doc? | ||
* | ||
* // fianc|é|e | ||
* deleteBackwardByDecomposingPreviousCharacter(event); | ||
* // fianc|e | ||
* | ||
* // fiancé|e | ||
* deleteBackwardByDecomposingPreviousCharacter(event); | ||
* // fiance|e | ||
* | ||
*/ | ||
}, { | ||
key: 'deleteBackwardByDecomposingPreviousCharacter', | ||
value: function deleteBackwardByDecomposingPreviousCharacter(event) { | ||
this.deleteBackward(event); | ||
} | ||
handleEvent: { | ||
value: function(event) { | ||
if(typeof event === 'undefined') { | ||
throw new Error('cannot handle and event that isn\'t passed'); | ||
} | ||
var action = this._bindings.actionForEvent(event); | ||
if(action) this[action](event); | ||
return action; | ||
}, | ||
/** | ||
* Deletes all characters before the cursor or clears a non-empty selection. | ||
* | ||
* @example | ||
* // The quick |brown fox. | ||
* deleteBackwardToBeginningOfLine(event); | ||
* // |brown fox. | ||
* | ||
* // The |quick |brown fox. | ||
* deleteBackwardToBeginningOfLine(event); | ||
* // The brown fox. | ||
* | ||
*/ | ||
}, { | ||
key: 'deleteBackwardToBeginningOfLine', | ||
value: function deleteBackwardToBeginningOfLine(event) { | ||
if (this.hasSelection()) { | ||
this.deleteBackward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = range.start; | ||
range.start = 0; | ||
this.setSelectedRange(range); | ||
this.clearSelection(); | ||
} | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Deletes forward one character or clears a non-empty selection. | ||
* | ||
* @example | ||
* // What's up, doc?| | ||
* deleteForward(event); | ||
* // What's up, doc?| | ||
* | ||
* // What'|s up, doc? | ||
* deleteForward(event); | ||
* // What'| up, doc? | ||
* | ||
* // |What's| up, doc? | ||
* deleteForward(event); | ||
* // | up, doc? | ||
* | ||
*/ | ||
}, { | ||
key: 'deleteForward', | ||
value: function deleteForward(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length === 0) { | ||
range.length++; | ||
this.setSelectedRange(range); | ||
} | ||
this.clearSelection(); | ||
} | ||
hasSelection: { | ||
value: function() { | ||
return this.selectedRange().length !== 0; | ||
}, | ||
/** | ||
* Deletes forward one word or clears a non-empty selection. | ||
* | ||
* @example | ||
* // What's up, doc?| | ||
* deleteWordForward(event); | ||
* // What's up, doc?| | ||
* | ||
* // What's |up, doc? | ||
* deleteWordForward(event); | ||
* // What's |, doc? | ||
* | ||
* // |What's| up, doc? | ||
* deleteWordForward(event); | ||
* // | up, doc? | ||
*/ | ||
}, { | ||
key: 'deleteWordForward', | ||
value: function deleteWordForward(event) { | ||
if (this.hasSelection()) { | ||
return this.deleteForward(event); | ||
} else { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var end = this._nextWordBreakAfterIndex(range.start + range.length); | ||
this.setSelectedRange({ | ||
start: range.start, | ||
length: end - range.start | ||
}); | ||
this.clearSelection(); | ||
} | ||
} | ||
}, { | ||
key: 'handleEvent', | ||
value: function handleEvent(event) { | ||
if (typeof event === 'undefined') { | ||
throw new Error('cannot handle and event that isn\'t passed'); | ||
} | ||
var action = this._bindings.actionForEvent(event); | ||
if (action) this[action](event); | ||
return action; | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Determines whether this field has any selection. | ||
* | ||
* @returns {boolean} true if there is at least one character selected | ||
*/ | ||
}, { | ||
key: 'hasSelection', | ||
value: function hasSelection() { | ||
return this.selectedRange().length !== 0; | ||
} | ||
insertBackTab: { | ||
value: function() {}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Handles the back tab key. | ||
* | ||
*/ | ||
}, { | ||
key: 'insertBackTab', | ||
value: function insertBackTab() {} | ||
insertNewline: { | ||
value: function() {}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Handles a key event could be trying to end editing. | ||
* | ||
*/ | ||
}, { | ||
key: 'insertNewline', | ||
value: function insertNewline() {} | ||
insertTab: { | ||
value: function() {}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Handles the tab key. | ||
* | ||
*/ | ||
}, { | ||
key: 'insertTab', | ||
value: function insertTab() {} | ||
insertText: { | ||
value: function(text) { | ||
var range; | ||
if (this.hasSelection()) { | ||
this.clearSelection(); | ||
} | ||
/** | ||
* Handles a event that is trying to insert a character. | ||
* | ||
* @param {string} text | ||
*/ | ||
}, { | ||
key: 'insertText', | ||
value: function insertText(text) { | ||
var range; | ||
if (this.hasSelection()) { | ||
this.clearSelection(); | ||
} | ||
this.replaceSelection(text); | ||
range = this.selectedRange(); | ||
range.start += range.length; | ||
range.length = 0; | ||
this.setSelectedRange(range); | ||
}, | ||
this.replaceSelection(text); | ||
range = this.selectedRange(); | ||
range.start += range.length; | ||
range.length = 0; | ||
this.setSelectedRange(range); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor up, which because this is a single-line text field, means | ||
* moving to the beginning of the value. | ||
* | ||
* @example | ||
* // Hey guys| | ||
* moveUp(event); | ||
* // |Hey guys | ||
* | ||
* // Hey |guys| | ||
* moveUp(event); | ||
* // |Hey guys | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveUp', | ||
value: function moveUp(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ | ||
start: 0, | ||
length: 0 | ||
}); | ||
} | ||
moveUp: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ | ||
start: 0, | ||
length: 0 | ||
}); | ||
}, | ||
/** | ||
* Moves the cursor up to the beginning of the current paragraph, which because | ||
* this is a single-line text field, means moving to the beginning of the | ||
* value. | ||
* | ||
* @example | ||
* // Hey guys| | ||
* moveToBeginningOfParagraph(event) | ||
* // |Hey guys | ||
* | ||
* // Hey |guys| | ||
* moveToBeginningOfParagraph(event) | ||
* // |Hey guys | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToBeginningOfParagraph', | ||
value: function moveToBeginningOfParagraph(event) { | ||
this.moveUp(event); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToBeginningOfParagraph: { | ||
value: function(event) { | ||
this.moveUp(event); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveUpAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
// 12<34 56|78 => <1234 56|78 | ||
range.length += range.start; | ||
range.start = 0; | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
// 12|34 56>78 => <12|34 5678 | ||
range.length = range.start; | ||
range.start = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveParagraphBackwardAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
// 12<34 56|78 => <1234 56|78 | ||
range.length += range.start; | ||
range.start = 0; | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
// 12|34 56>78 => 12|34 5678 | ||
range.length = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToBeginningOfDocument: { | ||
value: function(event) { | ||
// Since we only support a single line this is just an alias. | ||
this.moveToBeginningOfLine(event); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToBeginningOfDocumentAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
/** | ||
* Moves the cursor up, keeping the current anchor point and extending the | ||
* selection to the beginning as moveUp would. | ||
* | ||
* @example | ||
* // rightward selections are shrunk | ||
* // Hey guys, |where> are you? | ||
* moveUpAndModifySelection(event); | ||
* // <Hey guys, |where are you? | ||
* | ||
* // leftward selections are extended | ||
* // Hey guys, <where| are you? | ||
* moveUpAndModifySelection(event); | ||
* // <Hey guys, where| are you? | ||
* | ||
* // neutral selections are extended | ||
* // Hey guys, |where| are you? | ||
* moveUpAndModifySelection(event); | ||
* // <Hey guys, where| are you? | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveUpAndModifySelection', | ||
value: function moveUpAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
case Affinity.NONE: | ||
// 12<34 56|78 => <1234 56|78 | ||
range.length += range.start; | ||
range.start = 0; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM); | ||
}, | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
// 12|34 56>78 => <12|34 5678 | ||
range.length = range.start; | ||
range.start = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveDown: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
// 12|34 56|78 => 1234 5678| | ||
var range = { | ||
start: this.text().length, | ||
length: 0 | ||
}; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToEndOfParagraph: { | ||
value: function(event) { | ||
this.moveDown(event); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveDownAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var end = this.text().length; | ||
if (this.selectionAffinity === $$input$sim$$Affinity.UPSTREAM) { | ||
range.start += range.length; | ||
} | ||
range.length = end - range.start; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveParagraphForwardAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
// 12|34 56>78 => 12|34 5678> | ||
range.length = this.text().length - range.start; | ||
break; | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
// 12<34 56|78 => 12|34 5678 | ||
range.start += range.length; | ||
range.length = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToEndOfDocument: { | ||
value: function(event) { | ||
// Since we only support a single line this is just an alias. | ||
this.moveToEndOfLine(event); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToEndOfDocumentAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = this.text().length - range.start; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveLeft: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length !== 0) { | ||
range.length = 0; | ||
} else { | ||
range.start--; | ||
} | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveLeftAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
this.selectionAffinity = $$input$sim$$Affinity.UPSTREAM; | ||
range.start--; | ||
range.length++; | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
range.length--; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveWordLeft: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var index = this._lastWordBreakBeforeIndex(this.selectedRange().start - 1); | ||
this.setSelectedRange({ start: index, length: 0 }); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveWordLeftAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
this.selectionAffinity = $$input$sim$$Affinity.UPSTREAM; | ||
var start = this._lastWordBreakBeforeIndex(range.start - 1); | ||
range.length += range.start - start; | ||
range.start = start; | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
var end = this._lastWordBreakBeforeIndex(range.start + range.length); | ||
if (end < range.start) { | ||
end = range.start; | ||
} | ||
range.length -= range.start + range.length - end; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToBeginningOfLine: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ start: 0, length: 0 }); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
moveToBeginningOfLineAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
/** | ||
* Moves the free end of the selection to the beginning of the paragraph, or | ||
* since this is a single-line text field to the beginning of the line. | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveParagraphBackwardAndModifySelection', | ||
value: function moveParagraphBackwardAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
case Affinity.NONE: | ||
// 12<34 56|78 => <1234 56|78 | ||
range.length += range.start; | ||
range.start = 0; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM); | ||
}, | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
// 12|34 56>78 => 12|34 5678 | ||
range.length = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the beginning of the document. | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToBeginningOfDocument', | ||
value: function moveToBeginningOfDocument(event) { | ||
// Since we only support a single line this is just an alias. | ||
this.moveToBeginningOfLine(event); | ||
} | ||
moveRight: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length !== 0) { | ||
range.start += range.length; | ||
range.length = 0; | ||
} else { | ||
range.start++; | ||
} | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE); | ||
}, | ||
/** | ||
* Moves the selection start to the beginning of the document. | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToBeginningOfDocumentAndModifySelection', | ||
value: function moveToBeginningOfDocumentAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length += range.start; | ||
range.start = 0; | ||
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor down, which because this is a single-line text field, means | ||
* moving to the end of the value. | ||
* | ||
* @example | ||
* // Hey |guys | ||
* moveDown(event) | ||
* // Hey guys| | ||
* | ||
* // |Hey| guys | ||
* moveDown(event) | ||
* // Hey guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveDown', | ||
value: function moveDown(event) { | ||
this._handleEvent(event); | ||
// 12|34 56|78 => 1234 5678| | ||
var range = { | ||
start: this.text().length, | ||
length: 0 | ||
}; | ||
this.setSelectedRangeWithAffinity(range, Affinity.NONE); | ||
} | ||
moveRightAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
range.start++; | ||
range.length--; | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
this.selectionAffinity = $$input$sim$$Affinity.DOWNSTREAM; | ||
range.length++; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
}, | ||
/** | ||
* Moves the cursor up to the end of the current paragraph, which because this | ||
* is a single-line text field, means moving to the end of the value. | ||
* | ||
* @example | ||
* // |Hey guys | ||
* moveToEndOfParagraph(event) | ||
* // Hey guys| | ||
* | ||
* // Hey |guys| | ||
* moveToEndOfParagraph(event) | ||
* // Hey guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToEndOfParagraph', | ||
value: function moveToEndOfParagraph(event) { | ||
this.moveDown(event); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor down, keeping the current anchor point and extending the | ||
* selection to the end as moveDown would. | ||
* | ||
* @example | ||
* // leftward selections are shrunk | ||
* // Hey guys, <where| are you? | ||
* moveDownAndModifySelection(event) | ||
* // Hey guys, where| are you?> | ||
* | ||
* // rightward selections are extended | ||
* // Hey guys, |where> are you? | ||
* moveDownAndModifySelection(event) | ||
* // Hey guys, |where are you?> | ||
* | ||
* // neutral selections are extended | ||
* // Hey guys, |where| are you? | ||
* moveDownAndModifySelection(event) | ||
* // Hey guys, |where are you?> | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveDownAndModifySelection', | ||
value: function moveDownAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var end = this.text().length; | ||
if (this.selectionAffinity === Affinity.UPSTREAM) { | ||
range.start += range.length; | ||
} | ||
range.length = end - range.start; | ||
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM); | ||
} | ||
moveWordRight: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var index = this._nextWordBreakAfterIndex(range.start + range.length); | ||
this.setSelectedRange({ start: index, length: 0 }); | ||
}, | ||
/** | ||
* Moves the free end of the selection to the end of the paragraph, or since | ||
* this is a single-line text field to the end of the line. | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveParagraphForwardAndModifySelection', | ||
value: function moveParagraphForwardAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.DOWNSTREAM: | ||
case Affinity.NONE: | ||
// 12|34 56>78 => 12|34 5678> | ||
range.length = this.text().length - range.start; | ||
break; | ||
case Affinity.UPSTREAM: | ||
// 12<34 56|78 => 12|34 5678 | ||
range.start += range.length; | ||
range.length = 0; | ||
break; | ||
} | ||
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the end of the document. | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToEndOfDocument', | ||
value: function moveToEndOfDocument(event) { | ||
// Since we only support a single line this is just an alias. | ||
this.moveToEndOfLine(event); | ||
} | ||
moveWordRightAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var start = range.start; | ||
var end = range.start + range.length; | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
start = Math.min(this._nextWordBreakAfterIndex(start), end); | ||
break; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
case $$input$sim$$Affinity.NONE: | ||
this.selectionAffinity = $$input$sim$$Affinity.DOWNSTREAM; | ||
end = this._nextWordBreakAfterIndex(range.start + range.length); | ||
break; | ||
} | ||
this.setSelectedRange({ start: start, length: end - start }); | ||
}, | ||
/** | ||
* Moves the selection end to the end of the document. | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToEndOfDocumentAndModifySelection', | ||
value: function moveToEndOfDocumentAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = this.text().length - range.start; | ||
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the left, counting selections as a thing to move past. | ||
* | ||
* @example | ||
* // no selection just moves the cursor left | ||
* // Hey guys| | ||
* moveLeft(event) | ||
* // Hey guy|s | ||
* | ||
* // selections are removed | ||
* // Hey |guys| | ||
* moveLeft(event) | ||
* // Hey |guys | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveLeft', | ||
value: function moveLeft(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length !== 0) { | ||
range.length = 0; | ||
} else { | ||
range.start--; | ||
} | ||
this.setSelectedRangeWithAffinity(range, Affinity.NONE); | ||
} | ||
moveToEndOfLine: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ start: this.text().length, length: 0 }); | ||
}, | ||
/** | ||
* Moves the free end of the selection one to the left. | ||
* | ||
* @example | ||
* // no selection just selects to the left | ||
* // Hey guys| | ||
* moveLeftAndModifySelection(event) | ||
* // Hey guy<s| | ||
* | ||
* // left selections are extended | ||
* // Hey <guys| | ||
* moveLeftAndModifySelection(event) | ||
* // Hey< guys| | ||
* | ||
* // right selections are shrunk | ||
* // Hey |guys> | ||
* moveLeftAndModifySelection(event) | ||
* // Hey |guy>s | ||
* | ||
* // neutral selections are extended | ||
* // Hey |guys| | ||
* moveLeftAndModifySelection(event) | ||
* //Hey< guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveLeftAndModifySelection', | ||
value: function moveLeftAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
case Affinity.NONE: | ||
this.selectionAffinity = Affinity.UPSTREAM; | ||
range.start--; | ||
range.length++; | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
range.length--; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor left until the start of a word is found. | ||
* | ||
* @example | ||
* // no selection just moves the cursor left | ||
* // Hey guys| | ||
* moveWordLeft(event) | ||
* // Hey |guys | ||
* | ||
* // selections are removed | ||
* // Hey |guys| | ||
* moveWordLeft(event) | ||
* // |Hey guys | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveWordLeft', | ||
value: function moveWordLeft(event) { | ||
this._handleEvent(event); | ||
var index = this._lastWordBreakBeforeIndex(this.selectedRange().start - 1); | ||
this.setSelectedRange({ start: index, length: 0 }); | ||
} | ||
moveToEndOfLineAndModifySelection: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = this.text().length - range.start; | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
replaceSelection: { | ||
value: function(replacement) { | ||
var range = this.selectedRange(); | ||
var end = range.start + range.length; | ||
var text = this.text(); | ||
text = text.substring(0, range.start) + replacement + text.substring(end); | ||
range.length = replacement.length; | ||
this.setText(text); | ||
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE); | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
rightWordBreakIndexes: { | ||
value: function() { | ||
var result = []; | ||
var text = this.text(); | ||
for (var i = 0, l = text.length; i < l; i++) { | ||
if ($$input$sim$$hasRightWordBreakAtIndex(text, i)) { | ||
result.push(i + 1); | ||
} | ||
/** | ||
* Moves the free end of the current selection to the beginning of the previous | ||
* word. | ||
* | ||
* @example | ||
* // no selection just selects to the left | ||
* // Hey guys| | ||
* moveWordLeftAndModifySelection(event) | ||
* // Hey <guys| | ||
* | ||
* // left selections are extended | ||
* // Hey <guys| | ||
* moveWordLeftAndModifySelection(event) | ||
* // <Hey guys| | ||
* | ||
* // right selections are shrunk | ||
* // |Hey guys> | ||
* moveWordLeftAndModifySelection(event) | ||
* // |Hey >guys | ||
* | ||
* // neutral selections are extended | ||
* // Hey |guys| | ||
* moveWordLeftAndModifySelection(event) | ||
* // <Hey guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveWordLeftAndModifySelection', | ||
value: function moveWordLeftAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
case Affinity.NONE: | ||
this.selectionAffinity = Affinity.UPSTREAM; | ||
var start = this._lastWordBreakBeforeIndex(range.start - 1); | ||
range.length += range.start - start; | ||
range.start = start; | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
var end = this._lastWordBreakBeforeIndex(range.start + range.length); | ||
if (end < range.start) { | ||
end = range.start; | ||
} | ||
return result; | ||
}, | ||
range.length -= range.start + range.length - end; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the beginning of the current line. | ||
* | ||
* @example | ||
* // Hey guys, where| are ya? | ||
* moveToBeginningOfLine(event) | ||
* // |Hey guys, where are ya? | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToBeginningOfLine', | ||
value: function moveToBeginningOfLine(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ start: 0, length: 0 }); | ||
} | ||
selectAll: { | ||
value: function(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRangeWithAffinity({ | ||
start: 0, | ||
length: this.text().length | ||
}, $$input$sim$$Affinity.NONE); | ||
}, | ||
/** | ||
* Select from the free end of the selection to the beginning of line. | ||
* | ||
* @example | ||
* // Hey guys, where| are ya? | ||
* moveToBeginningOfLineAndModifySelection(event) | ||
* // <Hey guys, where| are ya? | ||
* | ||
* // Hey guys, where| are> ya? | ||
* moveToBeginningOfLineAndModifySelection(event) | ||
* // <Hey guys, where are| ya? | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToBeginningOfLineAndModifySelection', | ||
value: function moveToBeginningOfLineAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length += range.start; | ||
range.start = 0; | ||
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the right, counting selections as a thing to move past. | ||
* | ||
* @example | ||
* // no selection just moves the cursor right | ||
* // Hey guy|s | ||
* moveRight(event) | ||
* // Hey guys| | ||
* | ||
* // selections are removed | ||
* // Hey |guys| | ||
* moveRight(event) | ||
* // Hey guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveRight', | ||
value: function moveRight(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
if (range.length !== 0) { | ||
range.start += range.length; | ||
range.length = 0; | ||
} else { | ||
range.start++; | ||
} | ||
this.setSelectedRangeWithAffinity(range, Affinity.NONE); | ||
} | ||
text: { | ||
value: function() { | ||
return this._value; | ||
}, | ||
/** | ||
* Moves the free end of the selection one to the right. | ||
* | ||
* @example | ||
* // no selection just selects to the right | ||
* // Hey |guys | ||
* moveRightAndModifySelection(event) | ||
* // Hey |g>uys | ||
* | ||
* // right selections are extended | ||
* // Hey |gu>ys | ||
* moveRightAndModifySelection(event) | ||
* // Hey |guy>s | ||
* | ||
* // left selections are shrunk | ||
* // <Hey |guys | ||
* moveRightAndModifySelection(event) | ||
* // H<ey |guys | ||
* | ||
* // neutral selections are extended | ||
* // |Hey| guys | ||
* moveRightAndModifySelection(event) | ||
* // |Hey >guys | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveRightAndModifySelection', | ||
value: function moveRightAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
range.start++; | ||
range.length--; | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
case Affinity.NONE: | ||
this.selectionAffinity = Affinity.DOWNSTREAM; | ||
range.length++; | ||
break; | ||
} | ||
this.setSelectedRange(range); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor right until the end of a word is found. | ||
* | ||
* @example | ||
* // no selection just moves the cursor right | ||
* // Hey| guys | ||
* moveWordRight(event) | ||
* // Hey guys| | ||
* | ||
* // selections are removed | ||
* // |Hey| guys | ||
* moveWordRight(event) | ||
* // Hey guys| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveWordRight', | ||
value: function moveWordRight(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var index = this._nextWordBreakAfterIndex(range.start + range.length); | ||
this.setSelectedRange({ start: index, length: 0 }); | ||
} | ||
setText: { | ||
value: function(value) { | ||
this._value = '' + value; | ||
this.setSelectedRange({ | ||
start: this._value.length, | ||
length: 0 | ||
}); | ||
}, | ||
/** | ||
* Moves the free end of the current selection to the next end of word. | ||
* | ||
* @example | ||
* // no selection just selects to the right | ||
* // Hey |guys | ||
* moveWordRightAndModifySelection(event) | ||
* // Hey |guys| | ||
* | ||
* // right selections are extended | ||
* // Hey |g>uys | ||
* moveWordRightAndModifySelection(event) | ||
* // Hey |guys> | ||
* | ||
* // left selections are shrunk | ||
* // He<y |guys | ||
* moveWordRightAndModifySelection(event) | ||
* // Hey< |guys | ||
* | ||
* // neutral selections are extended | ||
* // He|y |guys | ||
* moveWordRightAndModifySelection(event) | ||
* // He|y guys> | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveWordRightAndModifySelection', | ||
value: function moveWordRightAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
var start = range.start; | ||
var end = range.start + range.length; | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
start = Math.min(this._nextWordBreakAfterIndex(start), end); | ||
break; | ||
case Affinity.DOWNSTREAM: | ||
case Affinity.NONE: | ||
this.selectionAffinity = Affinity.DOWNSTREAM; | ||
end = this._nextWordBreakAfterIndex(range.start + range.length); | ||
break; | ||
} | ||
this.setSelectedRange({ start: start, length: end - start }); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Moves the cursor to the end of the current line. | ||
* | ||
* @example | ||
* // Hey guys, where| are ya? | ||
* moveToEndOfLine(event) | ||
* // |Hey guys, where are ya? | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToEndOfLine', | ||
value: function moveToEndOfLine(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRange({ start: this.text().length, length: 0 }); | ||
} | ||
selectedRange: { | ||
value: function() { | ||
return this._selectedRange; | ||
}, | ||
/** | ||
* Moves the free end of the selection to the end of the current line. | ||
* | ||
* @example | ||
* // Hey guys, where| are ya? | ||
* moveToEndOfLineAndModifySelection(event) | ||
* // Hey guys, where| are ya?> | ||
* | ||
* // Hey guys, <where| are ya? | ||
* moveToEndOfLineAndModifySelection(event) | ||
* // Hey guys, |where are ya?> | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'moveToEndOfLineAndModifySelection', | ||
value: function moveToEndOfLineAndModifySelection(event) { | ||
this._handleEvent(event); | ||
var range = this.selectedRange(); | ||
range.length = this.text().length - range.start; | ||
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Replaces the characters within the selection with given text. | ||
* | ||
* @example | ||
* // 12|34567|8 | ||
* replaceSelection('00') | ||
* // 12|00|8 | ||
* | ||
* @param {string} replacement | ||
*/ | ||
}, { | ||
key: 'replaceSelection', | ||
value: function replaceSelection(replacement) { | ||
var range = this.selectedRange(); | ||
var end = range.start + range.length; | ||
var text = this.text(); | ||
text = text.substring(0, range.start) + replacement + text.substring(end); | ||
range.length = replacement.length; | ||
this.setText(text); | ||
this.setSelectedRangeWithAffinity(range, Affinity.NONE); | ||
} | ||
setSelectedRange: { | ||
value: function(range) { | ||
this.setSelectedRangeWithAffinity(range, this.selectionAffinity); | ||
}, | ||
/** | ||
* Find ends of 'words' for navigational purposes. | ||
* | ||
* @example | ||
* // given value of '123456789' and text of '123-45-6789' | ||
* rightWordBreakIndexes() | ||
* //=> [3, 5, 9] | ||
* | ||
* @returns {number[]} | ||
*/ | ||
}, { | ||
key: 'rightWordBreakIndexes', | ||
value: function rightWordBreakIndexes() { | ||
var result = []; | ||
var text = this.text(); | ||
for (var i = 0, l = text.length; i < l; i++) { | ||
if (hasRightWordBreakAtIndex(text, i)) { | ||
result.push(i + 1); | ||
} | ||
} | ||
return result; | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Expands the selection to contain all the characters in the content. | ||
* | ||
* @example | ||
* // 123|45678 | ||
* selectAll(event) | ||
* // |12345678| | ||
* | ||
* @param {Event} event | ||
*/ | ||
}, { | ||
key: 'selectAll', | ||
value: function selectAll(event) { | ||
this._handleEvent(event); | ||
this.setSelectedRangeWithAffinity({ | ||
start: 0, | ||
length: this.text().length | ||
}, Affinity.NONE); | ||
} | ||
setSelectedRangeWithAffinity: { | ||
value: function(range, affinity) { | ||
var min = 0; | ||
var max = this.text().length; | ||
var caret = { | ||
start: Math.max(min, Math.min(max, range.start)), | ||
end: Math.max(min, Math.min(max, range.start + range.length)) | ||
}; | ||
this._selectedRange = { | ||
start: caret.start, | ||
length: caret.end - caret.start | ||
} | ||
this.selectionAffinity = range.length === 0 ? $$input$sim$$Affinity.NONE : affinity; | ||
return this._selectedRange; | ||
}, | ||
/** | ||
* Gets the object value. This is the value that should be considered the | ||
* 'real' value of the field. | ||
* | ||
* @returns {String} | ||
*/ | ||
}, { | ||
key: 'text', | ||
value: function text() { | ||
return this._value; | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Sets the object value of the field. | ||
* | ||
* @param {string} value | ||
*/ | ||
}, { | ||
key: 'setText', | ||
value: function setText(value) { | ||
this._value = '' + value; | ||
this.setSelectedRange({ | ||
start: this._value.length, | ||
length: 0 | ||
}); | ||
} | ||
selectionAnchor: { | ||
value: function() { | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case $$input$sim$$Affinity.UPSTREAM: | ||
return range.start + range.length; | ||
case $$input$sim$$Affinity.DOWNSTREAM: | ||
return range.start; | ||
default: | ||
return $$input$sim$$Affinity.NONE; | ||
} | ||
}, | ||
/** | ||
* Gets the range of the current selection. | ||
* | ||
* @returns {Object} {start: number, length: number} | ||
*/ | ||
}, { | ||
key: 'selectedRange', | ||
value: function selectedRange() { | ||
return this._selectedRange; | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Sets the range of the current selection without changing the affinity. | ||
* @param {Object} range ({start: 0, length: 0}) | ||
*/ | ||
}, { | ||
key: 'setSelectedRange', | ||
value: function setSelectedRange(range) { | ||
this.setSelectedRangeWithAffinity(range, this.selectionAffinity); | ||
} | ||
_buildKeybindings: { | ||
value: function() { | ||
var osx; | ||
/** | ||
* Sets the range of the current selection and the selection affinity. | ||
* | ||
* @param {Object} range {start: number, length: number} | ||
* @param {Affinity} affinity | ||
* @returns {Object} {start: 0, length: 0} | ||
*/ | ||
}, { | ||
key: 'setSelectedRangeWithAffinity', | ||
value: function setSelectedRangeWithAffinity(range, affinity) { | ||
var min = 0; | ||
var max = this.text().length; | ||
var caret = { | ||
start: Math.max(min, Math.min(max, range.start)), | ||
end: Math.max(min, Math.min(max, range.start + range.length)) | ||
}; | ||
this._selectedRange = { | ||
start: caret.start, | ||
length: caret.end - caret.start | ||
}; | ||
this.selectionAffinity = range.length === 0 ? Affinity.NONE : affinity; | ||
return this._selectedRange; | ||
} | ||
if(typeof navigator !== 'undefined') { | ||
osx = /^Mozilla\/[\d\.]+ \(Macintosh/.test(navigator.userAgent); | ||
} else if(typeof process !== 'undefined') { | ||
osx = /darwin/.test(process.platform); | ||
} | ||
this._bindings = $$keybindings$$keyBindingsForPlatform(osx ? 'OSX' : 'Default'); | ||
}, | ||
/** | ||
* Gets the position of the current selection's anchor point, i.e. the point | ||
* that the selection extends from, if any. | ||
* | ||
* @returns {number} | ||
*/ | ||
}, { | ||
key: 'selectionAnchor', | ||
value: function selectionAnchor() { | ||
var range = this.selectedRange(); | ||
switch (this.selectionAffinity) { | ||
case Affinity.UPSTREAM: | ||
return range.start + range.length; | ||
case Affinity.DOWNSTREAM: | ||
return range.start; | ||
default: | ||
return Affinity.NONE; | ||
} | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Builds the key bindings for platform | ||
* | ||
* @TODO: Make this better | ||
* @private | ||
*/ | ||
}, { | ||
key: '_buildKeybindings', | ||
value: function _buildKeybindings() { | ||
var osx; | ||
_handleEvent: { | ||
value: function(event) { | ||
if(event && this.shouldCancelEvents) { | ||
event.preventDefault(); | ||
} | ||
}, | ||
if (typeof navigator !== 'undefined') { | ||
osx = /^Mozilla\/[\d\.]+ \(Macintosh/.test(navigator.userAgent); | ||
} else if (typeof process !== 'undefined') { | ||
osx = /darwin/.test(process.platform); | ||
} | ||
this._bindings = keyBindingsForPlatform(osx ? 'OSX' : 'Default'); | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Handles the event based on the `shouldCancelEvents` prop. | ||
* | ||
* @param {Event} event | ||
* @private | ||
*/ | ||
}, { | ||
key: '_handleEvent', | ||
value: function _handleEvent(event) { | ||
if (event && this.shouldCancelEvents) { | ||
event.preventDefault(); | ||
} | ||
} | ||
_lastWordBreakBeforeIndex: { | ||
value: function(index) { | ||
var indexes = this._leftWordBreakIndexes(); | ||
var result = indexes[0]; | ||
for (var i = 0, l = indexes.length; i < l; i++) { | ||
var wordBreakIndex = indexes[i]; | ||
if (index > wordBreakIndex) { | ||
result = wordBreakIndex; | ||
} else { | ||
break; | ||
} | ||
} | ||
return result; | ||
}, | ||
/** | ||
* Finds the start of the 'word' before index. | ||
* | ||
* @param {number} index position at which to start looking | ||
* @returns {number} index in value less than or equal to the given index | ||
* @private | ||
*/ | ||
}, { | ||
key: '_lastWordBreakBeforeIndex', | ||
value: function _lastWordBreakBeforeIndex(index) { | ||
var indexes = this._leftWordBreakIndexes(); | ||
var result = indexes[0]; | ||
for (var i = 0, l = indexes.length; i < l; i++) { | ||
var wordBreakIndex = indexes[i]; | ||
if (index > wordBreakIndex) { | ||
result = wordBreakIndex; | ||
} else { | ||
break; | ||
} | ||
} | ||
return result; | ||
} | ||
enumerable: false, | ||
writable: true | ||
}, | ||
/** | ||
* Find starts of 'words' for navigational purposes. | ||
* | ||
* @example | ||
* // given value of '123456789' and text of '123-45-6789' | ||
* leftWordBreakIndexes() | ||
* // => [0, 3, 5] | ||
* | ||
* @returns {number[]} indexes in value of word starts. | ||
* @private | ||
*/ | ||
}, { | ||
key: '_leftWordBreakIndexes', | ||
value: function _leftWordBreakIndexes() { | ||
var result = []; | ||
var text = this.text(); | ||
for (var i = 0, l = text.length; i < l; i++) { | ||
if (hasLeftWordBreakAtIndex(text, i)) { | ||
result.push(i); | ||
} | ||
} | ||
return result; | ||
} | ||
_leftWordBreakIndexes: { | ||
value: function() { | ||
var result = []; | ||
var text = this.text(); | ||
for (var i = 0, l = text.length; i < l; i++) { | ||
if ($$input$sim$$hasLeftWordBreakAtIndex(text, i)) { | ||
result.push(i); | ||
} | ||
} | ||
return result; | ||
}, | ||
enumerable: false, | ||
writable: true | ||
}, | ||
_nextWordBreakAfterIndex: { | ||
value: function(index) { | ||
var indexes = this.rightWordBreakIndexes().reverse(); | ||
var result = indexes[0]; | ||
for (var i = 0, l = indexes.length; i < l; i++) { | ||
var wordBreakIndex = indexes[i]; | ||
if (index < wordBreakIndex) { | ||
result = wordBreakIndex; | ||
} else { | ||
break; | ||
} | ||
} | ||
return result; | ||
}, | ||
enumerable: false, | ||
writable: true | ||
/** | ||
* Finds the end of the 'word' after index. | ||
* | ||
* @param {number} index position in value at which to start looking. | ||
* @returns {number} | ||
* @private | ||
*/ | ||
}, { | ||
key: '_nextWordBreakAfterIndex', | ||
value: function _nextWordBreakAfterIndex(index) { | ||
var indexes = this.rightWordBreakIndexes().reverse(); | ||
var result = indexes[0]; | ||
for (var i = 0, l = indexes.length; i < l; i++) { | ||
var wordBreakIndex = indexes[i]; | ||
if (index < wordBreakIndex) { | ||
result = wordBreakIndex; | ||
} else { | ||
break; | ||
} | ||
} | ||
}); | ||
return result; | ||
} | ||
}]); | ||
return Input; | ||
}(); | ||
return Input; | ||
})(); | ||
var input$sim$umd$$InputSim = { | ||
Input: $$input$sim$$Input, | ||
KEYS: $$keybindings$$KEYS, | ||
keyBindingsForPlatform: $$keybindings$$keyBindingsForPlatform | ||
}; | ||
exports.Input = Input; | ||
exports.KEYS = KEYS; | ||
exports.keyBindingsForPlatform = keyBindingsForPlatform; | ||
}); | ||
if (typeof define === 'function' && define.amd) { | ||
define(function() { return input$sim$umd$$InputSim; }); | ||
} else if (typeof module !== 'undefined' && module.exports) { | ||
module.exports = input$sim$umd$$InputSim; | ||
} else if (typeof window !== 'undefined') { | ||
window.InputSim = input$sim$umd$$InputSim; | ||
} else { | ||
this.InputSim = input$sim$umd$$InputSim; | ||
} | ||
}).call(this); | ||
//# sourceMappingURL=input-sim.js.map |
@@ -19,5 +19,4 @@ // Karma configuration | ||
'node_modules/chai/chai.js', | ||
'node_modules/string-selection/dist/string-selection.js', | ||
'dist/input-sim.js', | ||
'test/dist/*.js' | ||
'test/.build/test-bundle.js' | ||
], | ||
@@ -62,3 +61,3 @@ | ||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher | ||
browsers: ['PhantomJS'], | ||
browsers: ['Chrome'], | ||
@@ -65,0 +64,0 @@ |
{ | ||
"name": "input-sim", | ||
"version": "3.0.1", | ||
"version": "3.1.0", | ||
"description": "Simulate keyboard events and selection ranges for inputs", | ||
"main": "dist/input-sim.js", | ||
"jsnext:main": "lib/input-sim.js", | ||
"jsnext:main": "src/input-sim.js", | ||
"scripts": { | ||
@@ -30,5 +30,4 @@ "build": "make", | ||
"devDependencies": { | ||
"babel": "^5.8.21", | ||
"chai": "^1.9.2", | ||
"es6-module-transpiler": "^0.8.3", | ||
"esnext": "^0.11.1", | ||
"jsdoc": "git://github.com/eventualbuddha/jsdoc.git#add-support-for-es6-classes", | ||
@@ -38,6 +37,6 @@ "karma": "^0.12.24", | ||
"karma-mocha": "^0.1.9", | ||
"karma-phantomjs-launcher": "^0.1.4", | ||
"mocha": "^2.0.1", | ||
"string-selection": "^1.0.0" | ||
"rollup": "^0.14.0", | ||
"string-selection": "^2.1.1" | ||
} | ||
} |
@@ -35,3 +35,3 @@ # Input-Sim | ||
```js | ||
input.deleteWordForward(); // input.text() -> 'Mos ' | ||
input.deleteWordBackward(); // input.text() -> 'Mos ' | ||
``` | ||
@@ -38,0 +38,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9
181911
21
3952