mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
57565 lines
2.1 MiB
57565 lines
2.1 MiB
/******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId])
|
||
/******/ return installedModules[moduleId].exports;
|
||
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ exports: {},
|
||
/******/ id: moduleId,
|
||
/******/ loaded: false
|
||
/******/ };
|
||
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.loaded = true;
|
||
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
|
||
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(0);
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ([
|
||
/* 0 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
var _vue = __webpack_require__(1);
|
||
|
||
var _vue2 = _interopRequireDefault(_vue);
|
||
|
||
var _App = __webpack_require__(3);
|
||
|
||
var _App2 = _interopRequireDefault(_App);
|
||
|
||
var _vueTruncate = __webpack_require__(80);
|
||
|
||
var _vueTruncate2 = _interopRequireDefault(_vueTruncate);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
_vue2.default.use(_vueTruncate2.default);
|
||
_vue2.default.config.devtools = true;
|
||
// mount a root Vue instance
|
||
new _vue2.default({
|
||
el: 'body',
|
||
components: {
|
||
app: _App2.default
|
||
}
|
||
});
|
||
|
||
/***/ },
|
||
/* 1 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global, process) {/*!
|
||
* Vue.js v1.0.26
|
||
* (c) 2016 Evan You
|
||
* Released under the MIT License.
|
||
*/
|
||
'use strict';
|
||
|
||
function set(obj, key, val) {
|
||
if (hasOwn(obj, key)) {
|
||
obj[key] = val;
|
||
return;
|
||
}
|
||
if (obj._isVue) {
|
||
set(obj._data, key, val);
|
||
return;
|
||
}
|
||
var ob = obj.__ob__;
|
||
if (!ob) {
|
||
obj[key] = val;
|
||
return;
|
||
}
|
||
ob.convert(key, val);
|
||
ob.dep.notify();
|
||
if (ob.vms) {
|
||
var i = ob.vms.length;
|
||
while (i--) {
|
||
var vm = ob.vms[i];
|
||
vm._proxy(key);
|
||
vm._digest();
|
||
}
|
||
}
|
||
return val;
|
||
}
|
||
|
||
/**
|
||
* Delete a property and trigger change if necessary.
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String} key
|
||
*/
|
||
|
||
function del(obj, key) {
|
||
if (!hasOwn(obj, key)) {
|
||
return;
|
||
}
|
||
delete obj[key];
|
||
var ob = obj.__ob__;
|
||
if (!ob) {
|
||
if (obj._isVue) {
|
||
delete obj._data[key];
|
||
obj._digest();
|
||
}
|
||
return;
|
||
}
|
||
ob.dep.notify();
|
||
if (ob.vms) {
|
||
var i = ob.vms.length;
|
||
while (i--) {
|
||
var vm = ob.vms[i];
|
||
vm._unproxy(key);
|
||
vm._digest();
|
||
}
|
||
}
|
||
}
|
||
|
||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
/**
|
||
* Check whether the object has the property.
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String} key
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function hasOwn(obj, key) {
|
||
return hasOwnProperty.call(obj, key);
|
||
}
|
||
|
||
/**
|
||
* Check if an expression is a literal value.
|
||
*
|
||
* @param {String} exp
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
var literalValueRE = /^\s?(true|false|-?[\d\.]+|'[^']*'|"[^"]*")\s?$/;
|
||
|
||
function isLiteral(exp) {
|
||
return literalValueRE.test(exp);
|
||
}
|
||
|
||
/**
|
||
* Check if a string starts with $ or _
|
||
*
|
||
* @param {String} str
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isReserved(str) {
|
||
var c = (str + '').charCodeAt(0);
|
||
return c === 0x24 || c === 0x5F;
|
||
}
|
||
|
||
/**
|
||
* Guard text output, make sure undefined outputs
|
||
* empty string
|
||
*
|
||
* @param {*} value
|
||
* @return {String}
|
||
*/
|
||
|
||
function _toString(value) {
|
||
return value == null ? '' : value.toString();
|
||
}
|
||
|
||
/**
|
||
* Check and convert possible numeric strings to numbers
|
||
* before setting back to data
|
||
*
|
||
* @param {*} value
|
||
* @return {*|Number}
|
||
*/
|
||
|
||
function toNumber(value) {
|
||
if (typeof value !== 'string') {
|
||
return value;
|
||
} else {
|
||
var parsed = Number(value);
|
||
return isNaN(parsed) ? value : parsed;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Convert string boolean literals into real booleans.
|
||
*
|
||
* @param {*} value
|
||
* @return {*|Boolean}
|
||
*/
|
||
|
||
function toBoolean(value) {
|
||
return value === 'true' ? true : value === 'false' ? false : value;
|
||
}
|
||
|
||
/**
|
||
* Strip quotes from a string
|
||
*
|
||
* @param {String} str
|
||
* @return {String | false}
|
||
*/
|
||
|
||
function stripQuotes(str) {
|
||
var a = str.charCodeAt(0);
|
||
var b = str.charCodeAt(str.length - 1);
|
||
return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str;
|
||
}
|
||
|
||
/**
|
||
* Camelize a hyphen-delmited string.
|
||
*
|
||
* @param {String} str
|
||
* @return {String}
|
||
*/
|
||
|
||
var camelizeRE = /-(\w)/g;
|
||
|
||
function camelize(str) {
|
||
return str.replace(camelizeRE, toUpper);
|
||
}
|
||
|
||
function toUpper(_, c) {
|
||
return c ? c.toUpperCase() : '';
|
||
}
|
||
|
||
/**
|
||
* Hyphenate a camelCase string.
|
||
*
|
||
* @param {String} str
|
||
* @return {String}
|
||
*/
|
||
|
||
var hyphenateRE = /([a-z\d])([A-Z])/g;
|
||
|
||
function hyphenate(str) {
|
||
return str.replace(hyphenateRE, '$1-$2').toLowerCase();
|
||
}
|
||
|
||
/**
|
||
* Converts hyphen/underscore/slash delimitered names into
|
||
* camelized classNames.
|
||
*
|
||
* e.g. my-component => MyComponent
|
||
* some_else => SomeElse
|
||
* some/comp => SomeComp
|
||
*
|
||
* @param {String} str
|
||
* @return {String}
|
||
*/
|
||
|
||
var classifyRE = /(?:^|[-_\/])(\w)/g;
|
||
|
||
function classify(str) {
|
||
return str.replace(classifyRE, toUpper);
|
||
}
|
||
|
||
/**
|
||
* Simple bind, faster than native
|
||
*
|
||
* @param {Function} fn
|
||
* @param {Object} ctx
|
||
* @return {Function}
|
||
*/
|
||
|
||
function bind(fn, ctx) {
|
||
return function (a) {
|
||
var l = arguments.length;
|
||
return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Convert an Array-like object to a real Array.
|
||
*
|
||
* @param {Array-like} list
|
||
* @param {Number} [start] - start index
|
||
* @return {Array}
|
||
*/
|
||
|
||
function toArray(list, start) {
|
||
start = start || 0;
|
||
var i = list.length - start;
|
||
var ret = new Array(i);
|
||
while (i--) {
|
||
ret[i] = list[i + start];
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* Mix properties into target object.
|
||
*
|
||
* @param {Object} to
|
||
* @param {Object} from
|
||
*/
|
||
|
||
function extend(to, from) {
|
||
var keys = Object.keys(from);
|
||
var i = keys.length;
|
||
while (i--) {
|
||
to[keys[i]] = from[keys[i]];
|
||
}
|
||
return to;
|
||
}
|
||
|
||
/**
|
||
* Quick object check - this is primarily used to tell
|
||
* Objects from primitive values when we know the value
|
||
* is a JSON-compliant type.
|
||
*
|
||
* @param {*} obj
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isObject(obj) {
|
||
return obj !== null && typeof obj === 'object';
|
||
}
|
||
|
||
/**
|
||
* Strict object type check. Only returns true
|
||
* for plain JavaScript objects.
|
||
*
|
||
* @param {*} obj
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
var toString = Object.prototype.toString;
|
||
var OBJECT_STRING = '[object Object]';
|
||
|
||
function isPlainObject(obj) {
|
||
return toString.call(obj) === OBJECT_STRING;
|
||
}
|
||
|
||
/**
|
||
* Array type check.
|
||
*
|
||
* @param {*} obj
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
var isArray = Array.isArray;
|
||
|
||
/**
|
||
* Define a property.
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String} key
|
||
* @param {*} val
|
||
* @param {Boolean} [enumerable]
|
||
*/
|
||
|
||
function def(obj, key, val, enumerable) {
|
||
Object.defineProperty(obj, key, {
|
||
value: val,
|
||
enumerable: !!enumerable,
|
||
writable: true,
|
||
configurable: true
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Debounce a function so it only gets called after the
|
||
* input stops arriving after the given wait period.
|
||
*
|
||
* @param {Function} func
|
||
* @param {Number} wait
|
||
* @return {Function} - the debounced function
|
||
*/
|
||
|
||
function _debounce(func, wait) {
|
||
var timeout, args, context, timestamp, result;
|
||
var later = function later() {
|
||
var last = Date.now() - timestamp;
|
||
if (last < wait && last >= 0) {
|
||
timeout = setTimeout(later, wait - last);
|
||
} else {
|
||
timeout = null;
|
||
result = func.apply(context, args);
|
||
if (!timeout) context = args = null;
|
||
}
|
||
};
|
||
return function () {
|
||
context = this;
|
||
args = arguments;
|
||
timestamp = Date.now();
|
||
if (!timeout) {
|
||
timeout = setTimeout(later, wait);
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Manual indexOf because it's slightly faster than
|
||
* native.
|
||
*
|
||
* @param {Array} arr
|
||
* @param {*} obj
|
||
*/
|
||
|
||
function indexOf(arr, obj) {
|
||
var i = arr.length;
|
||
while (i--) {
|
||
if (arr[i] === obj) return i;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* Make a cancellable version of an async callback.
|
||
*
|
||
* @param {Function} fn
|
||
* @return {Function}
|
||
*/
|
||
|
||
function cancellable(fn) {
|
||
var cb = function cb() {
|
||
if (!cb.cancelled) {
|
||
return fn.apply(this, arguments);
|
||
}
|
||
};
|
||
cb.cancel = function () {
|
||
cb.cancelled = true;
|
||
};
|
||
return cb;
|
||
}
|
||
|
||
/**
|
||
* Check if two values are loosely equal - that is,
|
||
* if they are plain objects, do they have the same shape?
|
||
*
|
||
* @param {*} a
|
||
* @param {*} b
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function looseEqual(a, b) {
|
||
/* eslint-disable eqeqeq */
|
||
return a == b || (isObject(a) && isObject(b) ? JSON.stringify(a) === JSON.stringify(b) : false);
|
||
/* eslint-enable eqeqeq */
|
||
}
|
||
|
||
var hasProto = ('__proto__' in {});
|
||
|
||
// Browser environment sniffing
|
||
var inBrowser = typeof window !== 'undefined' && Object.prototype.toString.call(window) !== '[object Object]';
|
||
|
||
// detect devtools
|
||
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
||
|
||
// UA sniffing for working around browser-specific quirks
|
||
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
|
||
var isIE = UA && UA.indexOf('trident') > 0;
|
||
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
|
||
var isAndroid = UA && UA.indexOf('android') > 0;
|
||
var isIos = UA && /(iphone|ipad|ipod|ios)/i.test(UA);
|
||
var iosVersionMatch = isIos && UA.match(/os ([\d_]+)/);
|
||
var iosVersion = iosVersionMatch && iosVersionMatch[1].split('_');
|
||
|
||
// detecting iOS UIWebView by indexedDB
|
||
var hasMutationObserverBug = iosVersion && Number(iosVersion[0]) >= 9 && Number(iosVersion[1]) >= 3 && !window.indexedDB;
|
||
|
||
var transitionProp = undefined;
|
||
var transitionEndEvent = undefined;
|
||
var animationProp = undefined;
|
||
var animationEndEvent = undefined;
|
||
|
||
// Transition property/event sniffing
|
||
if (inBrowser && !isIE9) {
|
||
var isWebkitTrans = window.ontransitionend === undefined && window.onwebkittransitionend !== undefined;
|
||
var isWebkitAnim = window.onanimationend === undefined && window.onwebkitanimationend !== undefined;
|
||
transitionProp = isWebkitTrans ? 'WebkitTransition' : 'transition';
|
||
transitionEndEvent = isWebkitTrans ? 'webkitTransitionEnd' : 'transitionend';
|
||
animationProp = isWebkitAnim ? 'WebkitAnimation' : 'animation';
|
||
animationEndEvent = isWebkitAnim ? 'webkitAnimationEnd' : 'animationend';
|
||
}
|
||
|
||
/**
|
||
* Defer a task to execute it asynchronously. Ideally this
|
||
* should be executed as a microtask, so we leverage
|
||
* MutationObserver if it's available, and fallback to
|
||
* setTimeout(0).
|
||
*
|
||
* @param {Function} cb
|
||
* @param {Object} ctx
|
||
*/
|
||
|
||
var nextTick = (function () {
|
||
var callbacks = [];
|
||
var pending = false;
|
||
var timerFunc;
|
||
function nextTickHandler() {
|
||
pending = false;
|
||
var copies = callbacks.slice(0);
|
||
callbacks = [];
|
||
for (var i = 0; i < copies.length; i++) {
|
||
copies[i]();
|
||
}
|
||
}
|
||
|
||
/* istanbul ignore if */
|
||
if (typeof MutationObserver !== 'undefined' && !hasMutationObserverBug) {
|
||
var counter = 1;
|
||
var observer = new MutationObserver(nextTickHandler);
|
||
var textNode = document.createTextNode(counter);
|
||
observer.observe(textNode, {
|
||
characterData: true
|
||
});
|
||
timerFunc = function () {
|
||
counter = (counter + 1) % 2;
|
||
textNode.data = counter;
|
||
};
|
||
} else {
|
||
// webpack attempts to inject a shim for setImmediate
|
||
// if it is used as a global, so we have to work around that to
|
||
// avoid bundling unnecessary code.
|
||
var context = inBrowser ? window : typeof global !== 'undefined' ? global : {};
|
||
timerFunc = context.setImmediate || setTimeout;
|
||
}
|
||
return function (cb, ctx) {
|
||
var func = ctx ? function () {
|
||
cb.call(ctx);
|
||
} : cb;
|
||
callbacks.push(func);
|
||
if (pending) return;
|
||
pending = true;
|
||
timerFunc(nextTickHandler, 0);
|
||
};
|
||
})();
|
||
|
||
var _Set = undefined;
|
||
/* istanbul ignore if */
|
||
if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {
|
||
// use native Set when available.
|
||
_Set = Set;
|
||
} else {
|
||
// a non-standard Set polyfill that only works with primitive keys.
|
||
_Set = function () {
|
||
this.set = Object.create(null);
|
||
};
|
||
_Set.prototype.has = function (key) {
|
||
return this.set[key] !== undefined;
|
||
};
|
||
_Set.prototype.add = function (key) {
|
||
this.set[key] = 1;
|
||
};
|
||
_Set.prototype.clear = function () {
|
||
this.set = Object.create(null);
|
||
};
|
||
}
|
||
|
||
function Cache(limit) {
|
||
this.size = 0;
|
||
this.limit = limit;
|
||
this.head = this.tail = undefined;
|
||
this._keymap = Object.create(null);
|
||
}
|
||
|
||
var p = Cache.prototype;
|
||
|
||
/**
|
||
* Put <value> into the cache associated with <key>.
|
||
* Returns the entry which was removed to make room for
|
||
* the new entry. Otherwise undefined is returned.
|
||
* (i.e. if there was enough room already).
|
||
*
|
||
* @param {String} key
|
||
* @param {*} value
|
||
* @return {Entry|undefined}
|
||
*/
|
||
|
||
p.put = function (key, value) {
|
||
var removed;
|
||
|
||
var entry = this.get(key, true);
|
||
if (!entry) {
|
||
if (this.size === this.limit) {
|
||
removed = this.shift();
|
||
}
|
||
entry = {
|
||
key: key
|
||
};
|
||
this._keymap[key] = entry;
|
||
if (this.tail) {
|
||
this.tail.newer = entry;
|
||
entry.older = this.tail;
|
||
} else {
|
||
this.head = entry;
|
||
}
|
||
this.tail = entry;
|
||
this.size++;
|
||
}
|
||
entry.value = value;
|
||
|
||
return removed;
|
||
};
|
||
|
||
/**
|
||
* Purge the least recently used (oldest) entry from the
|
||
* cache. Returns the removed entry or undefined if the
|
||
* cache was empty.
|
||
*/
|
||
|
||
p.shift = function () {
|
||
var entry = this.head;
|
||
if (entry) {
|
||
this.head = this.head.newer;
|
||
this.head.older = undefined;
|
||
entry.newer = entry.older = undefined;
|
||
this._keymap[entry.key] = undefined;
|
||
this.size--;
|
||
}
|
||
return entry;
|
||
};
|
||
|
||
/**
|
||
* Get and register recent use of <key>. Returns the value
|
||
* associated with <key> or undefined if not in cache.
|
||
*
|
||
* @param {String} key
|
||
* @param {Boolean} returnEntry
|
||
* @return {Entry|*}
|
||
*/
|
||
|
||
p.get = function (key, returnEntry) {
|
||
var entry = this._keymap[key];
|
||
if (entry === undefined) return;
|
||
if (entry === this.tail) {
|
||
return returnEntry ? entry : entry.value;
|
||
}
|
||
// HEAD--------------TAIL
|
||
// <.older .newer>
|
||
// <--- add direction --
|
||
// A B C <D> E
|
||
if (entry.newer) {
|
||
if (entry === this.head) {
|
||
this.head = entry.newer;
|
||
}
|
||
entry.newer.older = entry.older; // C <-- E.
|
||
}
|
||
if (entry.older) {
|
||
entry.older.newer = entry.newer; // C. --> E
|
||
}
|
||
entry.newer = undefined; // D --x
|
||
entry.older = this.tail; // D. --> E
|
||
if (this.tail) {
|
||
this.tail.newer = entry; // E. <-- D
|
||
}
|
||
this.tail = entry;
|
||
return returnEntry ? entry : entry.value;
|
||
};
|
||
|
||
var cache$1 = new Cache(1000);
|
||
var filterTokenRE = /[^\s'"]+|'[^']*'|"[^"]*"/g;
|
||
var reservedArgRE = /^in$|^-?\d+/;
|
||
|
||
/**
|
||
* Parser state
|
||
*/
|
||
|
||
var str;
|
||
var dir;
|
||
var c;
|
||
var prev;
|
||
var i;
|
||
var l;
|
||
var lastFilterIndex;
|
||
var inSingle;
|
||
var inDouble;
|
||
var curly;
|
||
var square;
|
||
var paren;
|
||
/**
|
||
* Push a filter to the current directive object
|
||
*/
|
||
|
||
function pushFilter() {
|
||
var exp = str.slice(lastFilterIndex, i).trim();
|
||
var filter;
|
||
if (exp) {
|
||
filter = {};
|
||
var tokens = exp.match(filterTokenRE);
|
||
filter.name = tokens[0];
|
||
if (tokens.length > 1) {
|
||
filter.args = tokens.slice(1).map(processFilterArg);
|
||
}
|
||
}
|
||
if (filter) {
|
||
(dir.filters = dir.filters || []).push(filter);
|
||
}
|
||
lastFilterIndex = i + 1;
|
||
}
|
||
|
||
/**
|
||
* Check if an argument is dynamic and strip quotes.
|
||
*
|
||
* @param {String} arg
|
||
* @return {Object}
|
||
*/
|
||
|
||
function processFilterArg(arg) {
|
||
if (reservedArgRE.test(arg)) {
|
||
return {
|
||
value: toNumber(arg),
|
||
dynamic: false
|
||
};
|
||
} else {
|
||
var stripped = stripQuotes(arg);
|
||
var dynamic = stripped === arg;
|
||
return {
|
||
value: dynamic ? arg : stripped,
|
||
dynamic: dynamic
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Parse a directive value and extract the expression
|
||
* and its filters into a descriptor.
|
||
*
|
||
* Example:
|
||
*
|
||
* "a + 1 | uppercase" will yield:
|
||
* {
|
||
* expression: 'a + 1',
|
||
* filters: [
|
||
* { name: 'uppercase', args: null }
|
||
* ]
|
||
* }
|
||
*
|
||
* @param {String} s
|
||
* @return {Object}
|
||
*/
|
||
|
||
function parseDirective(s) {
|
||
var hit = cache$1.get(s);
|
||
if (hit) {
|
||
return hit;
|
||
}
|
||
|
||
// reset parser state
|
||
str = s;
|
||
inSingle = inDouble = false;
|
||
curly = square = paren = 0;
|
||
lastFilterIndex = 0;
|
||
dir = {};
|
||
|
||
for (i = 0, l = str.length; i < l; i++) {
|
||
prev = c;
|
||
c = str.charCodeAt(i);
|
||
if (inSingle) {
|
||
// check single quote
|
||
if (c === 0x27 && prev !== 0x5C) inSingle = !inSingle;
|
||
} else if (inDouble) {
|
||
// check double quote
|
||
if (c === 0x22 && prev !== 0x5C) inDouble = !inDouble;
|
||
} else if (c === 0x7C && // pipe
|
||
str.charCodeAt(i + 1) !== 0x7C && str.charCodeAt(i - 1) !== 0x7C) {
|
||
if (dir.expression == null) {
|
||
// first filter, end of expression
|
||
lastFilterIndex = i + 1;
|
||
dir.expression = str.slice(0, i).trim();
|
||
} else {
|
||
// already has filter
|
||
pushFilter();
|
||
}
|
||
} else {
|
||
switch (c) {
|
||
case 0x22:
|
||
inDouble = true;break; // "
|
||
case 0x27:
|
||
inSingle = true;break; // '
|
||
case 0x28:
|
||
paren++;break; // (
|
||
case 0x29:
|
||
paren--;break; // )
|
||
case 0x5B:
|
||
square++;break; // [
|
||
case 0x5D:
|
||
square--;break; // ]
|
||
case 0x7B:
|
||
curly++;break; // {
|
||
case 0x7D:
|
||
curly--;break; // }
|
||
}
|
||
}
|
||
}
|
||
|
||
if (dir.expression == null) {
|
||
dir.expression = str.slice(0, i).trim();
|
||
} else if (lastFilterIndex !== 0) {
|
||
pushFilter();
|
||
}
|
||
|
||
cache$1.put(s, dir);
|
||
return dir;
|
||
}
|
||
|
||
var directive = Object.freeze({
|
||
parseDirective: parseDirective
|
||
});
|
||
|
||
var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
|
||
var cache = undefined;
|
||
var tagRE = undefined;
|
||
var htmlRE = undefined;
|
||
/**
|
||
* Escape a string so it can be used in a RegExp
|
||
* constructor.
|
||
*
|
||
* @param {String} str
|
||
*/
|
||
|
||
function escapeRegex(str) {
|
||
return str.replace(regexEscapeRE, '\\$&');
|
||
}
|
||
|
||
function compileRegex() {
|
||
var open = escapeRegex(config.delimiters[0]);
|
||
var close = escapeRegex(config.delimiters[1]);
|
||
var unsafeOpen = escapeRegex(config.unsafeDelimiters[0]);
|
||
var unsafeClose = escapeRegex(config.unsafeDelimiters[1]);
|
||
tagRE = new RegExp(unsafeOpen + '((?:.|\\n)+?)' + unsafeClose + '|' + open + '((?:.|\\n)+?)' + close, 'g');
|
||
htmlRE = new RegExp('^' + unsafeOpen + '((?:.|\\n)+?)' + unsafeClose + '$');
|
||
// reset cache
|
||
cache = new Cache(1000);
|
||
}
|
||
|
||
/**
|
||
* Parse a template text string into an array of tokens.
|
||
*
|
||
* @param {String} text
|
||
* @return {Array<Object> | null}
|
||
* - {String} type
|
||
* - {String} value
|
||
* - {Boolean} [html]
|
||
* - {Boolean} [oneTime]
|
||
*/
|
||
|
||
function parseText(text) {
|
||
if (!cache) {
|
||
compileRegex();
|
||
}
|
||
var hit = cache.get(text);
|
||
if (hit) {
|
||
return hit;
|
||
}
|
||
if (!tagRE.test(text)) {
|
||
return null;
|
||
}
|
||
var tokens = [];
|
||
var lastIndex = tagRE.lastIndex = 0;
|
||
var match, index, html, value, first, oneTime;
|
||
/* eslint-disable no-cond-assign */
|
||
while (match = tagRE.exec(text)) {
|
||
/* eslint-enable no-cond-assign */
|
||
index = match.index;
|
||
// push text token
|
||
if (index > lastIndex) {
|
||
tokens.push({
|
||
value: text.slice(lastIndex, index)
|
||
});
|
||
}
|
||
// tag token
|
||
html = htmlRE.test(match[0]);
|
||
value = html ? match[1] : match[2];
|
||
first = value.charCodeAt(0);
|
||
oneTime = first === 42; // *
|
||
value = oneTime ? value.slice(1) : value;
|
||
tokens.push({
|
||
tag: true,
|
||
value: value.trim(),
|
||
html: html,
|
||
oneTime: oneTime
|
||
});
|
||
lastIndex = index + match[0].length;
|
||
}
|
||
if (lastIndex < text.length) {
|
||
tokens.push({
|
||
value: text.slice(lastIndex)
|
||
});
|
||
}
|
||
cache.put(text, tokens);
|
||
return tokens;
|
||
}
|
||
|
||
/**
|
||
* Format a list of tokens into an expression.
|
||
* e.g. tokens parsed from 'a {{b}} c' can be serialized
|
||
* into one single expression as '"a " + b + " c"'.
|
||
*
|
||
* @param {Array} tokens
|
||
* @param {Vue} [vm]
|
||
* @return {String}
|
||
*/
|
||
|
||
function tokensToExp(tokens, vm) {
|
||
if (tokens.length > 1) {
|
||
return tokens.map(function (token) {
|
||
return formatToken(token, vm);
|
||
}).join('+');
|
||
} else {
|
||
return formatToken(tokens[0], vm, true);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Format a single token.
|
||
*
|
||
* @param {Object} token
|
||
* @param {Vue} [vm]
|
||
* @param {Boolean} [single]
|
||
* @return {String}
|
||
*/
|
||
|
||
function formatToken(token, vm, single) {
|
||
return token.tag ? token.oneTime && vm ? '"' + vm.$eval(token.value) + '"' : inlineFilters(token.value, single) : '"' + token.value + '"';
|
||
}
|
||
|
||
/**
|
||
* For an attribute with multiple interpolation tags,
|
||
* e.g. attr="some-{{thing | filter}}", in order to combine
|
||
* the whole thing into a single watchable expression, we
|
||
* have to inline those filters. This function does exactly
|
||
* that. This is a bit hacky but it avoids heavy changes
|
||
* to directive parser and watcher mechanism.
|
||
*
|
||
* @param {String} exp
|
||
* @param {Boolean} single
|
||
* @return {String}
|
||
*/
|
||
|
||
var filterRE = /[^|]\|[^|]/;
|
||
function inlineFilters(exp, single) {
|
||
if (!filterRE.test(exp)) {
|
||
return single ? exp : '(' + exp + ')';
|
||
} else {
|
||
var dir = parseDirective(exp);
|
||
if (!dir.filters) {
|
||
return '(' + exp + ')';
|
||
} else {
|
||
return 'this._applyFilters(' + dir.expression + // value
|
||
',null,' + // oldValue (null for read)
|
||
JSON.stringify(dir.filters) + // filter descriptors
|
||
',false)'; // write?
|
||
}
|
||
}
|
||
}
|
||
|
||
var text = Object.freeze({
|
||
compileRegex: compileRegex,
|
||
parseText: parseText,
|
||
tokensToExp: tokensToExp
|
||
});
|
||
|
||
var delimiters = ['{{', '}}'];
|
||
var unsafeDelimiters = ['{{{', '}}}'];
|
||
|
||
var config = Object.defineProperties({
|
||
|
||
/**
|
||
* Whether to print debug messages.
|
||
* Also enables stack trace for warnings.
|
||
*
|
||
* @type {Boolean}
|
||
*/
|
||
|
||
debug: false,
|
||
|
||
/**
|
||
* Whether to suppress warnings.
|
||
*
|
||
* @type {Boolean}
|
||
*/
|
||
|
||
silent: false,
|
||
|
||
/**
|
||
* Whether to use async rendering.
|
||
*/
|
||
|
||
async: true,
|
||
|
||
/**
|
||
* Whether to warn against errors caught when evaluating
|
||
* expressions.
|
||
*/
|
||
|
||
warnExpressionErrors: true,
|
||
|
||
/**
|
||
* Whether to allow devtools inspection.
|
||
* Disabled by default in production builds.
|
||
*/
|
||
|
||
devtools: process.env.NODE_ENV !== 'production',
|
||
|
||
/**
|
||
* Internal flag to indicate the delimiters have been
|
||
* changed.
|
||
*
|
||
* @type {Boolean}
|
||
*/
|
||
|
||
_delimitersChanged: true,
|
||
|
||
/**
|
||
* List of asset types that a component can own.
|
||
*
|
||
* @type {Array}
|
||
*/
|
||
|
||
_assetTypes: ['component', 'directive', 'elementDirective', 'filter', 'transition', 'partial'],
|
||
|
||
/**
|
||
* prop binding modes
|
||
*/
|
||
|
||
_propBindingModes: {
|
||
ONE_WAY: 0,
|
||
TWO_WAY: 1,
|
||
ONE_TIME: 2
|
||
},
|
||
|
||
/**
|
||
* Max circular updates allowed in a batcher flush cycle.
|
||
*/
|
||
|
||
_maxUpdateCount: 100
|
||
|
||
}, {
|
||
delimiters: { /**
|
||
* Interpolation delimiters. Changing these would trigger
|
||
* the text parser to re-compile the regular expressions.
|
||
*
|
||
* @type {Array<String>}
|
||
*/
|
||
|
||
get: function get() {
|
||
return delimiters;
|
||
},
|
||
set: function set(val) {
|
||
delimiters = val;
|
||
compileRegex();
|
||
},
|
||
configurable: true,
|
||
enumerable: true
|
||
},
|
||
unsafeDelimiters: {
|
||
get: function get() {
|
||
return unsafeDelimiters;
|
||
},
|
||
set: function set(val) {
|
||
unsafeDelimiters = val;
|
||
compileRegex();
|
||
},
|
||
configurable: true,
|
||
enumerable: true
|
||
}
|
||
});
|
||
|
||
var warn = undefined;
|
||
var formatComponentName = undefined;
|
||
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
(function () {
|
||
var hasConsole = typeof console !== 'undefined';
|
||
|
||
warn = function (msg, vm) {
|
||
if (hasConsole && !config.silent) {
|
||
console.error('[Vue warn]: ' + msg + (vm ? formatComponentName(vm) : ''));
|
||
}
|
||
};
|
||
|
||
formatComponentName = function (vm) {
|
||
var name = vm._isVue ? vm.$options.name : vm.name;
|
||
return name ? ' (found in component: <' + hyphenate(name) + '>)' : '';
|
||
};
|
||
})();
|
||
}
|
||
|
||
/**
|
||
* Append with transition.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Element} target
|
||
* @param {Vue} vm
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function appendWithTransition(el, target, vm, cb) {
|
||
applyTransition(el, 1, function () {
|
||
target.appendChild(el);
|
||
}, vm, cb);
|
||
}
|
||
|
||
/**
|
||
* InsertBefore with transition.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Element} target
|
||
* @param {Vue} vm
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function beforeWithTransition(el, target, vm, cb) {
|
||
applyTransition(el, 1, function () {
|
||
before(el, target);
|
||
}, vm, cb);
|
||
}
|
||
|
||
/**
|
||
* Remove with transition.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Vue} vm
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function removeWithTransition(el, vm, cb) {
|
||
applyTransition(el, -1, function () {
|
||
remove(el);
|
||
}, vm, cb);
|
||
}
|
||
|
||
/**
|
||
* Apply transitions with an operation callback.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Number} direction
|
||
* 1: enter
|
||
* -1: leave
|
||
* @param {Function} op - the actual DOM operation
|
||
* @param {Vue} vm
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function applyTransition(el, direction, op, vm, cb) {
|
||
var transition = el.__v_trans;
|
||
if (!transition ||
|
||
// skip if there are no js hooks and CSS transition is
|
||
// not supported
|
||
!transition.hooks && !transitionEndEvent ||
|
||
// skip transitions for initial compile
|
||
!vm._isCompiled ||
|
||
// if the vm is being manipulated by a parent directive
|
||
// during the parent's compilation phase, skip the
|
||
// animation.
|
||
vm.$parent && !vm.$parent._isCompiled) {
|
||
op();
|
||
if (cb) cb();
|
||
return;
|
||
}
|
||
var action = direction > 0 ? 'enter' : 'leave';
|
||
transition[action](op, cb);
|
||
}
|
||
|
||
var transition = Object.freeze({
|
||
appendWithTransition: appendWithTransition,
|
||
beforeWithTransition: beforeWithTransition,
|
||
removeWithTransition: removeWithTransition,
|
||
applyTransition: applyTransition
|
||
});
|
||
|
||
/**
|
||
* Query an element selector if it's not an element already.
|
||
*
|
||
* @param {String|Element} el
|
||
* @return {Element}
|
||
*/
|
||
|
||
function query(el) {
|
||
if (typeof el === 'string') {
|
||
var selector = el;
|
||
el = document.querySelector(el);
|
||
if (!el) {
|
||
process.env.NODE_ENV !== 'production' && warn('Cannot find element: ' + selector);
|
||
}
|
||
}
|
||
return el;
|
||
}
|
||
|
||
/**
|
||
* Check if a node is in the document.
|
||
* Note: document.documentElement.contains should work here
|
||
* but always returns false for comment nodes in phantomjs,
|
||
* making unit tests difficult. This is fixed by doing the
|
||
* contains() check on the node's parentNode instead of
|
||
* the node itself.
|
||
*
|
||
* @param {Node} node
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function inDoc(node) {
|
||
if (!node) return false;
|
||
var doc = node.ownerDocument.documentElement;
|
||
var parent = node.parentNode;
|
||
return doc === node || doc === parent || !!(parent && parent.nodeType === 1 && doc.contains(parent));
|
||
}
|
||
|
||
/**
|
||
* Get and remove an attribute from a node.
|
||
*
|
||
* @param {Node} node
|
||
* @param {String} _attr
|
||
*/
|
||
|
||
function getAttr(node, _attr) {
|
||
var val = node.getAttribute(_attr);
|
||
if (val !== null) {
|
||
node.removeAttribute(_attr);
|
||
}
|
||
return val;
|
||
}
|
||
|
||
/**
|
||
* Get an attribute with colon or v-bind: prefix.
|
||
*
|
||
* @param {Node} node
|
||
* @param {String} name
|
||
* @return {String|null}
|
||
*/
|
||
|
||
function getBindAttr(node, name) {
|
||
var val = getAttr(node, ':' + name);
|
||
if (val === null) {
|
||
val = getAttr(node, 'v-bind:' + name);
|
||
}
|
||
return val;
|
||
}
|
||
|
||
/**
|
||
* Check the presence of a bind attribute.
|
||
*
|
||
* @param {Node} node
|
||
* @param {String} name
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function hasBindAttr(node, name) {
|
||
return node.hasAttribute(name) || node.hasAttribute(':' + name) || node.hasAttribute('v-bind:' + name);
|
||
}
|
||
|
||
/**
|
||
* Insert el before target
|
||
*
|
||
* @param {Element} el
|
||
* @param {Element} target
|
||
*/
|
||
|
||
function before(el, target) {
|
||
target.parentNode.insertBefore(el, target);
|
||
}
|
||
|
||
/**
|
||
* Insert el after target
|
||
*
|
||
* @param {Element} el
|
||
* @param {Element} target
|
||
*/
|
||
|
||
function after(el, target) {
|
||
if (target.nextSibling) {
|
||
before(el, target.nextSibling);
|
||
} else {
|
||
target.parentNode.appendChild(el);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Remove el from DOM
|
||
*
|
||
* @param {Element} el
|
||
*/
|
||
|
||
function remove(el) {
|
||
el.parentNode.removeChild(el);
|
||
}
|
||
|
||
/**
|
||
* Prepend el to target
|
||
*
|
||
* @param {Element} el
|
||
* @param {Element} target
|
||
*/
|
||
|
||
function prepend(el, target) {
|
||
if (target.firstChild) {
|
||
before(el, target.firstChild);
|
||
} else {
|
||
target.appendChild(el);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Replace target with el
|
||
*
|
||
* @param {Element} target
|
||
* @param {Element} el
|
||
*/
|
||
|
||
function replace(target, el) {
|
||
var parent = target.parentNode;
|
||
if (parent) {
|
||
parent.replaceChild(el, target);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Add event listener shorthand.
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} event
|
||
* @param {Function} cb
|
||
* @param {Boolean} [useCapture]
|
||
*/
|
||
|
||
function on(el, event, cb, useCapture) {
|
||
el.addEventListener(event, cb, useCapture);
|
||
}
|
||
|
||
/**
|
||
* Remove event listener shorthand.
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} event
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
function off(el, event, cb) {
|
||
el.removeEventListener(event, cb);
|
||
}
|
||
|
||
/**
|
||
* For IE9 compat: when both class and :class are present
|
||
* getAttribute('class') returns wrong value...
|
||
*
|
||
* @param {Element} el
|
||
* @return {String}
|
||
*/
|
||
|
||
function getClass(el) {
|
||
var classname = el.className;
|
||
if (typeof classname === 'object') {
|
||
classname = classname.baseVal || '';
|
||
}
|
||
return classname;
|
||
}
|
||
|
||
/**
|
||
* In IE9, setAttribute('class') will result in empty class
|
||
* if the element also has the :class attribute; However in
|
||
* PhantomJS, setting `className` does not work on SVG elements...
|
||
* So we have to do a conditional check here.
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} cls
|
||
*/
|
||
|
||
function setClass(el, cls) {
|
||
/* istanbul ignore if */
|
||
if (isIE9 && !/svg$/.test(el.namespaceURI)) {
|
||
el.className = cls;
|
||
} else {
|
||
el.setAttribute('class', cls);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Add class with compatibility for IE & SVG
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} cls
|
||
*/
|
||
|
||
function addClass(el, cls) {
|
||
if (el.classList) {
|
||
el.classList.add(cls);
|
||
} else {
|
||
var cur = ' ' + getClass(el) + ' ';
|
||
if (cur.indexOf(' ' + cls + ' ') < 0) {
|
||
setClass(el, (cur + cls).trim());
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Remove class with compatibility for IE & SVG
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} cls
|
||
*/
|
||
|
||
function removeClass(el, cls) {
|
||
if (el.classList) {
|
||
el.classList.remove(cls);
|
||
} else {
|
||
var cur = ' ' + getClass(el) + ' ';
|
||
var tar = ' ' + cls + ' ';
|
||
while (cur.indexOf(tar) >= 0) {
|
||
cur = cur.replace(tar, ' ');
|
||
}
|
||
setClass(el, cur.trim());
|
||
}
|
||
if (!el.className) {
|
||
el.removeAttribute('class');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Extract raw content inside an element into a temporary
|
||
* container div
|
||
*
|
||
* @param {Element} el
|
||
* @param {Boolean} asFragment
|
||
* @return {Element|DocumentFragment}
|
||
*/
|
||
|
||
function extractContent(el, asFragment) {
|
||
var child;
|
||
var rawContent;
|
||
/* istanbul ignore if */
|
||
if (isTemplate(el) && isFragment(el.content)) {
|
||
el = el.content;
|
||
}
|
||
if (el.hasChildNodes()) {
|
||
trimNode(el);
|
||
rawContent = asFragment ? document.createDocumentFragment() : document.createElement('div');
|
||
/* eslint-disable no-cond-assign */
|
||
while (child = el.firstChild) {
|
||
/* eslint-enable no-cond-assign */
|
||
rawContent.appendChild(child);
|
||
}
|
||
}
|
||
return rawContent;
|
||
}
|
||
|
||
/**
|
||
* Trim possible empty head/tail text and comment
|
||
* nodes inside a parent.
|
||
*
|
||
* @param {Node} node
|
||
*/
|
||
|
||
function trimNode(node) {
|
||
var child;
|
||
/* eslint-disable no-sequences */
|
||
while ((child = node.firstChild, isTrimmable(child))) {
|
||
node.removeChild(child);
|
||
}
|
||
while ((child = node.lastChild, isTrimmable(child))) {
|
||
node.removeChild(child);
|
||
}
|
||
/* eslint-enable no-sequences */
|
||
}
|
||
|
||
function isTrimmable(node) {
|
||
return node && (node.nodeType === 3 && !node.data.trim() || node.nodeType === 8);
|
||
}
|
||
|
||
/**
|
||
* Check if an element is a template tag.
|
||
* Note if the template appears inside an SVG its tagName
|
||
* will be in lowercase.
|
||
*
|
||
* @param {Element} el
|
||
*/
|
||
|
||
function isTemplate(el) {
|
||
return el.tagName && el.tagName.toLowerCase() === 'template';
|
||
}
|
||
|
||
/**
|
||
* Create an "anchor" for performing dom insertion/removals.
|
||
* This is used in a number of scenarios:
|
||
* - fragment instance
|
||
* - v-html
|
||
* - v-if
|
||
* - v-for
|
||
* - component
|
||
*
|
||
* @param {String} content
|
||
* @param {Boolean} persist - IE trashes empty textNodes on
|
||
* cloneNode(true), so in certain
|
||
* cases the anchor needs to be
|
||
* non-empty to be persisted in
|
||
* templates.
|
||
* @return {Comment|Text}
|
||
*/
|
||
|
||
function createAnchor(content, persist) {
|
||
var anchor = config.debug ? document.createComment(content) : document.createTextNode(persist ? ' ' : '');
|
||
anchor.__v_anchor = true;
|
||
return anchor;
|
||
}
|
||
|
||
/**
|
||
* Find a component ref attribute that starts with $.
|
||
*
|
||
* @param {Element} node
|
||
* @return {String|undefined}
|
||
*/
|
||
|
||
var refRE = /^v-ref:/;
|
||
|
||
function findRef(node) {
|
||
if (node.hasAttributes()) {
|
||
var attrs = node.attributes;
|
||
for (var i = 0, l = attrs.length; i < l; i++) {
|
||
var name = attrs[i].name;
|
||
if (refRE.test(name)) {
|
||
return camelize(name.replace(refRE, ''));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Map a function to a range of nodes .
|
||
*
|
||
* @param {Node} node
|
||
* @param {Node} end
|
||
* @param {Function} op
|
||
*/
|
||
|
||
function mapNodeRange(node, end, op) {
|
||
var next;
|
||
while (node !== end) {
|
||
next = node.nextSibling;
|
||
op(node);
|
||
node = next;
|
||
}
|
||
op(end);
|
||
}
|
||
|
||
/**
|
||
* Remove a range of nodes with transition, store
|
||
* the nodes in a fragment with correct ordering,
|
||
* and call callback when done.
|
||
*
|
||
* @param {Node} start
|
||
* @param {Node} end
|
||
* @param {Vue} vm
|
||
* @param {DocumentFragment} frag
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
function removeNodeRange(start, end, vm, frag, cb) {
|
||
var done = false;
|
||
var removed = 0;
|
||
var nodes = [];
|
||
mapNodeRange(start, end, function (node) {
|
||
if (node === end) done = true;
|
||
nodes.push(node);
|
||
removeWithTransition(node, vm, onRemoved);
|
||
});
|
||
function onRemoved() {
|
||
removed++;
|
||
if (done && removed >= nodes.length) {
|
||
for (var i = 0; i < nodes.length; i++) {
|
||
frag.appendChild(nodes[i]);
|
||
}
|
||
cb && cb();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Check if a node is a DocumentFragment.
|
||
*
|
||
* @param {Node} node
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isFragment(node) {
|
||
return node && node.nodeType === 11;
|
||
}
|
||
|
||
/**
|
||
* Get outerHTML of elements, taking care
|
||
* of SVG elements in IE as well.
|
||
*
|
||
* @param {Element} el
|
||
* @return {String}
|
||
*/
|
||
|
||
function getOuterHTML(el) {
|
||
if (el.outerHTML) {
|
||
return el.outerHTML;
|
||
} else {
|
||
var container = document.createElement('div');
|
||
container.appendChild(el.cloneNode(true));
|
||
return container.innerHTML;
|
||
}
|
||
}
|
||
|
||
var commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/i;
|
||
var reservedTagRE = /^(slot|partial|component)$/i;
|
||
|
||
var isUnknownElement = undefined;
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
isUnknownElement = function (el, tag) {
|
||
if (tag.indexOf('-') > -1) {
|
||
// http://stackoverflow.com/a/28210364/1070244
|
||
return el.constructor === window.HTMLUnknownElement || el.constructor === window.HTMLElement;
|
||
} else {
|
||
return (/HTMLUnknownElement/.test(el.toString()) &&
|
||
// Chrome returns unknown for several HTML5 elements.
|
||
// https://code.google.com/p/chromium/issues/detail?id=540526
|
||
// Firefox returns unknown for some "Interactive elements."
|
||
!/^(data|time|rtc|rb|details|dialog|summary)$/.test(tag)
|
||
);
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Check if an element is a component, if yes return its
|
||
* component id.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Object|undefined}
|
||
*/
|
||
|
||
function checkComponentAttr(el, options) {
|
||
var tag = el.tagName.toLowerCase();
|
||
var hasAttrs = el.hasAttributes();
|
||
if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {
|
||
if (resolveAsset(options, 'components', tag)) {
|
||
return { id: tag };
|
||
} else {
|
||
var is = hasAttrs && getIsBinding(el, options);
|
||
if (is) {
|
||
return is;
|
||
} else if (process.env.NODE_ENV !== 'production') {
|
||
var expectedTag = options._componentNameMap && options._componentNameMap[tag];
|
||
if (expectedTag) {
|
||
warn('Unknown custom element: <' + tag + '> - ' + 'did you mean <' + expectedTag + '>? ' + 'HTML is case-insensitive, remember to use kebab-case in templates.');
|
||
} else if (isUnknownElement(el, tag)) {
|
||
warn('Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly? For recursive components, ' + 'make sure to provide the "name" option.');
|
||
}
|
||
}
|
||
}
|
||
} else if (hasAttrs) {
|
||
return getIsBinding(el, options);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get "is" binding from an element.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Object|undefined}
|
||
*/
|
||
|
||
function getIsBinding(el, options) {
|
||
// dynamic syntax
|
||
var exp = el.getAttribute('is');
|
||
if (exp != null) {
|
||
if (resolveAsset(options, 'components', exp)) {
|
||
el.removeAttribute('is');
|
||
return { id: exp };
|
||
}
|
||
} else {
|
||
exp = getBindAttr(el, 'is');
|
||
if (exp != null) {
|
||
return { id: exp, dynamic: true };
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Option overwriting strategies are functions that handle
|
||
* how to merge a parent option value and a child option
|
||
* value into the final value.
|
||
*
|
||
* All strategy functions follow the same signature:
|
||
*
|
||
* @param {*} parentVal
|
||
* @param {*} childVal
|
||
* @param {Vue} [vm]
|
||
*/
|
||
|
||
var strats = config.optionMergeStrategies = Object.create(null);
|
||
|
||
/**
|
||
* Helper that recursively merges two data objects together.
|
||
*/
|
||
|
||
function mergeData(to, from) {
|
||
var key, toVal, fromVal;
|
||
for (key in from) {
|
||
toVal = to[key];
|
||
fromVal = from[key];
|
||
if (!hasOwn(to, key)) {
|
||
set(to, key, fromVal);
|
||
} else if (isObject(toVal) && isObject(fromVal)) {
|
||
mergeData(toVal, fromVal);
|
||
}
|
||
}
|
||
return to;
|
||
}
|
||
|
||
/**
|
||
* Data
|
||
*/
|
||
|
||
strats.data = function (parentVal, childVal, vm) {
|
||
if (!vm) {
|
||
// in a Vue.extend merge, both should be functions
|
||
if (!childVal) {
|
||
return parentVal;
|
||
}
|
||
if (typeof childVal !== 'function') {
|
||
process.env.NODE_ENV !== 'production' && warn('The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', vm);
|
||
return parentVal;
|
||
}
|
||
if (!parentVal) {
|
||
return childVal;
|
||
}
|
||
// when parentVal & childVal are both present,
|
||
// we need to return a function that returns the
|
||
// merged result of both functions... no need to
|
||
// check if parentVal is a function here because
|
||
// it has to be a function to pass previous merges.
|
||
return function mergedDataFn() {
|
||
return mergeData(childVal.call(this), parentVal.call(this));
|
||
};
|
||
} else if (parentVal || childVal) {
|
||
return function mergedInstanceDataFn() {
|
||
// instance merge
|
||
var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;
|
||
var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;
|
||
if (instanceData) {
|
||
return mergeData(instanceData, defaultData);
|
||
} else {
|
||
return defaultData;
|
||
}
|
||
};
|
||
}
|
||
};
|
||
|
||
/**
|
||
* El
|
||
*/
|
||
|
||
strats.el = function (parentVal, childVal, vm) {
|
||
if (!vm && childVal && typeof childVal !== 'function') {
|
||
process.env.NODE_ENV !== 'production' && warn('The "el" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', vm);
|
||
return;
|
||
}
|
||
var ret = childVal || parentVal;
|
||
// invoke the element factory if this is instance merge
|
||
return vm && typeof ret === 'function' ? ret.call(vm) : ret;
|
||
};
|
||
|
||
/**
|
||
* Hooks and param attributes are merged as arrays.
|
||
*/
|
||
|
||
strats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = strats.activate = function (parentVal, childVal) {
|
||
return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
|
||
};
|
||
|
||
/**
|
||
* Assets
|
||
*
|
||
* When a vm is present (instance creation), we need to do
|
||
* a three-way merge between constructor options, instance
|
||
* options and parent options.
|
||
*/
|
||
|
||
function mergeAssets(parentVal, childVal) {
|
||
var res = Object.create(parentVal || null);
|
||
return childVal ? extend(res, guardArrayAssets(childVal)) : res;
|
||
}
|
||
|
||
config._assetTypes.forEach(function (type) {
|
||
strats[type + 's'] = mergeAssets;
|
||
});
|
||
|
||
/**
|
||
* Events & Watchers.
|
||
*
|
||
* Events & watchers hashes should not overwrite one
|
||
* another, so we merge them as arrays.
|
||
*/
|
||
|
||
strats.watch = strats.events = function (parentVal, childVal) {
|
||
if (!childVal) return parentVal;
|
||
if (!parentVal) return childVal;
|
||
var ret = {};
|
||
extend(ret, parentVal);
|
||
for (var key in childVal) {
|
||
var parent = ret[key];
|
||
var child = childVal[key];
|
||
if (parent && !isArray(parent)) {
|
||
parent = [parent];
|
||
}
|
||
ret[key] = parent ? parent.concat(child) : [child];
|
||
}
|
||
return ret;
|
||
};
|
||
|
||
/**
|
||
* Other object hashes.
|
||
*/
|
||
|
||
strats.props = strats.methods = strats.computed = function (parentVal, childVal) {
|
||
if (!childVal) return parentVal;
|
||
if (!parentVal) return childVal;
|
||
var ret = Object.create(null);
|
||
extend(ret, parentVal);
|
||
extend(ret, childVal);
|
||
return ret;
|
||
};
|
||
|
||
/**
|
||
* Default strategy.
|
||
*/
|
||
|
||
var defaultStrat = function defaultStrat(parentVal, childVal) {
|
||
return childVal === undefined ? parentVal : childVal;
|
||
};
|
||
|
||
/**
|
||
* Make sure component options get converted to actual
|
||
* constructors.
|
||
*
|
||
* @param {Object} options
|
||
*/
|
||
|
||
function guardComponents(options) {
|
||
if (options.components) {
|
||
var components = options.components = guardArrayAssets(options.components);
|
||
var ids = Object.keys(components);
|
||
var def;
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
var map = options._componentNameMap = {};
|
||
}
|
||
for (var i = 0, l = ids.length; i < l; i++) {
|
||
var key = ids[i];
|
||
if (commonTagRE.test(key) || reservedTagRE.test(key)) {
|
||
process.env.NODE_ENV !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);
|
||
continue;
|
||
}
|
||
// record a all lowercase <-> kebab-case mapping for
|
||
// possible custom element case error warning
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
map[key.replace(/-/g, '').toLowerCase()] = hyphenate(key);
|
||
}
|
||
def = components[key];
|
||
if (isPlainObject(def)) {
|
||
components[key] = Vue.extend(def);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Ensure all props option syntax are normalized into the
|
||
* Object-based format.
|
||
*
|
||
* @param {Object} options
|
||
*/
|
||
|
||
function guardProps(options) {
|
||
var props = options.props;
|
||
var i, val;
|
||
if (isArray(props)) {
|
||
options.props = {};
|
||
i = props.length;
|
||
while (i--) {
|
||
val = props[i];
|
||
if (typeof val === 'string') {
|
||
options.props[val] = null;
|
||
} else if (val.name) {
|
||
options.props[val.name] = val;
|
||
}
|
||
}
|
||
} else if (isPlainObject(props)) {
|
||
var keys = Object.keys(props);
|
||
i = keys.length;
|
||
while (i--) {
|
||
val = props[keys[i]];
|
||
if (typeof val === 'function') {
|
||
props[keys[i]] = { type: val };
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Guard an Array-format assets option and converted it
|
||
* into the key-value Object format.
|
||
*
|
||
* @param {Object|Array} assets
|
||
* @return {Object}
|
||
*/
|
||
|
||
function guardArrayAssets(assets) {
|
||
if (isArray(assets)) {
|
||
var res = {};
|
||
var i = assets.length;
|
||
var asset;
|
||
while (i--) {
|
||
asset = assets[i];
|
||
var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;
|
||
if (!id) {
|
||
process.env.NODE_ENV !== 'production' && warn('Array-syntax assets must provide a "name" or "id" field.');
|
||
} else {
|
||
res[id] = asset;
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
return assets;
|
||
}
|
||
|
||
/**
|
||
* Merge two option objects into a new one.
|
||
* Core utility used in both instantiation and inheritance.
|
||
*
|
||
* @param {Object} parent
|
||
* @param {Object} child
|
||
* @param {Vue} [vm] - if vm is present, indicates this is
|
||
* an instantiation merge.
|
||
*/
|
||
|
||
function mergeOptions(parent, child, vm) {
|
||
guardComponents(child);
|
||
guardProps(child);
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
if (child.propsData && !vm) {
|
||
warn('propsData can only be used as an instantiation option.');
|
||
}
|
||
}
|
||
var options = {};
|
||
var key;
|
||
if (child['extends']) {
|
||
parent = typeof child['extends'] === 'function' ? mergeOptions(parent, child['extends'].options, vm) : mergeOptions(parent, child['extends'], vm);
|
||
}
|
||
if (child.mixins) {
|
||
for (var i = 0, l = child.mixins.length; i < l; i++) {
|
||
var mixin = child.mixins[i];
|
||
var mixinOptions = mixin.prototype instanceof Vue ? mixin.options : mixin;
|
||
parent = mergeOptions(parent, mixinOptions, vm);
|
||
}
|
||
}
|
||
for (key in parent) {
|
||
mergeField(key);
|
||
}
|
||
for (key in child) {
|
||
if (!hasOwn(parent, key)) {
|
||
mergeField(key);
|
||
}
|
||
}
|
||
function mergeField(key) {
|
||
var strat = strats[key] || defaultStrat;
|
||
options[key] = strat(parent[key], child[key], vm, key);
|
||
}
|
||
return options;
|
||
}
|
||
|
||
/**
|
||
* Resolve an asset.
|
||
* This function is used because child instances need access
|
||
* to assets defined in its ancestor chain.
|
||
*
|
||
* @param {Object} options
|
||
* @param {String} type
|
||
* @param {String} id
|
||
* @param {Boolean} warnMissing
|
||
* @return {Object|Function}
|
||
*/
|
||
|
||
function resolveAsset(options, type, id, warnMissing) {
|
||
/* istanbul ignore if */
|
||
if (typeof id !== 'string') {
|
||
return;
|
||
}
|
||
var assets = options[type];
|
||
var camelizedId;
|
||
var res = assets[id] ||
|
||
// camelCase ID
|
||
assets[camelizedId = camelize(id)] ||
|
||
// Pascal Case ID
|
||
assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];
|
||
if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {
|
||
warn('Failed to resolve ' + type.slice(0, -1) + ': ' + id, options);
|
||
}
|
||
return res;
|
||
}
|
||
|
||
var uid$1 = 0;
|
||
|
||
/**
|
||
* A dep is an observable that can have multiple
|
||
* directives subscribing to it.
|
||
*
|
||
* @constructor
|
||
*/
|
||
function Dep() {
|
||
this.id = uid$1++;
|
||
this.subs = [];
|
||
}
|
||
|
||
// the current target watcher being evaluated.
|
||
// this is globally unique because there could be only one
|
||
// watcher being evaluated at any time.
|
||
Dep.target = null;
|
||
|
||
/**
|
||
* Add a directive subscriber.
|
||
*
|
||
* @param {Directive} sub
|
||
*/
|
||
|
||
Dep.prototype.addSub = function (sub) {
|
||
this.subs.push(sub);
|
||
};
|
||
|
||
/**
|
||
* Remove a directive subscriber.
|
||
*
|
||
* @param {Directive} sub
|
||
*/
|
||
|
||
Dep.prototype.removeSub = function (sub) {
|
||
this.subs.$remove(sub);
|
||
};
|
||
|
||
/**
|
||
* Add self as a dependency to the target watcher.
|
||
*/
|
||
|
||
Dep.prototype.depend = function () {
|
||
Dep.target.addDep(this);
|
||
};
|
||
|
||
/**
|
||
* Notify all subscribers of a new value.
|
||
*/
|
||
|
||
Dep.prototype.notify = function () {
|
||
// stablize the subscriber list first
|
||
var subs = toArray(this.subs);
|
||
for (var i = 0, l = subs.length; i < l; i++) {
|
||
subs[i].update();
|
||
}
|
||
};
|
||
|
||
var arrayProto = Array.prototype;
|
||
var arrayMethods = Object.create(arrayProto)
|
||
|
||
/**
|
||
* Intercept mutating methods and emit events
|
||
*/
|
||
|
||
;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {
|
||
// cache original method
|
||
var original = arrayProto[method];
|
||
def(arrayMethods, method, function mutator() {
|
||
// avoid leaking arguments:
|
||
// http://jsperf.com/closure-with-arguments
|
||
var i = arguments.length;
|
||
var args = new Array(i);
|
||
while (i--) {
|
||
args[i] = arguments[i];
|
||
}
|
||
var result = original.apply(this, args);
|
||
var ob = this.__ob__;
|
||
var inserted;
|
||
switch (method) {
|
||
case 'push':
|
||
inserted = args;
|
||
break;
|
||
case 'unshift':
|
||
inserted = args;
|
||
break;
|
||
case 'splice':
|
||
inserted = args.slice(2);
|
||
break;
|
||
}
|
||
if (inserted) ob.observeArray(inserted);
|
||
// notify change
|
||
ob.dep.notify();
|
||
return result;
|
||
});
|
||
});
|
||
|
||
/**
|
||
* Swap the element at the given index with a new value
|
||
* and emits corresponding event.
|
||
*
|
||
* @param {Number} index
|
||
* @param {*} val
|
||
* @return {*} - replaced element
|
||
*/
|
||
|
||
def(arrayProto, '$set', function $set(index, val) {
|
||
if (index >= this.length) {
|
||
this.length = Number(index) + 1;
|
||
}
|
||
return this.splice(index, 1, val)[0];
|
||
});
|
||
|
||
/**
|
||
* Convenience method to remove the element at given index or target element reference.
|
||
*
|
||
* @param {*} item
|
||
*/
|
||
|
||
def(arrayProto, '$remove', function $remove(item) {
|
||
/* istanbul ignore if */
|
||
if (!this.length) return;
|
||
var index = indexOf(this, item);
|
||
if (index > -1) {
|
||
return this.splice(index, 1);
|
||
}
|
||
});
|
||
|
||
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
|
||
|
||
/**
|
||
* By default, when a reactive property is set, the new value is
|
||
* also converted to become reactive. However in certain cases, e.g.
|
||
* v-for scope alias and props, we don't want to force conversion
|
||
* because the value may be a nested value under a frozen data structure.
|
||
*
|
||
* So whenever we want to set a reactive property without forcing
|
||
* conversion on the new value, we wrap that call inside this function.
|
||
*/
|
||
|
||
var shouldConvert = true;
|
||
|
||
function withoutConversion(fn) {
|
||
shouldConvert = false;
|
||
fn();
|
||
shouldConvert = true;
|
||
}
|
||
|
||
/**
|
||
* Observer class that are attached to each observed
|
||
* object. Once attached, the observer converts target
|
||
* object's property keys into getter/setters that
|
||
* collect dependencies and dispatches updates.
|
||
*
|
||
* @param {Array|Object} value
|
||
* @constructor
|
||
*/
|
||
|
||
function Observer(value) {
|
||
this.value = value;
|
||
this.dep = new Dep();
|
||
def(value, '__ob__', this);
|
||
if (isArray(value)) {
|
||
var augment = hasProto ? protoAugment : copyAugment;
|
||
augment(value, arrayMethods, arrayKeys);
|
||
this.observeArray(value);
|
||
} else {
|
||
this.walk(value);
|
||
}
|
||
}
|
||
|
||
// Instance methods
|
||
|
||
/**
|
||
* Walk through each property and convert them into
|
||
* getter/setters. This method should only be called when
|
||
* value type is Object.
|
||
*
|
||
* @param {Object} obj
|
||
*/
|
||
|
||
Observer.prototype.walk = function (obj) {
|
||
var keys = Object.keys(obj);
|
||
for (var i = 0, l = keys.length; i < l; i++) {
|
||
this.convert(keys[i], obj[keys[i]]);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Observe a list of Array items.
|
||
*
|
||
* @param {Array} items
|
||
*/
|
||
|
||
Observer.prototype.observeArray = function (items) {
|
||
for (var i = 0, l = items.length; i < l; i++) {
|
||
observe(items[i]);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Convert a property into getter/setter so we can emit
|
||
* the events when the property is accessed/changed.
|
||
*
|
||
* @param {String} key
|
||
* @param {*} val
|
||
*/
|
||
|
||
Observer.prototype.convert = function (key, val) {
|
||
defineReactive(this.value, key, val);
|
||
};
|
||
|
||
/**
|
||
* Add an owner vm, so that when $set/$delete mutations
|
||
* happen we can notify owner vms to proxy the keys and
|
||
* digest the watchers. This is only called when the object
|
||
* is observed as an instance's root $data.
|
||
*
|
||
* @param {Vue} vm
|
||
*/
|
||
|
||
Observer.prototype.addVm = function (vm) {
|
||
(this.vms || (this.vms = [])).push(vm);
|
||
};
|
||
|
||
/**
|
||
* Remove an owner vm. This is called when the object is
|
||
* swapped out as an instance's $data object.
|
||
*
|
||
* @param {Vue} vm
|
||
*/
|
||
|
||
Observer.prototype.removeVm = function (vm) {
|
||
this.vms.$remove(vm);
|
||
};
|
||
|
||
// helpers
|
||
|
||
/**
|
||
* Augment an target Object or Array by intercepting
|
||
* the prototype chain using __proto__
|
||
*
|
||
* @param {Object|Array} target
|
||
* @param {Object} src
|
||
*/
|
||
|
||
function protoAugment(target, src) {
|
||
/* eslint-disable no-proto */
|
||
target.__proto__ = src;
|
||
/* eslint-enable no-proto */
|
||
}
|
||
|
||
/**
|
||
* Augment an target Object or Array by defining
|
||
* hidden properties.
|
||
*
|
||
* @param {Object|Array} target
|
||
* @param {Object} proto
|
||
*/
|
||
|
||
function copyAugment(target, src, keys) {
|
||
for (var i = 0, l = keys.length; i < l; i++) {
|
||
var key = keys[i];
|
||
def(target, key, src[key]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Attempt to create an observer instance for a value,
|
||
* returns the new observer if successfully observed,
|
||
* or the existing observer if the value already has one.
|
||
*
|
||
* @param {*} value
|
||
* @param {Vue} [vm]
|
||
* @return {Observer|undefined}
|
||
* @static
|
||
*/
|
||
|
||
function observe(value, vm) {
|
||
if (!value || typeof value !== 'object') {
|
||
return;
|
||
}
|
||
var ob;
|
||
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
|
||
ob = value.__ob__;
|
||
} else if (shouldConvert && (isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {
|
||
ob = new Observer(value);
|
||
}
|
||
if (ob && vm) {
|
||
ob.addVm(vm);
|
||
}
|
||
return ob;
|
||
}
|
||
|
||
/**
|
||
* Define a reactive property on an Object.
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String} key
|
||
* @param {*} val
|
||
*/
|
||
|
||
function defineReactive(obj, key, val) {
|
||
var dep = new Dep();
|
||
|
||
var property = Object.getOwnPropertyDescriptor(obj, key);
|
||
if (property && property.configurable === false) {
|
||
return;
|
||
}
|
||
|
||
// cater for pre-defined getter/setters
|
||
var getter = property && property.get;
|
||
var setter = property && property.set;
|
||
|
||
var childOb = observe(val);
|
||
Object.defineProperty(obj, key, {
|
||
enumerable: true,
|
||
configurable: true,
|
||
get: function reactiveGetter() {
|
||
var value = getter ? getter.call(obj) : val;
|
||
if (Dep.target) {
|
||
dep.depend();
|
||
if (childOb) {
|
||
childOb.dep.depend();
|
||
}
|
||
if (isArray(value)) {
|
||
for (var e, i = 0, l = value.length; i < l; i++) {
|
||
e = value[i];
|
||
e && e.__ob__ && e.__ob__.dep.depend();
|
||
}
|
||
}
|
||
}
|
||
return value;
|
||
},
|
||
set: function reactiveSetter(newVal) {
|
||
var value = getter ? getter.call(obj) : val;
|
||
if (newVal === value) {
|
||
return;
|
||
}
|
||
if (setter) {
|
||
setter.call(obj, newVal);
|
||
} else {
|
||
val = newVal;
|
||
}
|
||
childOb = observe(newVal);
|
||
dep.notify();
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
|
||
var util = Object.freeze({
|
||
defineReactive: defineReactive,
|
||
set: set,
|
||
del: del,
|
||
hasOwn: hasOwn,
|
||
isLiteral: isLiteral,
|
||
isReserved: isReserved,
|
||
_toString: _toString,
|
||
toNumber: toNumber,
|
||
toBoolean: toBoolean,
|
||
stripQuotes: stripQuotes,
|
||
camelize: camelize,
|
||
hyphenate: hyphenate,
|
||
classify: classify,
|
||
bind: bind,
|
||
toArray: toArray,
|
||
extend: extend,
|
||
isObject: isObject,
|
||
isPlainObject: isPlainObject,
|
||
def: def,
|
||
debounce: _debounce,
|
||
indexOf: indexOf,
|
||
cancellable: cancellable,
|
||
looseEqual: looseEqual,
|
||
isArray: isArray,
|
||
hasProto: hasProto,
|
||
inBrowser: inBrowser,
|
||
devtools: devtools,
|
||
isIE: isIE,
|
||
isIE9: isIE9,
|
||
isAndroid: isAndroid,
|
||
isIos: isIos,
|
||
iosVersionMatch: iosVersionMatch,
|
||
iosVersion: iosVersion,
|
||
hasMutationObserverBug: hasMutationObserverBug,
|
||
get transitionProp () { return transitionProp; },
|
||
get transitionEndEvent () { return transitionEndEvent; },
|
||
get animationProp () { return animationProp; },
|
||
get animationEndEvent () { return animationEndEvent; },
|
||
nextTick: nextTick,
|
||
get _Set () { return _Set; },
|
||
query: query,
|
||
inDoc: inDoc,
|
||
getAttr: getAttr,
|
||
getBindAttr: getBindAttr,
|
||
hasBindAttr: hasBindAttr,
|
||
before: before,
|
||
after: after,
|
||
remove: remove,
|
||
prepend: prepend,
|
||
replace: replace,
|
||
on: on,
|
||
off: off,
|
||
setClass: setClass,
|
||
addClass: addClass,
|
||
removeClass: removeClass,
|
||
extractContent: extractContent,
|
||
trimNode: trimNode,
|
||
isTemplate: isTemplate,
|
||
createAnchor: createAnchor,
|
||
findRef: findRef,
|
||
mapNodeRange: mapNodeRange,
|
||
removeNodeRange: removeNodeRange,
|
||
isFragment: isFragment,
|
||
getOuterHTML: getOuterHTML,
|
||
mergeOptions: mergeOptions,
|
||
resolveAsset: resolveAsset,
|
||
checkComponentAttr: checkComponentAttr,
|
||
commonTagRE: commonTagRE,
|
||
reservedTagRE: reservedTagRE,
|
||
get warn () { return warn; }
|
||
});
|
||
|
||
var uid = 0;
|
||
|
||
function initMixin (Vue) {
|
||
/**
|
||
* The main init sequence. This is called for every
|
||
* instance, including ones that are created from extended
|
||
* constructors.
|
||
*
|
||
* @param {Object} options - this options object should be
|
||
* the result of merging class
|
||
* options and the options passed
|
||
* in to the constructor.
|
||
*/
|
||
|
||
Vue.prototype._init = function (options) {
|
||
options = options || {};
|
||
|
||
this.$el = null;
|
||
this.$parent = options.parent;
|
||
this.$root = this.$parent ? this.$parent.$root : this;
|
||
this.$children = [];
|
||
this.$refs = {}; // child vm references
|
||
this.$els = {}; // element references
|
||
this._watchers = []; // all watchers as an array
|
||
this._directives = []; // all directives
|
||
|
||
// a uid
|
||
this._uid = uid++;
|
||
|
||
// a flag to avoid this being observed
|
||
this._isVue = true;
|
||
|
||
// events bookkeeping
|
||
this._events = {}; // registered callbacks
|
||
this._eventsCount = {}; // for $broadcast optimization
|
||
|
||
// fragment instance properties
|
||
this._isFragment = false;
|
||
this._fragment = // @type {DocumentFragment}
|
||
this._fragmentStart = // @type {Text|Comment}
|
||
this._fragmentEnd = null; // @type {Text|Comment}
|
||
|
||
// lifecycle state
|
||
this._isCompiled = this._isDestroyed = this._isReady = this._isAttached = this._isBeingDestroyed = this._vForRemoving = false;
|
||
this._unlinkFn = null;
|
||
|
||
// context:
|
||
// if this is a transcluded component, context
|
||
// will be the common parent vm of this instance
|
||
// and its host.
|
||
this._context = options._context || this.$parent;
|
||
|
||
// scope:
|
||
// if this is inside an inline v-for, the scope
|
||
// will be the intermediate scope created for this
|
||
// repeat fragment. this is used for linking props
|
||
// and container directives.
|
||
this._scope = options._scope;
|
||
|
||
// fragment:
|
||
// if this instance is compiled inside a Fragment, it
|
||
// needs to reigster itself as a child of that fragment
|
||
// for attach/detach to work properly.
|
||
this._frag = options._frag;
|
||
if (this._frag) {
|
||
this._frag.children.push(this);
|
||
}
|
||
|
||
// push self into parent / transclusion host
|
||
if (this.$parent) {
|
||
this.$parent.$children.push(this);
|
||
}
|
||
|
||
// merge options.
|
||
options = this.$options = mergeOptions(this.constructor.options, options, this);
|
||
|
||
// set ref
|
||
this._updateRef();
|
||
|
||
// initialize data as empty object.
|
||
// it will be filled up in _initData().
|
||
this._data = {};
|
||
|
||
// call init hook
|
||
this._callHook('init');
|
||
|
||
// initialize data observation and scope inheritance.
|
||
this._initState();
|
||
|
||
// setup event system and option events.
|
||
this._initEvents();
|
||
|
||
// call created hook
|
||
this._callHook('created');
|
||
|
||
// if `el` option is passed, start compilation.
|
||
if (options.el) {
|
||
this.$mount(options.el);
|
||
}
|
||
};
|
||
}
|
||
|
||
var pathCache = new Cache(1000);
|
||
|
||
// actions
|
||
var APPEND = 0;
|
||
var PUSH = 1;
|
||
var INC_SUB_PATH_DEPTH = 2;
|
||
var PUSH_SUB_PATH = 3;
|
||
|
||
// states
|
||
var BEFORE_PATH = 0;
|
||
var IN_PATH = 1;
|
||
var BEFORE_IDENT = 2;
|
||
var IN_IDENT = 3;
|
||
var IN_SUB_PATH = 4;
|
||
var IN_SINGLE_QUOTE = 5;
|
||
var IN_DOUBLE_QUOTE = 6;
|
||
var AFTER_PATH = 7;
|
||
var ERROR = 8;
|
||
|
||
var pathStateMachine = [];
|
||
|
||
pathStateMachine[BEFORE_PATH] = {
|
||
'ws': [BEFORE_PATH],
|
||
'ident': [IN_IDENT, APPEND],
|
||
'[': [IN_SUB_PATH],
|
||
'eof': [AFTER_PATH]
|
||
};
|
||
|
||
pathStateMachine[IN_PATH] = {
|
||
'ws': [IN_PATH],
|
||
'.': [BEFORE_IDENT],
|
||
'[': [IN_SUB_PATH],
|
||
'eof': [AFTER_PATH]
|
||
};
|
||
|
||
pathStateMachine[BEFORE_IDENT] = {
|
||
'ws': [BEFORE_IDENT],
|
||
'ident': [IN_IDENT, APPEND]
|
||
};
|
||
|
||
pathStateMachine[IN_IDENT] = {
|
||
'ident': [IN_IDENT, APPEND],
|
||
'0': [IN_IDENT, APPEND],
|
||
'number': [IN_IDENT, APPEND],
|
||
'ws': [IN_PATH, PUSH],
|
||
'.': [BEFORE_IDENT, PUSH],
|
||
'[': [IN_SUB_PATH, PUSH],
|
||
'eof': [AFTER_PATH, PUSH]
|
||
};
|
||
|
||
pathStateMachine[IN_SUB_PATH] = {
|
||
"'": [IN_SINGLE_QUOTE, APPEND],
|
||
'"': [IN_DOUBLE_QUOTE, APPEND],
|
||
'[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH],
|
||
']': [IN_PATH, PUSH_SUB_PATH],
|
||
'eof': ERROR,
|
||
'else': [IN_SUB_PATH, APPEND]
|
||
};
|
||
|
||
pathStateMachine[IN_SINGLE_QUOTE] = {
|
||
"'": [IN_SUB_PATH, APPEND],
|
||
'eof': ERROR,
|
||
'else': [IN_SINGLE_QUOTE, APPEND]
|
||
};
|
||
|
||
pathStateMachine[IN_DOUBLE_QUOTE] = {
|
||
'"': [IN_SUB_PATH, APPEND],
|
||
'eof': ERROR,
|
||
'else': [IN_DOUBLE_QUOTE, APPEND]
|
||
};
|
||
|
||
/**
|
||
* Determine the type of a character in a keypath.
|
||
*
|
||
* @param {Char} ch
|
||
* @return {String} type
|
||
*/
|
||
|
||
function getPathCharType(ch) {
|
||
if (ch === undefined) {
|
||
return 'eof';
|
||
}
|
||
|
||
var code = ch.charCodeAt(0);
|
||
|
||
switch (code) {
|
||
case 0x5B: // [
|
||
case 0x5D: // ]
|
||
case 0x2E: // .
|
||
case 0x22: // "
|
||
case 0x27: // '
|
||
case 0x30:
|
||
// 0
|
||
return ch;
|
||
|
||
case 0x5F: // _
|
||
case 0x24:
|
||
// $
|
||
return 'ident';
|
||
|
||
case 0x20: // Space
|
||
case 0x09: // Tab
|
||
case 0x0A: // Newline
|
||
case 0x0D: // Return
|
||
case 0xA0: // No-break space
|
||
case 0xFEFF: // Byte Order Mark
|
||
case 0x2028: // Line Separator
|
||
case 0x2029:
|
||
// Paragraph Separator
|
||
return 'ws';
|
||
}
|
||
|
||
// a-z, A-Z
|
||
if (code >= 0x61 && code <= 0x7A || code >= 0x41 && code <= 0x5A) {
|
||
return 'ident';
|
||
}
|
||
|
||
// 1-9
|
||
if (code >= 0x31 && code <= 0x39) {
|
||
return 'number';
|
||
}
|
||
|
||
return 'else';
|
||
}
|
||
|
||
/**
|
||
* Format a subPath, return its plain form if it is
|
||
* a literal string or number. Otherwise prepend the
|
||
* dynamic indicator (*).
|
||
*
|
||
* @param {String} path
|
||
* @return {String}
|
||
*/
|
||
|
||
function formatSubPath(path) {
|
||
var trimmed = path.trim();
|
||
// invalid leading 0
|
||
if (path.charAt(0) === '0' && isNaN(path)) {
|
||
return false;
|
||
}
|
||
return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed;
|
||
}
|
||
|
||
/**
|
||
* Parse a string path into an array of segments
|
||
*
|
||
* @param {String} path
|
||
* @return {Array|undefined}
|
||
*/
|
||
|
||
function parse(path) {
|
||
var keys = [];
|
||
var index = -1;
|
||
var mode = BEFORE_PATH;
|
||
var subPathDepth = 0;
|
||
var c, newChar, key, type, transition, action, typeMap;
|
||
|
||
var actions = [];
|
||
|
||
actions[PUSH] = function () {
|
||
if (key !== undefined) {
|
||
keys.push(key);
|
||
key = undefined;
|
||
}
|
||
};
|
||
|
||
actions[APPEND] = function () {
|
||
if (key === undefined) {
|
||
key = newChar;
|
||
} else {
|
||
key += newChar;
|
||
}
|
||
};
|
||
|
||
actions[INC_SUB_PATH_DEPTH] = function () {
|
||
actions[APPEND]();
|
||
subPathDepth++;
|
||
};
|
||
|
||
actions[PUSH_SUB_PATH] = function () {
|
||
if (subPathDepth > 0) {
|
||
subPathDepth--;
|
||
mode = IN_SUB_PATH;
|
||
actions[APPEND]();
|
||
} else {
|
||
subPathDepth = 0;
|
||
key = formatSubPath(key);
|
||
if (key === false) {
|
||
return false;
|
||
} else {
|
||
actions[PUSH]();
|
||
}
|
||
}
|
||
};
|
||
|
||
function maybeUnescapeQuote() {
|
||
var nextChar = path[index + 1];
|
||
if (mode === IN_SINGLE_QUOTE && nextChar === "'" || mode === IN_DOUBLE_QUOTE && nextChar === '"') {
|
||
index++;
|
||
newChar = '\\' + nextChar;
|
||
actions[APPEND]();
|
||
return true;
|
||
}
|
||
}
|
||
|
||
while (mode != null) {
|
||
index++;
|
||
c = path[index];
|
||
|
||
if (c === '\\' && maybeUnescapeQuote()) {
|
||
continue;
|
||
}
|
||
|
||
type = getPathCharType(c);
|
||
typeMap = pathStateMachine[mode];
|
||
transition = typeMap[type] || typeMap['else'] || ERROR;
|
||
|
||
if (transition === ERROR) {
|
||
return; // parse error
|
||
}
|
||
|
||
mode = transition[0];
|
||
action = actions[transition[1]];
|
||
if (action) {
|
||
newChar = transition[2];
|
||
newChar = newChar === undefined ? c : newChar;
|
||
if (action() === false) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (mode === AFTER_PATH) {
|
||
keys.raw = path;
|
||
return keys;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* External parse that check for a cache hit first
|
||
*
|
||
* @param {String} path
|
||
* @return {Array|undefined}
|
||
*/
|
||
|
||
function parsePath(path) {
|
||
var hit = pathCache.get(path);
|
||
if (!hit) {
|
||
hit = parse(path);
|
||
if (hit) {
|
||
pathCache.put(path, hit);
|
||
}
|
||
}
|
||
return hit;
|
||
}
|
||
|
||
/**
|
||
* Get from an object from a path string
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String} path
|
||
*/
|
||
|
||
function getPath(obj, path) {
|
||
return parseExpression(path).get(obj);
|
||
}
|
||
|
||
/**
|
||
* Warn against setting non-existent root path on a vm.
|
||
*/
|
||
|
||
var warnNonExistent;
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
warnNonExistent = function (path, vm) {
|
||
warn('You are setting a non-existent path "' + path.raw + '" ' + 'on a vm instance. Consider pre-initializing the property ' + 'with the "data" option for more reliable reactivity ' + 'and better performance.', vm);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Set on an object from a path
|
||
*
|
||
* @param {Object} obj
|
||
* @param {String | Array} path
|
||
* @param {*} val
|
||
*/
|
||
|
||
function setPath(obj, path, val) {
|
||
var original = obj;
|
||
if (typeof path === 'string') {
|
||
path = parse(path);
|
||
}
|
||
if (!path || !isObject(obj)) {
|
||
return false;
|
||
}
|
||
var last, key;
|
||
for (var i = 0, l = path.length; i < l; i++) {
|
||
last = obj;
|
||
key = path[i];
|
||
if (key.charAt(0) === '*') {
|
||
key = parseExpression(key.slice(1)).get.call(original, original);
|
||
}
|
||
if (i < l - 1) {
|
||
obj = obj[key];
|
||
if (!isObject(obj)) {
|
||
obj = {};
|
||
if (process.env.NODE_ENV !== 'production' && last._isVue) {
|
||
warnNonExistent(path, last);
|
||
}
|
||
set(last, key, obj);
|
||
}
|
||
} else {
|
||
if (isArray(obj)) {
|
||
obj.$set(key, val);
|
||
} else if (key in obj) {
|
||
obj[key] = val;
|
||
} else {
|
||
if (process.env.NODE_ENV !== 'production' && obj._isVue) {
|
||
warnNonExistent(path, obj);
|
||
}
|
||
set(obj, key, val);
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
var path = Object.freeze({
|
||
parsePath: parsePath,
|
||
getPath: getPath,
|
||
setPath: setPath
|
||
});
|
||
|
||
var expressionCache = new Cache(1000);
|
||
|
||
var allowedKeywords = 'Math,Date,this,true,false,null,undefined,Infinity,NaN,' + 'isNaN,isFinite,decodeURI,decodeURIComponent,encodeURI,' + 'encodeURIComponent,parseInt,parseFloat';
|
||
var allowedKeywordsRE = new RegExp('^(' + allowedKeywords.replace(/,/g, '\\b|') + '\\b)');
|
||
|
||
// keywords that don't make sense inside expressions
|
||
var improperKeywords = 'break,case,class,catch,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,' + 'import,in,instanceof,let,return,super,switch,throw,try,' + 'var,while,with,yield,enum,await,implements,package,' + 'protected,static,interface,private,public';
|
||
var improperKeywordsRE = new RegExp('^(' + improperKeywords.replace(/,/g, '\\b|') + '\\b)');
|
||
|
||
var wsRE = /\s/g;
|
||
var newlineRE = /\n/g;
|
||
var saveRE = /[\{,]\s*[\w\$_]+\s*:|('(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`)|new |typeof |void /g;
|
||
var restoreRE = /"(\d+)"/g;
|
||
var pathTestRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?'\]|\[".*?"\]|\[\d+\]|\[[A-Za-z_$][\w$]*\])*$/;
|
||
var identRE = /[^\w$\.](?:[A-Za-z_$][\w$]*)/g;
|
||
var literalValueRE$1 = /^(?:true|false|null|undefined|Infinity|NaN)$/;
|
||
|
||
function noop() {}
|
||
|
||
/**
|
||
* Save / Rewrite / Restore
|
||
*
|
||
* When rewriting paths found in an expression, it is
|
||
* possible for the same letter sequences to be found in
|
||
* strings and Object literal property keys. Therefore we
|
||
* remove and store these parts in a temporary array, and
|
||
* restore them after the path rewrite.
|
||
*/
|
||
|
||
var saved = [];
|
||
|
||
/**
|
||
* Save replacer
|
||
*
|
||
* The save regex can match two possible cases:
|
||
* 1. An opening object literal
|
||
* 2. A string
|
||
* If matched as a plain string, we need to escape its
|
||
* newlines, since the string needs to be preserved when
|
||
* generating the function body.
|
||
*
|
||
* @param {String} str
|
||
* @param {String} isString - str if matched as a string
|
||
* @return {String} - placeholder with index
|
||
*/
|
||
|
||
function save(str, isString) {
|
||
var i = saved.length;
|
||
saved[i] = isString ? str.replace(newlineRE, '\\n') : str;
|
||
return '"' + i + '"';
|
||
}
|
||
|
||
/**
|
||
* Path rewrite replacer
|
||
*
|
||
* @param {String} raw
|
||
* @return {String}
|
||
*/
|
||
|
||
function rewrite(raw) {
|
||
var c = raw.charAt(0);
|
||
var path = raw.slice(1);
|
||
if (allowedKeywordsRE.test(path)) {
|
||
return raw;
|
||
} else {
|
||
path = path.indexOf('"') > -1 ? path.replace(restoreRE, restore) : path;
|
||
return c + 'scope.' + path;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Restore replacer
|
||
*
|
||
* @param {String} str
|
||
* @param {String} i - matched save index
|
||
* @return {String}
|
||
*/
|
||
|
||
function restore(str, i) {
|
||
return saved[i];
|
||
}
|
||
|
||
/**
|
||
* Rewrite an expression, prefixing all path accessors with
|
||
* `scope.` and generate getter/setter functions.
|
||
*
|
||
* @param {String} exp
|
||
* @return {Function}
|
||
*/
|
||
|
||
function compileGetter(exp) {
|
||
if (improperKeywordsRE.test(exp)) {
|
||
process.env.NODE_ENV !== 'production' && warn('Avoid using reserved keywords in expression: ' + exp);
|
||
}
|
||
// reset state
|
||
saved.length = 0;
|
||
// save strings and object literal keys
|
||
var body = exp.replace(saveRE, save).replace(wsRE, '');
|
||
// rewrite all paths
|
||
// pad 1 space here because the regex matches 1 extra char
|
||
body = (' ' + body).replace(identRE, rewrite).replace(restoreRE, restore);
|
||
return makeGetterFn(body);
|
||
}
|
||
|
||
/**
|
||
* Build a getter function. Requires eval.
|
||
*
|
||
* We isolate the try/catch so it doesn't affect the
|
||
* optimization of the parse function when it is not called.
|
||
*
|
||
* @param {String} body
|
||
* @return {Function|undefined}
|
||
*/
|
||
|
||
function makeGetterFn(body) {
|
||
try {
|
||
/* eslint-disable no-new-func */
|
||
return new Function('scope', 'return ' + body + ';');
|
||
/* eslint-enable no-new-func */
|
||
} catch (e) {
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
/* istanbul ignore if */
|
||
if (e.toString().match(/unsafe-eval|CSP/)) {
|
||
warn('It seems you are using the default build of Vue.js in an environment ' + 'with Content Security Policy that prohibits unsafe-eval. ' + 'Use the CSP-compliant build instead: ' + 'http://vuejs.org/guide/installation.html#CSP-compliant-build');
|
||
} else {
|
||
warn('Invalid expression. ' + 'Generated function body: ' + body);
|
||
}
|
||
}
|
||
return noop;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Compile a setter function for the expression.
|
||
*
|
||
* @param {String} exp
|
||
* @return {Function|undefined}
|
||
*/
|
||
|
||
function compileSetter(exp) {
|
||
var path = parsePath(exp);
|
||
if (path) {
|
||
return function (scope, val) {
|
||
setPath(scope, path, val);
|
||
};
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid setter expression: ' + exp);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Parse an expression into re-written getter/setters.
|
||
*
|
||
* @param {String} exp
|
||
* @param {Boolean} needSet
|
||
* @return {Function}
|
||
*/
|
||
|
||
function parseExpression(exp, needSet) {
|
||
exp = exp.trim();
|
||
// try cache
|
||
var hit = expressionCache.get(exp);
|
||
if (hit) {
|
||
if (needSet && !hit.set) {
|
||
hit.set = compileSetter(hit.exp);
|
||
}
|
||
return hit;
|
||
}
|
||
var res = { exp: exp };
|
||
res.get = isSimplePath(exp) && exp.indexOf('[') < 0
|
||
// optimized super simple getter
|
||
? makeGetterFn('scope.' + exp)
|
||
// dynamic getter
|
||
: compileGetter(exp);
|
||
if (needSet) {
|
||
res.set = compileSetter(exp);
|
||
}
|
||
expressionCache.put(exp, res);
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Check if an expression is a simple path.
|
||
*
|
||
* @param {String} exp
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isSimplePath(exp) {
|
||
return pathTestRE.test(exp) &&
|
||
// don't treat literal values as paths
|
||
!literalValueRE$1.test(exp) &&
|
||
// Math constants e.g. Math.PI, Math.E etc.
|
||
exp.slice(0, 5) !== 'Math.';
|
||
}
|
||
|
||
var expression = Object.freeze({
|
||
parseExpression: parseExpression,
|
||
isSimplePath: isSimplePath
|
||
});
|
||
|
||
// we have two separate queues: one for directive updates
|
||
// and one for user watcher registered via $watch().
|
||
// we want to guarantee directive updates to be called
|
||
// before user watchers so that when user watchers are
|
||
// triggered, the DOM would have already been in updated
|
||
// state.
|
||
|
||
var queue = [];
|
||
var userQueue = [];
|
||
var has = {};
|
||
var circular = {};
|
||
var waiting = false;
|
||
|
||
/**
|
||
* Reset the batcher's state.
|
||
*/
|
||
|
||
function resetBatcherState() {
|
||
queue.length = 0;
|
||
userQueue.length = 0;
|
||
has = {};
|
||
circular = {};
|
||
waiting = false;
|
||
}
|
||
|
||
/**
|
||
* Flush both queues and run the watchers.
|
||
*/
|
||
|
||
function flushBatcherQueue() {
|
||
var _again = true;
|
||
|
||
_function: while (_again) {
|
||
_again = false;
|
||
|
||
runBatcherQueue(queue);
|
||
runBatcherQueue(userQueue);
|
||
// user watchers triggered more watchers,
|
||
// keep flushing until it depletes
|
||
if (queue.length) {
|
||
_again = true;
|
||
continue _function;
|
||
}
|
||
// dev tool hook
|
||
/* istanbul ignore if */
|
||
if (devtools && config.devtools) {
|
||
devtools.emit('flush');
|
||
}
|
||
resetBatcherState();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Run the watchers in a single queue.
|
||
*
|
||
* @param {Array} queue
|
||
*/
|
||
|
||
function runBatcherQueue(queue) {
|
||
// do not cache length because more watchers might be pushed
|
||
// as we run existing watchers
|
||
for (var i = 0; i < queue.length; i++) {
|
||
var watcher = queue[i];
|
||
var id = watcher.id;
|
||
has[id] = null;
|
||
watcher.run();
|
||
// in dev build, check and stop circular updates.
|
||
if (process.env.NODE_ENV !== 'production' && has[id] != null) {
|
||
circular[id] = (circular[id] || 0) + 1;
|
||
if (circular[id] > config._maxUpdateCount) {
|
||
warn('You may have an infinite update loop for watcher ' + 'with expression "' + watcher.expression + '"', watcher.vm);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
queue.length = 0;
|
||
}
|
||
|
||
/**
|
||
* Push a watcher into the watcher queue.
|
||
* Jobs with duplicate IDs will be skipped unless it's
|
||
* pushed when the queue is being flushed.
|
||
*
|
||
* @param {Watcher} watcher
|
||
* properties:
|
||
* - {Number} id
|
||
* - {Function} run
|
||
*/
|
||
|
||
function pushWatcher(watcher) {
|
||
var id = watcher.id;
|
||
if (has[id] == null) {
|
||
// push watcher into appropriate queue
|
||
var q = watcher.user ? userQueue : queue;
|
||
has[id] = q.length;
|
||
q.push(watcher);
|
||
// queue the flush
|
||
if (!waiting) {
|
||
waiting = true;
|
||
nextTick(flushBatcherQueue);
|
||
}
|
||
}
|
||
}
|
||
|
||
var uid$2 = 0;
|
||
|
||
/**
|
||
* A watcher parses an expression, collects dependencies,
|
||
* and fires callback when the expression value changes.
|
||
* This is used for both the $watch() api and directives.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {String|Function} expOrFn
|
||
* @param {Function} cb
|
||
* @param {Object} options
|
||
* - {Array} filters
|
||
* - {Boolean} twoWay
|
||
* - {Boolean} deep
|
||
* - {Boolean} user
|
||
* - {Boolean} sync
|
||
* - {Boolean} lazy
|
||
* - {Function} [preProcess]
|
||
* - {Function} [postProcess]
|
||
* @constructor
|
||
*/
|
||
function Watcher(vm, expOrFn, cb, options) {
|
||
// mix in options
|
||
if (options) {
|
||
extend(this, options);
|
||
}
|
||
var isFn = typeof expOrFn === 'function';
|
||
this.vm = vm;
|
||
vm._watchers.push(this);
|
||
this.expression = expOrFn;
|
||
this.cb = cb;
|
||
this.id = ++uid$2; // uid for batching
|
||
this.active = true;
|
||
this.dirty = this.lazy; // for lazy watchers
|
||
this.deps = [];
|
||
this.newDeps = [];
|
||
this.depIds = new _Set();
|
||
this.newDepIds = new _Set();
|
||
this.prevError = null; // for async error stacks
|
||
// parse expression for getter/setter
|
||
if (isFn) {
|
||
this.getter = expOrFn;
|
||
this.setter = undefined;
|
||
} else {
|
||
var res = parseExpression(expOrFn, this.twoWay);
|
||
this.getter = res.get;
|
||
this.setter = res.set;
|
||
}
|
||
this.value = this.lazy ? undefined : this.get();
|
||
// state for avoiding false triggers for deep and Array
|
||
// watchers during vm._digest()
|
||
this.queued = this.shallow = false;
|
||
}
|
||
|
||
/**
|
||
* Evaluate the getter, and re-collect dependencies.
|
||
*/
|
||
|
||
Watcher.prototype.get = function () {
|
||
this.beforeGet();
|
||
var scope = this.scope || this.vm;
|
||
var value;
|
||
try {
|
||
value = this.getter.call(scope, scope);
|
||
} catch (e) {
|
||
if (process.env.NODE_ENV !== 'production' && config.warnExpressionErrors) {
|
||
warn('Error when evaluating expression ' + '"' + this.expression + '": ' + e.toString(), this.vm);
|
||
}
|
||
}
|
||
// "touch" every property so they are all tracked as
|
||
// dependencies for deep watching
|
||
if (this.deep) {
|
||
traverse(value);
|
||
}
|
||
if (this.preProcess) {
|
||
value = this.preProcess(value);
|
||
}
|
||
if (this.filters) {
|
||
value = scope._applyFilters(value, null, this.filters, false);
|
||
}
|
||
if (this.postProcess) {
|
||
value = this.postProcess(value);
|
||
}
|
||
this.afterGet();
|
||
return value;
|
||
};
|
||
|
||
/**
|
||
* Set the corresponding value with the setter.
|
||
*
|
||
* @param {*} value
|
||
*/
|
||
|
||
Watcher.prototype.set = function (value) {
|
||
var scope = this.scope || this.vm;
|
||
if (this.filters) {
|
||
value = scope._applyFilters(value, this.value, this.filters, true);
|
||
}
|
||
try {
|
||
this.setter.call(scope, scope, value);
|
||
} catch (e) {
|
||
if (process.env.NODE_ENV !== 'production' && config.warnExpressionErrors) {
|
||
warn('Error when evaluating setter ' + '"' + this.expression + '": ' + e.toString(), this.vm);
|
||
}
|
||
}
|
||
// two-way sync for v-for alias
|
||
var forContext = scope.$forContext;
|
||
if (forContext && forContext.alias === this.expression) {
|
||
if (forContext.filters) {
|
||
process.env.NODE_ENV !== 'production' && warn('It seems you are using two-way binding on ' + 'a v-for alias (' + this.expression + '), and the ' + 'v-for has filters. This will not work properly. ' + 'Either remove the filters or use an array of ' + 'objects and bind to object properties instead.', this.vm);
|
||
return;
|
||
}
|
||
forContext._withLock(function () {
|
||
if (scope.$key) {
|
||
// original is an object
|
||
forContext.rawValue[scope.$key] = value;
|
||
} else {
|
||
forContext.rawValue.$set(scope.$index, value);
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Prepare for dependency collection.
|
||
*/
|
||
|
||
Watcher.prototype.beforeGet = function () {
|
||
Dep.target = this;
|
||
};
|
||
|
||
/**
|
||
* Add a dependency to this directive.
|
||
*
|
||
* @param {Dep} dep
|
||
*/
|
||
|
||
Watcher.prototype.addDep = function (dep) {
|
||
var id = dep.id;
|
||
if (!this.newDepIds.has(id)) {
|
||
this.newDepIds.add(id);
|
||
this.newDeps.push(dep);
|
||
if (!this.depIds.has(id)) {
|
||
dep.addSub(this);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Clean up for dependency collection.
|
||
*/
|
||
|
||
Watcher.prototype.afterGet = function () {
|
||
Dep.target = null;
|
||
var i = this.deps.length;
|
||
while (i--) {
|
||
var dep = this.deps[i];
|
||
if (!this.newDepIds.has(dep.id)) {
|
||
dep.removeSub(this);
|
||
}
|
||
}
|
||
var tmp = this.depIds;
|
||
this.depIds = this.newDepIds;
|
||
this.newDepIds = tmp;
|
||
this.newDepIds.clear();
|
||
tmp = this.deps;
|
||
this.deps = this.newDeps;
|
||
this.newDeps = tmp;
|
||
this.newDeps.length = 0;
|
||
};
|
||
|
||
/**
|
||
* Subscriber interface.
|
||
* Will be called when a dependency changes.
|
||
*
|
||
* @param {Boolean} shallow
|
||
*/
|
||
|
||
Watcher.prototype.update = function (shallow) {
|
||
if (this.lazy) {
|
||
this.dirty = true;
|
||
} else if (this.sync || !config.async) {
|
||
this.run();
|
||
} else {
|
||
// if queued, only overwrite shallow with non-shallow,
|
||
// but not the other way around.
|
||
this.shallow = this.queued ? shallow ? this.shallow : false : !!shallow;
|
||
this.queued = true;
|
||
// record before-push error stack in debug mode
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production' && config.debug) {
|
||
this.prevError = new Error('[vue] async stack trace');
|
||
}
|
||
pushWatcher(this);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Batcher job interface.
|
||
* Will be called by the batcher.
|
||
*/
|
||
|
||
Watcher.prototype.run = function () {
|
||
if (this.active) {
|
||
var value = this.get();
|
||
if (value !== this.value ||
|
||
// Deep watchers and watchers on Object/Arrays should fire even
|
||
// when the value is the same, because the value may
|
||
// have mutated; but only do so if this is a
|
||
// non-shallow update (caused by a vm digest).
|
||
(isObject(value) || this.deep) && !this.shallow) {
|
||
// set new value
|
||
var oldValue = this.value;
|
||
this.value = value;
|
||
// in debug + async mode, when a watcher callbacks
|
||
// throws, we also throw the saved before-push error
|
||
// so the full cross-tick stack trace is available.
|
||
var prevError = this.prevError;
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production' && config.debug && prevError) {
|
||
this.prevError = null;
|
||
try {
|
||
this.cb.call(this.vm, value, oldValue);
|
||
} catch (e) {
|
||
nextTick(function () {
|
||
throw prevError;
|
||
}, 0);
|
||
throw e;
|
||
}
|
||
} else {
|
||
this.cb.call(this.vm, value, oldValue);
|
||
}
|
||
}
|
||
this.queued = this.shallow = false;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Evaluate the value of the watcher.
|
||
* This only gets called for lazy watchers.
|
||
*/
|
||
|
||
Watcher.prototype.evaluate = function () {
|
||
// avoid overwriting another watcher that is being
|
||
// collected.
|
||
var current = Dep.target;
|
||
this.value = this.get();
|
||
this.dirty = false;
|
||
Dep.target = current;
|
||
};
|
||
|
||
/**
|
||
* Depend on all deps collected by this watcher.
|
||
*/
|
||
|
||
Watcher.prototype.depend = function () {
|
||
var i = this.deps.length;
|
||
while (i--) {
|
||
this.deps[i].depend();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Remove self from all dependencies' subcriber list.
|
||
*/
|
||
|
||
Watcher.prototype.teardown = function () {
|
||
if (this.active) {
|
||
// remove self from vm's watcher list
|
||
// this is a somewhat expensive operation so we skip it
|
||
// if the vm is being destroyed or is performing a v-for
|
||
// re-render (the watcher list is then filtered by v-for).
|
||
if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {
|
||
this.vm._watchers.$remove(this);
|
||
}
|
||
var i = this.deps.length;
|
||
while (i--) {
|
||
this.deps[i].removeSub(this);
|
||
}
|
||
this.active = false;
|
||
this.vm = this.cb = this.value = null;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Recrusively traverse an object to evoke all converted
|
||
* getters, so that every nested property inside the object
|
||
* is collected as a "deep" dependency.
|
||
*
|
||
* @param {*} val
|
||
*/
|
||
|
||
var seenObjects = new _Set();
|
||
function traverse(val, seen) {
|
||
var i = undefined,
|
||
keys = undefined;
|
||
if (!seen) {
|
||
seen = seenObjects;
|
||
seen.clear();
|
||
}
|
||
var isA = isArray(val);
|
||
var isO = isObject(val);
|
||
if ((isA || isO) && Object.isExtensible(val)) {
|
||
if (val.__ob__) {
|
||
var depId = val.__ob__.dep.id;
|
||
if (seen.has(depId)) {
|
||
return;
|
||
} else {
|
||
seen.add(depId);
|
||
}
|
||
}
|
||
if (isA) {
|
||
i = val.length;
|
||
while (i--) traverse(val[i], seen);
|
||
} else if (isO) {
|
||
keys = Object.keys(val);
|
||
i = keys.length;
|
||
while (i--) traverse(val[keys[i]], seen);
|
||
}
|
||
}
|
||
}
|
||
|
||
var text$1 = {
|
||
|
||
bind: function bind() {
|
||
this.attr = this.el.nodeType === 3 ? 'data' : 'textContent';
|
||
},
|
||
|
||
update: function update(value) {
|
||
this.el[this.attr] = _toString(value);
|
||
}
|
||
};
|
||
|
||
var templateCache = new Cache(1000);
|
||
var idSelectorCache = new Cache(1000);
|
||
|
||
var map = {
|
||
efault: [0, '', ''],
|
||
legend: [1, '<fieldset>', '</fieldset>'],
|
||
tr: [2, '<table><tbody>', '</tbody></table>'],
|
||
col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>']
|
||
};
|
||
|
||
map.td = map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
|
||
|
||
map.option = map.optgroup = [1, '<select multiple="multiple">', '</select>'];
|
||
|
||
map.thead = map.tbody = map.colgroup = map.caption = map.tfoot = [1, '<table>', '</table>'];
|
||
|
||
map.g = map.defs = map.symbol = map.use = map.image = map.text = map.circle = map.ellipse = map.line = map.path = map.polygon = map.polyline = map.rect = [1, '<svg ' + 'xmlns="http://www.w3.org/2000/svg" ' + 'xmlns:xlink="http://www.w3.org/1999/xlink" ' + 'xmlns:ev="http://www.w3.org/2001/xml-events"' + 'version="1.1">', '</svg>'];
|
||
|
||
/**
|
||
* Check if a node is a supported template node with a
|
||
* DocumentFragment content.
|
||
*
|
||
* @param {Node} node
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isRealTemplate(node) {
|
||
return isTemplate(node) && isFragment(node.content);
|
||
}
|
||
|
||
var tagRE$1 = /<([\w:-]+)/;
|
||
var entityRE = /&#?\w+?;/;
|
||
var commentRE = /<!--/;
|
||
|
||
/**
|
||
* Convert a string template to a DocumentFragment.
|
||
* Determines correct wrapping by tag types. Wrapping
|
||
* strategy found in jQuery & component/domify.
|
||
*
|
||
* @param {String} templateString
|
||
* @param {Boolean} raw
|
||
* @return {DocumentFragment}
|
||
*/
|
||
|
||
function stringToFragment(templateString, raw) {
|
||
// try a cache hit first
|
||
var cacheKey = raw ? templateString : templateString.trim();
|
||
var hit = templateCache.get(cacheKey);
|
||
if (hit) {
|
||
return hit;
|
||
}
|
||
|
||
var frag = document.createDocumentFragment();
|
||
var tagMatch = templateString.match(tagRE$1);
|
||
var entityMatch = entityRE.test(templateString);
|
||
var commentMatch = commentRE.test(templateString);
|
||
|
||
if (!tagMatch && !entityMatch && !commentMatch) {
|
||
// text only, return a single text node.
|
||
frag.appendChild(document.createTextNode(templateString));
|
||
} else {
|
||
var tag = tagMatch && tagMatch[1];
|
||
var wrap = map[tag] || map.efault;
|
||
var depth = wrap[0];
|
||
var prefix = wrap[1];
|
||
var suffix = wrap[2];
|
||
var node = document.createElement('div');
|
||
|
||
node.innerHTML = prefix + templateString + suffix;
|
||
while (depth--) {
|
||
node = node.lastChild;
|
||
}
|
||
|
||
var child;
|
||
/* eslint-disable no-cond-assign */
|
||
while (child = node.firstChild) {
|
||
/* eslint-enable no-cond-assign */
|
||
frag.appendChild(child);
|
||
}
|
||
}
|
||
if (!raw) {
|
||
trimNode(frag);
|
||
}
|
||
templateCache.put(cacheKey, frag);
|
||
return frag;
|
||
}
|
||
|
||
/**
|
||
* Convert a template node to a DocumentFragment.
|
||
*
|
||
* @param {Node} node
|
||
* @return {DocumentFragment}
|
||
*/
|
||
|
||
function nodeToFragment(node) {
|
||
// if its a template tag and the browser supports it,
|
||
// its content is already a document fragment. However, iOS Safari has
|
||
// bug when using directly cloned template content with touch
|
||
// events and can cause crashes when the nodes are removed from DOM, so we
|
||
// have to treat template elements as string templates. (#2805)
|
||
/* istanbul ignore if */
|
||
if (isRealTemplate(node)) {
|
||
return stringToFragment(node.innerHTML);
|
||
}
|
||
// script template
|
||
if (node.tagName === 'SCRIPT') {
|
||
return stringToFragment(node.textContent);
|
||
}
|
||
// normal node, clone it to avoid mutating the original
|
||
var clonedNode = cloneNode(node);
|
||
var frag = document.createDocumentFragment();
|
||
var child;
|
||
/* eslint-disable no-cond-assign */
|
||
while (child = clonedNode.firstChild) {
|
||
/* eslint-enable no-cond-assign */
|
||
frag.appendChild(child);
|
||
}
|
||
trimNode(frag);
|
||
return frag;
|
||
}
|
||
|
||
// Test for the presence of the Safari template cloning bug
|
||
// https://bugs.webkit.org/showug.cgi?id=137755
|
||
var hasBrokenTemplate = (function () {
|
||
/* istanbul ignore else */
|
||
if (inBrowser) {
|
||
var a = document.createElement('div');
|
||
a.innerHTML = '<template>1</template>';
|
||
return !a.cloneNode(true).firstChild.innerHTML;
|
||
} else {
|
||
return false;
|
||
}
|
||
})();
|
||
|
||
// Test for IE10/11 textarea placeholder clone bug
|
||
var hasTextareaCloneBug = (function () {
|
||
/* istanbul ignore else */
|
||
if (inBrowser) {
|
||
var t = document.createElement('textarea');
|
||
t.placeholder = 't';
|
||
return t.cloneNode(true).value === 't';
|
||
} else {
|
||
return false;
|
||
}
|
||
})();
|
||
|
||
/**
|
||
* 1. Deal with Safari cloning nested <template> bug by
|
||
* manually cloning all template instances.
|
||
* 2. Deal with IE10/11 textarea placeholder bug by setting
|
||
* the correct value after cloning.
|
||
*
|
||
* @param {Element|DocumentFragment} node
|
||
* @return {Element|DocumentFragment}
|
||
*/
|
||
|
||
function cloneNode(node) {
|
||
/* istanbul ignore if */
|
||
if (!node.querySelectorAll) {
|
||
return node.cloneNode();
|
||
}
|
||
var res = node.cloneNode(true);
|
||
var i, original, cloned;
|
||
/* istanbul ignore if */
|
||
if (hasBrokenTemplate) {
|
||
var tempClone = res;
|
||
if (isRealTemplate(node)) {
|
||
node = node.content;
|
||
tempClone = res.content;
|
||
}
|
||
original = node.querySelectorAll('template');
|
||
if (original.length) {
|
||
cloned = tempClone.querySelectorAll('template');
|
||
i = cloned.length;
|
||
while (i--) {
|
||
cloned[i].parentNode.replaceChild(cloneNode(original[i]), cloned[i]);
|
||
}
|
||
}
|
||
}
|
||
/* istanbul ignore if */
|
||
if (hasTextareaCloneBug) {
|
||
if (node.tagName === 'TEXTAREA') {
|
||
res.value = node.value;
|
||
} else {
|
||
original = node.querySelectorAll('textarea');
|
||
if (original.length) {
|
||
cloned = res.querySelectorAll('textarea');
|
||
i = cloned.length;
|
||
while (i--) {
|
||
cloned[i].value = original[i].value;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Process the template option and normalizes it into a
|
||
* a DocumentFragment that can be used as a partial or a
|
||
* instance template.
|
||
*
|
||
* @param {*} template
|
||
* Possible values include:
|
||
* - DocumentFragment object
|
||
* - Node object of type Template
|
||
* - id selector: '#some-template-id'
|
||
* - template string: '<div><span>{{msg}}</span></div>'
|
||
* @param {Boolean} shouldClone
|
||
* @param {Boolean} raw
|
||
* inline HTML interpolation. Do not check for id
|
||
* selector and keep whitespace in the string.
|
||
* @return {DocumentFragment|undefined}
|
||
*/
|
||
|
||
function parseTemplate(template, shouldClone, raw) {
|
||
var node, frag;
|
||
|
||
// if the template is already a document fragment,
|
||
// do nothing
|
||
if (isFragment(template)) {
|
||
trimNode(template);
|
||
return shouldClone ? cloneNode(template) : template;
|
||
}
|
||
|
||
if (typeof template === 'string') {
|
||
// id selector
|
||
if (!raw && template.charAt(0) === '#') {
|
||
// id selector can be cached too
|
||
frag = idSelectorCache.get(template);
|
||
if (!frag) {
|
||
node = document.getElementById(template.slice(1));
|
||
if (node) {
|
||
frag = nodeToFragment(node);
|
||
// save selector to cache
|
||
idSelectorCache.put(template, frag);
|
||
}
|
||
}
|
||
} else {
|
||
// normal string template
|
||
frag = stringToFragment(template, raw);
|
||
}
|
||
} else if (template.nodeType) {
|
||
// a direct node
|
||
frag = nodeToFragment(template);
|
||
}
|
||
|
||
return frag && shouldClone ? cloneNode(frag) : frag;
|
||
}
|
||
|
||
var template = Object.freeze({
|
||
cloneNode: cloneNode,
|
||
parseTemplate: parseTemplate
|
||
});
|
||
|
||
var html = {
|
||
|
||
bind: function bind() {
|
||
// a comment node means this is a binding for
|
||
// {{{ inline unescaped html }}}
|
||
if (this.el.nodeType === 8) {
|
||
// hold nodes
|
||
this.nodes = [];
|
||
// replace the placeholder with proper anchor
|
||
this.anchor = createAnchor('v-html');
|
||
replace(this.el, this.anchor);
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
value = _toString(value);
|
||
if (this.nodes) {
|
||
this.swap(value);
|
||
} else {
|
||
this.el.innerHTML = value;
|
||
}
|
||
},
|
||
|
||
swap: function swap(value) {
|
||
// remove old nodes
|
||
var i = this.nodes.length;
|
||
while (i--) {
|
||
remove(this.nodes[i]);
|
||
}
|
||
// convert new value to a fragment
|
||
// do not attempt to retrieve from id selector
|
||
var frag = parseTemplate(value, true, true);
|
||
// save a reference to these nodes so we can remove later
|
||
this.nodes = toArray(frag.childNodes);
|
||
before(frag, this.anchor);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Abstraction for a partially-compiled fragment.
|
||
* Can optionally compile content with a child scope.
|
||
*
|
||
* @param {Function} linker
|
||
* @param {Vue} vm
|
||
* @param {DocumentFragment} frag
|
||
* @param {Vue} [host]
|
||
* @param {Object} [scope]
|
||
* @param {Fragment} [parentFrag]
|
||
*/
|
||
function Fragment(linker, vm, frag, host, scope, parentFrag) {
|
||
this.children = [];
|
||
this.childFrags = [];
|
||
this.vm = vm;
|
||
this.scope = scope;
|
||
this.inserted = false;
|
||
this.parentFrag = parentFrag;
|
||
if (parentFrag) {
|
||
parentFrag.childFrags.push(this);
|
||
}
|
||
this.unlink = linker(vm, frag, host, scope, this);
|
||
var single = this.single = frag.childNodes.length === 1 &&
|
||
// do not go single mode if the only node is an anchor
|
||
!frag.childNodes[0].__v_anchor;
|
||
if (single) {
|
||
this.node = frag.childNodes[0];
|
||
this.before = singleBefore;
|
||
this.remove = singleRemove;
|
||
} else {
|
||
this.node = createAnchor('fragment-start');
|
||
this.end = createAnchor('fragment-end');
|
||
this.frag = frag;
|
||
prepend(this.node, frag);
|
||
frag.appendChild(this.end);
|
||
this.before = multiBefore;
|
||
this.remove = multiRemove;
|
||
}
|
||
this.node.__v_frag = this;
|
||
}
|
||
|
||
/**
|
||
* Call attach/detach for all components contained within
|
||
* this fragment. Also do so recursively for all child
|
||
* fragments.
|
||
*
|
||
* @param {Function} hook
|
||
*/
|
||
|
||
Fragment.prototype.callHook = function (hook) {
|
||
var i, l;
|
||
for (i = 0, l = this.childFrags.length; i < l; i++) {
|
||
this.childFrags[i].callHook(hook);
|
||
}
|
||
for (i = 0, l = this.children.length; i < l; i++) {
|
||
hook(this.children[i]);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Insert fragment before target, single node version
|
||
*
|
||
* @param {Node} target
|
||
* @param {Boolean} withTransition
|
||
*/
|
||
|
||
function singleBefore(target, withTransition) {
|
||
this.inserted = true;
|
||
var method = withTransition !== false ? beforeWithTransition : before;
|
||
method(this.node, target, this.vm);
|
||
if (inDoc(this.node)) {
|
||
this.callHook(attach);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Remove fragment, single node version
|
||
*/
|
||
|
||
function singleRemove() {
|
||
this.inserted = false;
|
||
var shouldCallRemove = inDoc(this.node);
|
||
var self = this;
|
||
this.beforeRemove();
|
||
removeWithTransition(this.node, this.vm, function () {
|
||
if (shouldCallRemove) {
|
||
self.callHook(detach);
|
||
}
|
||
self.destroy();
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Insert fragment before target, multi-nodes version
|
||
*
|
||
* @param {Node} target
|
||
* @param {Boolean} withTransition
|
||
*/
|
||
|
||
function multiBefore(target, withTransition) {
|
||
this.inserted = true;
|
||
var vm = this.vm;
|
||
var method = withTransition !== false ? beforeWithTransition : before;
|
||
mapNodeRange(this.node, this.end, function (node) {
|
||
method(node, target, vm);
|
||
});
|
||
if (inDoc(this.node)) {
|
||
this.callHook(attach);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Remove fragment, multi-nodes version
|
||
*/
|
||
|
||
function multiRemove() {
|
||
this.inserted = false;
|
||
var self = this;
|
||
var shouldCallRemove = inDoc(this.node);
|
||
this.beforeRemove();
|
||
removeNodeRange(this.node, this.end, this.vm, this.frag, function () {
|
||
if (shouldCallRemove) {
|
||
self.callHook(detach);
|
||
}
|
||
self.destroy();
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Prepare the fragment for removal.
|
||
*/
|
||
|
||
Fragment.prototype.beforeRemove = function () {
|
||
var i, l;
|
||
for (i = 0, l = this.childFrags.length; i < l; i++) {
|
||
// call the same method recursively on child
|
||
// fragments, depth-first
|
||
this.childFrags[i].beforeRemove(false);
|
||
}
|
||
for (i = 0, l = this.children.length; i < l; i++) {
|
||
// Call destroy for all contained instances,
|
||
// with remove:false and defer:true.
|
||
// Defer is necessary because we need to
|
||
// keep the children to call detach hooks
|
||
// on them.
|
||
this.children[i].$destroy(false, true);
|
||
}
|
||
var dirs = this.unlink.dirs;
|
||
for (i = 0, l = dirs.length; i < l; i++) {
|
||
// disable the watchers on all the directives
|
||
// so that the rendered content stays the same
|
||
// during removal.
|
||
dirs[i]._watcher && dirs[i]._watcher.teardown();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Destroy the fragment.
|
||
*/
|
||
|
||
Fragment.prototype.destroy = function () {
|
||
if (this.parentFrag) {
|
||
this.parentFrag.childFrags.$remove(this);
|
||
}
|
||
this.node.__v_frag = null;
|
||
this.unlink();
|
||
};
|
||
|
||
/**
|
||
* Call attach hook for a Vue instance.
|
||
*
|
||
* @param {Vue} child
|
||
*/
|
||
|
||
function attach(child) {
|
||
if (!child._isAttached && inDoc(child.$el)) {
|
||
child._callHook('attached');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Call detach hook for a Vue instance.
|
||
*
|
||
* @param {Vue} child
|
||
*/
|
||
|
||
function detach(child) {
|
||
if (child._isAttached && !inDoc(child.$el)) {
|
||
child._callHook('detached');
|
||
}
|
||
}
|
||
|
||
var linkerCache = new Cache(5000);
|
||
|
||
/**
|
||
* A factory that can be used to create instances of a
|
||
* fragment. Caches the compiled linker if possible.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Element|String} el
|
||
*/
|
||
function FragmentFactory(vm, el) {
|
||
this.vm = vm;
|
||
var template;
|
||
var isString = typeof el === 'string';
|
||
if (isString || isTemplate(el) && !el.hasAttribute('v-if')) {
|
||
template = parseTemplate(el, true);
|
||
} else {
|
||
template = document.createDocumentFragment();
|
||
template.appendChild(el);
|
||
}
|
||
this.template = template;
|
||
// linker can be cached, but only for components
|
||
var linker;
|
||
var cid = vm.constructor.cid;
|
||
if (cid > 0) {
|
||
var cacheId = cid + (isString ? el : getOuterHTML(el));
|
||
linker = linkerCache.get(cacheId);
|
||
if (!linker) {
|
||
linker = compile(template, vm.$options, true);
|
||
linkerCache.put(cacheId, linker);
|
||
}
|
||
} else {
|
||
linker = compile(template, vm.$options, true);
|
||
}
|
||
this.linker = linker;
|
||
}
|
||
|
||
/**
|
||
* Create a fragment instance with given host and scope.
|
||
*
|
||
* @param {Vue} host
|
||
* @param {Object} scope
|
||
* @param {Fragment} parentFrag
|
||
*/
|
||
|
||
FragmentFactory.prototype.create = function (host, scope, parentFrag) {
|
||
var frag = cloneNode(this.template);
|
||
return new Fragment(this.linker, this.vm, frag, host, scope, parentFrag);
|
||
};
|
||
|
||
var ON = 700;
|
||
var MODEL = 800;
|
||
var BIND = 850;
|
||
var TRANSITION = 1100;
|
||
var EL = 1500;
|
||
var COMPONENT = 1500;
|
||
var PARTIAL = 1750;
|
||
var IF = 2100;
|
||
var FOR = 2200;
|
||
var SLOT = 2300;
|
||
|
||
var uid$3 = 0;
|
||
|
||
var vFor = {
|
||
|
||
priority: FOR,
|
||
terminal: true,
|
||
|
||
params: ['track-by', 'stagger', 'enter-stagger', 'leave-stagger'],
|
||
|
||
bind: function bind() {
|
||
// support "item in/of items" syntax
|
||
var inMatch = this.expression.match(/(.*) (?:in|of) (.*)/);
|
||
if (inMatch) {
|
||
var itMatch = inMatch[1].match(/\((.*),(.*)\)/);
|
||
if (itMatch) {
|
||
this.iterator = itMatch[1].trim();
|
||
this.alias = itMatch[2].trim();
|
||
} else {
|
||
this.alias = inMatch[1].trim();
|
||
}
|
||
this.expression = inMatch[2];
|
||
}
|
||
|
||
if (!this.alias) {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid v-for expression "' + this.descriptor.raw + '": ' + 'alias is required.', this.vm);
|
||
return;
|
||
}
|
||
|
||
// uid as a cache identifier
|
||
this.id = '__v-for__' + ++uid$3;
|
||
|
||
// check if this is an option list,
|
||
// so that we know if we need to update the <select>'s
|
||
// v-model when the option list has changed.
|
||
// because v-model has a lower priority than v-for,
|
||
// the v-model is not bound here yet, so we have to
|
||
// retrive it in the actual updateModel() function.
|
||
var tag = this.el.tagName;
|
||
this.isOption = (tag === 'OPTION' || tag === 'OPTGROUP') && this.el.parentNode.tagName === 'SELECT';
|
||
|
||
// setup anchor nodes
|
||
this.start = createAnchor('v-for-start');
|
||
this.end = createAnchor('v-for-end');
|
||
replace(this.el, this.end);
|
||
before(this.start, this.end);
|
||
|
||
// cache
|
||
this.cache = Object.create(null);
|
||
|
||
// fragment factory
|
||
this.factory = new FragmentFactory(this.vm, this.el);
|
||
},
|
||
|
||
update: function update(data) {
|
||
this.diff(data);
|
||
this.updateRef();
|
||
this.updateModel();
|
||
},
|
||
|
||
/**
|
||
* Diff, based on new data and old data, determine the
|
||
* minimum amount of DOM manipulations needed to make the
|
||
* DOM reflect the new data Array.
|
||
*
|
||
* The algorithm diffs the new data Array by storing a
|
||
* hidden reference to an owner vm instance on previously
|
||
* seen data. This allows us to achieve O(n) which is
|
||
* better than a levenshtein distance based algorithm,
|
||
* which is O(m * n).
|
||
*
|
||
* @param {Array} data
|
||
*/
|
||
|
||
diff: function diff(data) {
|
||
// check if the Array was converted from an Object
|
||
var item = data[0];
|
||
var convertedFromObject = this.fromObject = isObject(item) && hasOwn(item, '$key') && hasOwn(item, '$value');
|
||
|
||
var trackByKey = this.params.trackBy;
|
||
var oldFrags = this.frags;
|
||
var frags = this.frags = new Array(data.length);
|
||
var alias = this.alias;
|
||
var iterator = this.iterator;
|
||
var start = this.start;
|
||
var end = this.end;
|
||
var inDocument = inDoc(start);
|
||
var init = !oldFrags;
|
||
var i, l, frag, key, value, primitive;
|
||
|
||
// First pass, go through the new Array and fill up
|
||
// the new frags array. If a piece of data has a cached
|
||
// instance for it, we reuse it. Otherwise build a new
|
||
// instance.
|
||
for (i = 0, l = data.length; i < l; i++) {
|
||
item = data[i];
|
||
key = convertedFromObject ? item.$key : null;
|
||
value = convertedFromObject ? item.$value : item;
|
||
primitive = !isObject(value);
|
||
frag = !init && this.getCachedFrag(value, i, key);
|
||
if (frag) {
|
||
// reusable fragment
|
||
frag.reused = true;
|
||
// update $index
|
||
frag.scope.$index = i;
|
||
// update $key
|
||
if (key) {
|
||
frag.scope.$key = key;
|
||
}
|
||
// update iterator
|
||
if (iterator) {
|
||
frag.scope[iterator] = key !== null ? key : i;
|
||
}
|
||
// update data for track-by, object repeat &
|
||
// primitive values.
|
||
if (trackByKey || convertedFromObject || primitive) {
|
||
withoutConversion(function () {
|
||
frag.scope[alias] = value;
|
||
});
|
||
}
|
||
} else {
|
||
// new isntance
|
||
frag = this.create(value, alias, i, key);
|
||
frag.fresh = !init;
|
||
}
|
||
frags[i] = frag;
|
||
if (init) {
|
||
frag.before(end);
|
||
}
|
||
}
|
||
|
||
// we're done for the initial render.
|
||
if (init) {
|
||
return;
|
||
}
|
||
|
||
// Second pass, go through the old fragments and
|
||
// destroy those who are not reused (and remove them
|
||
// from cache)
|
||
var removalIndex = 0;
|
||
var totalRemoved = oldFrags.length - frags.length;
|
||
// when removing a large number of fragments, watcher removal
|
||
// turns out to be a perf bottleneck, so we batch the watcher
|
||
// removals into a single filter call!
|
||
this.vm._vForRemoving = true;
|
||
for (i = 0, l = oldFrags.length; i < l; i++) {
|
||
frag = oldFrags[i];
|
||
if (!frag.reused) {
|
||
this.deleteCachedFrag(frag);
|
||
this.remove(frag, removalIndex++, totalRemoved, inDocument);
|
||
}
|
||
}
|
||
this.vm._vForRemoving = false;
|
||
if (removalIndex) {
|
||
this.vm._watchers = this.vm._watchers.filter(function (w) {
|
||
return w.active;
|
||
});
|
||
}
|
||
|
||
// Final pass, move/insert new fragments into the
|
||
// right place.
|
||
var targetPrev, prevEl, currentPrev;
|
||
var insertionIndex = 0;
|
||
for (i = 0, l = frags.length; i < l; i++) {
|
||
frag = frags[i];
|
||
// this is the frag that we should be after
|
||
targetPrev = frags[i - 1];
|
||
prevEl = targetPrev ? targetPrev.staggerCb ? targetPrev.staggerAnchor : targetPrev.end || targetPrev.node : start;
|
||
if (frag.reused && !frag.staggerCb) {
|
||
currentPrev = findPrevFrag(frag, start, this.id);
|
||
if (currentPrev !== targetPrev && (!currentPrev ||
|
||
// optimization for moving a single item.
|
||
// thanks to suggestions by @livoras in #1807
|
||
findPrevFrag(currentPrev, start, this.id) !== targetPrev)) {
|
||
this.move(frag, prevEl);
|
||
}
|
||
} else {
|
||
// new instance, or still in stagger.
|
||
// insert with updated stagger index.
|
||
this.insert(frag, insertionIndex++, prevEl, inDocument);
|
||
}
|
||
frag.reused = frag.fresh = false;
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Create a new fragment instance.
|
||
*
|
||
* @param {*} value
|
||
* @param {String} alias
|
||
* @param {Number} index
|
||
* @param {String} [key]
|
||
* @return {Fragment}
|
||
*/
|
||
|
||
create: function create(value, alias, index, key) {
|
||
var host = this._host;
|
||
// create iteration scope
|
||
var parentScope = this._scope || this.vm;
|
||
var scope = Object.create(parentScope);
|
||
// ref holder for the scope
|
||
scope.$refs = Object.create(parentScope.$refs);
|
||
scope.$els = Object.create(parentScope.$els);
|
||
// make sure point $parent to parent scope
|
||
scope.$parent = parentScope;
|
||
// for two-way binding on alias
|
||
scope.$forContext = this;
|
||
// define scope properties
|
||
// important: define the scope alias without forced conversion
|
||
// so that frozen data structures remain non-reactive.
|
||
withoutConversion(function () {
|
||
defineReactive(scope, alias, value);
|
||
});
|
||
defineReactive(scope, '$index', index);
|
||
if (key) {
|
||
defineReactive(scope, '$key', key);
|
||
} else if (scope.$key) {
|
||
// avoid accidental fallback
|
||
def(scope, '$key', null);
|
||
}
|
||
if (this.iterator) {
|
||
defineReactive(scope, this.iterator, key !== null ? key : index);
|
||
}
|
||
var frag = this.factory.create(host, scope, this._frag);
|
||
frag.forId = this.id;
|
||
this.cacheFrag(value, frag, index, key);
|
||
return frag;
|
||
},
|
||
|
||
/**
|
||
* Update the v-ref on owner vm.
|
||
*/
|
||
|
||
updateRef: function updateRef() {
|
||
var ref = this.descriptor.ref;
|
||
if (!ref) return;
|
||
var hash = (this._scope || this.vm).$refs;
|
||
var refs;
|
||
if (!this.fromObject) {
|
||
refs = this.frags.map(findVmFromFrag);
|
||
} else {
|
||
refs = {};
|
||
this.frags.forEach(function (frag) {
|
||
refs[frag.scope.$key] = findVmFromFrag(frag);
|
||
});
|
||
}
|
||
hash[ref] = refs;
|
||
},
|
||
|
||
/**
|
||
* For option lists, update the containing v-model on
|
||
* parent <select>.
|
||
*/
|
||
|
||
updateModel: function updateModel() {
|
||
if (this.isOption) {
|
||
var parent = this.start.parentNode;
|
||
var model = parent && parent.__v_model;
|
||
if (model) {
|
||
model.forceUpdate();
|
||
}
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Insert a fragment. Handles staggering.
|
||
*
|
||
* @param {Fragment} frag
|
||
* @param {Number} index
|
||
* @param {Node} prevEl
|
||
* @param {Boolean} inDocument
|
||
*/
|
||
|
||
insert: function insert(frag, index, prevEl, inDocument) {
|
||
if (frag.staggerCb) {
|
||
frag.staggerCb.cancel();
|
||
frag.staggerCb = null;
|
||
}
|
||
var staggerAmount = this.getStagger(frag, index, null, 'enter');
|
||
if (inDocument && staggerAmount) {
|
||
// create an anchor and insert it synchronously,
|
||
// so that we can resolve the correct order without
|
||
// worrying about some elements not inserted yet
|
||
var anchor = frag.staggerAnchor;
|
||
if (!anchor) {
|
||
anchor = frag.staggerAnchor = createAnchor('stagger-anchor');
|
||
anchor.__v_frag = frag;
|
||
}
|
||
after(anchor, prevEl);
|
||
var op = frag.staggerCb = cancellable(function () {
|
||
frag.staggerCb = null;
|
||
frag.before(anchor);
|
||
remove(anchor);
|
||
});
|
||
setTimeout(op, staggerAmount);
|
||
} else {
|
||
var target = prevEl.nextSibling;
|
||
/* istanbul ignore if */
|
||
if (!target) {
|
||
// reset end anchor position in case the position was messed up
|
||
// by an external drag-n-drop library.
|
||
after(this.end, prevEl);
|
||
target = this.end;
|
||
}
|
||
frag.before(target);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Remove a fragment. Handles staggering.
|
||
*
|
||
* @param {Fragment} frag
|
||
* @param {Number} index
|
||
* @param {Number} total
|
||
* @param {Boolean} inDocument
|
||
*/
|
||
|
||
remove: function remove(frag, index, total, inDocument) {
|
||
if (frag.staggerCb) {
|
||
frag.staggerCb.cancel();
|
||
frag.staggerCb = null;
|
||
// it's not possible for the same frag to be removed
|
||
// twice, so if we have a pending stagger callback,
|
||
// it means this frag is queued for enter but removed
|
||
// before its transition started. Since it is already
|
||
// destroyed, we can just leave it in detached state.
|
||
return;
|
||
}
|
||
var staggerAmount = this.getStagger(frag, index, total, 'leave');
|
||
if (inDocument && staggerAmount) {
|
||
var op = frag.staggerCb = cancellable(function () {
|
||
frag.staggerCb = null;
|
||
frag.remove();
|
||
});
|
||
setTimeout(op, staggerAmount);
|
||
} else {
|
||
frag.remove();
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Move a fragment to a new position.
|
||
* Force no transition.
|
||
*
|
||
* @param {Fragment} frag
|
||
* @param {Node} prevEl
|
||
*/
|
||
|
||
move: function move(frag, prevEl) {
|
||
// fix a common issue with Sortable:
|
||
// if prevEl doesn't have nextSibling, this means it's
|
||
// been dragged after the end anchor. Just re-position
|
||
// the end anchor to the end of the container.
|
||
/* istanbul ignore if */
|
||
if (!prevEl.nextSibling) {
|
||
this.end.parentNode.appendChild(this.end);
|
||
}
|
||
frag.before(prevEl.nextSibling, false);
|
||
},
|
||
|
||
/**
|
||
* Cache a fragment using track-by or the object key.
|
||
*
|
||
* @param {*} value
|
||
* @param {Fragment} frag
|
||
* @param {Number} index
|
||
* @param {String} [key]
|
||
*/
|
||
|
||
cacheFrag: function cacheFrag(value, frag, index, key) {
|
||
var trackByKey = this.params.trackBy;
|
||
var cache = this.cache;
|
||
var primitive = !isObject(value);
|
||
var id;
|
||
if (key || trackByKey || primitive) {
|
||
id = getTrackByKey(index, key, value, trackByKey);
|
||
if (!cache[id]) {
|
||
cache[id] = frag;
|
||
} else if (trackByKey !== '$index') {
|
||
process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);
|
||
}
|
||
} else {
|
||
id = this.id;
|
||
if (hasOwn(value, id)) {
|
||
if (value[id] === null) {
|
||
value[id] = frag;
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);
|
||
}
|
||
} else if (Object.isExtensible(value)) {
|
||
def(value, id, frag);
|
||
} else if (process.env.NODE_ENV !== 'production') {
|
||
warn('Frozen v-for objects cannot be automatically tracked, make sure to ' + 'provide a track-by key.');
|
||
}
|
||
}
|
||
frag.raw = value;
|
||
},
|
||
|
||
/**
|
||
* Get a cached fragment from the value/index/key
|
||
*
|
||
* @param {*} value
|
||
* @param {Number} index
|
||
* @param {String} key
|
||
* @return {Fragment}
|
||
*/
|
||
|
||
getCachedFrag: function getCachedFrag(value, index, key) {
|
||
var trackByKey = this.params.trackBy;
|
||
var primitive = !isObject(value);
|
||
var frag;
|
||
if (key || trackByKey || primitive) {
|
||
var id = getTrackByKey(index, key, value, trackByKey);
|
||
frag = this.cache[id];
|
||
} else {
|
||
frag = value[this.id];
|
||
}
|
||
if (frag && (frag.reused || frag.fresh)) {
|
||
process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);
|
||
}
|
||
return frag;
|
||
},
|
||
|
||
/**
|
||
* Delete a fragment from cache.
|
||
*
|
||
* @param {Fragment} frag
|
||
*/
|
||
|
||
deleteCachedFrag: function deleteCachedFrag(frag) {
|
||
var value = frag.raw;
|
||
var trackByKey = this.params.trackBy;
|
||
var scope = frag.scope;
|
||
var index = scope.$index;
|
||
// fix #948: avoid accidentally fall through to
|
||
// a parent repeater which happens to have $key.
|
||
var key = hasOwn(scope, '$key') && scope.$key;
|
||
var primitive = !isObject(value);
|
||
if (trackByKey || key || primitive) {
|
||
var id = getTrackByKey(index, key, value, trackByKey);
|
||
this.cache[id] = null;
|
||
} else {
|
||
value[this.id] = null;
|
||
frag.raw = null;
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Get the stagger amount for an insertion/removal.
|
||
*
|
||
* @param {Fragment} frag
|
||
* @param {Number} index
|
||
* @param {Number} total
|
||
* @param {String} type
|
||
*/
|
||
|
||
getStagger: function getStagger(frag, index, total, type) {
|
||
type = type + 'Stagger';
|
||
var trans = frag.node.__v_trans;
|
||
var hooks = trans && trans.hooks;
|
||
var hook = hooks && (hooks[type] || hooks.stagger);
|
||
return hook ? hook.call(frag, index, total) : index * parseInt(this.params[type] || this.params.stagger, 10);
|
||
},
|
||
|
||
/**
|
||
* Pre-process the value before piping it through the
|
||
* filters. This is passed to and called by the watcher.
|
||
*/
|
||
|
||
_preProcess: function _preProcess(value) {
|
||
// regardless of type, store the un-filtered raw value.
|
||
this.rawValue = value;
|
||
return value;
|
||
},
|
||
|
||
/**
|
||
* Post-process the value after it has been piped through
|
||
* the filters. This is passed to and called by the watcher.
|
||
*
|
||
* It is necessary for this to be called during the
|
||
* watcher's dependency collection phase because we want
|
||
* the v-for to update when the source Object is mutated.
|
||
*/
|
||
|
||
_postProcess: function _postProcess(value) {
|
||
if (isArray(value)) {
|
||
return value;
|
||
} else if (isPlainObject(value)) {
|
||
// convert plain object to array.
|
||
var keys = Object.keys(value);
|
||
var i = keys.length;
|
||
var res = new Array(i);
|
||
var key;
|
||
while (i--) {
|
||
key = keys[i];
|
||
res[i] = {
|
||
$key: key,
|
||
$value: value[key]
|
||
};
|
||
}
|
||
return res;
|
||
} else {
|
||
if (typeof value === 'number' && !isNaN(value)) {
|
||
value = range(value);
|
||
}
|
||
return value || [];
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
if (this.descriptor.ref) {
|
||
(this._scope || this.vm).$refs[this.descriptor.ref] = null;
|
||
}
|
||
if (this.frags) {
|
||
var i = this.frags.length;
|
||
var frag;
|
||
while (i--) {
|
||
frag = this.frags[i];
|
||
this.deleteCachedFrag(frag);
|
||
frag.destroy();
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Helper to find the previous element that is a fragment
|
||
* anchor. This is necessary because a destroyed frag's
|
||
* element could still be lingering in the DOM before its
|
||
* leaving transition finishes, but its inserted flag
|
||
* should have been set to false so we can skip them.
|
||
*
|
||
* If this is a block repeat, we want to make sure we only
|
||
* return frag that is bound to this v-for. (see #929)
|
||
*
|
||
* @param {Fragment} frag
|
||
* @param {Comment|Text} anchor
|
||
* @param {String} id
|
||
* @return {Fragment}
|
||
*/
|
||
|
||
function findPrevFrag(frag, anchor, id) {
|
||
var el = frag.node.previousSibling;
|
||
/* istanbul ignore if */
|
||
if (!el) return;
|
||
frag = el.__v_frag;
|
||
while ((!frag || frag.forId !== id || !frag.inserted) && el !== anchor) {
|
||
el = el.previousSibling;
|
||
/* istanbul ignore if */
|
||
if (!el) return;
|
||
frag = el.__v_frag;
|
||
}
|
||
return frag;
|
||
}
|
||
|
||
/**
|
||
* Find a vm from a fragment.
|
||
*
|
||
* @param {Fragment} frag
|
||
* @return {Vue|undefined}
|
||
*/
|
||
|
||
function findVmFromFrag(frag) {
|
||
var node = frag.node;
|
||
// handle multi-node frag
|
||
if (frag.end) {
|
||
while (!node.__vue__ && node !== frag.end && node.nextSibling) {
|
||
node = node.nextSibling;
|
||
}
|
||
}
|
||
return node.__vue__;
|
||
}
|
||
|
||
/**
|
||
* Create a range array from given number.
|
||
*
|
||
* @param {Number} n
|
||
* @return {Array}
|
||
*/
|
||
|
||
function range(n) {
|
||
var i = -1;
|
||
var ret = new Array(Math.floor(n));
|
||
while (++i < n) {
|
||
ret[i] = i;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* Get the track by key for an item.
|
||
*
|
||
* @param {Number} index
|
||
* @param {String} key
|
||
* @param {*} value
|
||
* @param {String} [trackByKey]
|
||
*/
|
||
|
||
function getTrackByKey(index, key, value, trackByKey) {
|
||
return trackByKey ? trackByKey === '$index' ? index : trackByKey.charAt(0).match(/\w/) ? getPath(value, trackByKey) : value[trackByKey] : key || value;
|
||
}
|
||
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
vFor.warnDuplicate = function (value) {
|
||
warn('Duplicate value found in v-for="' + this.descriptor.raw + '": ' + JSON.stringify(value) + '. Use track-by="$index" if ' + 'you are expecting duplicate values.', this.vm);
|
||
};
|
||
}
|
||
|
||
var vIf = {
|
||
|
||
priority: IF,
|
||
terminal: true,
|
||
|
||
bind: function bind() {
|
||
var el = this.el;
|
||
if (!el.__vue__) {
|
||
// check else block
|
||
var next = el.nextElementSibling;
|
||
if (next && getAttr(next, 'v-else') !== null) {
|
||
remove(next);
|
||
this.elseEl = next;
|
||
}
|
||
// check main block
|
||
this.anchor = createAnchor('v-if');
|
||
replace(el, this.anchor);
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('v-if="' + this.expression + '" cannot be ' + 'used on an instance root element.', this.vm);
|
||
this.invalid = true;
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
if (this.invalid) return;
|
||
if (value) {
|
||
if (!this.frag) {
|
||
this.insert();
|
||
}
|
||
} else {
|
||
this.remove();
|
||
}
|
||
},
|
||
|
||
insert: function insert() {
|
||
if (this.elseFrag) {
|
||
this.elseFrag.remove();
|
||
this.elseFrag = null;
|
||
}
|
||
// lazy init factory
|
||
if (!this.factory) {
|
||
this.factory = new FragmentFactory(this.vm, this.el);
|
||
}
|
||
this.frag = this.factory.create(this._host, this._scope, this._frag);
|
||
this.frag.before(this.anchor);
|
||
},
|
||
|
||
remove: function remove() {
|
||
if (this.frag) {
|
||
this.frag.remove();
|
||
this.frag = null;
|
||
}
|
||
if (this.elseEl && !this.elseFrag) {
|
||
if (!this.elseFactory) {
|
||
this.elseFactory = new FragmentFactory(this.elseEl._context || this.vm, this.elseEl);
|
||
}
|
||
this.elseFrag = this.elseFactory.create(this._host, this._scope, this._frag);
|
||
this.elseFrag.before(this.anchor);
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
if (this.frag) {
|
||
this.frag.destroy();
|
||
}
|
||
if (this.elseFrag) {
|
||
this.elseFrag.destroy();
|
||
}
|
||
}
|
||
};
|
||
|
||
var show = {
|
||
|
||
bind: function bind() {
|
||
// check else block
|
||
var next = this.el.nextElementSibling;
|
||
if (next && getAttr(next, 'v-else') !== null) {
|
||
this.elseEl = next;
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
this.apply(this.el, value);
|
||
if (this.elseEl) {
|
||
this.apply(this.elseEl, !value);
|
||
}
|
||
},
|
||
|
||
apply: function apply(el, value) {
|
||
if (inDoc(el)) {
|
||
applyTransition(el, value ? 1 : -1, toggle, this.vm);
|
||
} else {
|
||
toggle();
|
||
}
|
||
function toggle() {
|
||
el.style.display = value ? '' : 'none';
|
||
}
|
||
}
|
||
};
|
||
|
||
var text$2 = {
|
||
|
||
bind: function bind() {
|
||
var self = this;
|
||
var el = this.el;
|
||
var isRange = el.type === 'range';
|
||
var lazy = this.params.lazy;
|
||
var number = this.params.number;
|
||
var debounce = this.params.debounce;
|
||
|
||
// handle composition events.
|
||
// http://blog.evanyou.me/2014/01/03/composition-event/
|
||
// skip this for Android because it handles composition
|
||
// events quite differently. Android doesn't trigger
|
||
// composition events for language input methods e.g.
|
||
// Chinese, but instead triggers them for spelling
|
||
// suggestions... (see Discussion/#162)
|
||
var composing = false;
|
||
if (!isAndroid && !isRange) {
|
||
this.on('compositionstart', function () {
|
||
composing = true;
|
||
});
|
||
this.on('compositionend', function () {
|
||
composing = false;
|
||
// in IE11 the "compositionend" event fires AFTER
|
||
// the "input" event, so the input handler is blocked
|
||
// at the end... have to call it here.
|
||
//
|
||
// #1327: in lazy mode this is unecessary.
|
||
if (!lazy) {
|
||
self.listener();
|
||
}
|
||
});
|
||
}
|
||
|
||
// prevent messing with the input when user is typing,
|
||
// and force update on blur.
|
||
this.focused = false;
|
||
if (!isRange && !lazy) {
|
||
this.on('focus', function () {
|
||
self.focused = true;
|
||
});
|
||
this.on('blur', function () {
|
||
self.focused = false;
|
||
// do not sync value after fragment removal (#2017)
|
||
if (!self._frag || self._frag.inserted) {
|
||
self.rawListener();
|
||
}
|
||
});
|
||
}
|
||
|
||
// Now attach the main listener
|
||
this.listener = this.rawListener = function () {
|
||
if (composing || !self._bound) {
|
||
return;
|
||
}
|
||
var val = number || isRange ? toNumber(el.value) : el.value;
|
||
self.set(val);
|
||
// force update on next tick to avoid lock & same value
|
||
// also only update when user is not typing
|
||
nextTick(function () {
|
||
if (self._bound && !self.focused) {
|
||
self.update(self._watcher.value);
|
||
}
|
||
});
|
||
};
|
||
|
||
// apply debounce
|
||
if (debounce) {
|
||
this.listener = _debounce(this.listener, debounce);
|
||
}
|
||
|
||
// Support jQuery events, since jQuery.trigger() doesn't
|
||
// trigger native events in some cases and some plugins
|
||
// rely on $.trigger()
|
||
//
|
||
// We want to make sure if a listener is attached using
|
||
// jQuery, it is also removed with jQuery, that's why
|
||
// we do the check for each directive instance and
|
||
// store that check result on itself. This also allows
|
||
// easier test coverage control by unsetting the global
|
||
// jQuery variable in tests.
|
||
this.hasjQuery = typeof jQuery === 'function';
|
||
if (this.hasjQuery) {
|
||
var method = jQuery.fn.on ? 'on' : 'bind';
|
||
jQuery(el)[method]('change', this.rawListener);
|
||
if (!lazy) {
|
||
jQuery(el)[method]('input', this.listener);
|
||
}
|
||
} else {
|
||
this.on('change', this.rawListener);
|
||
if (!lazy) {
|
||
this.on('input', this.listener);
|
||
}
|
||
}
|
||
|
||
// IE9 doesn't fire input event on backspace/del/cut
|
||
if (!lazy && isIE9) {
|
||
this.on('cut', function () {
|
||
nextTick(self.listener);
|
||
});
|
||
this.on('keyup', function (e) {
|
||
if (e.keyCode === 46 || e.keyCode === 8) {
|
||
self.listener();
|
||
}
|
||
});
|
||
}
|
||
|
||
// set initial value if present
|
||
if (el.hasAttribute('value') || el.tagName === 'TEXTAREA' && el.value.trim()) {
|
||
this.afterBind = this.listener;
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
// #3029 only update when the value changes. This prevent
|
||
// browsers from overwriting values like selectionStart
|
||
value = _toString(value);
|
||
if (value !== this.el.value) this.el.value = value;
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
var el = this.el;
|
||
if (this.hasjQuery) {
|
||
var method = jQuery.fn.off ? 'off' : 'unbind';
|
||
jQuery(el)[method]('change', this.listener);
|
||
jQuery(el)[method]('input', this.listener);
|
||
}
|
||
}
|
||
};
|
||
|
||
var radio = {
|
||
|
||
bind: function bind() {
|
||
var self = this;
|
||
var el = this.el;
|
||
|
||
this.getValue = function () {
|
||
// value overwrite via v-bind:value
|
||
if (el.hasOwnProperty('_value')) {
|
||
return el._value;
|
||
}
|
||
var val = el.value;
|
||
if (self.params.number) {
|
||
val = toNumber(val);
|
||
}
|
||
return val;
|
||
};
|
||
|
||
this.listener = function () {
|
||
self.set(self.getValue());
|
||
};
|
||
this.on('change', this.listener);
|
||
|
||
if (el.hasAttribute('checked')) {
|
||
this.afterBind = this.listener;
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
this.el.checked = looseEqual(value, this.getValue());
|
||
}
|
||
};
|
||
|
||
var select = {
|
||
|
||
bind: function bind() {
|
||
var _this = this;
|
||
|
||
var self = this;
|
||
var el = this.el;
|
||
|
||
// method to force update DOM using latest value.
|
||
this.forceUpdate = function () {
|
||
if (self._watcher) {
|
||
self.update(self._watcher.get());
|
||
}
|
||
};
|
||
|
||
// check if this is a multiple select
|
||
var multiple = this.multiple = el.hasAttribute('multiple');
|
||
|
||
// attach listener
|
||
this.listener = function () {
|
||
var value = getValue(el, multiple);
|
||
value = self.params.number ? isArray(value) ? value.map(toNumber) : toNumber(value) : value;
|
||
self.set(value);
|
||
};
|
||
this.on('change', this.listener);
|
||
|
||
// if has initial value, set afterBind
|
||
var initValue = getValue(el, multiple, true);
|
||
if (multiple && initValue.length || !multiple && initValue !== null) {
|
||
this.afterBind = this.listener;
|
||
}
|
||
|
||
// All major browsers except Firefox resets
|
||
// selectedIndex with value -1 to 0 when the element
|
||
// is appended to a new parent, therefore we have to
|
||
// force a DOM update whenever that happens...
|
||
this.vm.$on('hook:attached', function () {
|
||
nextTick(_this.forceUpdate);
|
||
});
|
||
if (!inDoc(el)) {
|
||
nextTick(this.forceUpdate);
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
var el = this.el;
|
||
el.selectedIndex = -1;
|
||
var multi = this.multiple && isArray(value);
|
||
var options = el.options;
|
||
var i = options.length;
|
||
var op, val;
|
||
while (i--) {
|
||
op = options[i];
|
||
val = op.hasOwnProperty('_value') ? op._value : op.value;
|
||
/* eslint-disable eqeqeq */
|
||
op.selected = multi ? indexOf$1(value, val) > -1 : looseEqual(value, val);
|
||
/* eslint-enable eqeqeq */
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
/* istanbul ignore next */
|
||
this.vm.$off('hook:attached', this.forceUpdate);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Get select value
|
||
*
|
||
* @param {SelectElement} el
|
||
* @param {Boolean} multi
|
||
* @param {Boolean} init
|
||
* @return {Array|*}
|
||
*/
|
||
|
||
function getValue(el, multi, init) {
|
||
var res = multi ? [] : null;
|
||
var op, val, selected;
|
||
for (var i = 0, l = el.options.length; i < l; i++) {
|
||
op = el.options[i];
|
||
selected = init ? op.hasAttribute('selected') : op.selected;
|
||
if (selected) {
|
||
val = op.hasOwnProperty('_value') ? op._value : op.value;
|
||
if (multi) {
|
||
res.push(val);
|
||
} else {
|
||
return val;
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Native Array.indexOf uses strict equal, but in this
|
||
* case we need to match string/numbers with custom equal.
|
||
*
|
||
* @param {Array} arr
|
||
* @param {*} val
|
||
*/
|
||
|
||
function indexOf$1(arr, val) {
|
||
var i = arr.length;
|
||
while (i--) {
|
||
if (looseEqual(arr[i], val)) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
var checkbox = {
|
||
|
||
bind: function bind() {
|
||
var self = this;
|
||
var el = this.el;
|
||
|
||
this.getValue = function () {
|
||
return el.hasOwnProperty('_value') ? el._value : self.params.number ? toNumber(el.value) : el.value;
|
||
};
|
||
|
||
function getBooleanValue() {
|
||
var val = el.checked;
|
||
if (val && el.hasOwnProperty('_trueValue')) {
|
||
return el._trueValue;
|
||
}
|
||
if (!val && el.hasOwnProperty('_falseValue')) {
|
||
return el._falseValue;
|
||
}
|
||
return val;
|
||
}
|
||
|
||
this.listener = function () {
|
||
var model = self._watcher.value;
|
||
if (isArray(model)) {
|
||
var val = self.getValue();
|
||
if (el.checked) {
|
||
if (indexOf(model, val) < 0) {
|
||
model.push(val);
|
||
}
|
||
} else {
|
||
model.$remove(val);
|
||
}
|
||
} else {
|
||
self.set(getBooleanValue());
|
||
}
|
||
};
|
||
|
||
this.on('change', this.listener);
|
||
if (el.hasAttribute('checked')) {
|
||
this.afterBind = this.listener;
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
var el = this.el;
|
||
if (isArray(value)) {
|
||
el.checked = indexOf(value, this.getValue()) > -1;
|
||
} else {
|
||
if (el.hasOwnProperty('_trueValue')) {
|
||
el.checked = looseEqual(value, el._trueValue);
|
||
} else {
|
||
el.checked = !!value;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
var handlers = {
|
||
text: text$2,
|
||
radio: radio,
|
||
select: select,
|
||
checkbox: checkbox
|
||
};
|
||
|
||
var model = {
|
||
|
||
priority: MODEL,
|
||
twoWay: true,
|
||
handlers: handlers,
|
||
params: ['lazy', 'number', 'debounce'],
|
||
|
||
/**
|
||
* Possible elements:
|
||
* <select>
|
||
* <textarea>
|
||
* <input type="*">
|
||
* - text
|
||
* - checkbox
|
||
* - radio
|
||
* - number
|
||
*/
|
||
|
||
bind: function bind() {
|
||
// friendly warning...
|
||
this.checkFilters();
|
||
if (this.hasRead && !this.hasWrite) {
|
||
process.env.NODE_ENV !== 'production' && warn('It seems you are using a read-only filter with ' + 'v-model="' + this.descriptor.raw + '". ' + 'You might want to use a two-way filter to ensure correct behavior.', this.vm);
|
||
}
|
||
var el = this.el;
|
||
var tag = el.tagName;
|
||
var handler;
|
||
if (tag === 'INPUT') {
|
||
handler = handlers[el.type] || handlers.text;
|
||
} else if (tag === 'SELECT') {
|
||
handler = handlers.select;
|
||
} else if (tag === 'TEXTAREA') {
|
||
handler = handlers.text;
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('v-model does not support element type: ' + tag, this.vm);
|
||
return;
|
||
}
|
||
el.__v_model = this;
|
||
handler.bind.call(this);
|
||
this.update = handler.update;
|
||
this._unbind = handler.unbind;
|
||
},
|
||
|
||
/**
|
||
* Check read/write filter stats.
|
||
*/
|
||
|
||
checkFilters: function checkFilters() {
|
||
var filters = this.filters;
|
||
if (!filters) return;
|
||
var i = filters.length;
|
||
while (i--) {
|
||
var filter = resolveAsset(this.vm.$options, 'filters', filters[i].name);
|
||
if (typeof filter === 'function' || filter.read) {
|
||
this.hasRead = true;
|
||
}
|
||
if (filter.write) {
|
||
this.hasWrite = true;
|
||
}
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
this.el.__v_model = null;
|
||
this._unbind && this._unbind();
|
||
}
|
||
};
|
||
|
||
// keyCode aliases
|
||
var keyCodes = {
|
||
esc: 27,
|
||
tab: 9,
|
||
enter: 13,
|
||
space: 32,
|
||
'delete': [8, 46],
|
||
up: 38,
|
||
left: 37,
|
||
right: 39,
|
||
down: 40
|
||
};
|
||
|
||
function keyFilter(handler, keys) {
|
||
var codes = keys.map(function (key) {
|
||
var charCode = key.charCodeAt(0);
|
||
if (charCode > 47 && charCode < 58) {
|
||
return parseInt(key, 10);
|
||
}
|
||
if (key.length === 1) {
|
||
charCode = key.toUpperCase().charCodeAt(0);
|
||
if (charCode > 64 && charCode < 91) {
|
||
return charCode;
|
||
}
|
||
}
|
||
return keyCodes[key];
|
||
});
|
||
codes = [].concat.apply([], codes);
|
||
return function keyHandler(e) {
|
||
if (codes.indexOf(e.keyCode) > -1) {
|
||
return handler.call(this, e);
|
||
}
|
||
};
|
||
}
|
||
|
||
function stopFilter(handler) {
|
||
return function stopHandler(e) {
|
||
e.stopPropagation();
|
||
return handler.call(this, e);
|
||
};
|
||
}
|
||
|
||
function preventFilter(handler) {
|
||
return function preventHandler(e) {
|
||
e.preventDefault();
|
||
return handler.call(this, e);
|
||
};
|
||
}
|
||
|
||
function selfFilter(handler) {
|
||
return function selfHandler(e) {
|
||
if (e.target === e.currentTarget) {
|
||
return handler.call(this, e);
|
||
}
|
||
};
|
||
}
|
||
|
||
var on$1 = {
|
||
|
||
priority: ON,
|
||
acceptStatement: true,
|
||
keyCodes: keyCodes,
|
||
|
||
bind: function bind() {
|
||
// deal with iframes
|
||
if (this.el.tagName === 'IFRAME' && this.arg !== 'load') {
|
||
var self = this;
|
||
this.iframeBind = function () {
|
||
on(self.el.contentWindow, self.arg, self.handler, self.modifiers.capture);
|
||
};
|
||
this.on('load', this.iframeBind);
|
||
}
|
||
},
|
||
|
||
update: function update(handler) {
|
||
// stub a noop for v-on with no value,
|
||
// e.g. @mousedown.prevent
|
||
if (!this.descriptor.raw) {
|
||
handler = function () {};
|
||
}
|
||
|
||
if (typeof handler !== 'function') {
|
||
process.env.NODE_ENV !== 'production' && warn('v-on:' + this.arg + '="' + this.expression + '" expects a function value, ' + 'got ' + handler, this.vm);
|
||
return;
|
||
}
|
||
|
||
// apply modifiers
|
||
if (this.modifiers.stop) {
|
||
handler = stopFilter(handler);
|
||
}
|
||
if (this.modifiers.prevent) {
|
||
handler = preventFilter(handler);
|
||
}
|
||
if (this.modifiers.self) {
|
||
handler = selfFilter(handler);
|
||
}
|
||
// key filter
|
||
var keys = Object.keys(this.modifiers).filter(function (key) {
|
||
return key !== 'stop' && key !== 'prevent' && key !== 'self' && key !== 'capture';
|
||
});
|
||
if (keys.length) {
|
||
handler = keyFilter(handler, keys);
|
||
}
|
||
|
||
this.reset();
|
||
this.handler = handler;
|
||
|
||
if (this.iframeBind) {
|
||
this.iframeBind();
|
||
} else {
|
||
on(this.el, this.arg, this.handler, this.modifiers.capture);
|
||
}
|
||
},
|
||
|
||
reset: function reset() {
|
||
var el = this.iframeBind ? this.el.contentWindow : this.el;
|
||
if (this.handler) {
|
||
off(el, this.arg, this.handler);
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
this.reset();
|
||
}
|
||
};
|
||
|
||
var prefixes = ['-webkit-', '-moz-', '-ms-'];
|
||
var camelPrefixes = ['Webkit', 'Moz', 'ms'];
|
||
var importantRE = /!important;?$/;
|
||
var propCache = Object.create(null);
|
||
|
||
var testEl = null;
|
||
|
||
var style = {
|
||
|
||
deep: true,
|
||
|
||
update: function update(value) {
|
||
if (typeof value === 'string') {
|
||
this.el.style.cssText = value;
|
||
} else if (isArray(value)) {
|
||
this.handleObject(value.reduce(extend, {}));
|
||
} else {
|
||
this.handleObject(value || {});
|
||
}
|
||
},
|
||
|
||
handleObject: function handleObject(value) {
|
||
// cache object styles so that only changed props
|
||
// are actually updated.
|
||
var cache = this.cache || (this.cache = {});
|
||
var name, val;
|
||
for (name in cache) {
|
||
if (!(name in value)) {
|
||
this.handleSingle(name, null);
|
||
delete cache[name];
|
||
}
|
||
}
|
||
for (name in value) {
|
||
val = value[name];
|
||
if (val !== cache[name]) {
|
||
cache[name] = val;
|
||
this.handleSingle(name, val);
|
||
}
|
||
}
|
||
},
|
||
|
||
handleSingle: function handleSingle(prop, value) {
|
||
prop = normalize(prop);
|
||
if (!prop) return; // unsupported prop
|
||
// cast possible numbers/booleans into strings
|
||
if (value != null) value += '';
|
||
if (value) {
|
||
var isImportant = importantRE.test(value) ? 'important' : '';
|
||
if (isImportant) {
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
warn('It\'s probably a bad idea to use !important with inline rules. ' + 'This feature will be deprecated in a future version of Vue.');
|
||
}
|
||
value = value.replace(importantRE, '').trim();
|
||
this.el.style.setProperty(prop.kebab, value, isImportant);
|
||
} else {
|
||
this.el.style[prop.camel] = value;
|
||
}
|
||
} else {
|
||
this.el.style[prop.camel] = '';
|
||
}
|
||
}
|
||
|
||
};
|
||
|
||
/**
|
||
* Normalize a CSS property name.
|
||
* - cache result
|
||
* - auto prefix
|
||
* - camelCase -> dash-case
|
||
*
|
||
* @param {String} prop
|
||
* @return {String}
|
||
*/
|
||
|
||
function normalize(prop) {
|
||
if (propCache[prop]) {
|
||
return propCache[prop];
|
||
}
|
||
var res = prefix(prop);
|
||
propCache[prop] = propCache[res] = res;
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Auto detect the appropriate prefix for a CSS property.
|
||
* https://gist.github.com/paulirish/523692
|
||
*
|
||
* @param {String} prop
|
||
* @return {String}
|
||
*/
|
||
|
||
function prefix(prop) {
|
||
prop = hyphenate(prop);
|
||
var camel = camelize(prop);
|
||
var upper = camel.charAt(0).toUpperCase() + camel.slice(1);
|
||
if (!testEl) {
|
||
testEl = document.createElement('div');
|
||
}
|
||
var i = prefixes.length;
|
||
var prefixed;
|
||
if (camel !== 'filter' && camel in testEl.style) {
|
||
return {
|
||
kebab: prop,
|
||
camel: camel
|
||
};
|
||
}
|
||
while (i--) {
|
||
prefixed = camelPrefixes[i] + upper;
|
||
if (prefixed in testEl.style) {
|
||
return {
|
||
kebab: prefixes[i] + prop,
|
||
camel: prefixed
|
||
};
|
||
}
|
||
}
|
||
}
|
||
|
||
// xlink
|
||
var xlinkNS = 'http://www.w3.org/1999/xlink';
|
||
var xlinkRE = /^xlink:/;
|
||
|
||
// check for attributes that prohibit interpolations
|
||
var disallowedInterpAttrRE = /^v-|^:|^@|^(?:is|transition|transition-mode|debounce|track-by|stagger|enter-stagger|leave-stagger)$/;
|
||
// these attributes should also set their corresponding properties
|
||
// because they only affect the initial state of the element
|
||
var attrWithPropsRE = /^(?:value|checked|selected|muted)$/;
|
||
// these attributes expect enumrated values of "true" or "false"
|
||
// but are not boolean attributes
|
||
var enumeratedAttrRE = /^(?:draggable|contenteditable|spellcheck)$/;
|
||
|
||
// these attributes should set a hidden property for
|
||
// binding v-model to object values
|
||
var modelProps = {
|
||
value: '_value',
|
||
'true-value': '_trueValue',
|
||
'false-value': '_falseValue'
|
||
};
|
||
|
||
var bind$1 = {
|
||
|
||
priority: BIND,
|
||
|
||
bind: function bind() {
|
||
var attr = this.arg;
|
||
var tag = this.el.tagName;
|
||
// should be deep watch on object mode
|
||
if (!attr) {
|
||
this.deep = true;
|
||
}
|
||
// handle interpolation bindings
|
||
var descriptor = this.descriptor;
|
||
var tokens = descriptor.interp;
|
||
if (tokens) {
|
||
// handle interpolations with one-time tokens
|
||
if (descriptor.hasOneTime) {
|
||
this.expression = tokensToExp(tokens, this._scope || this.vm);
|
||
}
|
||
|
||
// only allow binding on native attributes
|
||
if (disallowedInterpAttrRE.test(attr) || attr === 'name' && (tag === 'PARTIAL' || tag === 'SLOT')) {
|
||
process.env.NODE_ENV !== 'production' && warn(attr + '="' + descriptor.raw + '": ' + 'attribute interpolation is not allowed in Vue.js ' + 'directives and special attributes.', this.vm);
|
||
this.el.removeAttribute(attr);
|
||
this.invalid = true;
|
||
}
|
||
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
var raw = attr + '="' + descriptor.raw + '": ';
|
||
// warn src
|
||
if (attr === 'src') {
|
||
warn(raw + 'interpolation in "src" attribute will cause ' + 'a 404 request. Use v-bind:src instead.', this.vm);
|
||
}
|
||
|
||
// warn style
|
||
if (attr === 'style') {
|
||
warn(raw + 'interpolation in "style" attribute will cause ' + 'the attribute to be discarded in Internet Explorer. ' + 'Use v-bind:style instead.', this.vm);
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
update: function update(value) {
|
||
if (this.invalid) {
|
||
return;
|
||
}
|
||
var attr = this.arg;
|
||
if (this.arg) {
|
||
this.handleSingle(attr, value);
|
||
} else {
|
||
this.handleObject(value || {});
|
||
}
|
||
},
|
||
|
||
// share object handler with v-bind:class
|
||
handleObject: style.handleObject,
|
||
|
||
handleSingle: function handleSingle(attr, value) {
|
||
var el = this.el;
|
||
var interp = this.descriptor.interp;
|
||
if (this.modifiers.camel) {
|
||
attr = camelize(attr);
|
||
}
|
||
if (!interp && attrWithPropsRE.test(attr) && attr in el) {
|
||
var attrValue = attr === 'value' ? value == null // IE9 will set input.value to "null" for null...
|
||
? '' : value : value;
|
||
|
||
if (el[attr] !== attrValue) {
|
||
el[attr] = attrValue;
|
||
}
|
||
}
|
||
// set model props
|
||
var modelProp = modelProps[attr];
|
||
if (!interp && modelProp) {
|
||
el[modelProp] = value;
|
||
// update v-model if present
|
||
var model = el.__v_model;
|
||
if (model) {
|
||
model.listener();
|
||
}
|
||
}
|
||
// do not set value attribute for textarea
|
||
if (attr === 'value' && el.tagName === 'TEXTAREA') {
|
||
el.removeAttribute(attr);
|
||
return;
|
||
}
|
||
// update attribute
|
||
if (enumeratedAttrRE.test(attr)) {
|
||
el.setAttribute(attr, value ? 'true' : 'false');
|
||
} else if (value != null && value !== false) {
|
||
if (attr === 'class') {
|
||
// handle edge case #1960:
|
||
// class interpolation should not overwrite Vue transition class
|
||
if (el.__v_trans) {
|
||
value += ' ' + el.__v_trans.id + '-transition';
|
||
}
|
||
setClass(el, value);
|
||
} else if (xlinkRE.test(attr)) {
|
||
el.setAttributeNS(xlinkNS, attr, value === true ? '' : value);
|
||
} else {
|
||
el.setAttribute(attr, value === true ? '' : value);
|
||
}
|
||
} else {
|
||
el.removeAttribute(attr);
|
||
}
|
||
}
|
||
};
|
||
|
||
var el = {
|
||
|
||
priority: EL,
|
||
|
||
bind: function bind() {
|
||
/* istanbul ignore if */
|
||
if (!this.arg) {
|
||
return;
|
||
}
|
||
var id = this.id = camelize(this.arg);
|
||
var refs = (this._scope || this.vm).$els;
|
||
if (hasOwn(refs, id)) {
|
||
refs[id] = this.el;
|
||
} else {
|
||
defineReactive(refs, id, this.el);
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
var refs = (this._scope || this.vm).$els;
|
||
if (refs[this.id] === this.el) {
|
||
refs[this.id] = null;
|
||
}
|
||
}
|
||
};
|
||
|
||
var ref = {
|
||
bind: function bind() {
|
||
process.env.NODE_ENV !== 'production' && warn('v-ref:' + this.arg + ' must be used on a child ' + 'component. Found on <' + this.el.tagName.toLowerCase() + '>.', this.vm);
|
||
}
|
||
};
|
||
|
||
var cloak = {
|
||
bind: function bind() {
|
||
var el = this.el;
|
||
this.vm.$once('pre-hook:compiled', function () {
|
||
el.removeAttribute('v-cloak');
|
||
});
|
||
}
|
||
};
|
||
|
||
// must export plain object
|
||
var directives = {
|
||
text: text$1,
|
||
html: html,
|
||
'for': vFor,
|
||
'if': vIf,
|
||
show: show,
|
||
model: model,
|
||
on: on$1,
|
||
bind: bind$1,
|
||
el: el,
|
||
ref: ref,
|
||
cloak: cloak
|
||
};
|
||
|
||
var vClass = {
|
||
|
||
deep: true,
|
||
|
||
update: function update(value) {
|
||
if (!value) {
|
||
this.cleanup();
|
||
} else if (typeof value === 'string') {
|
||
this.setClass(value.trim().split(/\s+/));
|
||
} else {
|
||
this.setClass(normalize$1(value));
|
||
}
|
||
},
|
||
|
||
setClass: function setClass(value) {
|
||
this.cleanup(value);
|
||
for (var i = 0, l = value.length; i < l; i++) {
|
||
var val = value[i];
|
||
if (val) {
|
||
apply(this.el, val, addClass);
|
||
}
|
||
}
|
||
this.prevKeys = value;
|
||
},
|
||
|
||
cleanup: function cleanup(value) {
|
||
var prevKeys = this.prevKeys;
|
||
if (!prevKeys) return;
|
||
var i = prevKeys.length;
|
||
while (i--) {
|
||
var key = prevKeys[i];
|
||
if (!value || value.indexOf(key) < 0) {
|
||
apply(this.el, key, removeClass);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Normalize objects and arrays (potentially containing objects)
|
||
* into array of strings.
|
||
*
|
||
* @param {Object|Array<String|Object>} value
|
||
* @return {Array<String>}
|
||
*/
|
||
|
||
function normalize$1(value) {
|
||
var res = [];
|
||
if (isArray(value)) {
|
||
for (var i = 0, l = value.length; i < l; i++) {
|
||
var _key = value[i];
|
||
if (_key) {
|
||
if (typeof _key === 'string') {
|
||
res.push(_key);
|
||
} else {
|
||
for (var k in _key) {
|
||
if (_key[k]) res.push(k);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} else if (isObject(value)) {
|
||
for (var key in value) {
|
||
if (value[key]) res.push(key);
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Add or remove a class/classes on an element
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} key The class name. This may or may not
|
||
* contain a space character, in such a
|
||
* case we'll deal with multiple class
|
||
* names at once.
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
function apply(el, key, fn) {
|
||
key = key.trim();
|
||
if (key.indexOf(' ') === -1) {
|
||
fn(el, key);
|
||
return;
|
||
}
|
||
// The key contains one or more space characters.
|
||
// Since a class name doesn't accept such characters, we
|
||
// treat it as multiple classes.
|
||
var keys = key.split(/\s+/);
|
||
for (var i = 0, l = keys.length; i < l; i++) {
|
||
fn(el, keys[i]);
|
||
}
|
||
}
|
||
|
||
var component = {
|
||
|
||
priority: COMPONENT,
|
||
|
||
params: ['keep-alive', 'transition-mode', 'inline-template'],
|
||
|
||
/**
|
||
* Setup. Two possible usages:
|
||
*
|
||
* - static:
|
||
* <comp> or <div v-component="comp">
|
||
*
|
||
* - dynamic:
|
||
* <component :is="view">
|
||
*/
|
||
|
||
bind: function bind() {
|
||
if (!this.el.__vue__) {
|
||
// keep-alive cache
|
||
this.keepAlive = this.params.keepAlive;
|
||
if (this.keepAlive) {
|
||
this.cache = {};
|
||
}
|
||
// check inline-template
|
||
if (this.params.inlineTemplate) {
|
||
// extract inline template as a DocumentFragment
|
||
this.inlineTemplate = extractContent(this.el, true);
|
||
}
|
||
// component resolution related state
|
||
this.pendingComponentCb = this.Component = null;
|
||
// transition related state
|
||
this.pendingRemovals = 0;
|
||
this.pendingRemovalCb = null;
|
||
// create a ref anchor
|
||
this.anchor = createAnchor('v-component');
|
||
replace(this.el, this.anchor);
|
||
// remove is attribute.
|
||
// this is removed during compilation, but because compilation is
|
||
// cached, when the component is used elsewhere this attribute
|
||
// will remain at link time.
|
||
this.el.removeAttribute('is');
|
||
this.el.removeAttribute(':is');
|
||
// remove ref, same as above
|
||
if (this.descriptor.ref) {
|
||
this.el.removeAttribute('v-ref:' + hyphenate(this.descriptor.ref));
|
||
}
|
||
// if static, build right now.
|
||
if (this.literal) {
|
||
this.setComponent(this.expression);
|
||
}
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('cannot mount component "' + this.expression + '" ' + 'on already mounted element: ' + this.el);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Public update, called by the watcher in the dynamic
|
||
* literal scenario, e.g. <component :is="view">
|
||
*/
|
||
|
||
update: function update(value) {
|
||
if (!this.literal) {
|
||
this.setComponent(value);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Switch dynamic components. May resolve the component
|
||
* asynchronously, and perform transition based on
|
||
* specified transition mode. Accepts a few additional
|
||
* arguments specifically for vue-router.
|
||
*
|
||
* The callback is called when the full transition is
|
||
* finished.
|
||
*
|
||
* @param {String} value
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
setComponent: function setComponent(value, cb) {
|
||
this.invalidatePending();
|
||
if (!value) {
|
||
// just remove current
|
||
this.unbuild(true);
|
||
this.remove(this.childVM, cb);
|
||
this.childVM = null;
|
||
} else {
|
||
var self = this;
|
||
this.resolveComponent(value, function () {
|
||
self.mountComponent(cb);
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Resolve the component constructor to use when creating
|
||
* the child vm.
|
||
*
|
||
* @param {String|Function} value
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
resolveComponent: function resolveComponent(value, cb) {
|
||
var self = this;
|
||
this.pendingComponentCb = cancellable(function (Component) {
|
||
self.ComponentName = Component.options.name || (typeof value === 'string' ? value : null);
|
||
self.Component = Component;
|
||
cb();
|
||
});
|
||
this.vm._resolveComponent(value, this.pendingComponentCb);
|
||
},
|
||
|
||
/**
|
||
* Create a new instance using the current constructor and
|
||
* replace the existing instance. This method doesn't care
|
||
* whether the new component and the old one are actually
|
||
* the same.
|
||
*
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
mountComponent: function mountComponent(cb) {
|
||
// actual mount
|
||
this.unbuild(true);
|
||
var self = this;
|
||
var activateHooks = this.Component.options.activate;
|
||
var cached = this.getCached();
|
||
var newComponent = this.build();
|
||
if (activateHooks && !cached) {
|
||
this.waitingFor = newComponent;
|
||
callActivateHooks(activateHooks, newComponent, function () {
|
||
if (self.waitingFor !== newComponent) {
|
||
return;
|
||
}
|
||
self.waitingFor = null;
|
||
self.transition(newComponent, cb);
|
||
});
|
||
} else {
|
||
// update ref for kept-alive component
|
||
if (cached) {
|
||
newComponent._updateRef();
|
||
}
|
||
this.transition(newComponent, cb);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* When the component changes or unbinds before an async
|
||
* constructor is resolved, we need to invalidate its
|
||
* pending callback.
|
||
*/
|
||
|
||
invalidatePending: function invalidatePending() {
|
||
if (this.pendingComponentCb) {
|
||
this.pendingComponentCb.cancel();
|
||
this.pendingComponentCb = null;
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Instantiate/insert a new child vm.
|
||
* If keep alive and has cached instance, insert that
|
||
* instance; otherwise build a new one and cache it.
|
||
*
|
||
* @param {Object} [extraOptions]
|
||
* @return {Vue} - the created instance
|
||
*/
|
||
|
||
build: function build(extraOptions) {
|
||
var cached = this.getCached();
|
||
if (cached) {
|
||
return cached;
|
||
}
|
||
if (this.Component) {
|
||
// default options
|
||
var options = {
|
||
name: this.ComponentName,
|
||
el: cloneNode(this.el),
|
||
template: this.inlineTemplate,
|
||
// make sure to add the child with correct parent
|
||
// if this is a transcluded component, its parent
|
||
// should be the transclusion host.
|
||
parent: this._host || this.vm,
|
||
// if no inline-template, then the compiled
|
||
// linker can be cached for better performance.
|
||
_linkerCachable: !this.inlineTemplate,
|
||
_ref: this.descriptor.ref,
|
||
_asComponent: true,
|
||
_isRouterView: this._isRouterView,
|
||
// if this is a transcluded component, context
|
||
// will be the common parent vm of this instance
|
||
// and its host.
|
||
_context: this.vm,
|
||
// if this is inside an inline v-for, the scope
|
||
// will be the intermediate scope created for this
|
||
// repeat fragment. this is used for linking props
|
||
// and container directives.
|
||
_scope: this._scope,
|
||
// pass in the owner fragment of this component.
|
||
// this is necessary so that the fragment can keep
|
||
// track of its contained components in order to
|
||
// call attach/detach hooks for them.
|
||
_frag: this._frag
|
||
};
|
||
// extra options
|
||
// in 1.0.0 this is used by vue-router only
|
||
/* istanbul ignore if */
|
||
if (extraOptions) {
|
||
extend(options, extraOptions);
|
||
}
|
||
var child = new this.Component(options);
|
||
if (this.keepAlive) {
|
||
this.cache[this.Component.cid] = child;
|
||
}
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production' && this.el.hasAttribute('transition') && child._isFragment) {
|
||
warn('Transitions will not work on a fragment instance. ' + 'Template: ' + child.$options.template, child);
|
||
}
|
||
return child;
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Try to get a cached instance of the current component.
|
||
*
|
||
* @return {Vue|undefined}
|
||
*/
|
||
|
||
getCached: function getCached() {
|
||
return this.keepAlive && this.cache[this.Component.cid];
|
||
},
|
||
|
||
/**
|
||
* Teardown the current child, but defers cleanup so
|
||
* that we can separate the destroy and removal steps.
|
||
*
|
||
* @param {Boolean} defer
|
||
*/
|
||
|
||
unbuild: function unbuild(defer) {
|
||
if (this.waitingFor) {
|
||
if (!this.keepAlive) {
|
||
this.waitingFor.$destroy();
|
||
}
|
||
this.waitingFor = null;
|
||
}
|
||
var child = this.childVM;
|
||
if (!child || this.keepAlive) {
|
||
if (child) {
|
||
// remove ref
|
||
child._inactive = true;
|
||
child._updateRef(true);
|
||
}
|
||
return;
|
||
}
|
||
// the sole purpose of `deferCleanup` is so that we can
|
||
// "deactivate" the vm right now and perform DOM removal
|
||
// later.
|
||
child.$destroy(false, defer);
|
||
},
|
||
|
||
/**
|
||
* Remove current destroyed child and manually do
|
||
* the cleanup after removal.
|
||
*
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
remove: function remove(child, cb) {
|
||
var keepAlive = this.keepAlive;
|
||
if (child) {
|
||
// we may have a component switch when a previous
|
||
// component is still being transitioned out.
|
||
// we want to trigger only one lastest insertion cb
|
||
// when the existing transition finishes. (#1119)
|
||
this.pendingRemovals++;
|
||
this.pendingRemovalCb = cb;
|
||
var self = this;
|
||
child.$remove(function () {
|
||
self.pendingRemovals--;
|
||
if (!keepAlive) child._cleanup();
|
||
if (!self.pendingRemovals && self.pendingRemovalCb) {
|
||
self.pendingRemovalCb();
|
||
self.pendingRemovalCb = null;
|
||
}
|
||
});
|
||
} else if (cb) {
|
||
cb();
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Actually swap the components, depending on the
|
||
* transition mode. Defaults to simultaneous.
|
||
*
|
||
* @param {Vue} target
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
transition: function transition(target, cb) {
|
||
var self = this;
|
||
var current = this.childVM;
|
||
// for devtool inspection
|
||
if (current) current._inactive = true;
|
||
target._inactive = false;
|
||
this.childVM = target;
|
||
switch (self.params.transitionMode) {
|
||
case 'in-out':
|
||
target.$before(self.anchor, function () {
|
||
self.remove(current, cb);
|
||
});
|
||
break;
|
||
case 'out-in':
|
||
self.remove(current, function () {
|
||
target.$before(self.anchor, cb);
|
||
});
|
||
break;
|
||
default:
|
||
self.remove(current);
|
||
target.$before(self.anchor, cb);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Unbind.
|
||
*/
|
||
|
||
unbind: function unbind() {
|
||
this.invalidatePending();
|
||
// Do not defer cleanup when unbinding
|
||
this.unbuild();
|
||
// destroy all keep-alive cached instances
|
||
if (this.cache) {
|
||
for (var key in this.cache) {
|
||
this.cache[key].$destroy();
|
||
}
|
||
this.cache = null;
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Call activate hooks in order (asynchronous)
|
||
*
|
||
* @param {Array} hooks
|
||
* @param {Vue} vm
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
function callActivateHooks(hooks, vm, cb) {
|
||
var total = hooks.length;
|
||
var called = 0;
|
||
hooks[0].call(vm, next);
|
||
function next() {
|
||
if (++called >= total) {
|
||
cb();
|
||
} else {
|
||
hooks[called].call(vm, next);
|
||
}
|
||
}
|
||
}
|
||
|
||
var propBindingModes = config._propBindingModes;
|
||
var empty = {};
|
||
|
||
// regexes
|
||
var identRE$1 = /^[$_a-zA-Z]+[\w$]*$/;
|
||
var settablePathRE = /^[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*|\[[^\[\]]+\])*$/;
|
||
|
||
/**
|
||
* Compile props on a root element and return
|
||
* a props link function.
|
||
*
|
||
* @param {Element|DocumentFragment} el
|
||
* @param {Array} propOptions
|
||
* @param {Vue} vm
|
||
* @return {Function} propsLinkFn
|
||
*/
|
||
|
||
function compileProps(el, propOptions, vm) {
|
||
var props = [];
|
||
var names = Object.keys(propOptions);
|
||
var i = names.length;
|
||
var options, name, attr, value, path, parsed, prop;
|
||
while (i--) {
|
||
name = names[i];
|
||
options = propOptions[name] || empty;
|
||
|
||
if (process.env.NODE_ENV !== 'production' && name === '$data') {
|
||
warn('Do not use $data as prop.', vm);
|
||
continue;
|
||
}
|
||
|
||
// props could contain dashes, which will be
|
||
// interpreted as minus calculations by the parser
|
||
// so we need to camelize the path here
|
||
path = camelize(name);
|
||
if (!identRE$1.test(path)) {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid prop key: "' + name + '". Prop keys ' + 'must be valid identifiers.', vm);
|
||
continue;
|
||
}
|
||
|
||
prop = {
|
||
name: name,
|
||
path: path,
|
||
options: options,
|
||
mode: propBindingModes.ONE_WAY,
|
||
raw: null
|
||
};
|
||
|
||
attr = hyphenate(name);
|
||
// first check dynamic version
|
||
if ((value = getBindAttr(el, attr)) === null) {
|
||
if ((value = getBindAttr(el, attr + '.sync')) !== null) {
|
||
prop.mode = propBindingModes.TWO_WAY;
|
||
} else if ((value = getBindAttr(el, attr + '.once')) !== null) {
|
||
prop.mode = propBindingModes.ONE_TIME;
|
||
}
|
||
}
|
||
if (value !== null) {
|
||
// has dynamic binding!
|
||
prop.raw = value;
|
||
parsed = parseDirective(value);
|
||
value = parsed.expression;
|
||
prop.filters = parsed.filters;
|
||
// check binding type
|
||
if (isLiteral(value) && !parsed.filters) {
|
||
// for expressions containing literal numbers and
|
||
// booleans, there's no need to setup a prop binding,
|
||
// so we can optimize them as a one-time set.
|
||
prop.optimizedLiteral = true;
|
||
} else {
|
||
prop.dynamic = true;
|
||
// check non-settable path for two-way bindings
|
||
if (process.env.NODE_ENV !== 'production' && prop.mode === propBindingModes.TWO_WAY && !settablePathRE.test(value)) {
|
||
prop.mode = propBindingModes.ONE_WAY;
|
||
warn('Cannot bind two-way prop with non-settable ' + 'parent path: ' + value, vm);
|
||
}
|
||
}
|
||
prop.parentPath = value;
|
||
|
||
// warn required two-way
|
||
if (process.env.NODE_ENV !== 'production' && options.twoWay && prop.mode !== propBindingModes.TWO_WAY) {
|
||
warn('Prop "' + name + '" expects a two-way binding type.', vm);
|
||
}
|
||
} else if ((value = getAttr(el, attr)) !== null) {
|
||
// has literal binding!
|
||
prop.raw = value;
|
||
} else if (process.env.NODE_ENV !== 'production') {
|
||
// check possible camelCase prop usage
|
||
var lowerCaseName = path.toLowerCase();
|
||
value = /[A-Z\-]/.test(name) && (el.getAttribute(lowerCaseName) || el.getAttribute(':' + lowerCaseName) || el.getAttribute('v-bind:' + lowerCaseName) || el.getAttribute(':' + lowerCaseName + '.once') || el.getAttribute('v-bind:' + lowerCaseName + '.once') || el.getAttribute(':' + lowerCaseName + '.sync') || el.getAttribute('v-bind:' + lowerCaseName + '.sync'));
|
||
if (value) {
|
||
warn('Possible usage error for prop `' + lowerCaseName + '` - ' + 'did you mean `' + attr + '`? HTML is case-insensitive, remember to use ' + 'kebab-case for props in templates.', vm);
|
||
} else if (options.required) {
|
||
// warn missing required
|
||
warn('Missing required prop: ' + name, vm);
|
||
}
|
||
}
|
||
// push prop
|
||
props.push(prop);
|
||
}
|
||
return makePropsLinkFn(props);
|
||
}
|
||
|
||
/**
|
||
* Build a function that applies props to a vm.
|
||
*
|
||
* @param {Array} props
|
||
* @return {Function} propsLinkFn
|
||
*/
|
||
|
||
function makePropsLinkFn(props) {
|
||
return function propsLinkFn(vm, scope) {
|
||
// store resolved props info
|
||
vm._props = {};
|
||
var inlineProps = vm.$options.propsData;
|
||
var i = props.length;
|
||
var prop, path, options, value, raw;
|
||
while (i--) {
|
||
prop = props[i];
|
||
raw = prop.raw;
|
||
path = prop.path;
|
||
options = prop.options;
|
||
vm._props[path] = prop;
|
||
if (inlineProps && hasOwn(inlineProps, path)) {
|
||
initProp(vm, prop, inlineProps[path]);
|
||
}if (raw === null) {
|
||
// initialize absent prop
|
||
initProp(vm, prop, undefined);
|
||
} else if (prop.dynamic) {
|
||
// dynamic prop
|
||
if (prop.mode === propBindingModes.ONE_TIME) {
|
||
// one time binding
|
||
value = (scope || vm._context || vm).$get(prop.parentPath);
|
||
initProp(vm, prop, value);
|
||
} else {
|
||
if (vm._context) {
|
||
// dynamic binding
|
||
vm._bindDir({
|
||
name: 'prop',
|
||
def: propDef,
|
||
prop: prop
|
||
}, null, null, scope); // el, host, scope
|
||
} else {
|
||
// root instance
|
||
initProp(vm, prop, vm.$get(prop.parentPath));
|
||
}
|
||
}
|
||
} else if (prop.optimizedLiteral) {
|
||
// optimized literal, cast it and just set once
|
||
var stripped = stripQuotes(raw);
|
||
value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;
|
||
initProp(vm, prop, value);
|
||
} else {
|
||
// string literal, but we need to cater for
|
||
// Boolean props with no value, or with same
|
||
// literal value (e.g. disabled="disabled")
|
||
// see https://github.com/vuejs/vue-loader/issues/182
|
||
value = options.type === Boolean && (raw === '' || raw === hyphenate(prop.name)) ? true : raw;
|
||
initProp(vm, prop, value);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Process a prop with a rawValue, applying necessary coersions,
|
||
* default values & assertions and call the given callback with
|
||
* processed value.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Object} prop
|
||
* @param {*} rawValue
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
function processPropValue(vm, prop, rawValue, fn) {
|
||
var isSimple = prop.dynamic && isSimplePath(prop.parentPath);
|
||
var value = rawValue;
|
||
if (value === undefined) {
|
||
value = getPropDefaultValue(vm, prop);
|
||
}
|
||
value = coerceProp(prop, value, vm);
|
||
var coerced = value !== rawValue;
|
||
if (!assertProp(prop, value, vm)) {
|
||
value = undefined;
|
||
}
|
||
if (isSimple && !coerced) {
|
||
withoutConversion(function () {
|
||
fn(value);
|
||
});
|
||
} else {
|
||
fn(value);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Set a prop's initial value on a vm and its data object.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Object} prop
|
||
* @param {*} value
|
||
*/
|
||
|
||
function initProp(vm, prop, value) {
|
||
processPropValue(vm, prop, value, function (value) {
|
||
defineReactive(vm, prop.path, value);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Update a prop's value on a vm.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Object} prop
|
||
* @param {*} value
|
||
*/
|
||
|
||
function updateProp(vm, prop, value) {
|
||
processPropValue(vm, prop, value, function (value) {
|
||
vm[prop.path] = value;
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Get the default value of a prop.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Object} prop
|
||
* @return {*}
|
||
*/
|
||
|
||
function getPropDefaultValue(vm, prop) {
|
||
// no default, return undefined
|
||
var options = prop.options;
|
||
if (!hasOwn(options, 'default')) {
|
||
// absent boolean value defaults to false
|
||
return options.type === Boolean ? false : undefined;
|
||
}
|
||
var def = options['default'];
|
||
// warn against non-factory defaults for Object & Array
|
||
if (isObject(def)) {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid default value for prop "' + prop.name + '": ' + 'Props with type Object/Array must use a factory function ' + 'to return the default value.', vm);
|
||
}
|
||
// call factory function for non-Function types
|
||
return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;
|
||
}
|
||
|
||
/**
|
||
* Assert whether a prop is valid.
|
||
*
|
||
* @param {Object} prop
|
||
* @param {*} value
|
||
* @param {Vue} vm
|
||
*/
|
||
|
||
function assertProp(prop, value, vm) {
|
||
if (!prop.options.required && ( // non-required
|
||
prop.raw === null || // abscent
|
||
value == null) // null or undefined
|
||
) {
|
||
return true;
|
||
}
|
||
var options = prop.options;
|
||
var type = options.type;
|
||
var valid = !type;
|
||
var expectedTypes = [];
|
||
if (type) {
|
||
if (!isArray(type)) {
|
||
type = [type];
|
||
}
|
||
for (var i = 0; i < type.length && !valid; i++) {
|
||
var assertedType = assertType(value, type[i]);
|
||
expectedTypes.push(assertedType.expectedType);
|
||
valid = assertedType.valid;
|
||
}
|
||
}
|
||
if (!valid) {
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
warn('Invalid prop: type check failed for prop "' + prop.name + '".' + ' Expected ' + expectedTypes.map(formatType).join(', ') + ', got ' + formatValue(value) + '.', vm);
|
||
}
|
||
return false;
|
||
}
|
||
var validator = options.validator;
|
||
if (validator) {
|
||
if (!validator(value)) {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid prop: custom validator check failed for prop "' + prop.name + '".', vm);
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Force parsing value with coerce option.
|
||
*
|
||
* @param {*} value
|
||
* @param {Object} options
|
||
* @return {*}
|
||
*/
|
||
|
||
function coerceProp(prop, value, vm) {
|
||
var coerce = prop.options.coerce;
|
||
if (!coerce) {
|
||
return value;
|
||
}
|
||
if (typeof coerce === 'function') {
|
||
return coerce(value);
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid coerce for prop "' + prop.name + '": expected function, got ' + typeof coerce + '.', vm);
|
||
return value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Assert the type of a value
|
||
*
|
||
* @param {*} value
|
||
* @param {Function} type
|
||
* @return {Object}
|
||
*/
|
||
|
||
function assertType(value, type) {
|
||
var valid;
|
||
var expectedType;
|
||
if (type === String) {
|
||
expectedType = 'string';
|
||
valid = typeof value === expectedType;
|
||
} else if (type === Number) {
|
||
expectedType = 'number';
|
||
valid = typeof value === expectedType;
|
||
} else if (type === Boolean) {
|
||
expectedType = 'boolean';
|
||
valid = typeof value === expectedType;
|
||
} else if (type === Function) {
|
||
expectedType = 'function';
|
||
valid = typeof value === expectedType;
|
||
} else if (type === Object) {
|
||
expectedType = 'object';
|
||
valid = isPlainObject(value);
|
||
} else if (type === Array) {
|
||
expectedType = 'array';
|
||
valid = isArray(value);
|
||
} else {
|
||
valid = value instanceof type;
|
||
}
|
||
return {
|
||
valid: valid,
|
||
expectedType: expectedType
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Format type for output
|
||
*
|
||
* @param {String} type
|
||
* @return {String}
|
||
*/
|
||
|
||
function formatType(type) {
|
||
return type ? type.charAt(0).toUpperCase() + type.slice(1) : 'custom type';
|
||
}
|
||
|
||
/**
|
||
* Format value
|
||
*
|
||
* @param {*} value
|
||
* @return {String}
|
||
*/
|
||
|
||
function formatValue(val) {
|
||
return Object.prototype.toString.call(val).slice(8, -1);
|
||
}
|
||
|
||
var bindingModes = config._propBindingModes;
|
||
|
||
var propDef = {
|
||
|
||
bind: function bind() {
|
||
var child = this.vm;
|
||
var parent = child._context;
|
||
// passed in from compiler directly
|
||
var prop = this.descriptor.prop;
|
||
var childKey = prop.path;
|
||
var parentKey = prop.parentPath;
|
||
var twoWay = prop.mode === bindingModes.TWO_WAY;
|
||
|
||
var parentWatcher = this.parentWatcher = new Watcher(parent, parentKey, function (val) {
|
||
updateProp(child, prop, val);
|
||
}, {
|
||
twoWay: twoWay,
|
||
filters: prop.filters,
|
||
// important: props need to be observed on the
|
||
// v-for scope if present
|
||
scope: this._scope
|
||
});
|
||
|
||
// set the child initial value.
|
||
initProp(child, prop, parentWatcher.value);
|
||
|
||
// setup two-way binding
|
||
if (twoWay) {
|
||
// important: defer the child watcher creation until
|
||
// the created hook (after data observation)
|
||
var self = this;
|
||
child.$once('pre-hook:created', function () {
|
||
self.childWatcher = new Watcher(child, childKey, function (val) {
|
||
parentWatcher.set(val);
|
||
}, {
|
||
// ensure sync upward before parent sync down.
|
||
// this is necessary in cases e.g. the child
|
||
// mutates a prop array, then replaces it. (#1683)
|
||
sync: true
|
||
});
|
||
});
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
this.parentWatcher.teardown();
|
||
if (this.childWatcher) {
|
||
this.childWatcher.teardown();
|
||
}
|
||
}
|
||
};
|
||
|
||
var queue$1 = [];
|
||
var queued = false;
|
||
|
||
/**
|
||
* Push a job into the queue.
|
||
*
|
||
* @param {Function} job
|
||
*/
|
||
|
||
function pushJob(job) {
|
||
queue$1.push(job);
|
||
if (!queued) {
|
||
queued = true;
|
||
nextTick(flush);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Flush the queue, and do one forced reflow before
|
||
* triggering transitions.
|
||
*/
|
||
|
||
function flush() {
|
||
// Force layout
|
||
var f = document.documentElement.offsetHeight;
|
||
for (var i = 0; i < queue$1.length; i++) {
|
||
queue$1[i]();
|
||
}
|
||
queue$1 = [];
|
||
queued = false;
|
||
// dummy return, so js linters don't complain about
|
||
// unused variable f
|
||
return f;
|
||
}
|
||
|
||
var TYPE_TRANSITION = 'transition';
|
||
var TYPE_ANIMATION = 'animation';
|
||
var transDurationProp = transitionProp + 'Duration';
|
||
var animDurationProp = animationProp + 'Duration';
|
||
|
||
/**
|
||
* If a just-entered element is applied the
|
||
* leave class while its enter transition hasn't started yet,
|
||
* and the transitioned property has the same value for both
|
||
* enter/leave, then the leave transition will be skipped and
|
||
* the transitionend event never fires. This function ensures
|
||
* its callback to be called after a transition has started
|
||
* by waiting for double raf.
|
||
*
|
||
* It falls back to setTimeout on devices that support CSS
|
||
* transitions but not raf (e.g. Android 4.2 browser) - since
|
||
* these environments are usually slow, we are giving it a
|
||
* relatively large timeout.
|
||
*/
|
||
|
||
var raf = inBrowser && window.requestAnimationFrame;
|
||
var waitForTransitionStart = raf
|
||
/* istanbul ignore next */
|
||
? function (fn) {
|
||
raf(function () {
|
||
raf(fn);
|
||
});
|
||
} : function (fn) {
|
||
setTimeout(fn, 50);
|
||
};
|
||
|
||
/**
|
||
* A Transition object that encapsulates the state and logic
|
||
* of the transition.
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} id
|
||
* @param {Object} hooks
|
||
* @param {Vue} vm
|
||
*/
|
||
function Transition(el, id, hooks, vm) {
|
||
this.id = id;
|
||
this.el = el;
|
||
this.enterClass = hooks && hooks.enterClass || id + '-enter';
|
||
this.leaveClass = hooks && hooks.leaveClass || id + '-leave';
|
||
this.hooks = hooks;
|
||
this.vm = vm;
|
||
// async state
|
||
this.pendingCssEvent = this.pendingCssCb = this.cancel = this.pendingJsCb = this.op = this.cb = null;
|
||
this.justEntered = false;
|
||
this.entered = this.left = false;
|
||
this.typeCache = {};
|
||
// check css transition type
|
||
this.type = hooks && hooks.type;
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
if (this.type && this.type !== TYPE_TRANSITION && this.type !== TYPE_ANIMATION) {
|
||
warn('invalid CSS transition type for transition="' + this.id + '": ' + this.type, vm);
|
||
}
|
||
}
|
||
// bind
|
||
var self = this;['enterNextTick', 'enterDone', 'leaveNextTick', 'leaveDone'].forEach(function (m) {
|
||
self[m] = bind(self[m], self);
|
||
});
|
||
}
|
||
|
||
var p$1 = Transition.prototype;
|
||
|
||
/**
|
||
* Start an entering transition.
|
||
*
|
||
* 1. enter transition triggered
|
||
* 2. call beforeEnter hook
|
||
* 3. add enter class
|
||
* 4. insert/show element
|
||
* 5. call enter hook (with possible explicit js callback)
|
||
* 6. reflow
|
||
* 7. based on transition type:
|
||
* - transition:
|
||
* remove class now, wait for transitionend,
|
||
* then done if there's no explicit js callback.
|
||
* - animation:
|
||
* wait for animationend, remove class,
|
||
* then done if there's no explicit js callback.
|
||
* - no css transition:
|
||
* done now if there's no explicit js callback.
|
||
* 8. wait for either done or js callback, then call
|
||
* afterEnter hook.
|
||
*
|
||
* @param {Function} op - insert/show the element
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
p$1.enter = function (op, cb) {
|
||
this.cancelPending();
|
||
this.callHook('beforeEnter');
|
||
this.cb = cb;
|
||
addClass(this.el, this.enterClass);
|
||
op();
|
||
this.entered = false;
|
||
this.callHookWithCb('enter');
|
||
if (this.entered) {
|
||
return; // user called done synchronously.
|
||
}
|
||
this.cancel = this.hooks && this.hooks.enterCancelled;
|
||
pushJob(this.enterNextTick);
|
||
};
|
||
|
||
/**
|
||
* The "nextTick" phase of an entering transition, which is
|
||
* to be pushed into a queue and executed after a reflow so
|
||
* that removing the class can trigger a CSS transition.
|
||
*/
|
||
|
||
p$1.enterNextTick = function () {
|
||
var _this = this;
|
||
|
||
// prevent transition skipping
|
||
this.justEntered = true;
|
||
waitForTransitionStart(function () {
|
||
_this.justEntered = false;
|
||
});
|
||
var enterDone = this.enterDone;
|
||
var type = this.getCssTransitionType(this.enterClass);
|
||
if (!this.pendingJsCb) {
|
||
if (type === TYPE_TRANSITION) {
|
||
// trigger transition by removing enter class now
|
||
removeClass(this.el, this.enterClass);
|
||
this.setupCssCb(transitionEndEvent, enterDone);
|
||
} else if (type === TYPE_ANIMATION) {
|
||
this.setupCssCb(animationEndEvent, enterDone);
|
||
} else {
|
||
enterDone();
|
||
}
|
||
} else if (type === TYPE_TRANSITION) {
|
||
removeClass(this.el, this.enterClass);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* The "cleanup" phase of an entering transition.
|
||
*/
|
||
|
||
p$1.enterDone = function () {
|
||
this.entered = true;
|
||
this.cancel = this.pendingJsCb = null;
|
||
removeClass(this.el, this.enterClass);
|
||
this.callHook('afterEnter');
|
||
if (this.cb) this.cb();
|
||
};
|
||
|
||
/**
|
||
* Start a leaving transition.
|
||
*
|
||
* 1. leave transition triggered.
|
||
* 2. call beforeLeave hook
|
||
* 3. add leave class (trigger css transition)
|
||
* 4. call leave hook (with possible explicit js callback)
|
||
* 5. reflow if no explicit js callback is provided
|
||
* 6. based on transition type:
|
||
* - transition or animation:
|
||
* wait for end event, remove class, then done if
|
||
* there's no explicit js callback.
|
||
* - no css transition:
|
||
* done if there's no explicit js callback.
|
||
* 7. wait for either done or js callback, then call
|
||
* afterLeave hook.
|
||
*
|
||
* @param {Function} op - remove/hide the element
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
p$1.leave = function (op, cb) {
|
||
this.cancelPending();
|
||
this.callHook('beforeLeave');
|
||
this.op = op;
|
||
this.cb = cb;
|
||
addClass(this.el, this.leaveClass);
|
||
this.left = false;
|
||
this.callHookWithCb('leave');
|
||
if (this.left) {
|
||
return; // user called done synchronously.
|
||
}
|
||
this.cancel = this.hooks && this.hooks.leaveCancelled;
|
||
// only need to handle leaveDone if
|
||
// 1. the transition is already done (synchronously called
|
||
// by the user, which causes this.op set to null)
|
||
// 2. there's no explicit js callback
|
||
if (this.op && !this.pendingJsCb) {
|
||
// if a CSS transition leaves immediately after enter,
|
||
// the transitionend event never fires. therefore we
|
||
// detect such cases and end the leave immediately.
|
||
if (this.justEntered) {
|
||
this.leaveDone();
|
||
} else {
|
||
pushJob(this.leaveNextTick);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* The "nextTick" phase of a leaving transition.
|
||
*/
|
||
|
||
p$1.leaveNextTick = function () {
|
||
var type = this.getCssTransitionType(this.leaveClass);
|
||
if (type) {
|
||
var event = type === TYPE_TRANSITION ? transitionEndEvent : animationEndEvent;
|
||
this.setupCssCb(event, this.leaveDone);
|
||
} else {
|
||
this.leaveDone();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* The "cleanup" phase of a leaving transition.
|
||
*/
|
||
|
||
p$1.leaveDone = function () {
|
||
this.left = true;
|
||
this.cancel = this.pendingJsCb = null;
|
||
this.op();
|
||
removeClass(this.el, this.leaveClass);
|
||
this.callHook('afterLeave');
|
||
if (this.cb) this.cb();
|
||
this.op = null;
|
||
};
|
||
|
||
/**
|
||
* Cancel any pending callbacks from a previously running
|
||
* but not finished transition.
|
||
*/
|
||
|
||
p$1.cancelPending = function () {
|
||
this.op = this.cb = null;
|
||
var hasPending = false;
|
||
if (this.pendingCssCb) {
|
||
hasPending = true;
|
||
off(this.el, this.pendingCssEvent, this.pendingCssCb);
|
||
this.pendingCssEvent = this.pendingCssCb = null;
|
||
}
|
||
if (this.pendingJsCb) {
|
||
hasPending = true;
|
||
this.pendingJsCb.cancel();
|
||
this.pendingJsCb = null;
|
||
}
|
||
if (hasPending) {
|
||
removeClass(this.el, this.enterClass);
|
||
removeClass(this.el, this.leaveClass);
|
||
}
|
||
if (this.cancel) {
|
||
this.cancel.call(this.vm, this.el);
|
||
this.cancel = null;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Call a user-provided synchronous hook function.
|
||
*
|
||
* @param {String} type
|
||
*/
|
||
|
||
p$1.callHook = function (type) {
|
||
if (this.hooks && this.hooks[type]) {
|
||
this.hooks[type].call(this.vm, this.el);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Call a user-provided, potentially-async hook function.
|
||
* We check for the length of arguments to see if the hook
|
||
* expects a `done` callback. If true, the transition's end
|
||
* will be determined by when the user calls that callback;
|
||
* otherwise, the end is determined by the CSS transition or
|
||
* animation.
|
||
*
|
||
* @param {String} type
|
||
*/
|
||
|
||
p$1.callHookWithCb = function (type) {
|
||
var hook = this.hooks && this.hooks[type];
|
||
if (hook) {
|
||
if (hook.length > 1) {
|
||
this.pendingJsCb = cancellable(this[type + 'Done']);
|
||
}
|
||
hook.call(this.vm, this.el, this.pendingJsCb);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Get an element's transition type based on the
|
||
* calculated styles.
|
||
*
|
||
* @param {String} className
|
||
* @return {Number}
|
||
*/
|
||
|
||
p$1.getCssTransitionType = function (className) {
|
||
/* istanbul ignore if */
|
||
if (!transitionEndEvent ||
|
||
// skip CSS transitions if page is not visible -
|
||
// this solves the issue of transitionend events not
|
||
// firing until the page is visible again.
|
||
// pageVisibility API is supported in IE10+, same as
|
||
// CSS transitions.
|
||
document.hidden ||
|
||
// explicit js-only transition
|
||
this.hooks && this.hooks.css === false ||
|
||
// element is hidden
|
||
isHidden(this.el)) {
|
||
return;
|
||
}
|
||
var type = this.type || this.typeCache[className];
|
||
if (type) return type;
|
||
var inlineStyles = this.el.style;
|
||
var computedStyles = window.getComputedStyle(this.el);
|
||
var transDuration = inlineStyles[transDurationProp] || computedStyles[transDurationProp];
|
||
if (transDuration && transDuration !== '0s') {
|
||
type = TYPE_TRANSITION;
|
||
} else {
|
||
var animDuration = inlineStyles[animDurationProp] || computedStyles[animDurationProp];
|
||
if (animDuration && animDuration !== '0s') {
|
||
type = TYPE_ANIMATION;
|
||
}
|
||
}
|
||
if (type) {
|
||
this.typeCache[className] = type;
|
||
}
|
||
return type;
|
||
};
|
||
|
||
/**
|
||
* Setup a CSS transitionend/animationend callback.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
p$1.setupCssCb = function (event, cb) {
|
||
this.pendingCssEvent = event;
|
||
var self = this;
|
||
var el = this.el;
|
||
var onEnd = this.pendingCssCb = function (e) {
|
||
if (e.target === el) {
|
||
off(el, event, onEnd);
|
||
self.pendingCssEvent = self.pendingCssCb = null;
|
||
if (!self.pendingJsCb && cb) {
|
||
cb();
|
||
}
|
||
}
|
||
};
|
||
on(el, event, onEnd);
|
||
};
|
||
|
||
/**
|
||
* Check if an element is hidden - in that case we can just
|
||
* skip the transition alltogether.
|
||
*
|
||
* @param {Element} el
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function isHidden(el) {
|
||
if (/svg$/.test(el.namespaceURI)) {
|
||
// SVG elements do not have offset(Width|Height)
|
||
// so we need to check the client rect
|
||
var rect = el.getBoundingClientRect();
|
||
return !(rect.width || rect.height);
|
||
} else {
|
||
return !(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
|
||
}
|
||
}
|
||
|
||
var transition$1 = {
|
||
|
||
priority: TRANSITION,
|
||
|
||
update: function update(id, oldId) {
|
||
var el = this.el;
|
||
// resolve on owner vm
|
||
var hooks = resolveAsset(this.vm.$options, 'transitions', id);
|
||
id = id || 'v';
|
||
oldId = oldId || 'v';
|
||
el.__v_trans = new Transition(el, id, hooks, this.vm);
|
||
removeClass(el, oldId + '-transition');
|
||
addClass(el, id + '-transition');
|
||
}
|
||
};
|
||
|
||
var internalDirectives = {
|
||
style: style,
|
||
'class': vClass,
|
||
component: component,
|
||
prop: propDef,
|
||
transition: transition$1
|
||
};
|
||
|
||
// special binding prefixes
|
||
var bindRE = /^v-bind:|^:/;
|
||
var onRE = /^v-on:|^@/;
|
||
var dirAttrRE = /^v-([^:]+)(?:$|:(.*)$)/;
|
||
var modifierRE = /\.[^\.]+/g;
|
||
var transitionRE = /^(v-bind:|:)?transition$/;
|
||
|
||
// default directive priority
|
||
var DEFAULT_PRIORITY = 1000;
|
||
var DEFAULT_TERMINAL_PRIORITY = 2000;
|
||
|
||
/**
|
||
* Compile a template and return a reusable composite link
|
||
* function, which recursively contains more link functions
|
||
* inside. This top level compile function would normally
|
||
* be called on instance root nodes, but can also be used
|
||
* for partial compilation if the partial argument is true.
|
||
*
|
||
* The returned composite link function, when called, will
|
||
* return an unlink function that tearsdown all directives
|
||
* created during the linking phase.
|
||
*
|
||
* @param {Element|DocumentFragment} el
|
||
* @param {Object} options
|
||
* @param {Boolean} partial
|
||
* @return {Function}
|
||
*/
|
||
|
||
function compile(el, options, partial) {
|
||
// link function for the node itself.
|
||
var nodeLinkFn = partial || !options._asComponent ? compileNode(el, options) : null;
|
||
// link function for the childNodes
|
||
var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && !isScript(el) && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;
|
||
|
||
/**
|
||
* A composite linker function to be called on a already
|
||
* compiled piece of DOM, which instantiates all directive
|
||
* instances.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Element|DocumentFragment} el
|
||
* @param {Vue} [host] - host vm of transcluded content
|
||
* @param {Object} [scope] - v-for scope
|
||
* @param {Fragment} [frag] - link context fragment
|
||
* @return {Function|undefined}
|
||
*/
|
||
|
||
return function compositeLinkFn(vm, el, host, scope, frag) {
|
||
// cache childNodes before linking parent, fix #657
|
||
var childNodes = toArray(el.childNodes);
|
||
// link
|
||
var dirs = linkAndCapture(function compositeLinkCapturer() {
|
||
if (nodeLinkFn) nodeLinkFn(vm, el, host, scope, frag);
|
||
if (childLinkFn) childLinkFn(vm, childNodes, host, scope, frag);
|
||
}, vm);
|
||
return makeUnlinkFn(vm, dirs);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Apply a linker to a vm/element pair and capture the
|
||
* directives created during the process.
|
||
*
|
||
* @param {Function} linker
|
||
* @param {Vue} vm
|
||
*/
|
||
|
||
function linkAndCapture(linker, vm) {
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV === 'production') {
|
||
// reset directives before every capture in production
|
||
// mode, so that when unlinking we don't need to splice
|
||
// them out (which turns out to be a perf hit).
|
||
// they are kept in development mode because they are
|
||
// useful for Vue's own tests.
|
||
vm._directives = [];
|
||
}
|
||
var originalDirCount = vm._directives.length;
|
||
linker();
|
||
var dirs = vm._directives.slice(originalDirCount);
|
||
dirs.sort(directiveComparator);
|
||
for (var i = 0, l = dirs.length; i < l; i++) {
|
||
dirs[i]._bind();
|
||
}
|
||
return dirs;
|
||
}
|
||
|
||
/**
|
||
* Directive priority sort comparator
|
||
*
|
||
* @param {Object} a
|
||
* @param {Object} b
|
||
*/
|
||
|
||
function directiveComparator(a, b) {
|
||
a = a.descriptor.def.priority || DEFAULT_PRIORITY;
|
||
b = b.descriptor.def.priority || DEFAULT_PRIORITY;
|
||
return a > b ? -1 : a === b ? 0 : 1;
|
||
}
|
||
|
||
/**
|
||
* Linker functions return an unlink function that
|
||
* tearsdown all directives instances generated during
|
||
* the process.
|
||
*
|
||
* We create unlink functions with only the necessary
|
||
* information to avoid retaining additional closures.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Array} dirs
|
||
* @param {Vue} [context]
|
||
* @param {Array} [contextDirs]
|
||
* @return {Function}
|
||
*/
|
||
|
||
function makeUnlinkFn(vm, dirs, context, contextDirs) {
|
||
function unlink(destroying) {
|
||
teardownDirs(vm, dirs, destroying);
|
||
if (context && contextDirs) {
|
||
teardownDirs(context, contextDirs);
|
||
}
|
||
}
|
||
// expose linked directives
|
||
unlink.dirs = dirs;
|
||
return unlink;
|
||
}
|
||
|
||
/**
|
||
* Teardown partial linked directives.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Array} dirs
|
||
* @param {Boolean} destroying
|
||
*/
|
||
|
||
function teardownDirs(vm, dirs, destroying) {
|
||
var i = dirs.length;
|
||
while (i--) {
|
||
dirs[i]._teardown();
|
||
if (process.env.NODE_ENV !== 'production' && !destroying) {
|
||
vm._directives.$remove(dirs[i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Compile link props on an instance.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Element} el
|
||
* @param {Object} props
|
||
* @param {Object} [scope]
|
||
* @return {Function}
|
||
*/
|
||
|
||
function compileAndLinkProps(vm, el, props, scope) {
|
||
var propsLinkFn = compileProps(el, props, vm);
|
||
var propDirs = linkAndCapture(function () {
|
||
propsLinkFn(vm, scope);
|
||
}, vm);
|
||
return makeUnlinkFn(vm, propDirs);
|
||
}
|
||
|
||
/**
|
||
* Compile the root element of an instance.
|
||
*
|
||
* 1. attrs on context container (context scope)
|
||
* 2. attrs on the component template root node, if
|
||
* replace:true (child scope)
|
||
*
|
||
* If this is a fragment instance, we only need to compile 1.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @param {Object} contextOptions
|
||
* @return {Function}
|
||
*/
|
||
|
||
function compileRoot(el, options, contextOptions) {
|
||
var containerAttrs = options._containerAttrs;
|
||
var replacerAttrs = options._replacerAttrs;
|
||
var contextLinkFn, replacerLinkFn;
|
||
|
||
// only need to compile other attributes for
|
||
// non-fragment instances
|
||
if (el.nodeType !== 11) {
|
||
// for components, container and replacer need to be
|
||
// compiled separately and linked in different scopes.
|
||
if (options._asComponent) {
|
||
// 2. container attributes
|
||
if (containerAttrs && contextOptions) {
|
||
contextLinkFn = compileDirectives(containerAttrs, contextOptions);
|
||
}
|
||
if (replacerAttrs) {
|
||
// 3. replacer attributes
|
||
replacerLinkFn = compileDirectives(replacerAttrs, options);
|
||
}
|
||
} else {
|
||
// non-component, just compile as a normal element.
|
||
replacerLinkFn = compileDirectives(el.attributes, options);
|
||
}
|
||
} else if (process.env.NODE_ENV !== 'production' && containerAttrs) {
|
||
// warn container directives for fragment instances
|
||
var names = containerAttrs.filter(function (attr) {
|
||
// allow vue-loader/vueify scoped css attributes
|
||
return attr.name.indexOf('_v-') < 0 &&
|
||
// allow event listeners
|
||
!onRE.test(attr.name) &&
|
||
// allow slots
|
||
attr.name !== 'slot';
|
||
}).map(function (attr) {
|
||
return '"' + attr.name + '"';
|
||
});
|
||
if (names.length) {
|
||
var plural = names.length > 1;
|
||
warn('Attribute' + (plural ? 's ' : ' ') + names.join(', ') + (plural ? ' are' : ' is') + ' ignored on component ' + '<' + options.el.tagName.toLowerCase() + '> because ' + 'the component is a fragment instance: ' + 'http://vuejs.org/guide/components.html#Fragment-Instance');
|
||
}
|
||
}
|
||
|
||
options._containerAttrs = options._replacerAttrs = null;
|
||
return function rootLinkFn(vm, el, scope) {
|
||
// link context scope dirs
|
||
var context = vm._context;
|
||
var contextDirs;
|
||
if (context && contextLinkFn) {
|
||
contextDirs = linkAndCapture(function () {
|
||
contextLinkFn(context, el, null, scope);
|
||
}, context);
|
||
}
|
||
|
||
// link self
|
||
var selfDirs = linkAndCapture(function () {
|
||
if (replacerLinkFn) replacerLinkFn(vm, el);
|
||
}, vm);
|
||
|
||
// return the unlink function that tearsdown context
|
||
// container directives.
|
||
return makeUnlinkFn(vm, selfDirs, context, contextDirs);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Compile a node and return a nodeLinkFn based on the
|
||
* node type.
|
||
*
|
||
* @param {Node} node
|
||
* @param {Object} options
|
||
* @return {Function|null}
|
||
*/
|
||
|
||
function compileNode(node, options) {
|
||
var type = node.nodeType;
|
||
if (type === 1 && !isScript(node)) {
|
||
return compileElement(node, options);
|
||
} else if (type === 3 && node.data.trim()) {
|
||
return compileTextNode(node, options);
|
||
} else {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Compile an element and return a nodeLinkFn.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Function|null}
|
||
*/
|
||
|
||
function compileElement(el, options) {
|
||
// preprocess textareas.
|
||
// textarea treats its text content as the initial value.
|
||
// just bind it as an attr directive for value.
|
||
if (el.tagName === 'TEXTAREA') {
|
||
var tokens = parseText(el.value);
|
||
if (tokens) {
|
||
el.setAttribute(':value', tokensToExp(tokens));
|
||
el.value = '';
|
||
}
|
||
}
|
||
var linkFn;
|
||
var hasAttrs = el.hasAttributes();
|
||
var attrs = hasAttrs && toArray(el.attributes);
|
||
// check terminal directives (for & if)
|
||
if (hasAttrs) {
|
||
linkFn = checkTerminalDirectives(el, attrs, options);
|
||
}
|
||
// check element directives
|
||
if (!linkFn) {
|
||
linkFn = checkElementDirectives(el, options);
|
||
}
|
||
// check component
|
||
if (!linkFn) {
|
||
linkFn = checkComponent(el, options);
|
||
}
|
||
// normal directives
|
||
if (!linkFn && hasAttrs) {
|
||
linkFn = compileDirectives(attrs, options);
|
||
}
|
||
return linkFn;
|
||
}
|
||
|
||
/**
|
||
* Compile a textNode and return a nodeLinkFn.
|
||
*
|
||
* @param {TextNode} node
|
||
* @param {Object} options
|
||
* @return {Function|null} textNodeLinkFn
|
||
*/
|
||
|
||
function compileTextNode(node, options) {
|
||
// skip marked text nodes
|
||
if (node._skip) {
|
||
return removeText;
|
||
}
|
||
|
||
var tokens = parseText(node.wholeText);
|
||
if (!tokens) {
|
||
return null;
|
||
}
|
||
|
||
// mark adjacent text nodes as skipped,
|
||
// because we are using node.wholeText to compile
|
||
// all adjacent text nodes together. This fixes
|
||
// issues in IE where sometimes it splits up a single
|
||
// text node into multiple ones.
|
||
var next = node.nextSibling;
|
||
while (next && next.nodeType === 3) {
|
||
next._skip = true;
|
||
next = next.nextSibling;
|
||
}
|
||
|
||
var frag = document.createDocumentFragment();
|
||
var el, token;
|
||
for (var i = 0, l = tokens.length; i < l; i++) {
|
||
token = tokens[i];
|
||
el = token.tag ? processTextToken(token, options) : document.createTextNode(token.value);
|
||
frag.appendChild(el);
|
||
}
|
||
return makeTextNodeLinkFn(tokens, frag, options);
|
||
}
|
||
|
||
/**
|
||
* Linker for an skipped text node.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Text} node
|
||
*/
|
||
|
||
function removeText(vm, node) {
|
||
remove(node);
|
||
}
|
||
|
||
/**
|
||
* Process a single text token.
|
||
*
|
||
* @param {Object} token
|
||
* @param {Object} options
|
||
* @return {Node}
|
||
*/
|
||
|
||
function processTextToken(token, options) {
|
||
var el;
|
||
if (token.oneTime) {
|
||
el = document.createTextNode(token.value);
|
||
} else {
|
||
if (token.html) {
|
||
el = document.createComment('v-html');
|
||
setTokenType('html');
|
||
} else {
|
||
// IE will clean up empty textNodes during
|
||
// frag.cloneNode(true), so we have to give it
|
||
// something here...
|
||
el = document.createTextNode(' ');
|
||
setTokenType('text');
|
||
}
|
||
}
|
||
function setTokenType(type) {
|
||
if (token.descriptor) return;
|
||
var parsed = parseDirective(token.value);
|
||
token.descriptor = {
|
||
name: type,
|
||
def: directives[type],
|
||
expression: parsed.expression,
|
||
filters: parsed.filters
|
||
};
|
||
}
|
||
return el;
|
||
}
|
||
|
||
/**
|
||
* Build a function that processes a textNode.
|
||
*
|
||
* @param {Array<Object>} tokens
|
||
* @param {DocumentFragment} frag
|
||
*/
|
||
|
||
function makeTextNodeLinkFn(tokens, frag) {
|
||
return function textNodeLinkFn(vm, el, host, scope) {
|
||
var fragClone = frag.cloneNode(true);
|
||
var childNodes = toArray(fragClone.childNodes);
|
||
var token, value, node;
|
||
for (var i = 0, l = tokens.length; i < l; i++) {
|
||
token = tokens[i];
|
||
value = token.value;
|
||
if (token.tag) {
|
||
node = childNodes[i];
|
||
if (token.oneTime) {
|
||
value = (scope || vm).$eval(value);
|
||
if (token.html) {
|
||
replace(node, parseTemplate(value, true));
|
||
} else {
|
||
node.data = _toString(value);
|
||
}
|
||
} else {
|
||
vm._bindDir(token.descriptor, node, host, scope);
|
||
}
|
||
}
|
||
}
|
||
replace(el, fragClone);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Compile a node list and return a childLinkFn.
|
||
*
|
||
* @param {NodeList} nodeList
|
||
* @param {Object} options
|
||
* @return {Function|undefined}
|
||
*/
|
||
|
||
function compileNodeList(nodeList, options) {
|
||
var linkFns = [];
|
||
var nodeLinkFn, childLinkFn, node;
|
||
for (var i = 0, l = nodeList.length; i < l; i++) {
|
||
node = nodeList[i];
|
||
nodeLinkFn = compileNode(node, options);
|
||
childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && node.tagName !== 'SCRIPT' && node.hasChildNodes() ? compileNodeList(node.childNodes, options) : null;
|
||
linkFns.push(nodeLinkFn, childLinkFn);
|
||
}
|
||
return linkFns.length ? makeChildLinkFn(linkFns) : null;
|
||
}
|
||
|
||
/**
|
||
* Make a child link function for a node's childNodes.
|
||
*
|
||
* @param {Array<Function>} linkFns
|
||
* @return {Function} childLinkFn
|
||
*/
|
||
|
||
function makeChildLinkFn(linkFns) {
|
||
return function childLinkFn(vm, nodes, host, scope, frag) {
|
||
var node, nodeLinkFn, childrenLinkFn;
|
||
for (var i = 0, n = 0, l = linkFns.length; i < l; n++) {
|
||
node = nodes[n];
|
||
nodeLinkFn = linkFns[i++];
|
||
childrenLinkFn = linkFns[i++];
|
||
// cache childNodes before linking parent, fix #657
|
||
var childNodes = toArray(node.childNodes);
|
||
if (nodeLinkFn) {
|
||
nodeLinkFn(vm, node, host, scope, frag);
|
||
}
|
||
if (childrenLinkFn) {
|
||
childrenLinkFn(vm, childNodes, host, scope, frag);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Check for element directives (custom elements that should
|
||
* be resovled as terminal directives).
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
*/
|
||
|
||
function checkElementDirectives(el, options) {
|
||
var tag = el.tagName.toLowerCase();
|
||
if (commonTagRE.test(tag)) {
|
||
return;
|
||
}
|
||
var def = resolveAsset(options, 'elementDirectives', tag);
|
||
if (def) {
|
||
return makeTerminalNodeLinkFn(el, tag, '', options, def);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Check if an element is a component. If yes, return
|
||
* a component link function.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Function|undefined}
|
||
*/
|
||
|
||
function checkComponent(el, options) {
|
||
var component = checkComponentAttr(el, options);
|
||
if (component) {
|
||
var ref = findRef(el);
|
||
var descriptor = {
|
||
name: 'component',
|
||
ref: ref,
|
||
expression: component.id,
|
||
def: internalDirectives.component,
|
||
modifiers: {
|
||
literal: !component.dynamic
|
||
}
|
||
};
|
||
var componentLinkFn = function componentLinkFn(vm, el, host, scope, frag) {
|
||
if (ref) {
|
||
defineReactive((scope || vm).$refs, ref, null);
|
||
}
|
||
vm._bindDir(descriptor, el, host, scope, frag);
|
||
};
|
||
componentLinkFn.terminal = true;
|
||
return componentLinkFn;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Check an element for terminal directives in fixed order.
|
||
* If it finds one, return a terminal link function.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Array} attrs
|
||
* @param {Object} options
|
||
* @return {Function} terminalLinkFn
|
||
*/
|
||
|
||
function checkTerminalDirectives(el, attrs, options) {
|
||
// skip v-pre
|
||
if (getAttr(el, 'v-pre') !== null) {
|
||
return skip;
|
||
}
|
||
// skip v-else block, but only if following v-if
|
||
if (el.hasAttribute('v-else')) {
|
||
var prev = el.previousElementSibling;
|
||
if (prev && prev.hasAttribute('v-if')) {
|
||
return skip;
|
||
}
|
||
}
|
||
|
||
var attr, name, value, modifiers, matched, dirName, rawName, arg, def, termDef;
|
||
for (var i = 0, j = attrs.length; i < j; i++) {
|
||
attr = attrs[i];
|
||
name = attr.name.replace(modifierRE, '');
|
||
if (matched = name.match(dirAttrRE)) {
|
||
def = resolveAsset(options, 'directives', matched[1]);
|
||
if (def && def.terminal) {
|
||
if (!termDef || (def.priority || DEFAULT_TERMINAL_PRIORITY) > termDef.priority) {
|
||
termDef = def;
|
||
rawName = attr.name;
|
||
modifiers = parseModifiers(attr.name);
|
||
value = attr.value;
|
||
dirName = matched[1];
|
||
arg = matched[2];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (termDef) {
|
||
return makeTerminalNodeLinkFn(el, dirName, value, options, termDef, rawName, arg, modifiers);
|
||
}
|
||
}
|
||
|
||
function skip() {}
|
||
skip.terminal = true;
|
||
|
||
/**
|
||
* Build a node link function for a terminal directive.
|
||
* A terminal link function terminates the current
|
||
* compilation recursion and handles compilation of the
|
||
* subtree in the directive.
|
||
*
|
||
* @param {Element} el
|
||
* @param {String} dirName
|
||
* @param {String} value
|
||
* @param {Object} options
|
||
* @param {Object} def
|
||
* @param {String} [rawName]
|
||
* @param {String} [arg]
|
||
* @param {Object} [modifiers]
|
||
* @return {Function} terminalLinkFn
|
||
*/
|
||
|
||
function makeTerminalNodeLinkFn(el, dirName, value, options, def, rawName, arg, modifiers) {
|
||
var parsed = parseDirective(value);
|
||
var descriptor = {
|
||
name: dirName,
|
||
arg: arg,
|
||
expression: parsed.expression,
|
||
filters: parsed.filters,
|
||
raw: value,
|
||
attr: rawName,
|
||
modifiers: modifiers,
|
||
def: def
|
||
};
|
||
// check ref for v-for and router-view
|
||
if (dirName === 'for' || dirName === 'router-view') {
|
||
descriptor.ref = findRef(el);
|
||
}
|
||
var fn = function terminalNodeLinkFn(vm, el, host, scope, frag) {
|
||
if (descriptor.ref) {
|
||
defineReactive((scope || vm).$refs, descriptor.ref, null);
|
||
}
|
||
vm._bindDir(descriptor, el, host, scope, frag);
|
||
};
|
||
fn.terminal = true;
|
||
return fn;
|
||
}
|
||
|
||
/**
|
||
* Compile the directives on an element and return a linker.
|
||
*
|
||
* @param {Array|NamedNodeMap} attrs
|
||
* @param {Object} options
|
||
* @return {Function}
|
||
*/
|
||
|
||
function compileDirectives(attrs, options) {
|
||
var i = attrs.length;
|
||
var dirs = [];
|
||
var attr, name, value, rawName, rawValue, dirName, arg, modifiers, dirDef, tokens, matched;
|
||
while (i--) {
|
||
attr = attrs[i];
|
||
name = rawName = attr.name;
|
||
value = rawValue = attr.value;
|
||
tokens = parseText(value);
|
||
// reset arg
|
||
arg = null;
|
||
// check modifiers
|
||
modifiers = parseModifiers(name);
|
||
name = name.replace(modifierRE, '');
|
||
|
||
// attribute interpolations
|
||
if (tokens) {
|
||
value = tokensToExp(tokens);
|
||
arg = name;
|
||
pushDir('bind', directives.bind, tokens);
|
||
// warn against mixing mustaches with v-bind
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
if (name === 'class' && Array.prototype.some.call(attrs, function (attr) {
|
||
return attr.name === ':class' || attr.name === 'v-bind:class';
|
||
})) {
|
||
warn('class="' + rawValue + '": Do not mix mustache interpolation ' + 'and v-bind for "class" on the same element. Use one or the other.', options);
|
||
}
|
||
}
|
||
} else
|
||
|
||
// special attribute: transition
|
||
if (transitionRE.test(name)) {
|
||
modifiers.literal = !bindRE.test(name);
|
||
pushDir('transition', internalDirectives.transition);
|
||
} else
|
||
|
||
// event handlers
|
||
if (onRE.test(name)) {
|
||
arg = name.replace(onRE, '');
|
||
pushDir('on', directives.on);
|
||
} else
|
||
|
||
// attribute bindings
|
||
if (bindRE.test(name)) {
|
||
dirName = name.replace(bindRE, '');
|
||
if (dirName === 'style' || dirName === 'class') {
|
||
pushDir(dirName, internalDirectives[dirName]);
|
||
} else {
|
||
arg = dirName;
|
||
pushDir('bind', directives.bind);
|
||
}
|
||
} else
|
||
|
||
// normal directives
|
||
if (matched = name.match(dirAttrRE)) {
|
||
dirName = matched[1];
|
||
arg = matched[2];
|
||
|
||
// skip v-else (when used with v-show)
|
||
if (dirName === 'else') {
|
||
continue;
|
||
}
|
||
|
||
dirDef = resolveAsset(options, 'directives', dirName, true);
|
||
if (dirDef) {
|
||
pushDir(dirName, dirDef);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Push a directive.
|
||
*
|
||
* @param {String} dirName
|
||
* @param {Object|Function} def
|
||
* @param {Array} [interpTokens]
|
||
*/
|
||
|
||
function pushDir(dirName, def, interpTokens) {
|
||
var hasOneTimeToken = interpTokens && hasOneTime(interpTokens);
|
||
var parsed = !hasOneTimeToken && parseDirective(value);
|
||
dirs.push({
|
||
name: dirName,
|
||
attr: rawName,
|
||
raw: rawValue,
|
||
def: def,
|
||
arg: arg,
|
||
modifiers: modifiers,
|
||
// conversion from interpolation strings with one-time token
|
||
// to expression is differed until directive bind time so that we
|
||
// have access to the actual vm context for one-time bindings.
|
||
expression: parsed && parsed.expression,
|
||
filters: parsed && parsed.filters,
|
||
interp: interpTokens,
|
||
hasOneTime: hasOneTimeToken
|
||
});
|
||
}
|
||
|
||
if (dirs.length) {
|
||
return makeNodeLinkFn(dirs);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Parse modifiers from directive attribute name.
|
||
*
|
||
* @param {String} name
|
||
* @return {Object}
|
||
*/
|
||
|
||
function parseModifiers(name) {
|
||
var res = Object.create(null);
|
||
var match = name.match(modifierRE);
|
||
if (match) {
|
||
var i = match.length;
|
||
while (i--) {
|
||
res[match[i].slice(1)] = true;
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Build a link function for all directives on a single node.
|
||
*
|
||
* @param {Array} directives
|
||
* @return {Function} directivesLinkFn
|
||
*/
|
||
|
||
function makeNodeLinkFn(directives) {
|
||
return function nodeLinkFn(vm, el, host, scope, frag) {
|
||
// reverse apply because it's sorted low to high
|
||
var i = directives.length;
|
||
while (i--) {
|
||
vm._bindDir(directives[i], el, host, scope, frag);
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Check if an interpolation string contains one-time tokens.
|
||
*
|
||
* @param {Array} tokens
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
function hasOneTime(tokens) {
|
||
var i = tokens.length;
|
||
while (i--) {
|
||
if (tokens[i].oneTime) return true;
|
||
}
|
||
}
|
||
|
||
function isScript(el) {
|
||
return el.tagName === 'SCRIPT' && (!el.hasAttribute('type') || el.getAttribute('type') === 'text/javascript');
|
||
}
|
||
|
||
var specialCharRE = /[^\w\-:\.]/;
|
||
|
||
/**
|
||
* Process an element or a DocumentFragment based on a
|
||
* instance option object. This allows us to transclude
|
||
* a template node/fragment before the instance is created,
|
||
* so the processed fragment can then be cloned and reused
|
||
* in v-for.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Element|DocumentFragment}
|
||
*/
|
||
|
||
function transclude(el, options) {
|
||
// extract container attributes to pass them down
|
||
// to compiler, because they need to be compiled in
|
||
// parent scope. we are mutating the options object here
|
||
// assuming the same object will be used for compile
|
||
// right after this.
|
||
if (options) {
|
||
options._containerAttrs = extractAttrs(el);
|
||
}
|
||
// for template tags, what we want is its content as
|
||
// a documentFragment (for fragment instances)
|
||
if (isTemplate(el)) {
|
||
el = parseTemplate(el);
|
||
}
|
||
if (options) {
|
||
if (options._asComponent && !options.template) {
|
||
options.template = '<slot></slot>';
|
||
}
|
||
if (options.template) {
|
||
options._content = extractContent(el);
|
||
el = transcludeTemplate(el, options);
|
||
}
|
||
}
|
||
if (isFragment(el)) {
|
||
// anchors for fragment instance
|
||
// passing in `persist: true` to avoid them being
|
||
// discarded by IE during template cloning
|
||
prepend(createAnchor('v-start', true), el);
|
||
el.appendChild(createAnchor('v-end', true));
|
||
}
|
||
return el;
|
||
}
|
||
|
||
/**
|
||
* Process the template option.
|
||
* If the replace option is true this will swap the $el.
|
||
*
|
||
* @param {Element} el
|
||
* @param {Object} options
|
||
* @return {Element|DocumentFragment}
|
||
*/
|
||
|
||
function transcludeTemplate(el, options) {
|
||
var template = options.template;
|
||
var frag = parseTemplate(template, true);
|
||
if (frag) {
|
||
var replacer = frag.firstChild;
|
||
var tag = replacer.tagName && replacer.tagName.toLowerCase();
|
||
if (options.replace) {
|
||
/* istanbul ignore if */
|
||
if (el === document.body) {
|
||
process.env.NODE_ENV !== 'production' && warn('You are mounting an instance with a template to ' + '<body>. This will replace <body> entirely. You ' + 'should probably use `replace: false` here.');
|
||
}
|
||
// there are many cases where the instance must
|
||
// become a fragment instance: basically anything that
|
||
// can create more than 1 root nodes.
|
||
if (
|
||
// multi-children template
|
||
frag.childNodes.length > 1 ||
|
||
// non-element template
|
||
replacer.nodeType !== 1 ||
|
||
// single nested component
|
||
tag === 'component' || resolveAsset(options, 'components', tag) || hasBindAttr(replacer, 'is') ||
|
||
// element directive
|
||
resolveAsset(options, 'elementDirectives', tag) ||
|
||
// for block
|
||
replacer.hasAttribute('v-for') ||
|
||
// if block
|
||
replacer.hasAttribute('v-if')) {
|
||
return frag;
|
||
} else {
|
||
options._replacerAttrs = extractAttrs(replacer);
|
||
mergeAttrs(el, replacer);
|
||
return replacer;
|
||
}
|
||
} else {
|
||
el.appendChild(frag);
|
||
return el;
|
||
}
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('Invalid template option: ' + template);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Helper to extract a component container's attributes
|
||
* into a plain object array.
|
||
*
|
||
* @param {Element} el
|
||
* @return {Array}
|
||
*/
|
||
|
||
function extractAttrs(el) {
|
||
if (el.nodeType === 1 && el.hasAttributes()) {
|
||
return toArray(el.attributes);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Merge the attributes of two elements, and make sure
|
||
* the class names are merged properly.
|
||
*
|
||
* @param {Element} from
|
||
* @param {Element} to
|
||
*/
|
||
|
||
function mergeAttrs(from, to) {
|
||
var attrs = from.attributes;
|
||
var i = attrs.length;
|
||
var name, value;
|
||
while (i--) {
|
||
name = attrs[i].name;
|
||
value = attrs[i].value;
|
||
if (!to.hasAttribute(name) && !specialCharRE.test(name)) {
|
||
to.setAttribute(name, value);
|
||
} else if (name === 'class' && !parseText(value) && (value = value.trim())) {
|
||
value.split(/\s+/).forEach(function (cls) {
|
||
addClass(to, cls);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Scan and determine slot content distribution.
|
||
* We do this during transclusion instead at compile time so that
|
||
* the distribution is decoupled from the compilation order of
|
||
* the slots.
|
||
*
|
||
* @param {Element|DocumentFragment} template
|
||
* @param {Element} content
|
||
* @param {Vue} vm
|
||
*/
|
||
|
||
function resolveSlots(vm, content) {
|
||
if (!content) {
|
||
return;
|
||
}
|
||
var contents = vm._slotContents = Object.create(null);
|
||
var el, name;
|
||
for (var i = 0, l = content.children.length; i < l; i++) {
|
||
el = content.children[i];
|
||
/* eslint-disable no-cond-assign */
|
||
if (name = el.getAttribute('slot')) {
|
||
(contents[name] || (contents[name] = [])).push(el);
|
||
}
|
||
/* eslint-enable no-cond-assign */
|
||
if (process.env.NODE_ENV !== 'production' && getBindAttr(el, 'slot')) {
|
||
warn('The "slot" attribute must be static.', vm.$parent);
|
||
}
|
||
}
|
||
for (name in contents) {
|
||
contents[name] = extractFragment(contents[name], content);
|
||
}
|
||
if (content.hasChildNodes()) {
|
||
var nodes = content.childNodes;
|
||
if (nodes.length === 1 && nodes[0].nodeType === 3 && !nodes[0].data.trim()) {
|
||
return;
|
||
}
|
||
contents['default'] = extractFragment(content.childNodes, content);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Extract qualified content nodes from a node list.
|
||
*
|
||
* @param {NodeList} nodes
|
||
* @return {DocumentFragment}
|
||
*/
|
||
|
||
function extractFragment(nodes, parent) {
|
||
var frag = document.createDocumentFragment();
|
||
nodes = toArray(nodes);
|
||
for (var i = 0, l = nodes.length; i < l; i++) {
|
||
var node = nodes[i];
|
||
if (isTemplate(node) && !node.hasAttribute('v-if') && !node.hasAttribute('v-for')) {
|
||
parent.removeChild(node);
|
||
node = parseTemplate(node, true);
|
||
}
|
||
frag.appendChild(node);
|
||
}
|
||
return frag;
|
||
}
|
||
|
||
|
||
|
||
var compiler = Object.freeze({
|
||
compile: compile,
|
||
compileAndLinkProps: compileAndLinkProps,
|
||
compileRoot: compileRoot,
|
||
transclude: transclude,
|
||
resolveSlots: resolveSlots
|
||
});
|
||
|
||
function stateMixin (Vue) {
|
||
/**
|
||
* Accessor for `$data` property, since setting $data
|
||
* requires observing the new object and updating
|
||
* proxied properties.
|
||
*/
|
||
|
||
Object.defineProperty(Vue.prototype, '$data', {
|
||
get: function get() {
|
||
return this._data;
|
||
},
|
||
set: function set(newData) {
|
||
if (newData !== this._data) {
|
||
this._setData(newData);
|
||
}
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Setup the scope of an instance, which contains:
|
||
* - observed data
|
||
* - computed properties
|
||
* - user methods
|
||
* - meta properties
|
||
*/
|
||
|
||
Vue.prototype._initState = function () {
|
||
this._initProps();
|
||
this._initMeta();
|
||
this._initMethods();
|
||
this._initData();
|
||
this._initComputed();
|
||
};
|
||
|
||
/**
|
||
* Initialize props.
|
||
*/
|
||
|
||
Vue.prototype._initProps = function () {
|
||
var options = this.$options;
|
||
var el = options.el;
|
||
var props = options.props;
|
||
if (props && !el) {
|
||
process.env.NODE_ENV !== 'production' && warn('Props will not be compiled if no `el` option is ' + 'provided at instantiation.', this);
|
||
}
|
||
// make sure to convert string selectors into element now
|
||
el = options.el = query(el);
|
||
this._propsUnlinkFn = el && el.nodeType === 1 && props
|
||
// props must be linked in proper scope if inside v-for
|
||
? compileAndLinkProps(this, el, props, this._scope) : null;
|
||
};
|
||
|
||
/**
|
||
* Initialize the data.
|
||
*/
|
||
|
||
Vue.prototype._initData = function () {
|
||
var dataFn = this.$options.data;
|
||
var data = this._data = dataFn ? dataFn() : {};
|
||
if (!isPlainObject(data)) {
|
||
data = {};
|
||
process.env.NODE_ENV !== 'production' && warn('data functions should return an object.', this);
|
||
}
|
||
var props = this._props;
|
||
// proxy data on instance
|
||
var keys = Object.keys(data);
|
||
var i, key;
|
||
i = keys.length;
|
||
while (i--) {
|
||
key = keys[i];
|
||
// there are two scenarios where we can proxy a data key:
|
||
// 1. it's not already defined as a prop
|
||
// 2. it's provided via a instantiation option AND there are no
|
||
// template prop present
|
||
if (!props || !hasOwn(props, key)) {
|
||
this._proxy(key);
|
||
} else if (process.env.NODE_ENV !== 'production') {
|
||
warn('Data field "' + key + '" is already defined ' + 'as a prop. To provide default value for a prop, use the "default" ' + 'prop option; if you want to pass prop values to an instantiation ' + 'call, use the "propsData" option.', this);
|
||
}
|
||
}
|
||
// observe data
|
||
observe(data, this);
|
||
};
|
||
|
||
/**
|
||
* Swap the instance's $data. Called in $data's setter.
|
||
*
|
||
* @param {Object} newData
|
||
*/
|
||
|
||
Vue.prototype._setData = function (newData) {
|
||
newData = newData || {};
|
||
var oldData = this._data;
|
||
this._data = newData;
|
||
var keys, key, i;
|
||
// unproxy keys not present in new data
|
||
keys = Object.keys(oldData);
|
||
i = keys.length;
|
||
while (i--) {
|
||
key = keys[i];
|
||
if (!(key in newData)) {
|
||
this._unproxy(key);
|
||
}
|
||
}
|
||
// proxy keys not already proxied,
|
||
// and trigger change for changed values
|
||
keys = Object.keys(newData);
|
||
i = keys.length;
|
||
while (i--) {
|
||
key = keys[i];
|
||
if (!hasOwn(this, key)) {
|
||
// new property
|
||
this._proxy(key);
|
||
}
|
||
}
|
||
oldData.__ob__.removeVm(this);
|
||
observe(newData, this);
|
||
this._digest();
|
||
};
|
||
|
||
/**
|
||
* Proxy a property, so that
|
||
* vm.prop === vm._data.prop
|
||
*
|
||
* @param {String} key
|
||
*/
|
||
|
||
Vue.prototype._proxy = function (key) {
|
||
if (!isReserved(key)) {
|
||
// need to store ref to self here
|
||
// because these getter/setters might
|
||
// be called by child scopes via
|
||
// prototype inheritance.
|
||
var self = this;
|
||
Object.defineProperty(self, key, {
|
||
configurable: true,
|
||
enumerable: true,
|
||
get: function proxyGetter() {
|
||
return self._data[key];
|
||
},
|
||
set: function proxySetter(val) {
|
||
self._data[key] = val;
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Unproxy a property.
|
||
*
|
||
* @param {String} key
|
||
*/
|
||
|
||
Vue.prototype._unproxy = function (key) {
|
||
if (!isReserved(key)) {
|
||
delete this[key];
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Force update on every watcher in scope.
|
||
*/
|
||
|
||
Vue.prototype._digest = function () {
|
||
for (var i = 0, l = this._watchers.length; i < l; i++) {
|
||
this._watchers[i].update(true); // shallow updates
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Setup computed properties. They are essentially
|
||
* special getter/setters
|
||
*/
|
||
|
||
function noop() {}
|
||
Vue.prototype._initComputed = function () {
|
||
var computed = this.$options.computed;
|
||
if (computed) {
|
||
for (var key in computed) {
|
||
var userDef = computed[key];
|
||
var def = {
|
||
enumerable: true,
|
||
configurable: true
|
||
};
|
||
if (typeof userDef === 'function') {
|
||
def.get = makeComputedGetter(userDef, this);
|
||
def.set = noop;
|
||
} else {
|
||
def.get = userDef.get ? userDef.cache !== false ? makeComputedGetter(userDef.get, this) : bind(userDef.get, this) : noop;
|
||
def.set = userDef.set ? bind(userDef.set, this) : noop;
|
||
}
|
||
Object.defineProperty(this, key, def);
|
||
}
|
||
}
|
||
};
|
||
|
||
function makeComputedGetter(getter, owner) {
|
||
var watcher = new Watcher(owner, getter, null, {
|
||
lazy: true
|
||
});
|
||
return function computedGetter() {
|
||
if (watcher.dirty) {
|
||
watcher.evaluate();
|
||
}
|
||
if (Dep.target) {
|
||
watcher.depend();
|
||
}
|
||
return watcher.value;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Setup instance methods. Methods must be bound to the
|
||
* instance since they might be passed down as a prop to
|
||
* child components.
|
||
*/
|
||
|
||
Vue.prototype._initMethods = function () {
|
||
var methods = this.$options.methods;
|
||
if (methods) {
|
||
for (var key in methods) {
|
||
this[key] = bind(methods[key], this);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Initialize meta information like $index, $key & $value.
|
||
*/
|
||
|
||
Vue.prototype._initMeta = function () {
|
||
var metas = this.$options._meta;
|
||
if (metas) {
|
||
for (var key in metas) {
|
||
defineReactive(this, key, metas[key]);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
var eventRE = /^v-on:|^@/;
|
||
|
||
function eventsMixin (Vue) {
|
||
/**
|
||
* Setup the instance's option events & watchers.
|
||
* If the value is a string, we pull it from the
|
||
* instance's methods by name.
|
||
*/
|
||
|
||
Vue.prototype._initEvents = function () {
|
||
var options = this.$options;
|
||
if (options._asComponent) {
|
||
registerComponentEvents(this, options.el);
|
||
}
|
||
registerCallbacks(this, '$on', options.events);
|
||
registerCallbacks(this, '$watch', options.watch);
|
||
};
|
||
|
||
/**
|
||
* Register v-on events on a child component
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Element} el
|
||
*/
|
||
|
||
function registerComponentEvents(vm, el) {
|
||
var attrs = el.attributes;
|
||
var name, value, handler;
|
||
for (var i = 0, l = attrs.length; i < l; i++) {
|
||
name = attrs[i].name;
|
||
if (eventRE.test(name)) {
|
||
name = name.replace(eventRE, '');
|
||
// force the expression into a statement so that
|
||
// it always dynamically resolves the method to call (#2670)
|
||
// kinda ugly hack, but does the job.
|
||
value = attrs[i].value;
|
||
if (isSimplePath(value)) {
|
||
value += '.apply(this, $arguments)';
|
||
}
|
||
handler = (vm._scope || vm._context).$eval(value, true);
|
||
handler._fromParent = true;
|
||
vm.$on(name.replace(eventRE), handler);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Register callbacks for option events and watchers.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {String} action
|
||
* @param {Object} hash
|
||
*/
|
||
|
||
function registerCallbacks(vm, action, hash) {
|
||
if (!hash) return;
|
||
var handlers, key, i, j;
|
||
for (key in hash) {
|
||
handlers = hash[key];
|
||
if (isArray(handlers)) {
|
||
for (i = 0, j = handlers.length; i < j; i++) {
|
||
register(vm, action, key, handlers[i]);
|
||
}
|
||
} else {
|
||
register(vm, action, key, handlers);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Helper to register an event/watch callback.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {String} action
|
||
* @param {String} key
|
||
* @param {Function|String|Object} handler
|
||
* @param {Object} [options]
|
||
*/
|
||
|
||
function register(vm, action, key, handler, options) {
|
||
var type = typeof handler;
|
||
if (type === 'function') {
|
||
vm[action](key, handler, options);
|
||
} else if (type === 'string') {
|
||
var methods = vm.$options.methods;
|
||
var method = methods && methods[handler];
|
||
if (method) {
|
||
vm[action](key, method, options);
|
||
} else {
|
||
process.env.NODE_ENV !== 'production' && warn('Unknown method: "' + handler + '" when ' + 'registering callback for ' + action + ': "' + key + '".', vm);
|
||
}
|
||
} else if (handler && type === 'object') {
|
||
register(vm, action, key, handler.handler, handler);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Setup recursive attached/detached calls
|
||
*/
|
||
|
||
Vue.prototype._initDOMHooks = function () {
|
||
this.$on('hook:attached', onAttached);
|
||
this.$on('hook:detached', onDetached);
|
||
};
|
||
|
||
/**
|
||
* Callback to recursively call attached hook on children
|
||
*/
|
||
|
||
function onAttached() {
|
||
if (!this._isAttached) {
|
||
this._isAttached = true;
|
||
this.$children.forEach(callAttach);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Iterator to call attached hook
|
||
*
|
||
* @param {Vue} child
|
||
*/
|
||
|
||
function callAttach(child) {
|
||
if (!child._isAttached && inDoc(child.$el)) {
|
||
child._callHook('attached');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Callback to recursively call detached hook on children
|
||
*/
|
||
|
||
function onDetached() {
|
||
if (this._isAttached) {
|
||
this._isAttached = false;
|
||
this.$children.forEach(callDetach);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Iterator to call detached hook
|
||
*
|
||
* @param {Vue} child
|
||
*/
|
||
|
||
function callDetach(child) {
|
||
if (child._isAttached && !inDoc(child.$el)) {
|
||
child._callHook('detached');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Trigger all handlers for a hook
|
||
*
|
||
* @param {String} hook
|
||
*/
|
||
|
||
Vue.prototype._callHook = function (hook) {
|
||
this.$emit('pre-hook:' + hook);
|
||
var handlers = this.$options[hook];
|
||
if (handlers) {
|
||
for (var i = 0, j = handlers.length; i < j; i++) {
|
||
handlers[i].call(this);
|
||
}
|
||
}
|
||
this.$emit('hook:' + hook);
|
||
};
|
||
}
|
||
|
||
function noop$1() {}
|
||
|
||
/**
|
||
* A directive links a DOM element with a piece of data,
|
||
* which is the result of evaluating an expression.
|
||
* It registers a watcher with the expression and calls
|
||
* the DOM update function when a change is triggered.
|
||
*
|
||
* @param {Object} descriptor
|
||
* - {String} name
|
||
* - {Object} def
|
||
* - {String} expression
|
||
* - {Array<Object>} [filters]
|
||
* - {Object} [modifiers]
|
||
* - {Boolean} literal
|
||
* - {String} attr
|
||
* - {String} arg
|
||
* - {String} raw
|
||
* - {String} [ref]
|
||
* - {Array<Object>} [interp]
|
||
* - {Boolean} [hasOneTime]
|
||
* @param {Vue} vm
|
||
* @param {Node} el
|
||
* @param {Vue} [host] - transclusion host component
|
||
* @param {Object} [scope] - v-for scope
|
||
* @param {Fragment} [frag] - owner fragment
|
||
* @constructor
|
||
*/
|
||
function Directive(descriptor, vm, el, host, scope, frag) {
|
||
this.vm = vm;
|
||
this.el = el;
|
||
// copy descriptor properties
|
||
this.descriptor = descriptor;
|
||
this.name = descriptor.name;
|
||
this.expression = descriptor.expression;
|
||
this.arg = descriptor.arg;
|
||
this.modifiers = descriptor.modifiers;
|
||
this.filters = descriptor.filters;
|
||
this.literal = this.modifiers && this.modifiers.literal;
|
||
// private
|
||
this._locked = false;
|
||
this._bound = false;
|
||
this._listeners = null;
|
||
// link context
|
||
this._host = host;
|
||
this._scope = scope;
|
||
this._frag = frag;
|
||
// store directives on node in dev mode
|
||
if (process.env.NODE_ENV !== 'production' && this.el) {
|
||
this.el._vue_directives = this.el._vue_directives || [];
|
||
this.el._vue_directives.push(this);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Initialize the directive, mixin definition properties,
|
||
* setup the watcher, call definition bind() and update()
|
||
* if present.
|
||
*/
|
||
|
||
Directive.prototype._bind = function () {
|
||
var name = this.name;
|
||
var descriptor = this.descriptor;
|
||
|
||
// remove attribute
|
||
if ((name !== 'cloak' || this.vm._isCompiled) && this.el && this.el.removeAttribute) {
|
||
var attr = descriptor.attr || 'v-' + name;
|
||
this.el.removeAttribute(attr);
|
||
}
|
||
|
||
// copy def properties
|
||
var def = descriptor.def;
|
||
if (typeof def === 'function') {
|
||
this.update = def;
|
||
} else {
|
||
extend(this, def);
|
||
}
|
||
|
||
// setup directive params
|
||
this._setupParams();
|
||
|
||
// initial bind
|
||
if (this.bind) {
|
||
this.bind();
|
||
}
|
||
this._bound = true;
|
||
|
||
if (this.literal) {
|
||
this.update && this.update(descriptor.raw);
|
||
} else if ((this.expression || this.modifiers) && (this.update || this.twoWay) && !this._checkStatement()) {
|
||
// wrapped updater for context
|
||
var dir = this;
|
||
if (this.update) {
|
||
this._update = function (val, oldVal) {
|
||
if (!dir._locked) {
|
||
dir.update(val, oldVal);
|
||
}
|
||
};
|
||
} else {
|
||
this._update = noop$1;
|
||
}
|
||
var preProcess = this._preProcess ? bind(this._preProcess, this) : null;
|
||
var postProcess = this._postProcess ? bind(this._postProcess, this) : null;
|
||
var watcher = this._watcher = new Watcher(this.vm, this.expression, this._update, // callback
|
||
{
|
||
filters: this.filters,
|
||
twoWay: this.twoWay,
|
||
deep: this.deep,
|
||
preProcess: preProcess,
|
||
postProcess: postProcess,
|
||
scope: this._scope
|
||
});
|
||
// v-model with inital inline value need to sync back to
|
||
// model instead of update to DOM on init. They would
|
||
// set the afterBind hook to indicate that.
|
||
if (this.afterBind) {
|
||
this.afterBind();
|
||
} else if (this.update) {
|
||
this.update(watcher.value);
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Setup all param attributes, e.g. track-by,
|
||
* transition-mode, etc...
|
||
*/
|
||
|
||
Directive.prototype._setupParams = function () {
|
||
if (!this.params) {
|
||
return;
|
||
}
|
||
var params = this.params;
|
||
// swap the params array with a fresh object.
|
||
this.params = Object.create(null);
|
||
var i = params.length;
|
||
var key, val, mappedKey;
|
||
while (i--) {
|
||
key = hyphenate(params[i]);
|
||
mappedKey = camelize(key);
|
||
val = getBindAttr(this.el, key);
|
||
if (val != null) {
|
||
// dynamic
|
||
this._setupParamWatcher(mappedKey, val);
|
||
} else {
|
||
// static
|
||
val = getAttr(this.el, key);
|
||
if (val != null) {
|
||
this.params[mappedKey] = val === '' ? true : val;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Setup a watcher for a dynamic param.
|
||
*
|
||
* @param {String} key
|
||
* @param {String} expression
|
||
*/
|
||
|
||
Directive.prototype._setupParamWatcher = function (key, expression) {
|
||
var self = this;
|
||
var called = false;
|
||
var unwatch = (this._scope || this.vm).$watch(expression, function (val, oldVal) {
|
||
self.params[key] = val;
|
||
// since we are in immediate mode,
|
||
// only call the param change callbacks if this is not the first update.
|
||
if (called) {
|
||
var cb = self.paramWatchers && self.paramWatchers[key];
|
||
if (cb) {
|
||
cb.call(self, val, oldVal);
|
||
}
|
||
} else {
|
||
called = true;
|
||
}
|
||
}, {
|
||
immediate: true,
|
||
user: false
|
||
});(this._paramUnwatchFns || (this._paramUnwatchFns = [])).push(unwatch);
|
||
};
|
||
|
||
/**
|
||
* Check if the directive is a function caller
|
||
* and if the expression is a callable one. If both true,
|
||
* we wrap up the expression and use it as the event
|
||
* handler.
|
||
*
|
||
* e.g. on-click="a++"
|
||
*
|
||
* @return {Boolean}
|
||
*/
|
||
|
||
Directive.prototype._checkStatement = function () {
|
||
var expression = this.expression;
|
||
if (expression && this.acceptStatement && !isSimplePath(expression)) {
|
||
var fn = parseExpression(expression).get;
|
||
var scope = this._scope || this.vm;
|
||
var handler = function handler(e) {
|
||
scope.$event = e;
|
||
fn.call(scope, scope);
|
||
scope.$event = null;
|
||
};
|
||
if (this.filters) {
|
||
handler = scope._applyFilters(handler, null, this.filters);
|
||
}
|
||
this.update(handler);
|
||
return true;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Set the corresponding value with the setter.
|
||
* This should only be used in two-way directives
|
||
* e.g. v-model.
|
||
*
|
||
* @param {*} value
|
||
* @public
|
||
*/
|
||
|
||
Directive.prototype.set = function (value) {
|
||
/* istanbul ignore else */
|
||
if (this.twoWay) {
|
||
this._withLock(function () {
|
||
this._watcher.set(value);
|
||
});
|
||
} else if (process.env.NODE_ENV !== 'production') {
|
||
warn('Directive.set() can only be used inside twoWay' + 'directives.');
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Execute a function while preventing that function from
|
||
* triggering updates on this directive instance.
|
||
*
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
Directive.prototype._withLock = function (fn) {
|
||
var self = this;
|
||
self._locked = true;
|
||
fn.call(self);
|
||
nextTick(function () {
|
||
self._locked = false;
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Convenience method that attaches a DOM event listener
|
||
* to the directive element and autometically tears it down
|
||
* during unbind.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} handler
|
||
* @param {Boolean} [useCapture]
|
||
*/
|
||
|
||
Directive.prototype.on = function (event, handler, useCapture) {
|
||
on(this.el, event, handler, useCapture);(this._listeners || (this._listeners = [])).push([event, handler]);
|
||
};
|
||
|
||
/**
|
||
* Teardown the watcher and call unbind.
|
||
*/
|
||
|
||
Directive.prototype._teardown = function () {
|
||
if (this._bound) {
|
||
this._bound = false;
|
||
if (this.unbind) {
|
||
this.unbind();
|
||
}
|
||
if (this._watcher) {
|
||
this._watcher.teardown();
|
||
}
|
||
var listeners = this._listeners;
|
||
var i;
|
||
if (listeners) {
|
||
i = listeners.length;
|
||
while (i--) {
|
||
off(this.el, listeners[i][0], listeners[i][1]);
|
||
}
|
||
}
|
||
var unwatchFns = this._paramUnwatchFns;
|
||
if (unwatchFns) {
|
||
i = unwatchFns.length;
|
||
while (i--) {
|
||
unwatchFns[i]();
|
||
}
|
||
}
|
||
if (process.env.NODE_ENV !== 'production' && this.el) {
|
||
this.el._vue_directives.$remove(this);
|
||
}
|
||
this.vm = this.el = this._watcher = this._listeners = null;
|
||
}
|
||
};
|
||
|
||
function lifecycleMixin (Vue) {
|
||
/**
|
||
* Update v-ref for component.
|
||
*
|
||
* @param {Boolean} remove
|
||
*/
|
||
|
||
Vue.prototype._updateRef = function (remove) {
|
||
var ref = this.$options._ref;
|
||
if (ref) {
|
||
var refs = (this._scope || this._context).$refs;
|
||
if (remove) {
|
||
if (refs[ref] === this) {
|
||
refs[ref] = null;
|
||
}
|
||
} else {
|
||
refs[ref] = this;
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Transclude, compile and link element.
|
||
*
|
||
* If a pre-compiled linker is available, that means the
|
||
* passed in element will be pre-transcluded and compiled
|
||
* as well - all we need to do is to call the linker.
|
||
*
|
||
* Otherwise we need to call transclude/compile/link here.
|
||
*
|
||
* @param {Element} el
|
||
*/
|
||
|
||
Vue.prototype._compile = function (el) {
|
||
var options = this.$options;
|
||
|
||
// transclude and init element
|
||
// transclude can potentially replace original
|
||
// so we need to keep reference; this step also injects
|
||
// the template and caches the original attributes
|
||
// on the container node and replacer node.
|
||
var original = el;
|
||
el = transclude(el, options);
|
||
this._initElement(el);
|
||
|
||
// handle v-pre on root node (#2026)
|
||
if (el.nodeType === 1 && getAttr(el, 'v-pre') !== null) {
|
||
return;
|
||
}
|
||
|
||
// root is always compiled per-instance, because
|
||
// container attrs and props can be different every time.
|
||
var contextOptions = this._context && this._context.$options;
|
||
var rootLinker = compileRoot(el, options, contextOptions);
|
||
|
||
// resolve slot distribution
|
||
resolveSlots(this, options._content);
|
||
|
||
// compile and link the rest
|
||
var contentLinkFn;
|
||
var ctor = this.constructor;
|
||
// component compilation can be cached
|
||
// as long as it's not using inline-template
|
||
if (options._linkerCachable) {
|
||
contentLinkFn = ctor.linker;
|
||
if (!contentLinkFn) {
|
||
contentLinkFn = ctor.linker = compile(el, options);
|
||
}
|
||
}
|
||
|
||
// link phase
|
||
// make sure to link root with prop scope!
|
||
var rootUnlinkFn = rootLinker(this, el, this._scope);
|
||
var contentUnlinkFn = contentLinkFn ? contentLinkFn(this, el) : compile(el, options)(this, el);
|
||
|
||
// register composite unlink function
|
||
// to be called during instance destruction
|
||
this._unlinkFn = function () {
|
||
rootUnlinkFn();
|
||
// passing destroying: true to avoid searching and
|
||
// splicing the directives
|
||
contentUnlinkFn(true);
|
||
};
|
||
|
||
// finally replace original
|
||
if (options.replace) {
|
||
replace(original, el);
|
||
}
|
||
|
||
this._isCompiled = true;
|
||
this._callHook('compiled');
|
||
};
|
||
|
||
/**
|
||
* Initialize instance element. Called in the public
|
||
* $mount() method.
|
||
*
|
||
* @param {Element} el
|
||
*/
|
||
|
||
Vue.prototype._initElement = function (el) {
|
||
if (isFragment(el)) {
|
||
this._isFragment = true;
|
||
this.$el = this._fragmentStart = el.firstChild;
|
||
this._fragmentEnd = el.lastChild;
|
||
// set persisted text anchors to empty
|
||
if (this._fragmentStart.nodeType === 3) {
|
||
this._fragmentStart.data = this._fragmentEnd.data = '';
|
||
}
|
||
this._fragment = el;
|
||
} else {
|
||
this.$el = el;
|
||
}
|
||
this.$el.__vue__ = this;
|
||
this._callHook('beforeCompile');
|
||
};
|
||
|
||
/**
|
||
* Create and bind a directive to an element.
|
||
*
|
||
* @param {Object} descriptor - parsed directive descriptor
|
||
* @param {Node} node - target node
|
||
* @param {Vue} [host] - transclusion host component
|
||
* @param {Object} [scope] - v-for scope
|
||
* @param {Fragment} [frag] - owner fragment
|
||
*/
|
||
|
||
Vue.prototype._bindDir = function (descriptor, node, host, scope, frag) {
|
||
this._directives.push(new Directive(descriptor, this, node, host, scope, frag));
|
||
};
|
||
|
||
/**
|
||
* Teardown an instance, unobserves the data, unbind all the
|
||
* directives, turn off all the event listeners, etc.
|
||
*
|
||
* @param {Boolean} remove - whether to remove the DOM node.
|
||
* @param {Boolean} deferCleanup - if true, defer cleanup to
|
||
* be called later
|
||
*/
|
||
|
||
Vue.prototype._destroy = function (remove, deferCleanup) {
|
||
if (this._isBeingDestroyed) {
|
||
if (!deferCleanup) {
|
||
this._cleanup();
|
||
}
|
||
return;
|
||
}
|
||
|
||
var destroyReady;
|
||
var pendingRemoval;
|
||
|
||
var self = this;
|
||
// Cleanup should be called either synchronously or asynchronoysly as
|
||
// callback of this.$remove(), or if remove and deferCleanup are false.
|
||
// In any case it should be called after all other removing, unbinding and
|
||
// turning of is done
|
||
var cleanupIfPossible = function cleanupIfPossible() {
|
||
if (destroyReady && !pendingRemoval && !deferCleanup) {
|
||
self._cleanup();
|
||
}
|
||
};
|
||
|
||
// remove DOM element
|
||
if (remove && this.$el) {
|
||
pendingRemoval = true;
|
||
this.$remove(function () {
|
||
pendingRemoval = false;
|
||
cleanupIfPossible();
|
||
});
|
||
}
|
||
|
||
this._callHook('beforeDestroy');
|
||
this._isBeingDestroyed = true;
|
||
var i;
|
||
// remove self from parent. only necessary
|
||
// if parent is not being destroyed as well.
|
||
var parent = this.$parent;
|
||
if (parent && !parent._isBeingDestroyed) {
|
||
parent.$children.$remove(this);
|
||
// unregister ref (remove: true)
|
||
this._updateRef(true);
|
||
}
|
||
// destroy all children.
|
||
i = this.$children.length;
|
||
while (i--) {
|
||
this.$children[i].$destroy();
|
||
}
|
||
// teardown props
|
||
if (this._propsUnlinkFn) {
|
||
this._propsUnlinkFn();
|
||
}
|
||
// teardown all directives. this also tearsdown all
|
||
// directive-owned watchers.
|
||
if (this._unlinkFn) {
|
||
this._unlinkFn();
|
||
}
|
||
i = this._watchers.length;
|
||
while (i--) {
|
||
this._watchers[i].teardown();
|
||
}
|
||
// remove reference to self on $el
|
||
if (this.$el) {
|
||
this.$el.__vue__ = null;
|
||
}
|
||
|
||
destroyReady = true;
|
||
cleanupIfPossible();
|
||
};
|
||
|
||
/**
|
||
* Clean up to ensure garbage collection.
|
||
* This is called after the leave transition if there
|
||
* is any.
|
||
*/
|
||
|
||
Vue.prototype._cleanup = function () {
|
||
if (this._isDestroyed) {
|
||
return;
|
||
}
|
||
// remove self from owner fragment
|
||
// do it in cleanup so that we can call $destroy with
|
||
// defer right when a fragment is about to be removed.
|
||
if (this._frag) {
|
||
this._frag.children.$remove(this);
|
||
}
|
||
// remove reference from data ob
|
||
// frozen object may not have observer.
|
||
if (this._data && this._data.__ob__) {
|
||
this._data.__ob__.removeVm(this);
|
||
}
|
||
// Clean up references to private properties and other
|
||
// instances. preserve reference to _data so that proxy
|
||
// accessors still work. The only potential side effect
|
||
// here is that mutating the instance after it's destroyed
|
||
// may affect the state of other components that are still
|
||
// observing the same object, but that seems to be a
|
||
// reasonable responsibility for the user rather than
|
||
// always throwing an error on them.
|
||
this.$el = this.$parent = this.$root = this.$children = this._watchers = this._context = this._scope = this._directives = null;
|
||
// call the last hook...
|
||
this._isDestroyed = true;
|
||
this._callHook('destroyed');
|
||
// turn off all instance listeners.
|
||
this.$off();
|
||
};
|
||
}
|
||
|
||
function miscMixin (Vue) {
|
||
/**
|
||
* Apply a list of filter (descriptors) to a value.
|
||
* Using plain for loops here because this will be called in
|
||
* the getter of any watcher with filters so it is very
|
||
* performance sensitive.
|
||
*
|
||
* @param {*} value
|
||
* @param {*} [oldValue]
|
||
* @param {Array} filters
|
||
* @param {Boolean} write
|
||
* @return {*}
|
||
*/
|
||
|
||
Vue.prototype._applyFilters = function (value, oldValue, filters, write) {
|
||
var filter, fn, args, arg, offset, i, l, j, k;
|
||
for (i = 0, l = filters.length; i < l; i++) {
|
||
filter = filters[write ? l - i - 1 : i];
|
||
fn = resolveAsset(this.$options, 'filters', filter.name, true);
|
||
if (!fn) continue;
|
||
fn = write ? fn.write : fn.read || fn;
|
||
if (typeof fn !== 'function') continue;
|
||
args = write ? [value, oldValue] : [value];
|
||
offset = write ? 2 : 1;
|
||
if (filter.args) {
|
||
for (j = 0, k = filter.args.length; j < k; j++) {
|
||
arg = filter.args[j];
|
||
args[j + offset] = arg.dynamic ? this.$get(arg.value) : arg.value;
|
||
}
|
||
}
|
||
value = fn.apply(this, args);
|
||
}
|
||
return value;
|
||
};
|
||
|
||
/**
|
||
* Resolve a component, depending on whether the component
|
||
* is defined normally or using an async factory function.
|
||
* Resolves synchronously if already resolved, otherwise
|
||
* resolves asynchronously and caches the resolved
|
||
* constructor on the factory.
|
||
*
|
||
* @param {String|Function} value
|
||
* @param {Function} cb
|
||
*/
|
||
|
||
Vue.prototype._resolveComponent = function (value, cb) {
|
||
var factory;
|
||
if (typeof value === 'function') {
|
||
factory = value;
|
||
} else {
|
||
factory = resolveAsset(this.$options, 'components', value, true);
|
||
}
|
||
/* istanbul ignore if */
|
||
if (!factory) {
|
||
return;
|
||
}
|
||
// async component factory
|
||
if (!factory.options) {
|
||
if (factory.resolved) {
|
||
// cached
|
||
cb(factory.resolved);
|
||
} else if (factory.requested) {
|
||
// pool callbacks
|
||
factory.pendingCallbacks.push(cb);
|
||
} else {
|
||
factory.requested = true;
|
||
var cbs = factory.pendingCallbacks = [cb];
|
||
factory.call(this, function resolve(res) {
|
||
if (isPlainObject(res)) {
|
||
res = Vue.extend(res);
|
||
}
|
||
// cache resolved
|
||
factory.resolved = res;
|
||
// invoke callbacks
|
||
for (var i = 0, l = cbs.length; i < l; i++) {
|
||
cbs[i](res);
|
||
}
|
||
}, function reject(reason) {
|
||
process.env.NODE_ENV !== 'production' && warn('Failed to resolve async component' + (typeof value === 'string' ? ': ' + value : '') + '. ' + (reason ? '\nReason: ' + reason : ''));
|
||
});
|
||
}
|
||
} else {
|
||
// normal component
|
||
cb(factory);
|
||
}
|
||
};
|
||
}
|
||
|
||
var filterRE$1 = /[^|]\|[^|]/;
|
||
|
||
function dataAPI (Vue) {
|
||
/**
|
||
* Get the value from an expression on this vm.
|
||
*
|
||
* @param {String} exp
|
||
* @param {Boolean} [asStatement]
|
||
* @return {*}
|
||
*/
|
||
|
||
Vue.prototype.$get = function (exp, asStatement) {
|
||
var res = parseExpression(exp);
|
||
if (res) {
|
||
if (asStatement) {
|
||
var self = this;
|
||
return function statementHandler() {
|
||
self.$arguments = toArray(arguments);
|
||
var result = res.get.call(self, self);
|
||
self.$arguments = null;
|
||
return result;
|
||
};
|
||
} else {
|
||
try {
|
||
return res.get.call(this, this);
|
||
} catch (e) {}
|
||
}
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Set the value from an expression on this vm.
|
||
* The expression must be a valid left-hand
|
||
* expression in an assignment.
|
||
*
|
||
* @param {String} exp
|
||
* @param {*} val
|
||
*/
|
||
|
||
Vue.prototype.$set = function (exp, val) {
|
||
var res = parseExpression(exp, true);
|
||
if (res && res.set) {
|
||
res.set.call(this, this, val);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Delete a property on the VM
|
||
*
|
||
* @param {String} key
|
||
*/
|
||
|
||
Vue.prototype.$delete = function (key) {
|
||
del(this._data, key);
|
||
};
|
||
|
||
/**
|
||
* Watch an expression, trigger callback when its
|
||
* value changes.
|
||
*
|
||
* @param {String|Function} expOrFn
|
||
* @param {Function} cb
|
||
* @param {Object} [options]
|
||
* - {Boolean} deep
|
||
* - {Boolean} immediate
|
||
* @return {Function} - unwatchFn
|
||
*/
|
||
|
||
Vue.prototype.$watch = function (expOrFn, cb, options) {
|
||
var vm = this;
|
||
var parsed;
|
||
if (typeof expOrFn === 'string') {
|
||
parsed = parseDirective(expOrFn);
|
||
expOrFn = parsed.expression;
|
||
}
|
||
var watcher = new Watcher(vm, expOrFn, cb, {
|
||
deep: options && options.deep,
|
||
sync: options && options.sync,
|
||
filters: parsed && parsed.filters,
|
||
user: !options || options.user !== false
|
||
});
|
||
if (options && options.immediate) {
|
||
cb.call(vm, watcher.value);
|
||
}
|
||
return function unwatchFn() {
|
||
watcher.teardown();
|
||
};
|
||
};
|
||
|
||
/**
|
||
* Evaluate a text directive, including filters.
|
||
*
|
||
* @param {String} text
|
||
* @param {Boolean} [asStatement]
|
||
* @return {String}
|
||
*/
|
||
|
||
Vue.prototype.$eval = function (text, asStatement) {
|
||
// check for filters.
|
||
if (filterRE$1.test(text)) {
|
||
var dir = parseDirective(text);
|
||
// the filter regex check might give false positive
|
||
// for pipes inside strings, so it's possible that
|
||
// we don't get any filters here
|
||
var val = this.$get(dir.expression, asStatement);
|
||
return dir.filters ? this._applyFilters(val, null, dir.filters) : val;
|
||
} else {
|
||
// no filter
|
||
return this.$get(text, asStatement);
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Interpolate a piece of template text.
|
||
*
|
||
* @param {String} text
|
||
* @return {String}
|
||
*/
|
||
|
||
Vue.prototype.$interpolate = function (text) {
|
||
var tokens = parseText(text);
|
||
var vm = this;
|
||
if (tokens) {
|
||
if (tokens.length === 1) {
|
||
return vm.$eval(tokens[0].value) + '';
|
||
} else {
|
||
return tokens.map(function (token) {
|
||
return token.tag ? vm.$eval(token.value) : token.value;
|
||
}).join('');
|
||
}
|
||
} else {
|
||
return text;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Log instance data as a plain JS object
|
||
* so that it is easier to inspect in console.
|
||
* This method assumes console is available.
|
||
*
|
||
* @param {String} [path]
|
||
*/
|
||
|
||
Vue.prototype.$log = function (path) {
|
||
var data = path ? getPath(this._data, path) : this._data;
|
||
if (data) {
|
||
data = clean(data);
|
||
}
|
||
// include computed fields
|
||
if (!path) {
|
||
var key;
|
||
for (key in this.$options.computed) {
|
||
data[key] = clean(this[key]);
|
||
}
|
||
if (this._props) {
|
||
for (key in this._props) {
|
||
data[key] = clean(this[key]);
|
||
}
|
||
}
|
||
}
|
||
console.log(data);
|
||
};
|
||
|
||
/**
|
||
* "clean" a getter/setter converted object into a plain
|
||
* object copy.
|
||
*
|
||
* @param {Object} - obj
|
||
* @return {Object}
|
||
*/
|
||
|
||
function clean(obj) {
|
||
return JSON.parse(JSON.stringify(obj));
|
||
}
|
||
}
|
||
|
||
function domAPI (Vue) {
|
||
/**
|
||
* Convenience on-instance nextTick. The callback is
|
||
* auto-bound to the instance, and this avoids component
|
||
* modules having to rely on the global Vue.
|
||
*
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
Vue.prototype.$nextTick = function (fn) {
|
||
nextTick(fn, this);
|
||
};
|
||
|
||
/**
|
||
* Append instance to target
|
||
*
|
||
* @param {Node} target
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition] - defaults to true
|
||
*/
|
||
|
||
Vue.prototype.$appendTo = function (target, cb, withTransition) {
|
||
return insert(this, target, cb, withTransition, append, appendWithTransition);
|
||
};
|
||
|
||
/**
|
||
* Prepend instance to target
|
||
*
|
||
* @param {Node} target
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition] - defaults to true
|
||
*/
|
||
|
||
Vue.prototype.$prependTo = function (target, cb, withTransition) {
|
||
target = query(target);
|
||
if (target.hasChildNodes()) {
|
||
this.$before(target.firstChild, cb, withTransition);
|
||
} else {
|
||
this.$appendTo(target, cb, withTransition);
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Insert instance before target
|
||
*
|
||
* @param {Node} target
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition] - defaults to true
|
||
*/
|
||
|
||
Vue.prototype.$before = function (target, cb, withTransition) {
|
||
return insert(this, target, cb, withTransition, beforeWithCb, beforeWithTransition);
|
||
};
|
||
|
||
/**
|
||
* Insert instance after target
|
||
*
|
||
* @param {Node} target
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition] - defaults to true
|
||
*/
|
||
|
||
Vue.prototype.$after = function (target, cb, withTransition) {
|
||
target = query(target);
|
||
if (target.nextSibling) {
|
||
this.$before(target.nextSibling, cb, withTransition);
|
||
} else {
|
||
this.$appendTo(target.parentNode, cb, withTransition);
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Remove instance from DOM
|
||
*
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition] - defaults to true
|
||
*/
|
||
|
||
Vue.prototype.$remove = function (cb, withTransition) {
|
||
if (!this.$el.parentNode) {
|
||
return cb && cb();
|
||
}
|
||
var inDocument = this._isAttached && inDoc(this.$el);
|
||
// if we are not in document, no need to check
|
||
// for transitions
|
||
if (!inDocument) withTransition = false;
|
||
var self = this;
|
||
var realCb = function realCb() {
|
||
if (inDocument) self._callHook('detached');
|
||
if (cb) cb();
|
||
};
|
||
if (this._isFragment) {
|
||
removeNodeRange(this._fragmentStart, this._fragmentEnd, this, this._fragment, realCb);
|
||
} else {
|
||
var op = withTransition === false ? removeWithCb : removeWithTransition;
|
||
op(this.$el, this, realCb);
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Shared DOM insertion function.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {Element} target
|
||
* @param {Function} [cb]
|
||
* @param {Boolean} [withTransition]
|
||
* @param {Function} op1 - op for non-transition insert
|
||
* @param {Function} op2 - op for transition insert
|
||
* @return vm
|
||
*/
|
||
|
||
function insert(vm, target, cb, withTransition, op1, op2) {
|
||
target = query(target);
|
||
var targetIsDetached = !inDoc(target);
|
||
var op = withTransition === false || targetIsDetached ? op1 : op2;
|
||
var shouldCallHook = !targetIsDetached && !vm._isAttached && !inDoc(vm.$el);
|
||
if (vm._isFragment) {
|
||
mapNodeRange(vm._fragmentStart, vm._fragmentEnd, function (node) {
|
||
op(node, target, vm);
|
||
});
|
||
cb && cb();
|
||
} else {
|
||
op(vm.$el, target, vm, cb);
|
||
}
|
||
if (shouldCallHook) {
|
||
vm._callHook('attached');
|
||
}
|
||
return vm;
|
||
}
|
||
|
||
/**
|
||
* Check for selectors
|
||
*
|
||
* @param {String|Element} el
|
||
*/
|
||
|
||
function query(el) {
|
||
return typeof el === 'string' ? document.querySelector(el) : el;
|
||
}
|
||
|
||
/**
|
||
* Append operation that takes a callback.
|
||
*
|
||
* @param {Node} el
|
||
* @param {Node} target
|
||
* @param {Vue} vm - unused
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function append(el, target, vm, cb) {
|
||
target.appendChild(el);
|
||
if (cb) cb();
|
||
}
|
||
|
||
/**
|
||
* InsertBefore operation that takes a callback.
|
||
*
|
||
* @param {Node} el
|
||
* @param {Node} target
|
||
* @param {Vue} vm - unused
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function beforeWithCb(el, target, vm, cb) {
|
||
before(el, target);
|
||
if (cb) cb();
|
||
}
|
||
|
||
/**
|
||
* Remove operation that takes a callback.
|
||
*
|
||
* @param {Node} el
|
||
* @param {Vue} vm - unused
|
||
* @param {Function} [cb]
|
||
*/
|
||
|
||
function removeWithCb(el, vm, cb) {
|
||
remove(el);
|
||
if (cb) cb();
|
||
}
|
||
}
|
||
|
||
function eventsAPI (Vue) {
|
||
/**
|
||
* Listen on the given `event` with `fn`.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
Vue.prototype.$on = function (event, fn) {
|
||
(this._events[event] || (this._events[event] = [])).push(fn);
|
||
modifyListenerCount(this, event, 1);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Adds an `event` listener that will be invoked a single
|
||
* time then automatically removed.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
Vue.prototype.$once = function (event, fn) {
|
||
var self = this;
|
||
function on() {
|
||
self.$off(event, on);
|
||
fn.apply(this, arguments);
|
||
}
|
||
on.fn = fn;
|
||
this.$on(event, on);
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Remove the given callback for `event` or all
|
||
* registered callbacks.
|
||
*
|
||
* @param {String} event
|
||
* @param {Function} fn
|
||
*/
|
||
|
||
Vue.prototype.$off = function (event, fn) {
|
||
var cbs;
|
||
// all
|
||
if (!arguments.length) {
|
||
if (this.$parent) {
|
||
for (event in this._events) {
|
||
cbs = this._events[event];
|
||
if (cbs) {
|
||
modifyListenerCount(this, event, -cbs.length);
|
||
}
|
||
}
|
||
}
|
||
this._events = {};
|
||
return this;
|
||
}
|
||
// specific event
|
||
cbs = this._events[event];
|
||
if (!cbs) {
|
||
return this;
|
||
}
|
||
if (arguments.length === 1) {
|
||
modifyListenerCount(this, event, -cbs.length);
|
||
this._events[event] = null;
|
||
return this;
|
||
}
|
||
// specific handler
|
||
var cb;
|
||
var i = cbs.length;
|
||
while (i--) {
|
||
cb = cbs[i];
|
||
if (cb === fn || cb.fn === fn) {
|
||
modifyListenerCount(this, event, -1);
|
||
cbs.splice(i, 1);
|
||
break;
|
||
}
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Trigger an event on self.
|
||
*
|
||
* @param {String|Object} event
|
||
* @return {Boolean} shouldPropagate
|
||
*/
|
||
|
||
Vue.prototype.$emit = function (event) {
|
||
var isSource = typeof event === 'string';
|
||
event = isSource ? event : event.name;
|
||
var cbs = this._events[event];
|
||
var shouldPropagate = isSource || !cbs;
|
||
if (cbs) {
|
||
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
|
||
// this is a somewhat hacky solution to the question raised
|
||
// in #2102: for an inline component listener like <comp @test="doThis">,
|
||
// the propagation handling is somewhat broken. Therefore we
|
||
// need to treat these inline callbacks differently.
|
||
var hasParentCbs = isSource && cbs.some(function (cb) {
|
||
return cb._fromParent;
|
||
});
|
||
if (hasParentCbs) {
|
||
shouldPropagate = false;
|
||
}
|
||
var args = toArray(arguments, 1);
|
||
for (var i = 0, l = cbs.length; i < l; i++) {
|
||
var cb = cbs[i];
|
||
var res = cb.apply(this, args);
|
||
if (res === true && (!hasParentCbs || cb._fromParent)) {
|
||
shouldPropagate = true;
|
||
}
|
||
}
|
||
}
|
||
return shouldPropagate;
|
||
};
|
||
|
||
/**
|
||
* Recursively broadcast an event to all children instances.
|
||
*
|
||
* @param {String|Object} event
|
||
* @param {...*} additional arguments
|
||
*/
|
||
|
||
Vue.prototype.$broadcast = function (event) {
|
||
var isSource = typeof event === 'string';
|
||
event = isSource ? event : event.name;
|
||
// if no child has registered for this event,
|
||
// then there's no need to broadcast.
|
||
if (!this._eventsCount[event]) return;
|
||
var children = this.$children;
|
||
var args = toArray(arguments);
|
||
if (isSource) {
|
||
// use object event to indicate non-source emit
|
||
// on children
|
||
args[0] = { name: event, source: this };
|
||
}
|
||
for (var i = 0, l = children.length; i < l; i++) {
|
||
var child = children[i];
|
||
var shouldPropagate = child.$emit.apply(child, args);
|
||
if (shouldPropagate) {
|
||
child.$broadcast.apply(child, args);
|
||
}
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Recursively propagate an event up the parent chain.
|
||
*
|
||
* @param {String} event
|
||
* @param {...*} additional arguments
|
||
*/
|
||
|
||
Vue.prototype.$dispatch = function (event) {
|
||
var shouldPropagate = this.$emit.apply(this, arguments);
|
||
if (!shouldPropagate) return;
|
||
var parent = this.$parent;
|
||
var args = toArray(arguments);
|
||
// use object event to indicate non-source emit
|
||
// on parents
|
||
args[0] = { name: event, source: this };
|
||
while (parent) {
|
||
shouldPropagate = parent.$emit.apply(parent, args);
|
||
parent = shouldPropagate ? parent.$parent : null;
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Modify the listener counts on all parents.
|
||
* This bookkeeping allows $broadcast to return early when
|
||
* no child has listened to a certain event.
|
||
*
|
||
* @param {Vue} vm
|
||
* @param {String} event
|
||
* @param {Number} count
|
||
*/
|
||
|
||
var hookRE = /^hook:/;
|
||
function modifyListenerCount(vm, event, count) {
|
||
var parent = vm.$parent;
|
||
// hooks do not get broadcasted so no need
|
||
// to do bookkeeping for them
|
||
if (!parent || !count || hookRE.test(event)) return;
|
||
while (parent) {
|
||
parent._eventsCount[event] = (parent._eventsCount[event] || 0) + count;
|
||
parent = parent.$parent;
|
||
}
|
||
}
|
||
}
|
||
|
||
function lifecycleAPI (Vue) {
|
||
/**
|
||
* Set instance target element and kick off the compilation
|
||
* process. The passed in `el` can be a selector string, an
|
||
* existing Element, or a DocumentFragment (for block
|
||
* instances).
|
||
*
|
||
* @param {Element|DocumentFragment|string} el
|
||
* @public
|
||
*/
|
||
|
||
Vue.prototype.$mount = function (el) {
|
||
if (this._isCompiled) {
|
||
process.env.NODE_ENV !== 'production' && warn('$mount() should be called only once.', this);
|
||
return;
|
||
}
|
||
el = query(el);
|
||
if (!el) {
|
||
el = document.createElement('div');
|
||
}
|
||
this._compile(el);
|
||
this._initDOMHooks();
|
||
if (inDoc(this.$el)) {
|
||
this._callHook('attached');
|
||
ready.call(this);
|
||
} else {
|
||
this.$once('hook:attached', ready);
|
||
}
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Mark an instance as ready.
|
||
*/
|
||
|
||
function ready() {
|
||
this._isAttached = true;
|
||
this._isReady = true;
|
||
this._callHook('ready');
|
||
}
|
||
|
||
/**
|
||
* Teardown the instance, simply delegate to the internal
|
||
* _destroy.
|
||
*
|
||
* @param {Boolean} remove
|
||
* @param {Boolean} deferCleanup
|
||
*/
|
||
|
||
Vue.prototype.$destroy = function (remove, deferCleanup) {
|
||
this._destroy(remove, deferCleanup);
|
||
};
|
||
|
||
/**
|
||
* Partially compile a piece of DOM and return a
|
||
* decompile function.
|
||
*
|
||
* @param {Element|DocumentFragment} el
|
||
* @param {Vue} [host]
|
||
* @param {Object} [scope]
|
||
* @param {Fragment} [frag]
|
||
* @return {Function}
|
||
*/
|
||
|
||
Vue.prototype.$compile = function (el, host, scope, frag) {
|
||
return compile(el, this.$options, true)(this, el, host, scope, frag);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The exposed Vue constructor.
|
||
*
|
||
* API conventions:
|
||
* - public API methods/properties are prefixed with `$`
|
||
* - internal methods/properties are prefixed with `_`
|
||
* - non-prefixed properties are assumed to be proxied user
|
||
* data.
|
||
*
|
||
* @constructor
|
||
* @param {Object} [options]
|
||
* @public
|
||
*/
|
||
|
||
function Vue(options) {
|
||
this._init(options);
|
||
}
|
||
|
||
// install internals
|
||
initMixin(Vue);
|
||
stateMixin(Vue);
|
||
eventsMixin(Vue);
|
||
lifecycleMixin(Vue);
|
||
miscMixin(Vue);
|
||
|
||
// install instance APIs
|
||
dataAPI(Vue);
|
||
domAPI(Vue);
|
||
eventsAPI(Vue);
|
||
lifecycleAPI(Vue);
|
||
|
||
var slot = {
|
||
|
||
priority: SLOT,
|
||
params: ['name'],
|
||
|
||
bind: function bind() {
|
||
// this was resolved during component transclusion
|
||
var name = this.params.name || 'default';
|
||
var content = this.vm._slotContents && this.vm._slotContents[name];
|
||
if (!content || !content.hasChildNodes()) {
|
||
this.fallback();
|
||
} else {
|
||
this.compile(content.cloneNode(true), this.vm._context, this.vm);
|
||
}
|
||
},
|
||
|
||
compile: function compile(content, context, host) {
|
||
if (content && context) {
|
||
if (this.el.hasChildNodes() && content.childNodes.length === 1 && content.childNodes[0].nodeType === 1 && content.childNodes[0].hasAttribute('v-if')) {
|
||
// if the inserted slot has v-if
|
||
// inject fallback content as the v-else
|
||
var elseBlock = document.createElement('template');
|
||
elseBlock.setAttribute('v-else', '');
|
||
elseBlock.innerHTML = this.el.innerHTML;
|
||
// the else block should be compiled in child scope
|
||
elseBlock._context = this.vm;
|
||
content.appendChild(elseBlock);
|
||
}
|
||
var scope = host ? host._scope : this._scope;
|
||
this.unlink = context.$compile(content, host, scope, this._frag);
|
||
}
|
||
if (content) {
|
||
replace(this.el, content);
|
||
} else {
|
||
remove(this.el);
|
||
}
|
||
},
|
||
|
||
fallback: function fallback() {
|
||
this.compile(extractContent(this.el, true), this.vm);
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
if (this.unlink) {
|
||
this.unlink();
|
||
}
|
||
}
|
||
};
|
||
|
||
var partial = {
|
||
|
||
priority: PARTIAL,
|
||
|
||
params: ['name'],
|
||
|
||
// watch changes to name for dynamic partials
|
||
paramWatchers: {
|
||
name: function name(value) {
|
||
vIf.remove.call(this);
|
||
if (value) {
|
||
this.insert(value);
|
||
}
|
||
}
|
||
},
|
||
|
||
bind: function bind() {
|
||
this.anchor = createAnchor('v-partial');
|
||
replace(this.el, this.anchor);
|
||
this.insert(this.params.name);
|
||
},
|
||
|
||
insert: function insert(id) {
|
||
var partial = resolveAsset(this.vm.$options, 'partials', id, true);
|
||
if (partial) {
|
||
this.factory = new FragmentFactory(this.vm, partial);
|
||
vIf.insert.call(this);
|
||
}
|
||
},
|
||
|
||
unbind: function unbind() {
|
||
if (this.frag) {
|
||
this.frag.destroy();
|
||
}
|
||
}
|
||
};
|
||
|
||
var elementDirectives = {
|
||
slot: slot,
|
||
partial: partial
|
||
};
|
||
|
||
var convertArray = vFor._postProcess;
|
||
|
||
/**
|
||
* Limit filter for arrays
|
||
*
|
||
* @param {Number} n
|
||
* @param {Number} offset (Decimal expected)
|
||
*/
|
||
|
||
function limitBy(arr, n, offset) {
|
||
offset = offset ? parseInt(offset, 10) : 0;
|
||
n = toNumber(n);
|
||
return typeof n === 'number' ? arr.slice(offset, offset + n) : arr;
|
||
}
|
||
|
||
/**
|
||
* Filter filter for arrays
|
||
*
|
||
* @param {String} search
|
||
* @param {String} [delimiter]
|
||
* @param {String} ...dataKeys
|
||
*/
|
||
|
||
function filterBy(arr, search, delimiter) {
|
||
arr = convertArray(arr);
|
||
if (search == null) {
|
||
return arr;
|
||
}
|
||
if (typeof search === 'function') {
|
||
return arr.filter(search);
|
||
}
|
||
// cast to lowercase string
|
||
search = ('' + search).toLowerCase();
|
||
// allow optional `in` delimiter
|
||
// because why not
|
||
var n = delimiter === 'in' ? 3 : 2;
|
||
// extract and flatten keys
|
||
var keys = Array.prototype.concat.apply([], toArray(arguments, n));
|
||
var res = [];
|
||
var item, key, val, j;
|
||
for (var i = 0, l = arr.length; i < l; i++) {
|
||
item = arr[i];
|
||
val = item && item.$value || item;
|
||
j = keys.length;
|
||
if (j) {
|
||
while (j--) {
|
||
key = keys[j];
|
||
if (key === '$key' && contains(item.$key, search) || contains(getPath(val, key), search)) {
|
||
res.push(item);
|
||
break;
|
||
}
|
||
}
|
||
} else if (contains(item, search)) {
|
||
res.push(item);
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
/**
|
||
* Filter filter for arrays
|
||
*
|
||
* @param {String|Array<String>|Function} ...sortKeys
|
||
* @param {Number} [order]
|
||
*/
|
||
|
||
function orderBy(arr) {
|
||
var comparator = null;
|
||
var sortKeys = undefined;
|
||
arr = convertArray(arr);
|
||
|
||
// determine order (last argument)
|
||
var args = toArray(arguments, 1);
|
||
var order = args[args.length - 1];
|
||
if (typeof order === 'number') {
|
||
order = order < 0 ? -1 : 1;
|
||
args = args.length > 1 ? args.slice(0, -1) : args;
|
||
} else {
|
||
order = 1;
|
||
}
|
||
|
||
// determine sortKeys & comparator
|
||
var firstArg = args[0];
|
||
if (!firstArg) {
|
||
return arr;
|
||
} else if (typeof firstArg === 'function') {
|
||
// custom comparator
|
||
comparator = function (a, b) {
|
||
return firstArg(a, b) * order;
|
||
};
|
||
} else {
|
||
// string keys. flatten first
|
||
sortKeys = Array.prototype.concat.apply([], args);
|
||
comparator = function (a, b, i) {
|
||
i = i || 0;
|
||
return i >= sortKeys.length - 1 ? baseCompare(a, b, i) : baseCompare(a, b, i) || comparator(a, b, i + 1);
|
||
};
|
||
}
|
||
|
||
function baseCompare(a, b, sortKeyIndex) {
|
||
var sortKey = sortKeys[sortKeyIndex];
|
||
if (sortKey) {
|
||
if (sortKey !== '$key') {
|
||
if (isObject(a) && '$value' in a) a = a.$value;
|
||
if (isObject(b) && '$value' in b) b = b.$value;
|
||
}
|
||
a = isObject(a) ? getPath(a, sortKey) : a;
|
||
b = isObject(b) ? getPath(b, sortKey) : b;
|
||
}
|
||
return a === b ? 0 : a > b ? order : -order;
|
||
}
|
||
|
||
// sort on a copy to avoid mutating original array
|
||
return arr.slice().sort(comparator);
|
||
}
|
||
|
||
/**
|
||
* String contain helper
|
||
*
|
||
* @param {*} val
|
||
* @param {String} search
|
||
*/
|
||
|
||
function contains(val, search) {
|
||
var i;
|
||
if (isPlainObject(val)) {
|
||
var keys = Object.keys(val);
|
||
i = keys.length;
|
||
while (i--) {
|
||
if (contains(val[keys[i]], search)) {
|
||
return true;
|
||
}
|
||
}
|
||
} else if (isArray(val)) {
|
||
i = val.length;
|
||
while (i--) {
|
||
if (contains(val[i], search)) {
|
||
return true;
|
||
}
|
||
}
|
||
} else if (val != null) {
|
||
return val.toString().toLowerCase().indexOf(search) > -1;
|
||
}
|
||
}
|
||
|
||
var digitsRE = /(\d{3})(?=\d)/g;
|
||
|
||
// asset collections must be a plain object.
|
||
var filters = {
|
||
|
||
orderBy: orderBy,
|
||
filterBy: filterBy,
|
||
limitBy: limitBy,
|
||
|
||
/**
|
||
* Stringify value.
|
||
*
|
||
* @param {Number} indent
|
||
*/
|
||
|
||
json: {
|
||
read: function read(value, indent) {
|
||
return typeof value === 'string' ? value : JSON.stringify(value, null, arguments.length > 1 ? indent : 2);
|
||
},
|
||
write: function write(value) {
|
||
try {
|
||
return JSON.parse(value);
|
||
} catch (e) {
|
||
return value;
|
||
}
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 'abc' => 'Abc'
|
||
*/
|
||
|
||
capitalize: function capitalize(value) {
|
||
if (!value && value !== 0) return '';
|
||
value = value.toString();
|
||
return value.charAt(0).toUpperCase() + value.slice(1);
|
||
},
|
||
|
||
/**
|
||
* 'abc' => 'ABC'
|
||
*/
|
||
|
||
uppercase: function uppercase(value) {
|
||
return value || value === 0 ? value.toString().toUpperCase() : '';
|
||
},
|
||
|
||
/**
|
||
* 'AbC' => 'abc'
|
||
*/
|
||
|
||
lowercase: function lowercase(value) {
|
||
return value || value === 0 ? value.toString().toLowerCase() : '';
|
||
},
|
||
|
||
/**
|
||
* 12345 => $12,345.00
|
||
*
|
||
* @param {String} sign
|
||
* @param {Number} decimals Decimal places
|
||
*/
|
||
|
||
currency: function currency(value, _currency, decimals) {
|
||
value = parseFloat(value);
|
||
if (!isFinite(value) || !value && value !== 0) return '';
|
||
_currency = _currency != null ? _currency : '$';
|
||
decimals = decimals != null ? decimals : 2;
|
||
var stringified = Math.abs(value).toFixed(decimals);
|
||
var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified;
|
||
var i = _int.length % 3;
|
||
var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';
|
||
var _float = decimals ? stringified.slice(-1 - decimals) : '';
|
||
var sign = value < 0 ? '-' : '';
|
||
return sign + _currency + head + _int.slice(i).replace(digitsRE, '$1,') + _float;
|
||
},
|
||
|
||
/**
|
||
* 'item' => 'items'
|
||
*
|
||
* @params
|
||
* an array of strings corresponding to
|
||
* the single, double, triple ... forms of the word to
|
||
* be pluralized. When the number to be pluralized
|
||
* exceeds the length of the args, it will use the last
|
||
* entry in the array.
|
||
*
|
||
* e.g. ['single', 'double', 'triple', 'multiple']
|
||
*/
|
||
|
||
pluralize: function pluralize(value) {
|
||
var args = toArray(arguments, 1);
|
||
var length = args.length;
|
||
if (length > 1) {
|
||
var index = value % 10 - 1;
|
||
return index in args ? args[index] : args[length - 1];
|
||
} else {
|
||
return args[0] + (value === 1 ? '' : 's');
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Debounce a handler function.
|
||
*
|
||
* @param {Function} handler
|
||
* @param {Number} delay = 300
|
||
* @return {Function}
|
||
*/
|
||
|
||
debounce: function debounce(handler, delay) {
|
||
if (!handler) return;
|
||
if (!delay) {
|
||
delay = 300;
|
||
}
|
||
return _debounce(handler, delay);
|
||
}
|
||
};
|
||
|
||
function installGlobalAPI (Vue) {
|
||
/**
|
||
* Vue and every constructor that extends Vue has an
|
||
* associated options object, which can be accessed during
|
||
* compilation steps as `this.constructor.options`.
|
||
*
|
||
* These can be seen as the default options of every
|
||
* Vue instance.
|
||
*/
|
||
|
||
Vue.options = {
|
||
directives: directives,
|
||
elementDirectives: elementDirectives,
|
||
filters: filters,
|
||
transitions: {},
|
||
components: {},
|
||
partials: {},
|
||
replace: true
|
||
};
|
||
|
||
/**
|
||
* Expose useful internals
|
||
*/
|
||
|
||
Vue.util = util;
|
||
Vue.config = config;
|
||
Vue.set = set;
|
||
Vue['delete'] = del;
|
||
Vue.nextTick = nextTick;
|
||
|
||
/**
|
||
* The following are exposed for advanced usage / plugins
|
||
*/
|
||
|
||
Vue.compiler = compiler;
|
||
Vue.FragmentFactory = FragmentFactory;
|
||
Vue.internalDirectives = internalDirectives;
|
||
Vue.parsers = {
|
||
path: path,
|
||
text: text,
|
||
template: template,
|
||
directive: directive,
|
||
expression: expression
|
||
};
|
||
|
||
/**
|
||
* Each instance constructor, including Vue, has a unique
|
||
* cid. This enables us to create wrapped "child
|
||
* constructors" for prototypal inheritance and cache them.
|
||
*/
|
||
|
||
Vue.cid = 0;
|
||
var cid = 1;
|
||
|
||
/**
|
||
* Class inheritance
|
||
*
|
||
* @param {Object} extendOptions
|
||
*/
|
||
|
||
Vue.extend = function (extendOptions) {
|
||
extendOptions = extendOptions || {};
|
||
var Super = this;
|
||
var isFirstExtend = Super.cid === 0;
|
||
if (isFirstExtend && extendOptions._Ctor) {
|
||
return extendOptions._Ctor;
|
||
}
|
||
var name = extendOptions.name || Super.options.name;
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
if (!/^[a-zA-Z][\w-]*$/.test(name)) {
|
||
warn('Invalid component name: "' + name + '". Component names ' + 'can only contain alphanumeric characaters and the hyphen.');
|
||
name = null;
|
||
}
|
||
}
|
||
var Sub = createClass(name || 'VueComponent');
|
||
Sub.prototype = Object.create(Super.prototype);
|
||
Sub.prototype.constructor = Sub;
|
||
Sub.cid = cid++;
|
||
Sub.options = mergeOptions(Super.options, extendOptions);
|
||
Sub['super'] = Super;
|
||
// allow further extension
|
||
Sub.extend = Super.extend;
|
||
// create asset registers, so extended classes
|
||
// can have their private assets too.
|
||
config._assetTypes.forEach(function (type) {
|
||
Sub[type] = Super[type];
|
||
});
|
||
// enable recursive self-lookup
|
||
if (name) {
|
||
Sub.options.components[name] = Sub;
|
||
}
|
||
// cache constructor
|
||
if (isFirstExtend) {
|
||
extendOptions._Ctor = Sub;
|
||
}
|
||
return Sub;
|
||
};
|
||
|
||
/**
|
||
* A function that returns a sub-class constructor with the
|
||
* given name. This gives us much nicer output when
|
||
* logging instances in the console.
|
||
*
|
||
* @param {String} name
|
||
* @return {Function}
|
||
*/
|
||
|
||
function createClass(name) {
|
||
/* eslint-disable no-new-func */
|
||
return new Function('return function ' + classify(name) + ' (options) { this._init(options) }')();
|
||
/* eslint-enable no-new-func */
|
||
}
|
||
|
||
/**
|
||
* Plugin system
|
||
*
|
||
* @param {Object} plugin
|
||
*/
|
||
|
||
Vue.use = function (plugin) {
|
||
/* istanbul ignore if */
|
||
if (plugin.installed) {
|
||
return;
|
||
}
|
||
// additional parameters
|
||
var args = toArray(arguments, 1);
|
||
args.unshift(this);
|
||
if (typeof plugin.install === 'function') {
|
||
plugin.install.apply(plugin, args);
|
||
} else {
|
||
plugin.apply(null, args);
|
||
}
|
||
plugin.installed = true;
|
||
return this;
|
||
};
|
||
|
||
/**
|
||
* Apply a global mixin by merging it into the default
|
||
* options.
|
||
*/
|
||
|
||
Vue.mixin = function (mixin) {
|
||
Vue.options = mergeOptions(Vue.options, mixin);
|
||
};
|
||
|
||
/**
|
||
* Create asset registration methods with the following
|
||
* signature:
|
||
*
|
||
* @param {String} id
|
||
* @param {*} definition
|
||
*/
|
||
|
||
config._assetTypes.forEach(function (type) {
|
||
Vue[type] = function (id, definition) {
|
||
if (!definition) {
|
||
return this.options[type + 's'][id];
|
||
} else {
|
||
/* istanbul ignore if */
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
if (type === 'component' && (commonTagRE.test(id) || reservedTagRE.test(id))) {
|
||
warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + id);
|
||
}
|
||
}
|
||
if (type === 'component' && isPlainObject(definition)) {
|
||
if (!definition.name) {
|
||
definition.name = id;
|
||
}
|
||
definition = Vue.extend(definition);
|
||
}
|
||
this.options[type + 's'][id] = definition;
|
||
return definition;
|
||
}
|
||
};
|
||
});
|
||
|
||
// expose internal transition API
|
||
extend(Vue.transition, transition);
|
||
}
|
||
|
||
installGlobalAPI(Vue);
|
||
|
||
Vue.version = '1.0.26';
|
||
|
||
// devtools global hook
|
||
/* istanbul ignore next */
|
||
setTimeout(function () {
|
||
if (config.devtools) {
|
||
if (devtools) {
|
||
devtools.emit('init', Vue);
|
||
} else if (process.env.NODE_ENV !== 'production' && inBrowser && /Chrome\/\d+/.test(window.navigator.userAgent)) {
|
||
console.log('Download the Vue Devtools for a better development experience:\n' + 'https://github.com/vuejs/vue-devtools');
|
||
}
|
||
}
|
||
}, 0);
|
||
|
||
module.exports = Vue;
|
||
/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(2)))
|
||
|
||
/***/ },
|
||
/* 2 */
|
||
/***/ function(module, exports) {
|
||
|
||
// shim for using process in browser
|
||
|
||
var process = module.exports = {};
|
||
|
||
// cached from whatever global is present so that test runners that stub it
|
||
// don't break things. But we need to wrap it in a try catch in case it is
|
||
// wrapped in strict mode code which doesn't define any globals. It's inside a
|
||
// function because try/catches deoptimize in certain engines.
|
||
|
||
var cachedSetTimeout;
|
||
var cachedClearTimeout;
|
||
|
||
(function () {
|
||
try {
|
||
cachedSetTimeout = setTimeout;
|
||
} catch (e) {
|
||
cachedSetTimeout = function () {
|
||
throw new Error('setTimeout is not defined');
|
||
}
|
||
}
|
||
try {
|
||
cachedClearTimeout = clearTimeout;
|
||
} catch (e) {
|
||
cachedClearTimeout = function () {
|
||
throw new Error('clearTimeout is not defined');
|
||
}
|
||
}
|
||
} ())
|
||
var queue = [];
|
||
var draining = false;
|
||
var currentQueue;
|
||
var queueIndex = -1;
|
||
|
||
function cleanUpNextTick() {
|
||
if (!draining || !currentQueue) {
|
||
return;
|
||
}
|
||
draining = false;
|
||
if (currentQueue.length) {
|
||
queue = currentQueue.concat(queue);
|
||
} else {
|
||
queueIndex = -1;
|
||
}
|
||
if (queue.length) {
|
||
drainQueue();
|
||
}
|
||
}
|
||
|
||
function drainQueue() {
|
||
if (draining) {
|
||
return;
|
||
}
|
||
var timeout = cachedSetTimeout.call(null, cleanUpNextTick);
|
||
draining = true;
|
||
|
||
var len = queue.length;
|
||
while(len) {
|
||
currentQueue = queue;
|
||
queue = [];
|
||
while (++queueIndex < len) {
|
||
if (currentQueue) {
|
||
currentQueue[queueIndex].run();
|
||
}
|
||
}
|
||
queueIndex = -1;
|
||
len = queue.length;
|
||
}
|
||
currentQueue = null;
|
||
draining = false;
|
||
cachedClearTimeout.call(null, timeout);
|
||
}
|
||
|
||
process.nextTick = function (fun) {
|
||
var args = new Array(arguments.length - 1);
|
||
if (arguments.length > 1) {
|
||
for (var i = 1; i < arguments.length; i++) {
|
||
args[i - 1] = arguments[i];
|
||
}
|
||
}
|
||
queue.push(new Item(fun, args));
|
||
if (queue.length === 1 && !draining) {
|
||
cachedSetTimeout.call(null, drainQueue, 0);
|
||
}
|
||
};
|
||
|
||
// v8 likes predictible objects
|
||
function Item(fun, array) {
|
||
this.fun = fun;
|
||
this.array = array;
|
||
}
|
||
Item.prototype.run = function () {
|
||
this.fun.apply(null, this.array);
|
||
};
|
||
process.title = 'browser';
|
||
process.browser = true;
|
||
process.env = {};
|
||
process.argv = [];
|
||
process.version = ''; // empty string to avoid regexp issues
|
||
process.versions = {};
|
||
|
||
function noop() {}
|
||
|
||
process.on = noop;
|
||
process.addListener = noop;
|
||
process.once = noop;
|
||
process.off = noop;
|
||
process.removeListener = noop;
|
||
process.removeAllListeners = noop;
|
||
process.emit = noop;
|
||
|
||
process.binding = function (name) {
|
||
throw new Error('process.binding is not supported');
|
||
};
|
||
|
||
process.cwd = function () { return '/' };
|
||
process.chdir = function (dir) {
|
||
throw new Error('process.chdir is not supported');
|
||
};
|
||
process.umask = function() { return 0; };
|
||
|
||
|
||
/***/ },
|
||
/* 3 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__vue_script__ = __webpack_require__(4)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/App.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(79)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-42321fc5/App.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 4 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _vueMultiselect = __webpack_require__(5);
|
||
|
||
var _vueMultiselect2 = _interopRequireDefault(_vueMultiselect);
|
||
|
||
var _Editor = __webpack_require__(6);
|
||
|
||
var _Editor2 = _interopRequireDefault(_Editor);
|
||
|
||
var _DNSConfig = __webpack_require__(20);
|
||
|
||
var _DNSConfig2 = _interopRequireDefault(_DNSConfig);
|
||
|
||
__webpack_require__(76);
|
||
|
||
var _lodash = __webpack_require__(77);
|
||
|
||
var _lodash2 = _interopRequireDefault(_lodash);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
window._ = _lodash2.default;
|
||
|
||
exports.default = {
|
||
data: function data() {
|
||
return {
|
||
domains: [],
|
||
vars: [],
|
||
content: window.initialScript,
|
||
config: null,
|
||
error: null,
|
||
lastSelected: ""
|
||
};
|
||
},
|
||
created: function created() {
|
||
this.parse();
|
||
},
|
||
methods: {
|
||
parse: function parse() {
|
||
var domainRE = this.buildDomainRegex();
|
||
var match;
|
||
var domains = [];
|
||
while (match = domainRE.exec(this.content)) {
|
||
domains.push(match[2]);
|
||
}
|
||
domains.sort(function (a, b) {
|
||
return a.toLowerCase().localeCompare(b.toLowerCase());
|
||
});
|
||
var varRE = this.buildVarRegex();
|
||
var vars = [];
|
||
while (match = varRE.exec(this.content)) {
|
||
vars.push(match[1]);
|
||
}
|
||
vars.sort(function (a, b) {
|
||
return a.toLowerCase().localeCompare(b.toLowerCase());
|
||
});
|
||
this.domains = domains;
|
||
this.vars = vars;
|
||
this.run();
|
||
},
|
||
textChanged: function textChanged(e) {
|
||
this.content = e;
|
||
this.parse();
|
||
},
|
||
domainSelect: function domainSelect(val) {
|
||
var searchRegex = this.buildDomainRegex(val);
|
||
this.$refs.editor.jump(searchRegex);
|
||
this.lastSelected = val;
|
||
},
|
||
varSelect: function varSelect(val) {
|
||
var searchRegex = this.buildVarRegex(val);
|
||
this.$refs.editor.jump(searchRegex);
|
||
},
|
||
buildDomainRegex: function buildDomainRegex(d) {
|
||
if (!d) {
|
||
d = "((?:\\\\\\1|.)*?)";
|
||
}
|
||
return new RegExp("^\\s*D\\s*\\(\\s*(['\"])" + d + "\\1", "gm");
|
||
},
|
||
buildVarRegex: function buildVarRegex(v) {
|
||
if (!v) {
|
||
v = "([^\\s=]+)";
|
||
}
|
||
return new RegExp("^\s*var " + v, "gm");
|
||
},
|
||
run: function run() {
|
||
this.error = null;
|
||
this.config = null;
|
||
try {
|
||
initialize();
|
||
eval(this.content);
|
||
this.config = conf;
|
||
this.stale = false;
|
||
} catch (e) {
|
||
this.error = e.toString();
|
||
}
|
||
},
|
||
save: function save() {
|
||
fetch('/api/save', {
|
||
method: 'POST',
|
||
body: this.content
|
||
});
|
||
}
|
||
},
|
||
components: { Multiselect: _vueMultiselect2.default, Editor: _Editor2.default, DnsConfig: _DNSConfig2.default }
|
||
};
|
||
|
||
/***/ },
|
||
/* 5 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
!function(t,e){ true?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.VueMultiselect=e():t.VueMultiselect=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var o=n[i]={exports:{},id:i,loaded:!1};return t[i].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="/",e(0)}([function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0}),e.pointerMixin=e.multiselectMixin=e.Multiselect=void 0;var o=n(81),r=i(o),s=n(28),l=i(s),a=n(29),u=i(a);e["default"]=r["default"],e.Multiselect=r["default"],e.multiselectMixin=l["default"],e.pointerMixin=u["default"]},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var i=n(56),o=n(15);t.exports=function(t){return i(o(t))}},function(t,e){var n=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},function(t,e,n){t.exports=!n(9)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){var i=n(7),o=n(13);t.exports=n(5)?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var i=n(11),o=n(32),r=n(25),s=Object.defineProperty;e.f=n(5)?Object.defineProperty:function(t,e,n){if(i(t),e=r(e,!0),i(n),o)try{return s(t,e,n)}catch(l){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var i=n(23)("wks"),o=n(14),r=n(1).Symbol,s="function"==typeof r,l=t.exports=function(t){return i[t]||(i[t]=s&&r[t]||(s?r:o)("Symbol."+t))};l.store=i},function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},function(t,e,n){var i=n(37),o=n(16);t.exports=Object.keys||function(t){return i(t,o)}},function(t,e,n){var i=n(12);t.exports=function(t){if(!i(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,i=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+i).toString(36))}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var i=n(1),o=n(4),r=n(53),s=n(6),l="prototype",a=function(t,e,n){var u,c,f,p=t&a.F,d=t&a.G,h=t&a.S,m=t&a.P,v=t&a.B,b=t&a.W,g=d?o:o[e]||(o[e]={}),y=g[l],x=d?i:h?i[e]:(i[e]||{})[l];d&&(n=e);for(u in n)c=!p&&x&&void 0!==x[u],c&&u in g||(f=c?x[u]:n[u],g[u]=d&&"function"!=typeof x[u]?n[u]:v&&c?r(f,i):b&&x[u]==f?function(t){var e=function(e,n,i){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,i)}return t.apply(this,arguments)};return e[l]=t[l],e}(f):m&&"function"==typeof f?r(Function.call,f):f,m&&((g.virtual||(g.virtual={}))[u]=f,t&a.R&&y&&!y[u]&&s(y,u,f)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,e){t.exports={}},function(t,e){t.exports=!0},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var i=n(7).f,o=n(2),r=n(8)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,r)&&i(t,r,{configurable:!0,value:e})}},function(t,e,n){var i=n(23)("keys"),o=n(14);t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){var i=n(1),o="__core-js_shared__",r=i[o]||(i[o]={});t.exports=function(t){return r[t]||(r[t]={})}},function(t,e){var n=Math.ceil,i=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?i:n)(t)}},function(t,e,n){var i=n(12);t.exports=function(t,e){if(!i(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!i(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!i(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!i(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var i=n(1),o=n(4),r=n(19),s=n(27),l=n(7).f;t.exports=function(t){var e=o.Symbol||(o.Symbol=r?{}:i.Symbol||{});"_"==t.charAt(0)||t in e||l(e,t,{value:s.f(t)})}},function(t,e,n){e.f=n(8)},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}function o(t){if(Array.isArray(t))return t.map(o);if(t&&"object"===("undefined"==typeof t?"undefined":(0,c["default"])(t))){for(var e={},n=(0,a["default"])(t),i=0,r=n.length;r>i;i++){var s=n[i];e[s]=o(t[s])}return e}return t}var r=n(41),s=i(r),l=n(42),a=i(l),u=n(45),c=i(u);t.exports={data:function(){return{search:"",isOpen:!1,value:[],loading:!1}},props:{options:{type:Array,required:!0},multiple:{type:Boolean,"default":!1},selected:{required:!0},key:{type:String,"default":!1},label:{type:String,"default":!1},searchable:{type:Boolean,"default":!0},clearOnSelect:{type:Boolean,"default":!0},hideSelected:{type:Boolean,"default":!1},placeholder:{type:String,"default":"Select option"},maxHeight:{type:Number,"default":300},allowEmpty:{type:Boolean,"default":!0},onChange:{type:Function,"default":!1},onSearchChange:{type:Function,"default":!1},touched:{type:Boolean,"default":!1},resetAfter:{type:Boolean,"default":!1},closeOnSelect:{type:Boolean,"default":!0},customLabel:{type:Function,"default":!1},taggable:{type:Boolean,"default":!1},onTag:{type:Function,"default":function(t){this.options.push(t),this.value.push(t)}},tagPlaceholder:{type:String,"default":"Press enter to create a tag"},max:{type:Number,"default":!1}},created:function(){this.selected?this.value=o(this.selected):this.$set("value",this.multiple?[]:null),this.searchable&&!this.multiple&&(this.search=this.getOptionLabel(this.value))},computed:{filteredOptions:function(){var t=this.search||"",e=this.hideSelected?this.options.filter(this.isNotSelected):this.options;return e=this.$options.filters.filterBy(e,this.search),this.taggable&&t.length&&!this.isExistingOption(t)&&e.unshift({isTag:!0,label:t}),e},valueKeys:function(){var t=this;return this.key?this.multiple?this.value.map(function(e){return e[t.key]}):this.value[this.key]:this.value},optionKeys:function(){var t=this;return this.label?this.options.map(function(e){return e[t.label]}):this.options}},watch:{value:function(){this.onChange&&(0,s["default"])(this.value)!==(0,s["default"])(this.selected)?this.onChange(o(this.value)):this.$set("selected",o(this.value)),this.resetAfter&&(this.$set("value",null),this.$set("search",null),this.$set("selected",null)),!this.multiple&&this.searchable&&this.clearOnSelect&&(this.search=this.getOptionLabel(this.value))},search:function(){this.onSearchChange&&(this.onSearchChange(this.search),this.loading=!0)},options:function(){this.onSearchChange&&(this.loading=!1)},selected:function(t,e){(0,s["default"])(t)!==(0,s["default"])(e)&&(this.value=o(this.selected))}},methods:{isExistingOption:function(t){return this.options?this.optionKeys.indexOf(t)>-1:!1},isSelected:function(t){if(!this.value)return!1;var e=this.key?t[this.key]:t;return this.multiple?this.valueKeys.indexOf(e)>-1:this.valueKeys===e},isNotSelected:function(t){return!this.isSelected(t)},getOptionLabel:function(t){return"object"!==("undefined"==typeof t?"undefined":(0,c["default"])(t))||null===t?t:this.customLabel?this.customLabel(t):this.label&&t[this.label]?t[this.label]:t.label?t.label:void 0},select:function(t){this.max&&this.multiple&&this.value.length===this.max||(t.isTag?(this.onTag(t.label),this.search=""):this.multiple?this.isNotSelected(t)?(this.value.push(t),this.clearOnSelect&&(this.search="")):this.removeElement(t):(this.$set("value",!this.isNotSelected(t)&&this.allowEmpty?null:t),this.closeOnSelect&&(this.searchable?this.$els.search.blur():this.$el.blur())))},removeElement:function(t){if(this.allowEmpty||this.value.length>1)if(this.multiple&&"object"===("undefined"==typeof t?"undefined":(0,c["default"])(t))){var e=this.valueKeys.indexOf(t[this.key]);this.value.splice(e,1)}else this.value.$remove(t)},removeLastElement:function(){0===this.search.length&&Array.isArray(this.value)&&this.removeElement(this.value[this.value.length-1])},activate:function(){this.isOpen||(this.isOpen=!0,this.searchable?(this.search="",this.$els.search.focus()):this.$el.focus())},deactivate:function(){this.isOpen&&(this.isOpen=!1,this.touched=!0,this.searchable?(this.$els.search.blur(),this.search=this.multiple?"":this.getOptionLabel(this.value)):this.$el.blur())},toggle:function(){this.isOpen?this.deactivate():this.activate()}}}},function(t,e){"use strict";t.exports={data:function(){return{pointer:0}},props:{showPointer:{type:Boolean,"default":!0}},methods:{addPointerElement:function(){this.filteredOptions.length>0&&this.select(this.filteredOptions[this.pointer]),this.pointerReset()},pointerForward:function(){if(this.pointer<this.filteredOptions.length-1){this.pointer++;var t=40*this.pointer,e=this.maxHeight/40;this.$els.list.scrollTop<=t-40*e&&(this.$els.list.scrollTop=t-40*(e-1))}},pointerBackward:function(){if(this.pointer>0){this.pointer--;var t=40*this.pointer;this.$els.list.scrollTop>=t&&(this.$els.list.scrollTop=t)}},pointerReset:function(){this.pointer=0,this.$els.list&&(this.$els.list.scrollTop=0)},pointerSet:function(t){this.pointer=t}}}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var i=n(12),o=n(1).document,r=i(o)&&i(o.createElement);t.exports=function(t){return r?o.createElement(t):{}}},function(t,e,n){t.exports=!n(5)&&!n(9)(function(){return 7!=Object.defineProperty(n(31)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){"use strict";var i=n(19),o=n(17),r=n(38),s=n(6),l=n(2),a=n(18),u=n(58),c=n(21),f=n(65),p=n(8)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",b=function(){return this};t.exports=function(t,e,n,g,y,x,_){u(n,e,g);var w,O,S,k=function(t){if(!d&&t in P)return P[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},j=e+" Iterator",E=y==v,M=!1,P=t.prototype,L=P[p]||P[h]||y&&P[y],N=L||k(y),T=y?E?k("entries"):N:void 0,A="Array"==e?P.entries||L:L;if(A&&(S=f(A.call(new t)),S!==Object.prototype&&(c(S,j,!0),i||l(S,p)||s(S,p,b))),E&&L&&L.name!==v&&(M=!0,N=function(){return L.call(this)}),i&&!_||!d&&!M&&P[p]||s(P,p,N),a[e]=N,a[j]=b,y)if(w={values:E?N:k(v),keys:x?N:k(m),entries:T},_)for(O in w)O in P||r(P,O,w[O]);else o(o.P+o.F*(d||M),e,w);return w}},function(t,e,n){var i=n(11),o=n(62),r=n(16),s=n(22)("IE_PROTO"),l=function(){},a="prototype",u=function(){var t,e=n(31)("iframe"),i=r.length,o=">";for(e.style.display="none",n(55).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("<script>document.F=Object</script"+o),t.close(),u=t.F;i--;)delete u[a][r[i]];return u()};t.exports=Object.create||function(t,e){var n;return null!==t?(l[a]=i(t),n=new l,l[a]=null,n[s]=t):n=u(),void 0===e?n:o(n,e)}},function(t,e,n){var i=n(37),o=n(16).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return i(t,o)}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var i=n(2),o=n(3),r=n(52)(!1),s=n(22)("IE_PROTO");t.exports=function(t,e){var n,l=o(t),a=0,u=[];for(n in l)n!=s&&i(l,n)&&u.push(n);for(;e.length>a;)i(l,n=e[a++])&&(~r(u,n)||u.push(n));return u}},function(t,e,n){t.exports=n(6)},function(t,e,n){var i=n(15);t.exports=function(t){return Object(i(t))}},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(28),r=i(o),s=n(29),l=i(s);e["default"]={mixins:[r["default"],l["default"]],props:{selectLabel:{type:String,"default":"Press enter to select"},selectedLabel:{type:String,"default":"Selected"},deselectLabel:{type:String,"default":"Press enter to remove"},showLabels:{type:Boolean,"default":!0},limit:{type:Number,"default":99999},limitText:{type:Function,"default":function(t){return"and "+t+" more"}}},computed:{visibleValue:function(){return this.multiple?this.value.slice(0,this.limit):this.value}},ready:function(){this.showLabels||(this.deselectLabel=this.selectedLabel=this.selectLabel="")}}},function(t,e,n){t.exports={"default":n(46),__esModule:!0}},function(t,e,n){t.exports={"default":n(47),__esModule:!0}},function(t,e,n){t.exports={"default":n(48),__esModule:!0}},function(t,e,n){t.exports={"default":n(49),__esModule:!0}},function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var o=n(44),r=i(o),s=n(43),l=i(s),a="function"==typeof l["default"]&&"symbol"==typeof r["default"]?function(t){return typeof t}:function(t){return t&&"function"==typeof l["default"]&&t.constructor===l["default"]?"symbol":typeof t};e["default"]="function"==typeof l["default"]&&"symbol"===a(r["default"])?function(t){return"undefined"==typeof t?"undefined":a(t)}:function(t){return t&&"function"==typeof l["default"]&&t.constructor===l["default"]?"symbol":"undefined"==typeof t?"undefined":a(t)}},function(t,e,n){var i=n(4),o=i.JSON||(i.JSON={stringify:JSON.stringify});t.exports=function(t){return o.stringify.apply(o,arguments)}},function(t,e,n){n(71),t.exports=n(4).Object.keys},function(t,e,n){n(74),n(72),n(75),n(76),t.exports=n(4).Symbol},function(t,e,n){n(73),n(77),t.exports=n(27).f("iterator")},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){t.exports=function(){}},function(t,e,n){var i=n(3),o=n(69),r=n(68);t.exports=function(t){return function(e,n,s){var l,a=i(e),u=o(a.length),c=r(s,u);if(t&&n!=n){for(;u>c;)if(l=a[c++],l!=l)return!0}else for(;u>c;c++)if((t||c in a)&&a[c]===n)return t||c||0;return!t&&-1}}},function(t,e,n){var i=n(50);t.exports=function(t,e,n){if(i(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,o){return t.call(e,n,i,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var i=n(10),o=n(36),r=n(20);t.exports=function(t){var e=i(t),n=o.f;if(n)for(var s,l=n(t),a=r.f,u=0;l.length>u;)a.call(t,s=l[u++])&&e.push(s);return e}},function(t,e,n){t.exports=n(1).document&&document.documentElement},function(t,e,n){var i=n(30);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==i(t)?t.split(""):Object(t)}},function(t,e,n){var i=n(30);t.exports=Array.isArray||function(t){return"Array"==i(t)}},function(t,e,n){"use strict";var i=n(34),o=n(13),r=n(21),s={};n(6)(s,n(8)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=i(s,{next:o(1,n)}),r(t,e+" Iterator")}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var i=n(10),o=n(3);t.exports=function(t,e){for(var n,r=o(t),s=i(r),l=s.length,a=0;l>a;)if(r[n=s[a++]]===e)return n}},function(t,e,n){var i=n(14)("meta"),o=n(12),r=n(2),s=n(7).f,l=0,a=Object.isExtensible||function(){return!0},u=!n(9)(function(){return a(Object.preventExtensions({}))}),c=function(t){s(t,i,{value:{i:"O"+ ++l,w:{}}})},f=function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!r(t,i)){if(!a(t))return"F";if(!e)return"E";c(t)}return t[i].i},p=function(t,e){if(!r(t,i)){if(!a(t))return!0;if(!e)return!1;c(t)}return t[i].w},d=function(t){return u&&h.NEED&&a(t)&&!r(t,i)&&c(t),t},h=t.exports={KEY:i,NEED:!1,fastKey:f,getWeak:p,onFreeze:d}},function(t,e,n){var i=n(7),o=n(11),r=n(10);t.exports=n(5)?Object.defineProperties:function(t,e){o(t);for(var n,s=r(e),l=s.length,a=0;l>a;)i.f(t,n=s[a++],e[n]);return t}},function(t,e,n){var i=n(20),o=n(13),r=n(3),s=n(25),l=n(2),a=n(32),u=Object.getOwnPropertyDescriptor;e.f=n(5)?u:function(t,e){if(t=r(t),e=s(e,!0),a)try{return u(t,e)}catch(n){}return l(t,e)?o(!i.f.call(t,e),t[e]):void 0}},function(t,e,n){var i=n(3),o=n(35).f,r={}.toString,s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],l=function(t){try{return o(t)}catch(e){return s.slice()}};t.exports.f=function(t){return s&&"[object Window]"==r.call(t)?l(t):o(i(t))}},function(t,e,n){var i=n(2),o=n(39),r=n(22)("IE_PROTO"),s=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),i(t,r)?t[r]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?s:null}},function(t,e,n){var i=n(17),o=n(4),r=n(9);t.exports=function(t,e){var n=(o.Object||{})[t]||Object[t],s={};s[t]=e(n),i(i.S+i.F*r(function(){n(1)}),"Object",s)}},function(t,e,n){var i=n(24),o=n(15);t.exports=function(t){return function(e,n){var r,s,l=String(o(e)),a=i(n),u=l.length;return 0>a||a>=u?t?"":void 0:(r=l.charCodeAt(a),55296>r||r>56319||a+1===u||(s=l.charCodeAt(a+1))<56320||s>57343?t?l.charAt(a):r:t?l.slice(a,a+2):(r-55296<<10)+(s-56320)+65536)}}},function(t,e,n){var i=n(24),o=Math.max,r=Math.min;t.exports=function(t,e){return t=i(t),0>t?o(t+e,0):r(t,e)}},function(t,e,n){var i=n(24),o=Math.min;t.exports=function(t){return t>0?o(i(t),9007199254740991):0}},function(t,e,n){"use strict";var i=n(51),o=n(59),r=n(18),s=n(3);t.exports=n(33)(Array,"Array",function(t,e){this._t=s(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):"keys"==e?o(0,n):"values"==e?o(0,t[n]):o(0,[n,t[n]])},"values"),r.Arguments=r.Array,i("keys"),i("values"),i("entries")},function(t,e,n){var i=n(39),o=n(10);n(66)("keys",function(){return function(t){return o(i(t))}})},function(t,e){},function(t,e,n){"use strict";var i=n(67)(!0);n(33)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=i(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){"use strict";var i=n(1),o=n(2),r=n(5),s=n(17),l=n(38),a=n(61).KEY,u=n(9),c=n(23),f=n(21),p=n(14),d=n(8),h=n(27),m=n(26),v=n(60),b=n(54),g=n(57),y=n(11),x=n(3),_=n(25),w=n(13),O=n(34),S=n(64),k=n(63),j=n(7),E=n(10),M=k.f,P=j.f,L=S.f,N=i.Symbol,T=i.JSON,A=T&&T.stringify,C="prototype",F=d("_hidden"),$=d("toPrimitive"),B={}.propertyIsEnumerable,z=c("symbol-registry"),I=c("symbols"),R=c("op-symbols"),K=Object[C],J="function"==typeof N,D=i.QObject,W=!D||!D[C]||!D[C].findChild,H=r&&u(function(){return 7!=O(P({},"a",{get:function(){return P(this,"a",{value:7}).a}})).a})?function(t,e,n){var i=M(K,e);i&&delete K[e],P(t,e,n),i&&t!==K&&P(K,e,i)}:P,U=function(t){var e=I[t]=O(N[C]);return e._k=t,e},V=J&&"symbol"==typeof N.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof N},q=function(t,e,n){return t===K&&q(R,e,n),y(t),e=_(e,!0),y(n),o(I,e)?(n.enumerable?(o(t,F)&&t[F][e]&&(t[F][e]=!1),n=O(n,{enumerable:w(0,!1)})):(o(t,F)||P(t,F,w(1,{})),t[F][e]=!0),H(t,e,n)):P(t,e,n)},G=function(t,e){y(t);for(var n,i=b(e=x(e)),o=0,r=i.length;r>o;)q(t,n=i[o++],e[n]);return t},Y=function(t,e){return void 0===e?O(t):G(O(t),e)},Q=function(t){var e=B.call(this,t=_(t,!0));return this===K&&o(I,t)&&!o(R,t)?!1:e||!o(this,t)||!o(I,t)||o(this,F)&&this[F][t]?e:!0},X=function(t,e){if(t=x(t),e=_(e,!0),t!==K||!o(I,e)||o(R,e)){var n=M(t,e);return!n||!o(I,e)||o(t,F)&&t[F][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=L(x(t)),i=[],r=0;n.length>r;)o(I,e=n[r++])||e==F||e==a||i.push(e);return i},tt=function(t){for(var e,n=t===K,i=L(n?R:x(t)),r=[],s=0;i.length>s;)o(I,e=i[s++])&&(n?o(K,e):!0)&&r.push(I[e]);return r};J||(N=function(){if(this instanceof N)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),e=function(n){this===K&&e.call(R,n),o(this,F)&&o(this[F],t)&&(this[F][t]=!1),H(this,t,w(1,n))};return r&&W&&H(K,t,{configurable:!0,set:e}),U(t)},l(N[C],"toString",function(){return this._k}),k.f=X,j.f=q,n(35).f=S.f=Z,n(20).f=Q,n(36).f=tt,r&&!n(19)&&l(K,"propertyIsEnumerable",Q,!0),h.f=function(t){return U(d(t))}),s(s.G+s.W+s.F*!J,{Symbol:N});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)d(et[nt++]);for(var et=E(d.store),nt=0;et.length>nt;)m(et[nt++]);s(s.S+s.F*!J,"Symbol",{"for":function(t){return o(z,t+="")?z[t]:z[t]=N(t)},keyFor:function(t){if(V(t))return v(z,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){W=!0},useSimple:function(){W=!1}}),s(s.S+s.F*!J,"Object",{create:Y,defineProperty:q,defineProperties:G,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),T&&s(s.S+s.F*(!J||u(function(){var t=N();return"[null]"!=A([t])||"{}"!=A({a:t})||"{}"!=A(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,n,i=[t],o=1;arguments.length>o;)i.push(arguments[o++]);return e=i[1],"function"==typeof e&&(n=e),!n&&g(e)||(e=function(t,e){return n&&(e=n.call(this,t,e)),V(e)?void 0:e}),i[1]=e,A.apply(T,i)}}}),N[C][$]||n(6)(N[C],$,N[C].valueOf),f(N,"Symbol"),f(Math,"Math",!0),f(i.JSON,"JSON",!0)},function(t,e,n){n(26)("asyncIterator")},function(t,e,n){n(26)("observable")},function(t,e,n){n(70);for(var i=n(1),o=n(6),r=n(18),s=n(8)("toStringTag"),l=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],a=0;5>a;a++){var u=l[a],c=i[u],f=c&&c.prototype;f&&!f[s]&&o(f,s,u),r[u]=r.Array}},function(t,e,n){e=t.exports=n(79)(),e.push([t.id,'.multiselect__spinner{position:absolute;right:1px;top:1px;width:48px;height:35px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{-webkit-animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.multiselect__spinner:after{-webkit-animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.multiselect__loading-transition{-webkit-transition:opacity .4s ease-in-out;transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:14px}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--active{z-index:50}.multiselect--active .multiselect__current,.multiselect--active .multiselect__input,.multiselect--active .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:1px 0 0 5px;width:100%;-webkit-transition:border .1s ease;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px}.multiselect__tag~.multiselect__input{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:6px;margin-bottom:8px}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:8px}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:initial;width:22px;text-align:center;line-height:22px;-webkit-transition:all .2s ease;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"\\D7";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus,.multiselect__tag-icon:hover{background:#369a6e}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0;border-color:#999 transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content{position:absolute;list-style:none;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;padding:0;margin:0;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50}.multiselect__content::webkit-scrollbar{display:none}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{content:attr(data-deselect);color:#fff}.multiselect--disabled{background:#ededed;pointer-events:none}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select,.multiselect__option--disabled{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{cursor:text;pointer-events:none}.multiselect__option--disabled:visited{color:#a6a6a6}.multiselect__option--disabled:focus,.multiselect__option--disabled:hover{background:#3dad7b}.multiselect-transition{-webkit-transition:all .3s ease;transition:all .3s ease}.multiselect-enter,.multiselect-leave{opacity:0;max-height:0!important}@-webkit-keyframes spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(2turn);transform:rotate(2turn)}}@keyframes spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(2turn);transform:rotate(2turn)}}',""])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e<this.length;e++){var n=this[e];n[2]?t.push("@media "+n[2]+"{"+n[1]+"}"):t.push(n[1])}return t.join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var i={},o=0;o<this.length;o++){var r=this[o][0];"number"==typeof r&&(i[r]=!0)}for(o=0;o<e.length;o++){var s=e[o];"number"==typeof s[0]&&i[s[0]]||(n&&!s[2]?s[2]=n:n&&(s[2]="("+s[2]+") and ("+n+")"),t.push(s))}},t}},function(t,e){t.exports='<div tabindex=0 :class="{ \'multiselect--active\': isOpen }" @focus=activate() @blur="searchable ? false : deactivate()" @keydown.self.down.prevent=pointerForward() @keydown.self.up.prevent=pointerBackward() @keydown.enter.stop.prevent.self=addPointerElement() @keyup.esc=deactivate() class=multiselect> <div @mousedown.prevent=toggle() class=multiselect__select></div> <div v-el:tags=v-el:tags class=multiselect__tags> <span v-if=multiple v-for="option in visibleValue" track-by=$index onmousedown=event.preventDefault() class=multiselect__tag> {{ getOptionLabel(option) }} <i aria-hidden=true tabindex=1 @keydown.enter.prevent=removeElement(option) @mousedown.prevent=removeElement(option) class=multiselect__tag-icon></i> </span> <template v-if="value && value.length > limit"> <strong>{{ limitText(value.length - limit) }}</strong> </template> <div v-show=loading transition=multiselect__loading class=multiselect__spinner></div> <input name=search type=text autocomplete=off :placeholder=placeholder v-el:search v-if=searchable v-model=search @focus.prevent=activate() @blur.prevent=deactivate() @input=pointerReset() @keyup.esc=deactivate() @keyup.down=pointerForward() @keyup.up=pointerBackward() @keydown.enter.stop.prevent.self=addPointerElement() @keydown.delete=removeLastElement() class=multiselect__input /> <span v-if="!searchable && !multiple" class=multiselect__single>{{ getOptionLabel(value) ? getOptionLabel(value) : placeholder }}</span> </div> <ul transition=multiselect :style="{ maxHeight: maxHeight + \'px\' }" v-el:list=v-el:list v-show=isOpen class=multiselect__content> <slot name=beforeList></slot> <li v-if="multiple && max === value.length"> <span class=multiselect__option> <slot name=maxElements>Maximum of {{ max }} options selected. First remove a selected option to select another.</slot> </span> </li> <template v-if="!max || value.length < max"> <li v-for="option in filteredOptions" track-by=$index> <span tabindex=0 :class="{ \'multiselect__option--highlight\': $index === pointer && this.showPointer, \'multiselect__option--selected\': !isNotSelected(option) }" @mousedown.prevent=select(option) @mouseover=pointerSet($index) :data-select="option.isTag ? tagPlaceholder : selectLabel" :data-selected=selectedLabel :data-deselect=deselectLabel class=multiselect__option> {{ getOptionLabel(option) }} </span> </li> </template> <li v-show="filteredOptions.length === 0 && search"> <span class=multiselect__option> <slot name=noResult>No elements found. Consider changing the search query.</slot> </span> </li> <slot name=afterList></slot> </ul> </div>'},function(t,e,n){var i,o;n(83),i=n(40),o=n(80),t.exports=i||{},t.exports.__esModule&&(t.exports=t.exports["default"]),o&&(("function"==typeof t.exports?t.exports.options||(t.exports.options={}):t.exports).template=o)},function(t,e,n){function i(t,e){for(var n=0;n<t.length;n++){var i=t[n],o=f[i.id];if(o){o.refs++;for(var r=0;r<o.parts.length;r++)o.parts[r](i.parts[r]);for(;r<i.parts.length;r++)o.parts.push(a(i.parts[r],e))}else{for(var s=[],r=0;r<i.parts.length;r++)s.push(a(i.parts[r],e));f[i.id]={id:i.id,refs:1,parts:s}}}}function o(t){for(var e=[],n={},i=0;i<t.length;i++){var o=t[i],r=o[0],s=o[1],l=o[2],a=o[3],u={css:s,media:l,sourceMap:a};n[r]?n[r].parts.push(u):e.push(n[r]={id:r,parts:[u]})}return e}function r(t,e){var n=h(),i=b[b.length-1];if("top"===t.insertAt)i?i.nextSibling?n.insertBefore(e,i.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),b.push(e);else{if("bottom"!==t.insertAt)throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");n.appendChild(e)}}function s(t){t.parentNode.removeChild(t);var e=b.indexOf(t);e>=0&&b.splice(e,1)}function l(t){var e=document.createElement("style");return e.type="text/css",r(t,e),e}function a(t,e){var n,i,o;if(e.singleton){var r=v++;n=m||(m=l(e)),i=u.bind(null,n,r,!1),o=u.bind(null,n,r,!0)}else n=l(e),i=c.bind(null,n),o=function(){s(n)};return i(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;i(t=e)}else o()}}function u(t,e,n,i){var o=n?"":i.css;if(t.styleSheet)t.styleSheet.cssText=g(e,o);else{var r=document.createTextNode(o),s=t.childNodes;
|
||
s[e]&&t.removeChild(s[e]),s.length?t.insertBefore(r,s[e]):t.appendChild(r)}}function c(t,e){var n=e.css,i=e.media,o=e.sourceMap;if(i&&t.setAttribute("media",i),o&&(n+="\n/*# sourceURL="+o.sources[0]+" */",n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */"),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var f={},p=function(t){var e;return function(){return"undefined"==typeof e&&(e=t.apply(this,arguments)),e}},d=p(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),h=p(function(){return document.head||document.getElementsByTagName("head")[0]}),m=null,v=0,b=[];t.exports=function(t,e){e=e||{},"undefined"==typeof e.singleton&&(e.singleton=d()),"undefined"==typeof e.insertAt&&(e.insertAt="bottom");var n=o(t);return i(n,e),function(t){for(var r=[],s=0;s<n.length;s++){var l=n[s],a=f[l.id];a.refs--,r.push(a)}if(t){var u=o(t);i(u,e)}for(var s=0;s<r.length;s++){var a=r[s];if(0===a.refs){for(var c=0;c<a.parts.length;c++)a.parts[c]();delete f[a.id]}}}};var g=function(){var t=[];return function(e,n){return t[e]=n,t.filter(Boolean).join("\n")}}()},function(t,e,n){var i=n(78);"string"==typeof i&&(i=[[t.id,i,""]]);n(82)(i,{});i.locals&&(t.exports=i.locals)}])});
|
||
|
||
|
||
/***/ },
|
||
/* 6 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(7)
|
||
__vue_script__ = __webpack_require__(11)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/Editor.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(19)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-8eefa30e/Editor.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 7 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(8);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Editor.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Editor.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 8 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.editor{\n width: 100%;\n height: 500px;\n}\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 9 */
|
||
/***/ function(module, exports) {
|
||
|
||
/*
|
||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
Author Tobias Koppers @sokra
|
||
*/
|
||
// css base code, injected by the css-loader
|
||
module.exports = function() {
|
||
var list = [];
|
||
|
||
// return the list of modules as css string
|
||
list.toString = function toString() {
|
||
var result = [];
|
||
for(var i = 0; i < this.length; i++) {
|
||
var item = this[i];
|
||
if(item[2]) {
|
||
result.push("@media " + item[2] + "{" + item[1] + "}");
|
||
} else {
|
||
result.push(item[1]);
|
||
}
|
||
}
|
||
return result.join("");
|
||
};
|
||
|
||
// import a list of modules into the list
|
||
list.i = function(modules, mediaQuery) {
|
||
if(typeof modules === "string")
|
||
modules = [[null, modules, ""]];
|
||
var alreadyImportedModules = {};
|
||
for(var i = 0; i < this.length; i++) {
|
||
var id = this[i][0];
|
||
if(typeof id === "number")
|
||
alreadyImportedModules[id] = true;
|
||
}
|
||
for(i = 0; i < modules.length; i++) {
|
||
var item = modules[i];
|
||
// skip already imported module
|
||
// this implementation is not 100% perfect for weird media query combinations
|
||
// when a module is imported multiple times with different media queries.
|
||
// I hope this will never occur (Hey this way we have smaller bundles)
|
||
if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
|
||
if(mediaQuery && !item[2]) {
|
||
item[2] = mediaQuery;
|
||
} else if(mediaQuery) {
|
||
item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
|
||
}
|
||
list.push(item);
|
||
}
|
||
}
|
||
};
|
||
return list;
|
||
};
|
||
|
||
|
||
/***/ },
|
||
/* 10 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
/*
|
||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
Author Tobias Koppers @sokra
|
||
*/
|
||
var stylesInDom = {},
|
||
memoize = function(fn) {
|
||
var memo;
|
||
return function () {
|
||
if (typeof memo === "undefined") memo = fn.apply(this, arguments);
|
||
return memo;
|
||
};
|
||
},
|
||
isOldIE = memoize(function() {
|
||
return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
|
||
}),
|
||
getHeadElement = memoize(function () {
|
||
return document.head || document.getElementsByTagName("head")[0];
|
||
}),
|
||
singletonElement = null,
|
||
singletonCounter = 0,
|
||
styleElementsInsertedAtTop = [];
|
||
|
||
module.exports = function(list, options) {
|
||
if(false) {
|
||
if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
|
||
}
|
||
|
||
options = options || {};
|
||
// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
|
||
// tags it will allow on a page
|
||
if (typeof options.singleton === "undefined") options.singleton = isOldIE();
|
||
|
||
// By default, add <style> tags to the bottom of <head>.
|
||
if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
|
||
|
||
var styles = listToStyles(list);
|
||
addStylesToDom(styles, options);
|
||
|
||
return function update(newList) {
|
||
var mayRemove = [];
|
||
for(var i = 0; i < styles.length; i++) {
|
||
var item = styles[i];
|
||
var domStyle = stylesInDom[item.id];
|
||
domStyle.refs--;
|
||
mayRemove.push(domStyle);
|
||
}
|
||
if(newList) {
|
||
var newStyles = listToStyles(newList);
|
||
addStylesToDom(newStyles, options);
|
||
}
|
||
for(var i = 0; i < mayRemove.length; i++) {
|
||
var domStyle = mayRemove[i];
|
||
if(domStyle.refs === 0) {
|
||
for(var j = 0; j < domStyle.parts.length; j++)
|
||
domStyle.parts[j]();
|
||
delete stylesInDom[domStyle.id];
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
function addStylesToDom(styles, options) {
|
||
for(var i = 0; i < styles.length; i++) {
|
||
var item = styles[i];
|
||
var domStyle = stylesInDom[item.id];
|
||
if(domStyle) {
|
||
domStyle.refs++;
|
||
for(var j = 0; j < domStyle.parts.length; j++) {
|
||
domStyle.parts[j](item.parts[j]);
|
||
}
|
||
for(; j < item.parts.length; j++) {
|
||
domStyle.parts.push(addStyle(item.parts[j], options));
|
||
}
|
||
} else {
|
||
var parts = [];
|
||
for(var j = 0; j < item.parts.length; j++) {
|
||
parts.push(addStyle(item.parts[j], options));
|
||
}
|
||
stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
|
||
}
|
||
}
|
||
}
|
||
|
||
function listToStyles(list) {
|
||
var styles = [];
|
||
var newStyles = {};
|
||
for(var i = 0; i < list.length; i++) {
|
||
var item = list[i];
|
||
var id = item[0];
|
||
var css = item[1];
|
||
var media = item[2];
|
||
var sourceMap = item[3];
|
||
var part = {css: css, media: media, sourceMap: sourceMap};
|
||
if(!newStyles[id])
|
||
styles.push(newStyles[id] = {id: id, parts: [part]});
|
||
else
|
||
newStyles[id].parts.push(part);
|
||
}
|
||
return styles;
|
||
}
|
||
|
||
function insertStyleElement(options, styleElement) {
|
||
var head = getHeadElement();
|
||
var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
|
||
if (options.insertAt === "top") {
|
||
if(!lastStyleElementInsertedAtTop) {
|
||
head.insertBefore(styleElement, head.firstChild);
|
||
} else if(lastStyleElementInsertedAtTop.nextSibling) {
|
||
head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
|
||
} else {
|
||
head.appendChild(styleElement);
|
||
}
|
||
styleElementsInsertedAtTop.push(styleElement);
|
||
} else if (options.insertAt === "bottom") {
|
||
head.appendChild(styleElement);
|
||
} else {
|
||
throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
|
||
}
|
||
}
|
||
|
||
function removeStyleElement(styleElement) {
|
||
styleElement.parentNode.removeChild(styleElement);
|
||
var idx = styleElementsInsertedAtTop.indexOf(styleElement);
|
||
if(idx >= 0) {
|
||
styleElementsInsertedAtTop.splice(idx, 1);
|
||
}
|
||
}
|
||
|
||
function createStyleElement(options) {
|
||
var styleElement = document.createElement("style");
|
||
styleElement.type = "text/css";
|
||
insertStyleElement(options, styleElement);
|
||
return styleElement;
|
||
}
|
||
|
||
function addStyle(obj, options) {
|
||
var styleElement, update, remove;
|
||
|
||
if (options.singleton) {
|
||
var styleIndex = singletonCounter++;
|
||
styleElement = singletonElement || (singletonElement = createStyleElement(options));
|
||
update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
|
||
remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
|
||
} else {
|
||
styleElement = createStyleElement(options);
|
||
update = applyToTag.bind(null, styleElement);
|
||
remove = function() {
|
||
removeStyleElement(styleElement);
|
||
};
|
||
}
|
||
|
||
update(obj);
|
||
|
||
return function updateStyle(newObj) {
|
||
if(newObj) {
|
||
if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
|
||
return;
|
||
update(obj = newObj);
|
||
} else {
|
||
remove();
|
||
}
|
||
};
|
||
}
|
||
|
||
var replaceText = (function () {
|
||
var textStore = [];
|
||
|
||
return function (index, replacement) {
|
||
textStore[index] = replacement;
|
||
return textStore.filter(Boolean).join('\n');
|
||
};
|
||
})();
|
||
|
||
function applyToSingletonTag(styleElement, index, remove, obj) {
|
||
var css = remove ? "" : obj.css;
|
||
|
||
if (styleElement.styleSheet) {
|
||
styleElement.styleSheet.cssText = replaceText(index, css);
|
||
} else {
|
||
var cssNode = document.createTextNode(css);
|
||
var childNodes = styleElement.childNodes;
|
||
if (childNodes[index]) styleElement.removeChild(childNodes[index]);
|
||
if (childNodes.length) {
|
||
styleElement.insertBefore(cssNode, childNodes[index]);
|
||
} else {
|
||
styleElement.appendChild(cssNode);
|
||
}
|
||
}
|
||
}
|
||
|
||
function applyToTag(styleElement, obj) {
|
||
var css = obj.css;
|
||
var media = obj.media;
|
||
var sourceMap = obj.sourceMap;
|
||
|
||
if (media) {
|
||
styleElement.setAttribute("media", media);
|
||
}
|
||
|
||
if (sourceMap) {
|
||
// https://developer.chrome.com/devtools/docs/javascript-debugging
|
||
// this makes source maps inside style tags work properly in Chrome
|
||
css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */';
|
||
// http://stackoverflow.com/a/26603875
|
||
css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
|
||
}
|
||
|
||
if (styleElement.styleSheet) {
|
||
styleElement.styleSheet.cssText = css;
|
||
} else {
|
||
while(styleElement.firstChild) {
|
||
styleElement.removeChild(styleElement.firstChild);
|
||
}
|
||
styleElement.appendChild(document.createTextNode(css));
|
||
}
|
||
}
|
||
|
||
|
||
/***/ },
|
||
/* 11 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _brace = __webpack_require__(12);
|
||
|
||
var _brace2 = _interopRequireDefault(_brace);
|
||
|
||
__webpack_require__(15);
|
||
|
||
__webpack_require__(17);
|
||
|
||
__webpack_require__(18);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
text: { type: String, required: true },
|
||
onChange: { type: Function }
|
||
},
|
||
data: function data() {
|
||
return {
|
||
editor: null,
|
||
debounced: null
|
||
};
|
||
},
|
||
methods: {
|
||
change: function change(e) {
|
||
if (!this.debounced) {
|
||
var self = this;
|
||
this.debounced = _.debounce(function () {
|
||
if (self.onChange) {
|
||
self.onChange(self.editor.getValue());
|
||
}
|
||
}, 500);
|
||
}
|
||
this.debounced();
|
||
},
|
||
jump: function jump(r) {
|
||
this.editor.find(r, {
|
||
backwards: false,
|
||
wrap: true,
|
||
caseSensitive: false,
|
||
wholeWord: false,
|
||
regExp: true
|
||
});
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var el = this.$els.editor;
|
||
this.editor = _brace2.default.edit(el);
|
||
this.editor.getSession().setMode('ace/mode/javascript');
|
||
this.editor.getSession().on('change', this.change);
|
||
this.editor.setOptions({
|
||
enableBasicAutocompletion: true
|
||
});
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 12 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
/* ***** BEGIN LICENSE BLOCK *****
|
||
* Distributed under the BSD license:
|
||
*
|
||
* Copyright (c) 2010, Ajax.org B.V.
|
||
* All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions are met:
|
||
* * Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* * Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* * Neither the name of Ajax.org B.V. nor the
|
||
* names of its contributors may be used to endorse or promote products
|
||
* derived from this software without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
|
||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
*
|
||
* ***** END LICENSE BLOCK ***** */
|
||
|
||
/**
|
||
* Define a module along with a payload
|
||
* @param module a name for the payload
|
||
* @param payload a function to call with (acequire, exports, module) params
|
||
*/
|
||
|
||
(function() {
|
||
|
||
var ACE_NAMESPACE = "ace";
|
||
|
||
var global = (function() { return this; })();
|
||
if (!global && typeof window != "undefined") global = window; // strict mode
|
||
|
||
|
||
if (!ACE_NAMESPACE && typeof acequirejs !== "undefined")
|
||
return;
|
||
|
||
|
||
var define = function(module, deps, payload) {
|
||
if (typeof module !== "string") {
|
||
if (define.original)
|
||
define.original.apply(this, arguments);
|
||
else {
|
||
console.error("dropping module because define wasn\'t a string.");
|
||
console.trace();
|
||
}
|
||
return;
|
||
}
|
||
if (arguments.length == 2)
|
||
payload = deps;
|
||
if (!define.modules[module]) {
|
||
define.payloads[module] = payload;
|
||
define.modules[module] = null;
|
||
}
|
||
};
|
||
|
||
define.modules = {};
|
||
define.payloads = {};
|
||
|
||
/**
|
||
* Get at functionality define()ed using the function above
|
||
*/
|
||
var _acequire = function(parentId, module, callback) {
|
||
if (typeof module === "string") {
|
||
var payload = lookup(parentId, module);
|
||
if (payload != undefined) {
|
||
callback && callback();
|
||
return payload;
|
||
}
|
||
} else if (Object.prototype.toString.call(module) === "[object Array]") {
|
||
var params = [];
|
||
for (var i = 0, l = module.length; i < l; ++i) {
|
||
var dep = lookup(parentId, module[i]);
|
||
if (dep == undefined && acequire.original)
|
||
return;
|
||
params.push(dep);
|
||
}
|
||
return callback && callback.apply(null, params) || true;
|
||
}
|
||
};
|
||
|
||
var acequire = function(module, callback) {
|
||
var packagedModule = _acequire("", module, callback);
|
||
if (packagedModule == undefined && acequire.original)
|
||
return acequire.original.apply(this, arguments);
|
||
return packagedModule;
|
||
};
|
||
|
||
var normalizeModule = function(parentId, moduleName) {
|
||
// normalize plugin acequires
|
||
if (moduleName.indexOf("!") !== -1) {
|
||
var chunks = moduleName.split("!");
|
||
return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);
|
||
}
|
||
// normalize relative acequires
|
||
if (moduleName.charAt(0) == ".") {
|
||
var base = parentId.split("/").slice(0, -1).join("/");
|
||
moduleName = base + "/" + moduleName;
|
||
|
||
while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
|
||
var previous = moduleName;
|
||
moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
|
||
}
|
||
}
|
||
return moduleName;
|
||
};
|
||
|
||
/**
|
||
* Internal function to lookup moduleNames and resolve them by calling the
|
||
* definition function if needed.
|
||
*/
|
||
var lookup = function(parentId, moduleName) {
|
||
moduleName = normalizeModule(parentId, moduleName);
|
||
|
||
var module = define.modules[moduleName];
|
||
if (!module) {
|
||
module = define.payloads[moduleName];
|
||
if (typeof module === 'function') {
|
||
var exports = {};
|
||
var mod = {
|
||
id: moduleName,
|
||
uri: '',
|
||
exports: exports,
|
||
packaged: true
|
||
};
|
||
|
||
var req = function(module, callback) {
|
||
return _acequire(moduleName, module, callback);
|
||
};
|
||
|
||
var returnValue = module(req, exports, mod);
|
||
exports = returnValue || mod.exports;
|
||
define.modules[moduleName] = exports;
|
||
delete define.payloads[moduleName];
|
||
}
|
||
module = define.modules[moduleName] = exports || module;
|
||
}
|
||
return module;
|
||
};
|
||
|
||
function exportAce(ns) {
|
||
var root = global;
|
||
if (ns) {
|
||
if (!global[ns])
|
||
global[ns] = {};
|
||
root = global[ns];
|
||
}
|
||
|
||
if (!root.define || !root.define.packaged) {
|
||
define.original = root.define;
|
||
root.define = define;
|
||
root.define.packaged = true;
|
||
}
|
||
|
||
if (!root.acequire || !root.acequire.packaged) {
|
||
acequire.original = root.acequire;
|
||
root.acequire = acequire;
|
||
root.acequire.packaged = true;
|
||
}
|
||
}
|
||
|
||
exportAce(ACE_NAMESPACE);
|
||
|
||
})();
|
||
|
||
ace.define("ace/lib/regexp",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var real = {
|
||
exec: RegExp.prototype.exec,
|
||
test: RegExp.prototype.test,
|
||
match: String.prototype.match,
|
||
replace: String.prototype.replace,
|
||
split: String.prototype.split
|
||
},
|
||
compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups
|
||
compliantLastIndexIncrement = function () {
|
||
var x = /^/g;
|
||
real.test.call(x, "");
|
||
return !x.lastIndex;
|
||
}();
|
||
|
||
if (compliantLastIndexIncrement && compliantExecNpcg)
|
||
return;
|
||
RegExp.prototype.exec = function (str) {
|
||
var match = real.exec.apply(this, arguments),
|
||
name, r2;
|
||
if ( typeof(str) == 'string' && match) {
|
||
if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) {
|
||
r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", ""));
|
||
real.replace.call(str.slice(match.index), r2, function () {
|
||
for (var i = 1; i < arguments.length - 2; i++) {
|
||
if (arguments[i] === undefined)
|
||
match[i] = undefined;
|
||
}
|
||
});
|
||
}
|
||
if (this._xregexp && this._xregexp.captureNames) {
|
||
for (var i = 1; i < match.length; i++) {
|
||
name = this._xregexp.captureNames[i - 1];
|
||
if (name)
|
||
match[name] = match[i];
|
||
}
|
||
}
|
||
if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
|
||
this.lastIndex--;
|
||
}
|
||
return match;
|
||
};
|
||
if (!compliantLastIndexIncrement) {
|
||
RegExp.prototype.test = function (str) {
|
||
var match = real.exec.call(this, str);
|
||
if (match && this.global && !match[0].length && (this.lastIndex > match.index))
|
||
this.lastIndex--;
|
||
return !!match;
|
||
};
|
||
}
|
||
|
||
function getNativeFlags (regex) {
|
||
return (regex.global ? "g" : "") +
|
||
(regex.ignoreCase ? "i" : "") +
|
||
(regex.multiline ? "m" : "") +
|
||
(regex.extended ? "x" : "") + // Proposed for ES4; included in AS3
|
||
(regex.sticky ? "y" : "");
|
||
}
|
||
|
||
function indexOf (array, item, from) {
|
||
if (Array.prototype.indexOf) // Use the native array method if available
|
||
return array.indexOf(item, from);
|
||
for (var i = from || 0; i < array.length; i++) {
|
||
if (array[i] === item)
|
||
return i;
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/es5-shim",["require","exports","module"], function(acequire, exports, module) {
|
||
|
||
function Empty() {}
|
||
|
||
if (!Function.prototype.bind) {
|
||
Function.prototype.bind = function bind(that) { // .length is 1
|
||
var target = this;
|
||
if (typeof target != "function") {
|
||
throw new TypeError("Function.prototype.bind called on incompatible " + target);
|
||
}
|
||
var args = slice.call(arguments, 1); // for normal call
|
||
var bound = function () {
|
||
|
||
if (this instanceof bound) {
|
||
|
||
var result = target.apply(
|
||
this,
|
||
args.concat(slice.call(arguments))
|
||
);
|
||
if (Object(result) === result) {
|
||
return result;
|
||
}
|
||
return this;
|
||
|
||
} else {
|
||
return target.apply(
|
||
that,
|
||
args.concat(slice.call(arguments))
|
||
);
|
||
|
||
}
|
||
|
||
};
|
||
if(target.prototype) {
|
||
Empty.prototype = target.prototype;
|
||
bound.prototype = new Empty();
|
||
Empty.prototype = null;
|
||
}
|
||
return bound;
|
||
};
|
||
}
|
||
var call = Function.prototype.call;
|
||
var prototypeOfArray = Array.prototype;
|
||
var prototypeOfObject = Object.prototype;
|
||
var slice = prototypeOfArray.slice;
|
||
var _toString = call.bind(prototypeOfObject.toString);
|
||
var owns = call.bind(prototypeOfObject.hasOwnProperty);
|
||
var defineGetter;
|
||
var defineSetter;
|
||
var lookupGetter;
|
||
var lookupSetter;
|
||
var supportsAccessors;
|
||
if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
|
||
defineGetter = call.bind(prototypeOfObject.__defineGetter__);
|
||
defineSetter = call.bind(prototypeOfObject.__defineSetter__);
|
||
lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
|
||
lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
|
||
}
|
||
if ([1,2].splice(0).length != 2) {
|
||
if(function() { // test IE < 9 to splice bug - see issue #138
|
||
function makeArray(l) {
|
||
var a = new Array(l+2);
|
||
a[0] = a[1] = 0;
|
||
return a;
|
||
}
|
||
var array = [], lengthBefore;
|
||
|
||
array.splice.apply(array, makeArray(20));
|
||
array.splice.apply(array, makeArray(26));
|
||
|
||
lengthBefore = array.length; //46
|
||
array.splice(5, 0, "XXX"); // add one element
|
||
|
||
lengthBefore + 1 == array.length
|
||
|
||
if (lengthBefore + 1 == array.length) {
|
||
return true;// has right splice implementation without bugs
|
||
}
|
||
}()) {//IE 6/7
|
||
var array_splice = Array.prototype.splice;
|
||
Array.prototype.splice = function(start, deleteCount) {
|
||
if (!arguments.length) {
|
||
return [];
|
||
} else {
|
||
return array_splice.apply(this, [
|
||
start === void 0 ? 0 : start,
|
||
deleteCount === void 0 ? (this.length - start) : deleteCount
|
||
].concat(slice.call(arguments, 2)))
|
||
}
|
||
};
|
||
} else {//IE8
|
||
Array.prototype.splice = function(pos, removeCount){
|
||
var length = this.length;
|
||
if (pos > 0) {
|
||
if (pos > length)
|
||
pos = length;
|
||
} else if (pos == void 0) {
|
||
pos = 0;
|
||
} else if (pos < 0) {
|
||
pos = Math.max(length + pos, 0);
|
||
}
|
||
|
||
if (!(pos+removeCount < length))
|
||
removeCount = length - pos;
|
||
|
||
var removed = this.slice(pos, pos+removeCount);
|
||
var insert = slice.call(arguments, 2);
|
||
var add = insert.length;
|
||
if (pos === length) {
|
||
if (add) {
|
||
this.push.apply(this, insert);
|
||
}
|
||
} else {
|
||
var remove = Math.min(removeCount, length - pos);
|
||
var tailOldPos = pos + remove;
|
||
var tailNewPos = tailOldPos + add - remove;
|
||
var tailCount = length - tailOldPos;
|
||
var lengthAfterRemove = length - remove;
|
||
|
||
if (tailNewPos < tailOldPos) { // case A
|
||
for (var i = 0; i < tailCount; ++i) {
|
||
this[tailNewPos+i] = this[tailOldPos+i];
|
||
}
|
||
} else if (tailNewPos > tailOldPos) { // case B
|
||
for (i = tailCount; i--; ) {
|
||
this[tailNewPos+i] = this[tailOldPos+i];
|
||
}
|
||
} // else, add == remove (nothing to do)
|
||
|
||
if (add && pos === lengthAfterRemove) {
|
||
this.length = lengthAfterRemove; // truncate array
|
||
this.push.apply(this, insert);
|
||
} else {
|
||
this.length = lengthAfterRemove + add; // reserves space
|
||
for (i = 0; i < add; ++i) {
|
||
this[pos+i] = insert[i];
|
||
}
|
||
}
|
||
}
|
||
return removed;
|
||
};
|
||
}
|
||
}
|
||
if (!Array.isArray) {
|
||
Array.isArray = function isArray(obj) {
|
||
return _toString(obj) == "[object Array]";
|
||
};
|
||
}
|
||
var boxedString = Object("a"),
|
||
splitString = boxedString[0] != "a" || !(0 in boxedString);
|
||
|
||
if (!Array.prototype.forEach) {
|
||
Array.prototype.forEach = function forEach(fun /*, thisp*/) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
thisp = arguments[1],
|
||
i = -1,
|
||
length = self.length >>> 0;
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(); // TODO message
|
||
}
|
||
|
||
while (++i < length) {
|
||
if (i in self) {
|
||
fun.call(thisp, self[i], i, object);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
if (!Array.prototype.map) {
|
||
Array.prototype.map = function map(fun /*, thisp*/) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0,
|
||
result = Array(length),
|
||
thisp = arguments[1];
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
|
||
for (var i = 0; i < length; i++) {
|
||
if (i in self)
|
||
result[i] = fun.call(thisp, self[i], i, object);
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
if (!Array.prototype.filter) {
|
||
Array.prototype.filter = function filter(fun /*, thisp */) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0,
|
||
result = [],
|
||
value,
|
||
thisp = arguments[1];
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
|
||
for (var i = 0; i < length; i++) {
|
||
if (i in self) {
|
||
value = self[i];
|
||
if (fun.call(thisp, value, i, object)) {
|
||
result.push(value);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
if (!Array.prototype.every) {
|
||
Array.prototype.every = function every(fun /*, thisp */) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0,
|
||
thisp = arguments[1];
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
|
||
for (var i = 0; i < length; i++) {
|
||
if (i in self && !fun.call(thisp, self[i], i, object)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
}
|
||
if (!Array.prototype.some) {
|
||
Array.prototype.some = function some(fun /*, thisp */) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0,
|
||
thisp = arguments[1];
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
|
||
for (var i = 0; i < length; i++) {
|
||
if (i in self && fun.call(thisp, self[i], i, object)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
}
|
||
if (!Array.prototype.reduce) {
|
||
Array.prototype.reduce = function reduce(fun /*, initial*/) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0;
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
if (!length && arguments.length == 1) {
|
||
throw new TypeError("reduce of empty array with no initial value");
|
||
}
|
||
|
||
var i = 0;
|
||
var result;
|
||
if (arguments.length >= 2) {
|
||
result = arguments[1];
|
||
} else {
|
||
do {
|
||
if (i in self) {
|
||
result = self[i++];
|
||
break;
|
||
}
|
||
if (++i >= length) {
|
||
throw new TypeError("reduce of empty array with no initial value");
|
||
}
|
||
} while (true);
|
||
}
|
||
|
||
for (; i < length; i++) {
|
||
if (i in self) {
|
||
result = fun.call(void 0, result, self[i], i, object);
|
||
}
|
||
}
|
||
|
||
return result;
|
||
};
|
||
}
|
||
if (!Array.prototype.reduceRight) {
|
||
Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {
|
||
var object = toObject(this),
|
||
self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
object,
|
||
length = self.length >>> 0;
|
||
if (_toString(fun) != "[object Function]") {
|
||
throw new TypeError(fun + " is not a function");
|
||
}
|
||
if (!length && arguments.length == 1) {
|
||
throw new TypeError("reduceRight of empty array with no initial value");
|
||
}
|
||
|
||
var result, i = length - 1;
|
||
if (arguments.length >= 2) {
|
||
result = arguments[1];
|
||
} else {
|
||
do {
|
||
if (i in self) {
|
||
result = self[i--];
|
||
break;
|
||
}
|
||
if (--i < 0) {
|
||
throw new TypeError("reduceRight of empty array with no initial value");
|
||
}
|
||
} while (true);
|
||
}
|
||
|
||
do {
|
||
if (i in this) {
|
||
result = fun.call(void 0, result, self[i], i, object);
|
||
}
|
||
} while (i--);
|
||
|
||
return result;
|
||
};
|
||
}
|
||
if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
|
||
Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {
|
||
var self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
toObject(this),
|
||
length = self.length >>> 0;
|
||
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
|
||
var i = 0;
|
||
if (arguments.length > 1) {
|
||
i = toInteger(arguments[1]);
|
||
}
|
||
i = i >= 0 ? i : Math.max(0, length + i);
|
||
for (; i < length; i++) {
|
||
if (i in self && self[i] === sought) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
}
|
||
if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
|
||
Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {
|
||
var self = splitString && _toString(this) == "[object String]" ?
|
||
this.split("") :
|
||
toObject(this),
|
||
length = self.length >>> 0;
|
||
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
var i = length - 1;
|
||
if (arguments.length > 1) {
|
||
i = Math.min(i, toInteger(arguments[1]));
|
||
}
|
||
i = i >= 0 ? i : length - Math.abs(i);
|
||
for (; i >= 0; i--) {
|
||
if (i in self && sought === self[i]) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
}
|
||
if (!Object.getPrototypeOf) {
|
||
Object.getPrototypeOf = function getPrototypeOf(object) {
|
||
return object.__proto__ || (
|
||
object.constructor ?
|
||
object.constructor.prototype :
|
||
prototypeOfObject
|
||
);
|
||
};
|
||
}
|
||
if (!Object.getOwnPropertyDescriptor) {
|
||
var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " +
|
||
"non-object: ";
|
||
Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
|
||
if ((typeof object != "object" && typeof object != "function") || object === null)
|
||
throw new TypeError(ERR_NON_OBJECT + object);
|
||
if (!owns(object, property))
|
||
return;
|
||
|
||
var descriptor, getter, setter;
|
||
descriptor = { enumerable: true, configurable: true };
|
||
if (supportsAccessors) {
|
||
var prototype = object.__proto__;
|
||
object.__proto__ = prototypeOfObject;
|
||
|
||
var getter = lookupGetter(object, property);
|
||
var setter = lookupSetter(object, property);
|
||
object.__proto__ = prototype;
|
||
|
||
if (getter || setter) {
|
||
if (getter) descriptor.get = getter;
|
||
if (setter) descriptor.set = setter;
|
||
return descriptor;
|
||
}
|
||
}
|
||
descriptor.value = object[property];
|
||
return descriptor;
|
||
};
|
||
}
|
||
if (!Object.getOwnPropertyNames) {
|
||
Object.getOwnPropertyNames = function getOwnPropertyNames(object) {
|
||
return Object.keys(object);
|
||
};
|
||
}
|
||
if (!Object.create) {
|
||
var createEmpty;
|
||
if (Object.prototype.__proto__ === null) {
|
||
createEmpty = function () {
|
||
return { "__proto__": null };
|
||
};
|
||
} else {
|
||
createEmpty = function () {
|
||
var empty = {};
|
||
for (var i in empty)
|
||
empty[i] = null;
|
||
empty.constructor =
|
||
empty.hasOwnProperty =
|
||
empty.propertyIsEnumerable =
|
||
empty.isPrototypeOf =
|
||
empty.toLocaleString =
|
||
empty.toString =
|
||
empty.valueOf =
|
||
empty.__proto__ = null;
|
||
return empty;
|
||
}
|
||
}
|
||
|
||
Object.create = function create(prototype, properties) {
|
||
var object;
|
||
if (prototype === null) {
|
||
object = createEmpty();
|
||
} else {
|
||
if (typeof prototype != "object")
|
||
throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");
|
||
var Type = function () {};
|
||
Type.prototype = prototype;
|
||
object = new Type();
|
||
object.__proto__ = prototype;
|
||
}
|
||
if (properties !== void 0)
|
||
Object.defineProperties(object, properties);
|
||
return object;
|
||
};
|
||
}
|
||
|
||
function doesDefinePropertyWork(object) {
|
||
try {
|
||
Object.defineProperty(object, "sentinel", {});
|
||
return "sentinel" in object;
|
||
} catch (exception) {
|
||
}
|
||
}
|
||
if (Object.defineProperty) {
|
||
var definePropertyWorksOnObject = doesDefinePropertyWork({});
|
||
var definePropertyWorksOnDom = typeof document == "undefined" ||
|
||
doesDefinePropertyWork(document.createElement("div"));
|
||
if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
|
||
var definePropertyFallback = Object.defineProperty;
|
||
}
|
||
}
|
||
|
||
if (!Object.defineProperty || definePropertyFallback) {
|
||
var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: ";
|
||
var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: "
|
||
var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " +
|
||
"on this javascript engine";
|
||
|
||
Object.defineProperty = function defineProperty(object, property, descriptor) {
|
||
if ((typeof object != "object" && typeof object != "function") || object === null)
|
||
throw new TypeError(ERR_NON_OBJECT_TARGET + object);
|
||
if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null)
|
||
throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
|
||
if (definePropertyFallback) {
|
||
try {
|
||
return definePropertyFallback.call(Object, object, property, descriptor);
|
||
} catch (exception) {
|
||
}
|
||
}
|
||
if (owns(descriptor, "value")) {
|
||
|
||
if (supportsAccessors && (lookupGetter(object, property) ||
|
||
lookupSetter(object, property)))
|
||
{
|
||
var prototype = object.__proto__;
|
||
object.__proto__ = prototypeOfObject;
|
||
delete object[property];
|
||
object[property] = descriptor.value;
|
||
object.__proto__ = prototype;
|
||
} else {
|
||
object[property] = descriptor.value;
|
||
}
|
||
} else {
|
||
if (!supportsAccessors)
|
||
throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
|
||
if (owns(descriptor, "get"))
|
||
defineGetter(object, property, descriptor.get);
|
||
if (owns(descriptor, "set"))
|
||
defineSetter(object, property, descriptor.set);
|
||
}
|
||
|
||
return object;
|
||
};
|
||
}
|
||
if (!Object.defineProperties) {
|
||
Object.defineProperties = function defineProperties(object, properties) {
|
||
for (var property in properties) {
|
||
if (owns(properties, property))
|
||
Object.defineProperty(object, property, properties[property]);
|
||
}
|
||
return object;
|
||
};
|
||
}
|
||
if (!Object.seal) {
|
||
Object.seal = function seal(object) {
|
||
return object;
|
||
};
|
||
}
|
||
if (!Object.freeze) {
|
||
Object.freeze = function freeze(object) {
|
||
return object;
|
||
};
|
||
}
|
||
try {
|
||
Object.freeze(function () {});
|
||
} catch (exception) {
|
||
Object.freeze = (function freeze(freezeObject) {
|
||
return function freeze(object) {
|
||
if (typeof object == "function") {
|
||
return object;
|
||
} else {
|
||
return freezeObject(object);
|
||
}
|
||
};
|
||
})(Object.freeze);
|
||
}
|
||
if (!Object.preventExtensions) {
|
||
Object.preventExtensions = function preventExtensions(object) {
|
||
return object;
|
||
};
|
||
}
|
||
if (!Object.isSealed) {
|
||
Object.isSealed = function isSealed(object) {
|
||
return false;
|
||
};
|
||
}
|
||
if (!Object.isFrozen) {
|
||
Object.isFrozen = function isFrozen(object) {
|
||
return false;
|
||
};
|
||
}
|
||
if (!Object.isExtensible) {
|
||
Object.isExtensible = function isExtensible(object) {
|
||
if (Object(object) === object) {
|
||
throw new TypeError(); // TODO message
|
||
}
|
||
var name = '';
|
||
while (owns(object, name)) {
|
||
name += '?';
|
||
}
|
||
object[name] = true;
|
||
var returnValue = owns(object, name);
|
||
delete object[name];
|
||
return returnValue;
|
||
};
|
||
}
|
||
if (!Object.keys) {
|
||
var hasDontEnumBug = true,
|
||
dontEnums = [
|
||
"toString",
|
||
"toLocaleString",
|
||
"valueOf",
|
||
"hasOwnProperty",
|
||
"isPrototypeOf",
|
||
"propertyIsEnumerable",
|
||
"constructor"
|
||
],
|
||
dontEnumsLength = dontEnums.length;
|
||
|
||
for (var key in {"toString": null}) {
|
||
hasDontEnumBug = false;
|
||
}
|
||
|
||
Object.keys = function keys(object) {
|
||
|
||
if (
|
||
(typeof object != "object" && typeof object != "function") ||
|
||
object === null
|
||
) {
|
||
throw new TypeError("Object.keys called on a non-object");
|
||
}
|
||
|
||
var keys = [];
|
||
for (var name in object) {
|
||
if (owns(object, name)) {
|
||
keys.push(name);
|
||
}
|
||
}
|
||
|
||
if (hasDontEnumBug) {
|
||
for (var i = 0, ii = dontEnumsLength; i < ii; i++) {
|
||
var dontEnum = dontEnums[i];
|
||
if (owns(object, dontEnum)) {
|
||
keys.push(dontEnum);
|
||
}
|
||
}
|
||
}
|
||
return keys;
|
||
};
|
||
|
||
}
|
||
if (!Date.now) {
|
||
Date.now = function now() {
|
||
return new Date().getTime();
|
||
};
|
||
}
|
||
var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
|
||
"\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
|
||
"\u2029\uFEFF";
|
||
if (!String.prototype.trim || ws.trim()) {
|
||
ws = "[" + ws + "]";
|
||
var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
|
||
trimEndRegexp = new RegExp(ws + ws + "*$");
|
||
String.prototype.trim = function trim() {
|
||
return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
|
||
};
|
||
}
|
||
|
||
function toInteger(n) {
|
||
n = +n;
|
||
if (n !== n) { // isNaN
|
||
n = 0;
|
||
} else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
|
||
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
||
}
|
||
return n;
|
||
}
|
||
|
||
function isPrimitive(input) {
|
||
var type = typeof input;
|
||
return (
|
||
input === null ||
|
||
type === "undefined" ||
|
||
type === "boolean" ||
|
||
type === "number" ||
|
||
type === "string"
|
||
);
|
||
}
|
||
|
||
function toPrimitive(input) {
|
||
var val, valueOf, toString;
|
||
if (isPrimitive(input)) {
|
||
return input;
|
||
}
|
||
valueOf = input.valueOf;
|
||
if (typeof valueOf === "function") {
|
||
val = valueOf.call(input);
|
||
if (isPrimitive(val)) {
|
||
return val;
|
||
}
|
||
}
|
||
toString = input.toString;
|
||
if (typeof toString === "function") {
|
||
val = toString.call(input);
|
||
if (isPrimitive(val)) {
|
||
return val;
|
||
}
|
||
}
|
||
throw new TypeError();
|
||
}
|
||
var toObject = function (o) {
|
||
if (o == null) { // this matches both null and undefined
|
||
throw new TypeError("can't convert "+o+" to object");
|
||
}
|
||
return Object(o);
|
||
};
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
acequire("./regexp");
|
||
acequire("./es5-shim");
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/dom",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var XHTML_NS = "http://www.w3.org/1999/xhtml";
|
||
|
||
exports.getDocumentHead = function(doc) {
|
||
if (!doc)
|
||
doc = document;
|
||
return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement;
|
||
};
|
||
|
||
exports.createElement = function(tag, ns) {
|
||
return document.createElementNS ?
|
||
document.createElementNS(ns || XHTML_NS, tag) :
|
||
document.createElement(tag);
|
||
};
|
||
|
||
exports.hasCssClass = function(el, name) {
|
||
var classes = (el.className || "").split(/\s+/g);
|
||
return classes.indexOf(name) !== -1;
|
||
};
|
||
exports.addCssClass = function(el, name) {
|
||
if (!exports.hasCssClass(el, name)) {
|
||
el.className += " " + name;
|
||
}
|
||
};
|
||
exports.removeCssClass = function(el, name) {
|
||
var classes = el.className.split(/\s+/g);
|
||
while (true) {
|
||
var index = classes.indexOf(name);
|
||
if (index == -1) {
|
||
break;
|
||
}
|
||
classes.splice(index, 1);
|
||
}
|
||
el.className = classes.join(" ");
|
||
};
|
||
|
||
exports.toggleCssClass = function(el, name) {
|
||
var classes = el.className.split(/\s+/g), add = true;
|
||
while (true) {
|
||
var index = classes.indexOf(name);
|
||
if (index == -1) {
|
||
break;
|
||
}
|
||
add = false;
|
||
classes.splice(index, 1);
|
||
}
|
||
if (add)
|
||
classes.push(name);
|
||
|
||
el.className = classes.join(" ");
|
||
return add;
|
||
};
|
||
exports.setCssClass = function(node, className, include) {
|
||
if (include) {
|
||
exports.addCssClass(node, className);
|
||
} else {
|
||
exports.removeCssClass(node, className);
|
||
}
|
||
};
|
||
|
||
exports.hasCssString = function(id, doc) {
|
||
var index = 0, sheets;
|
||
doc = doc || document;
|
||
|
||
if (doc.createStyleSheet && (sheets = doc.styleSheets)) {
|
||
while (index < sheets.length)
|
||
if (sheets[index++].owningElement.id === id) return true;
|
||
} else if ((sheets = doc.getElementsByTagName("style"))) {
|
||
while (index < sheets.length)
|
||
if (sheets[index++].id === id) return true;
|
||
}
|
||
|
||
return false;
|
||
};
|
||
|
||
exports.importCssString = function importCssString(cssText, id, doc) {
|
||
doc = doc || document;
|
||
if (id && exports.hasCssString(id, doc))
|
||
return null;
|
||
|
||
var style;
|
||
|
||
if (id)
|
||
cssText += "\n/*# sourceURL=ace/css/" + id + " */";
|
||
|
||
if (doc.createStyleSheet) {
|
||
style = doc.createStyleSheet();
|
||
style.cssText = cssText;
|
||
if (id)
|
||
style.owningElement.id = id;
|
||
} else {
|
||
style = exports.createElement("style");
|
||
style.appendChild(doc.createTextNode(cssText));
|
||
if (id)
|
||
style.id = id;
|
||
|
||
exports.getDocumentHead(doc).appendChild(style);
|
||
}
|
||
};
|
||
|
||
exports.importCssStylsheet = function(uri, doc) {
|
||
if (doc.createStyleSheet) {
|
||
doc.createStyleSheet(uri);
|
||
} else {
|
||
var link = exports.createElement('link');
|
||
link.rel = 'stylesheet';
|
||
link.href = uri;
|
||
|
||
exports.getDocumentHead(doc).appendChild(link);
|
||
}
|
||
};
|
||
|
||
exports.getInnerWidth = function(element) {
|
||
return (
|
||
parseInt(exports.computedStyle(element, "paddingLeft"), 10) +
|
||
parseInt(exports.computedStyle(element, "paddingRight"), 10) +
|
||
element.clientWidth
|
||
);
|
||
};
|
||
|
||
exports.getInnerHeight = function(element) {
|
||
return (
|
||
parseInt(exports.computedStyle(element, "paddingTop"), 10) +
|
||
parseInt(exports.computedStyle(element, "paddingBottom"), 10) +
|
||
element.clientHeight
|
||
);
|
||
};
|
||
|
||
exports.scrollbarWidth = function(document) {
|
||
var inner = exports.createElement("ace_inner");
|
||
inner.style.width = "100%";
|
||
inner.style.minWidth = "0px";
|
||
inner.style.height = "200px";
|
||
inner.style.display = "block";
|
||
|
||
var outer = exports.createElement("ace_outer");
|
||
var style = outer.style;
|
||
|
||
style.position = "absolute";
|
||
style.left = "-10000px";
|
||
style.overflow = "hidden";
|
||
style.width = "200px";
|
||
style.minWidth = "0px";
|
||
style.height = "150px";
|
||
style.display = "block";
|
||
|
||
outer.appendChild(inner);
|
||
|
||
var body = document.documentElement;
|
||
body.appendChild(outer);
|
||
|
||
var noScrollbar = inner.offsetWidth;
|
||
|
||
style.overflow = "scroll";
|
||
var withScrollbar = inner.offsetWidth;
|
||
|
||
if (noScrollbar == withScrollbar) {
|
||
withScrollbar = outer.clientWidth;
|
||
}
|
||
|
||
body.removeChild(outer);
|
||
|
||
return noScrollbar-withScrollbar;
|
||
};
|
||
|
||
if (typeof document == "undefined") {
|
||
exports.importCssString = function() {};
|
||
return;
|
||
}
|
||
|
||
if (window.pageYOffset !== undefined) {
|
||
exports.getPageScrollTop = function() {
|
||
return window.pageYOffset;
|
||
};
|
||
|
||
exports.getPageScrollLeft = function() {
|
||
return window.pageXOffset;
|
||
};
|
||
}
|
||
else {
|
||
exports.getPageScrollTop = function() {
|
||
return document.body.scrollTop;
|
||
};
|
||
|
||
exports.getPageScrollLeft = function() {
|
||
return document.body.scrollLeft;
|
||
};
|
||
}
|
||
|
||
if (window.getComputedStyle)
|
||
exports.computedStyle = function(element, style) {
|
||
if (style)
|
||
return (window.getComputedStyle(element, "") || {})[style] || "";
|
||
return window.getComputedStyle(element, "") || {};
|
||
};
|
||
else
|
||
exports.computedStyle = function(element, style) {
|
||
if (style)
|
||
return element.currentStyle[style];
|
||
return element.currentStyle;
|
||
};
|
||
exports.setInnerHtml = function(el, innerHtml) {
|
||
var element = el.cloneNode(false);//document.createElement("div");
|
||
element.innerHTML = innerHtml;
|
||
el.parentNode.replaceChild(element, el);
|
||
return element;
|
||
};
|
||
|
||
if ("textContent" in document.documentElement) {
|
||
exports.setInnerText = function(el, innerText) {
|
||
el.textContent = innerText;
|
||
};
|
||
|
||
exports.getInnerText = function(el) {
|
||
return el.textContent;
|
||
};
|
||
}
|
||
else {
|
||
exports.setInnerText = function(el, innerText) {
|
||
el.innerText = innerText;
|
||
};
|
||
|
||
exports.getInnerText = function(el) {
|
||
return el.innerText;
|
||
};
|
||
}
|
||
|
||
exports.getParentWindow = function(document) {
|
||
return document.defaultView || document.parentWindow;
|
||
};
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/oop",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
exports.inherits = function(ctor, superCtor) {
|
||
ctor.super_ = superCtor;
|
||
ctor.prototype = Object.create(superCtor.prototype, {
|
||
constructor: {
|
||
value: ctor,
|
||
enumerable: false,
|
||
writable: true,
|
||
configurable: true
|
||
}
|
||
});
|
||
};
|
||
|
||
exports.mixin = function(obj, mixin) {
|
||
for (var key in mixin) {
|
||
obj[key] = mixin[key];
|
||
}
|
||
return obj;
|
||
};
|
||
|
||
exports.implement = function(proto, mixin) {
|
||
exports.mixin(proto, mixin);
|
||
};
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/keys",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
acequire("./fixoldbrowsers");
|
||
|
||
var oop = acequire("./oop");
|
||
var Keys = (function() {
|
||
var ret = {
|
||
MODIFIER_KEYS: {
|
||
16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'
|
||
},
|
||
|
||
KEY_MODS: {
|
||
"ctrl": 1, "alt": 2, "option" : 2, "shift": 4,
|
||
"super": 8, "meta": 8, "command": 8, "cmd": 8
|
||
},
|
||
|
||
FUNCTION_KEYS : {
|
||
8 : "Backspace",
|
||
9 : "Tab",
|
||
13 : "Return",
|
||
19 : "Pause",
|
||
27 : "Esc",
|
||
32 : "Space",
|
||
33 : "PageUp",
|
||
34 : "PageDown",
|
||
35 : "End",
|
||
36 : "Home",
|
||
37 : "Left",
|
||
38 : "Up",
|
||
39 : "Right",
|
||
40 : "Down",
|
||
44 : "Print",
|
||
45 : "Insert",
|
||
46 : "Delete",
|
||
96 : "Numpad0",
|
||
97 : "Numpad1",
|
||
98 : "Numpad2",
|
||
99 : "Numpad3",
|
||
100: "Numpad4",
|
||
101: "Numpad5",
|
||
102: "Numpad6",
|
||
103: "Numpad7",
|
||
104: "Numpad8",
|
||
105: "Numpad9",
|
||
'-13': "NumpadEnter",
|
||
112: "F1",
|
||
113: "F2",
|
||
114: "F3",
|
||
115: "F4",
|
||
116: "F5",
|
||
117: "F6",
|
||
118: "F7",
|
||
119: "F8",
|
||
120: "F9",
|
||
121: "F10",
|
||
122: "F11",
|
||
123: "F12",
|
||
144: "Numlock",
|
||
145: "Scrolllock"
|
||
},
|
||
|
||
PRINTABLE_KEYS: {
|
||
32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',
|
||
54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',
|
||
66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',
|
||
73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',
|
||
80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',
|
||
87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',
|
||
186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',
|
||
219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*'
|
||
}
|
||
};
|
||
var name, i;
|
||
for (i in ret.FUNCTION_KEYS) {
|
||
name = ret.FUNCTION_KEYS[i].toLowerCase();
|
||
ret[name] = parseInt(i, 10);
|
||
}
|
||
for (i in ret.PRINTABLE_KEYS) {
|
||
name = ret.PRINTABLE_KEYS[i].toLowerCase();
|
||
ret[name] = parseInt(i, 10);
|
||
}
|
||
oop.mixin(ret, ret.MODIFIER_KEYS);
|
||
oop.mixin(ret, ret.PRINTABLE_KEYS);
|
||
oop.mixin(ret, ret.FUNCTION_KEYS);
|
||
ret.enter = ret["return"];
|
||
ret.escape = ret.esc;
|
||
ret.del = ret["delete"];
|
||
ret[173] = '-';
|
||
|
||
(function() {
|
||
var mods = ["cmd", "ctrl", "alt", "shift"];
|
||
for (var i = Math.pow(2, mods.length); i--;) {
|
||
ret.KEY_MODS[i] = mods.filter(function(x) {
|
||
return i & ret.KEY_MODS[x];
|
||
}).join("-") + "-";
|
||
}
|
||
})();
|
||
|
||
ret.KEY_MODS[0] = "";
|
||
ret.KEY_MODS[-1] = "input-";
|
||
|
||
return ret;
|
||
})();
|
||
oop.mixin(exports, Keys);
|
||
|
||
exports.keyCodeToString = function(keyCode) {
|
||
var keyString = Keys[keyCode];
|
||
if (typeof keyString != "string")
|
||
keyString = String.fromCharCode(keyCode);
|
||
return keyString.toLowerCase();
|
||
};
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/useragent",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
exports.OS = {
|
||
LINUX: "LINUX",
|
||
MAC: "MAC",
|
||
WINDOWS: "WINDOWS"
|
||
};
|
||
exports.getOS = function() {
|
||
if (exports.isMac) {
|
||
return exports.OS.MAC;
|
||
} else if (exports.isLinux) {
|
||
return exports.OS.LINUX;
|
||
} else {
|
||
return exports.OS.WINDOWS;
|
||
}
|
||
};
|
||
if (typeof navigator != "object")
|
||
return;
|
||
|
||
var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase();
|
||
var ua = navigator.userAgent;
|
||
exports.isWin = (os == "win");
|
||
exports.isMac = (os == "mac");
|
||
exports.isLinux = (os == "linux");
|
||
exports.isIE =
|
||
(navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0)
|
||
? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1])
|
||
: parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie
|
||
|
||
exports.isOldIE = exports.isIE && exports.isIE < 9;
|
||
exports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === "Gecko";
|
||
exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\:(\d+)/)||[])[1], 10) < 4;
|
||
exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]";
|
||
exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined;
|
||
|
||
exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined;
|
||
|
||
exports.isAIR = ua.indexOf("AdobeAIR") >= 0;
|
||
|
||
exports.isIPad = ua.indexOf("iPad") >= 0;
|
||
|
||
exports.isTouchPad = ua.indexOf("TouchPad") >= 0;
|
||
|
||
exports.isChromeOS = ua.indexOf(" CrOS ") >= 0;
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var keys = acequire("./keys");
|
||
var useragent = acequire("./useragent");
|
||
|
||
var pressedKeys = null;
|
||
var ts = 0;
|
||
|
||
exports.addListener = function(elem, type, callback) {
|
||
if (elem.addEventListener) {
|
||
return elem.addEventListener(type, callback, false);
|
||
}
|
||
if (elem.attachEvent) {
|
||
var wrapper = function() {
|
||
callback.call(elem, window.event);
|
||
};
|
||
callback._wrapper = wrapper;
|
||
elem.attachEvent("on" + type, wrapper);
|
||
}
|
||
};
|
||
|
||
exports.removeListener = function(elem, type, callback) {
|
||
if (elem.removeEventListener) {
|
||
return elem.removeEventListener(type, callback, false);
|
||
}
|
||
if (elem.detachEvent) {
|
||
elem.detachEvent("on" + type, callback._wrapper || callback);
|
||
}
|
||
};
|
||
exports.stopEvent = function(e) {
|
||
exports.stopPropagation(e);
|
||
exports.preventDefault(e);
|
||
return false;
|
||
};
|
||
|
||
exports.stopPropagation = function(e) {
|
||
if (e.stopPropagation)
|
||
e.stopPropagation();
|
||
else
|
||
e.cancelBubble = true;
|
||
};
|
||
|
||
exports.preventDefault = function(e) {
|
||
if (e.preventDefault)
|
||
e.preventDefault();
|
||
else
|
||
e.returnValue = false;
|
||
};
|
||
exports.getButton = function(e) {
|
||
if (e.type == "dblclick")
|
||
return 0;
|
||
if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))
|
||
return 2;
|
||
if (e.preventDefault) {
|
||
return e.button;
|
||
}
|
||
else {
|
||
return {1:0, 2:2, 4:1}[e.button];
|
||
}
|
||
};
|
||
|
||
exports.capture = function(el, eventHandler, releaseCaptureHandler) {
|
||
function onMouseUp(e) {
|
||
eventHandler && eventHandler(e);
|
||
releaseCaptureHandler && releaseCaptureHandler(e);
|
||
|
||
exports.removeListener(document, "mousemove", eventHandler, true);
|
||
exports.removeListener(document, "mouseup", onMouseUp, true);
|
||
exports.removeListener(document, "dragstart", onMouseUp, true);
|
||
}
|
||
|
||
exports.addListener(document, "mousemove", eventHandler, true);
|
||
exports.addListener(document, "mouseup", onMouseUp, true);
|
||
exports.addListener(document, "dragstart", onMouseUp, true);
|
||
|
||
return onMouseUp;
|
||
};
|
||
|
||
exports.addTouchMoveListener = function (el, callback) {
|
||
if ("ontouchmove" in el) {
|
||
var startx, starty;
|
||
exports.addListener(el, "touchstart", function (e) {
|
||
var touchObj = e.changedTouches[0];
|
||
startx = touchObj.clientX;
|
||
starty = touchObj.clientY;
|
||
});
|
||
exports.addListener(el, "touchmove", function (e) {
|
||
var factor = 1,
|
||
touchObj = e.changedTouches[0];
|
||
|
||
e.wheelX = -(touchObj.clientX - startx) / factor;
|
||
e.wheelY = -(touchObj.clientY - starty) / factor;
|
||
|
||
startx = touchObj.clientX;
|
||
starty = touchObj.clientY;
|
||
|
||
callback(e);
|
||
});
|
||
}
|
||
};
|
||
|
||
exports.addMouseWheelListener = function(el, callback) {
|
||
if ("onmousewheel" in el) {
|
||
exports.addListener(el, "mousewheel", function(e) {
|
||
var factor = 8;
|
||
if (e.wheelDeltaX !== undefined) {
|
||
e.wheelX = -e.wheelDeltaX / factor;
|
||
e.wheelY = -e.wheelDeltaY / factor;
|
||
} else {
|
||
e.wheelX = 0;
|
||
e.wheelY = -e.wheelDelta / factor;
|
||
}
|
||
callback(e);
|
||
});
|
||
} else if ("onwheel" in el) {
|
||
exports.addListener(el, "wheel", function(e) {
|
||
var factor = 0.35;
|
||
switch (e.deltaMode) {
|
||
case e.DOM_DELTA_PIXEL:
|
||
e.wheelX = e.deltaX * factor || 0;
|
||
e.wheelY = e.deltaY * factor || 0;
|
||
break;
|
||
case e.DOM_DELTA_LINE:
|
||
case e.DOM_DELTA_PAGE:
|
||
e.wheelX = (e.deltaX || 0) * 5;
|
||
e.wheelY = (e.deltaY || 0) * 5;
|
||
break;
|
||
}
|
||
|
||
callback(e);
|
||
});
|
||
} else {
|
||
exports.addListener(el, "DOMMouseScroll", function(e) {
|
||
if (e.axis && e.axis == e.HORIZONTAL_AXIS) {
|
||
e.wheelX = (e.detail || 0) * 5;
|
||
e.wheelY = 0;
|
||
} else {
|
||
e.wheelX = 0;
|
||
e.wheelY = (e.detail || 0) * 5;
|
||
}
|
||
callback(e);
|
||
});
|
||
}
|
||
};
|
||
|
||
exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {
|
||
var clicks = 0;
|
||
var startX, startY, timer;
|
||
var eventNames = {
|
||
2: "dblclick",
|
||
3: "tripleclick",
|
||
4: "quadclick"
|
||
};
|
||
|
||
function onMousedown(e) {
|
||
if (exports.getButton(e) !== 0) {
|
||
clicks = 0;
|
||
} else if (e.detail > 1) {
|
||
clicks++;
|
||
if (clicks > 4)
|
||
clicks = 1;
|
||
} else {
|
||
clicks = 1;
|
||
}
|
||
if (useragent.isIE) {
|
||
var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;
|
||
if (!timer || isNewClick)
|
||
clicks = 1;
|
||
if (timer)
|
||
clearTimeout(timer);
|
||
timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);
|
||
|
||
if (clicks == 1) {
|
||
startX = e.clientX;
|
||
startY = e.clientY;
|
||
}
|
||
}
|
||
|
||
e._clicks = clicks;
|
||
|
||
eventHandler[callbackName]("mousedown", e);
|
||
|
||
if (clicks > 4)
|
||
clicks = 0;
|
||
else if (clicks > 1)
|
||
return eventHandler[callbackName](eventNames[clicks], e);
|
||
}
|
||
function onDblclick(e) {
|
||
clicks = 2;
|
||
if (timer)
|
||
clearTimeout(timer);
|
||
timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);
|
||
eventHandler[callbackName]("mousedown", e);
|
||
eventHandler[callbackName](eventNames[clicks], e);
|
||
}
|
||
if (!Array.isArray(elements))
|
||
elements = [elements];
|
||
elements.forEach(function(el) {
|
||
exports.addListener(el, "mousedown", onMousedown);
|
||
if (useragent.isOldIE)
|
||
exports.addListener(el, "dblclick", onDblclick);
|
||
});
|
||
};
|
||
|
||
var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window)
|
||
? function(e) {
|
||
return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);
|
||
}
|
||
: function(e) {
|
||
return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);
|
||
};
|
||
|
||
exports.getModifierString = function(e) {
|
||
return keys.KEY_MODS[getModifierHash(e)];
|
||
};
|
||
|
||
function normalizeCommandKeys(callback, e, keyCode) {
|
||
var hashId = getModifierHash(e);
|
||
|
||
if (!useragent.isMac && pressedKeys) {
|
||
if (pressedKeys.OSKey)
|
||
hashId |= 8;
|
||
if (pressedKeys.altGr) {
|
||
if ((3 & hashId) != 3)
|
||
pressedKeys.altGr = 0;
|
||
else
|
||
return;
|
||
}
|
||
if (keyCode === 18 || keyCode === 17) {
|
||
var location = "location" in e ? e.location : e.keyLocation;
|
||
if (keyCode === 17 && location === 1) {
|
||
if (pressedKeys[keyCode] == 1)
|
||
ts = e.timeStamp;
|
||
} else if (keyCode === 18 && hashId === 3 && location === 2) {
|
||
var dt = e.timeStamp - ts;
|
||
if (dt < 50)
|
||
pressedKeys.altGr = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (keyCode in keys.MODIFIER_KEYS) {
|
||
keyCode = -1;
|
||
}
|
||
if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {
|
||
keyCode = -1;
|
||
}
|
||
|
||
if (!hashId && keyCode === 13) {
|
||
var location = "location" in e ? e.location : e.keyLocation;
|
||
if (location === 3) {
|
||
callback(e, hashId, -keyCode);
|
||
if (e.defaultPrevented)
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (useragent.isChromeOS && hashId & 8) {
|
||
callback(e, hashId, keyCode);
|
||
if (e.defaultPrevented)
|
||
return;
|
||
else
|
||
hashId &= ~8;
|
||
}
|
||
if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {
|
||
return false;
|
||
}
|
||
|
||
return callback(e, hashId, keyCode);
|
||
}
|
||
|
||
|
||
exports.addCommandKeyListener = function(el, callback) {
|
||
var addListener = exports.addListener;
|
||
if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) {
|
||
var lastKeyDownKeyCode = null;
|
||
addListener(el, "keydown", function(e) {
|
||
lastKeyDownKeyCode = e.keyCode;
|
||
});
|
||
addListener(el, "keypress", function(e) {
|
||
return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);
|
||
});
|
||
} else {
|
||
var lastDefaultPrevented = null;
|
||
|
||
addListener(el, "keydown", function(e) {
|
||
var keyCode = e.keyCode;
|
||
pressedKeys[keyCode] = (pressedKeys[keyCode] || 0) + 1;
|
||
if (keyCode == 91 || keyCode == 92) {
|
||
pressedKeys.OSKey = true;
|
||
} else if (pressedKeys.OSKey) {
|
||
if (e.timeStamp - pressedKeys.lastT > 200 && pressedKeys.count == 1)
|
||
resetPressedKeys();
|
||
}
|
||
if (pressedKeys[keyCode] == 1)
|
||
pressedKeys.count++;
|
||
pressedKeys.lastT = e.timeStamp;
|
||
var result = normalizeCommandKeys(callback, e, keyCode);
|
||
lastDefaultPrevented = e.defaultPrevented;
|
||
return result;
|
||
});
|
||
|
||
addListener(el, "keypress", function(e) {
|
||
if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {
|
||
exports.stopEvent(e);
|
||
lastDefaultPrevented = null;
|
||
}
|
||
});
|
||
|
||
addListener(el, "keyup", function(e) {
|
||
var keyCode = e.keyCode;
|
||
if (!pressedKeys[keyCode]) {
|
||
resetPressedKeys();
|
||
} else {
|
||
pressedKeys.count = Math.max(pressedKeys.count - 1, 0);
|
||
}
|
||
if (keyCode == 91 || keyCode == 92) {
|
||
pressedKeys.OSKey = false;
|
||
}
|
||
pressedKeys[keyCode] = null;
|
||
});
|
||
|
||
if (!pressedKeys) {
|
||
resetPressedKeys();
|
||
addListener(window, "focus", resetPressedKeys);
|
||
}
|
||
}
|
||
};
|
||
function resetPressedKeys() {
|
||
pressedKeys = Object.create(null);
|
||
pressedKeys.count = 0;
|
||
pressedKeys.lastT = 0;
|
||
}
|
||
|
||
if (typeof window == "object" && window.postMessage && !useragent.isOldIE) {
|
||
var postMessageId = 1;
|
||
exports.nextTick = function(callback, win) {
|
||
win = win || window;
|
||
var messageName = "zero-timeout-message-" + postMessageId;
|
||
exports.addListener(win, "message", function listener(e) {
|
||
if (e.data == messageName) {
|
||
exports.stopPropagation(e);
|
||
exports.removeListener(win, "message", listener);
|
||
callback();
|
||
}
|
||
});
|
||
win.postMessage(messageName, "*");
|
||
};
|
||
}
|
||
|
||
|
||
exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame
|
||
|| window.mozRequestAnimationFrame
|
||
|| window.webkitRequestAnimationFrame
|
||
|| window.msRequestAnimationFrame
|
||
|| window.oRequestAnimationFrame);
|
||
|
||
if (exports.nextFrame)
|
||
exports.nextFrame = exports.nextFrame.bind(window);
|
||
else
|
||
exports.nextFrame = function(callback) {
|
||
setTimeout(callback, 17);
|
||
};
|
||
});
|
||
|
||
ace.define("ace/lib/lang",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
exports.last = function(a) {
|
||
return a[a.length - 1];
|
||
};
|
||
|
||
exports.stringReverse = function(string) {
|
||
return string.split("").reverse().join("");
|
||
};
|
||
|
||
exports.stringRepeat = function (string, count) {
|
||
var result = '';
|
||
while (count > 0) {
|
||
if (count & 1)
|
||
result += string;
|
||
|
||
if (count >>= 1)
|
||
string += string;
|
||
}
|
||
return result;
|
||
};
|
||
|
||
var trimBeginRegexp = /^\s\s*/;
|
||
var trimEndRegexp = /\s\s*$/;
|
||
|
||
exports.stringTrimLeft = function (string) {
|
||
return string.replace(trimBeginRegexp, '');
|
||
};
|
||
|
||
exports.stringTrimRight = function (string) {
|
||
return string.replace(trimEndRegexp, '');
|
||
};
|
||
|
||
exports.copyObject = function(obj) {
|
||
var copy = {};
|
||
for (var key in obj) {
|
||
copy[key] = obj[key];
|
||
}
|
||
return copy;
|
||
};
|
||
|
||
exports.copyArray = function(array){
|
||
var copy = [];
|
||
for (var i=0, l=array.length; i<l; i++) {
|
||
if (array[i] && typeof array[i] == "object")
|
||
copy[i] = this.copyObject( array[i] );
|
||
else
|
||
copy[i] = array[i];
|
||
}
|
||
return copy;
|
||
};
|
||
|
||
exports.deepCopy = function deepCopy(obj) {
|
||
if (typeof obj !== "object" || !obj)
|
||
return obj;
|
||
var copy;
|
||
if (Array.isArray(obj)) {
|
||
copy = [];
|
||
for (var key = 0; key < obj.length; key++) {
|
||
copy[key] = deepCopy(obj[key]);
|
||
}
|
||
return copy;
|
||
}
|
||
var cons = obj.constructor;
|
||
if (cons === RegExp)
|
||
return obj;
|
||
|
||
copy = cons();
|
||
for (var key in obj) {
|
||
copy[key] = deepCopy(obj[key]);
|
||
}
|
||
return copy;
|
||
};
|
||
|
||
exports.arrayToMap = function(arr) {
|
||
var map = {};
|
||
for (var i=0; i<arr.length; i++) {
|
||
map[arr[i]] = 1;
|
||
}
|
||
return map;
|
||
|
||
};
|
||
|
||
exports.createMap = function(props) {
|
||
var map = Object.create(null);
|
||
for (var i in props) {
|
||
map[i] = props[i];
|
||
}
|
||
return map;
|
||
};
|
||
exports.arrayRemove = function(array, value) {
|
||
for (var i = 0; i <= array.length; i++) {
|
||
if (value === array[i]) {
|
||
array.splice(i, 1);
|
||
}
|
||
}
|
||
};
|
||
|
||
exports.escapeRegExp = function(str) {
|
||
return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
|
||
};
|
||
|
||
exports.escapeHTML = function(str) {
|
||
return str.replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<");
|
||
};
|
||
|
||
exports.getMatchOffsets = function(string, regExp) {
|
||
var matches = [];
|
||
|
||
string.replace(regExp, function(str) {
|
||
matches.push({
|
||
offset: arguments[arguments.length-2],
|
||
length: str.length
|
||
});
|
||
});
|
||
|
||
return matches;
|
||
};
|
||
exports.deferredCall = function(fcn) {
|
||
var timer = null;
|
||
var callback = function() {
|
||
timer = null;
|
||
fcn();
|
||
};
|
||
|
||
var deferred = function(timeout) {
|
||
deferred.cancel();
|
||
timer = setTimeout(callback, timeout || 0);
|
||
return deferred;
|
||
};
|
||
|
||
deferred.schedule = deferred;
|
||
|
||
deferred.call = function() {
|
||
this.cancel();
|
||
fcn();
|
||
return deferred;
|
||
};
|
||
|
||
deferred.cancel = function() {
|
||
clearTimeout(timer);
|
||
timer = null;
|
||
return deferred;
|
||
};
|
||
|
||
deferred.isPending = function() {
|
||
return timer;
|
||
};
|
||
|
||
return deferred;
|
||
};
|
||
|
||
|
||
exports.delayedCall = function(fcn, defaultTimeout) {
|
||
var timer = null;
|
||
var callback = function() {
|
||
timer = null;
|
||
fcn();
|
||
};
|
||
|
||
var _self = function(timeout) {
|
||
if (timer == null)
|
||
timer = setTimeout(callback, timeout || defaultTimeout);
|
||
};
|
||
|
||
_self.delay = function(timeout) {
|
||
timer && clearTimeout(timer);
|
||
timer = setTimeout(callback, timeout || defaultTimeout);
|
||
};
|
||
_self.schedule = _self;
|
||
|
||
_self.call = function() {
|
||
this.cancel();
|
||
fcn();
|
||
};
|
||
|
||
_self.cancel = function() {
|
||
timer && clearTimeout(timer);
|
||
timer = null;
|
||
};
|
||
|
||
_self.isPending = function() {
|
||
return timer;
|
||
};
|
||
|
||
return _self;
|
||
};
|
||
});
|
||
|
||
ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
var dom = acequire("../lib/dom");
|
||
var lang = acequire("../lib/lang");
|
||
var BROKEN_SETDATA = useragent.isChrome < 18;
|
||
var USE_IE_MIME_TYPE = useragent.isIE;
|
||
|
||
var TextInput = function(parentNode, host) {
|
||
var text = dom.createElement("textarea");
|
||
text.className = "ace_text-input";
|
||
|
||
if (useragent.isTouchPad)
|
||
text.setAttribute("x-palm-disable-auto-cap", true);
|
||
|
||
text.setAttribute("wrap", "off");
|
||
text.setAttribute("autocorrect", "off");
|
||
text.setAttribute("autocapitalize", "off");
|
||
text.setAttribute("spellcheck", false);
|
||
|
||
text.style.opacity = "0";
|
||
if (useragent.isOldIE) text.style.top = "-1000px";
|
||
parentNode.insertBefore(text, parentNode.firstChild);
|
||
|
||
var PLACEHOLDER = "\x01\x01";
|
||
|
||
var copied = false;
|
||
var pasted = false;
|
||
var inComposition = false;
|
||
var tempStyle = '';
|
||
var isSelectionEmpty = true;
|
||
try { var isFocused = document.activeElement === text; } catch(e) {}
|
||
|
||
event.addListener(text, "blur", function(e) {
|
||
host.onBlur(e);
|
||
isFocused = false;
|
||
});
|
||
event.addListener(text, "focus", function(e) {
|
||
isFocused = true;
|
||
host.onFocus(e);
|
||
resetSelection();
|
||
});
|
||
this.focus = function() {
|
||
if (tempStyle) return text.focus();
|
||
var top = text.style.top;
|
||
text.style.position = "fixed";
|
||
text.style.top = "0px";
|
||
text.focus();
|
||
setTimeout(function() {
|
||
text.style.position = "";
|
||
if (text.style.top == "0px")
|
||
text.style.top = top;
|
||
}, 0);
|
||
};
|
||
this.blur = function() {
|
||
text.blur();
|
||
};
|
||
this.isFocused = function() {
|
||
return isFocused;
|
||
};
|
||
var syncSelection = lang.delayedCall(function() {
|
||
isFocused && resetSelection(isSelectionEmpty);
|
||
});
|
||
var syncValue = lang.delayedCall(function() {
|
||
if (!inComposition) {
|
||
text.value = PLACEHOLDER;
|
||
isFocused && resetSelection();
|
||
}
|
||
});
|
||
|
||
function resetSelection(isEmpty) {
|
||
if (inComposition)
|
||
return;
|
||
inComposition = true;
|
||
|
||
if (inputHandler) {
|
||
selectionStart = 0;
|
||
selectionEnd = isEmpty ? 0 : text.value.length - 1;
|
||
} else {
|
||
var selectionStart = isEmpty ? 2 : 1;
|
||
var selectionEnd = 2;
|
||
}
|
||
try {
|
||
text.setSelectionRange(selectionStart, selectionEnd);
|
||
} catch(e){}
|
||
|
||
inComposition = false;
|
||
}
|
||
|
||
function resetValue() {
|
||
if (inComposition)
|
||
return;
|
||
text.value = PLACEHOLDER;
|
||
if (useragent.isWebKit)
|
||
syncValue.schedule();
|
||
}
|
||
|
||
useragent.isWebKit || host.addEventListener('changeSelection', function() {
|
||
if (host.selection.isEmpty() != isSelectionEmpty) {
|
||
isSelectionEmpty = !isSelectionEmpty;
|
||
syncSelection.schedule();
|
||
}
|
||
});
|
||
|
||
resetValue();
|
||
if (isFocused)
|
||
host.onFocus();
|
||
|
||
|
||
var isAllSelected = function(text) {
|
||
return text.selectionStart === 0 && text.selectionEnd === text.value.length;
|
||
};
|
||
if (!text.setSelectionRange && text.createTextRange) {
|
||
text.setSelectionRange = function(selectionStart, selectionEnd) {
|
||
var range = this.createTextRange();
|
||
range.collapse(true);
|
||
range.moveStart('character', selectionStart);
|
||
range.moveEnd('character', selectionEnd);
|
||
range.select();
|
||
};
|
||
isAllSelected = function(text) {
|
||
try {
|
||
var range = text.ownerDocument.selection.createRange();
|
||
}catch(e) {}
|
||
if (!range || range.parentElement() != text) return false;
|
||
return range.text == text.value;
|
||
}
|
||
}
|
||
if (useragent.isOldIE) {
|
||
var inPropertyChange = false;
|
||
var onPropertyChange = function(e){
|
||
if (inPropertyChange)
|
||
return;
|
||
var data = text.value;
|
||
if (inComposition || !data || data == PLACEHOLDER)
|
||
return;
|
||
if (e && data == PLACEHOLDER[0])
|
||
return syncProperty.schedule();
|
||
|
||
sendText(data);
|
||
inPropertyChange = true;
|
||
resetValue();
|
||
inPropertyChange = false;
|
||
};
|
||
var syncProperty = lang.delayedCall(onPropertyChange);
|
||
event.addListener(text, "propertychange", onPropertyChange);
|
||
|
||
var keytable = { 13:1, 27:1 };
|
||
event.addListener(text, "keyup", function (e) {
|
||
if (inComposition && (!text.value || keytable[e.keyCode]))
|
||
setTimeout(onCompositionEnd, 0);
|
||
if ((text.value.charCodeAt(0)||0) < 129) {
|
||
return syncProperty.call();
|
||
}
|
||
inComposition ? onCompositionUpdate() : onCompositionStart();
|
||
});
|
||
event.addListener(text, "keydown", function (e) {
|
||
syncProperty.schedule(50);
|
||
});
|
||
}
|
||
|
||
var onSelect = function(e) {
|
||
if (copied) {
|
||
copied = false;
|
||
} else if (isAllSelected(text)) {
|
||
host.selectAll();
|
||
resetSelection();
|
||
} else if (inputHandler) {
|
||
resetSelection(host.selection.isEmpty());
|
||
}
|
||
};
|
||
|
||
var inputHandler = null;
|
||
this.setInputHandler = function(cb) {inputHandler = cb};
|
||
this.getInputHandler = function() {return inputHandler};
|
||
var afterContextMenu = false;
|
||
|
||
var sendText = function(data) {
|
||
if (inputHandler) {
|
||
data = inputHandler(data);
|
||
inputHandler = null;
|
||
}
|
||
if (pasted) {
|
||
resetSelection();
|
||
if (data)
|
||
host.onPaste(data);
|
||
pasted = false;
|
||
} else if (data == PLACEHOLDER.charAt(0)) {
|
||
if (afterContextMenu)
|
||
host.execCommand("del", {source: "ace"});
|
||
else // some versions of android do not fire keydown when pressing backspace
|
||
host.execCommand("backspace", {source: "ace"});
|
||
} else {
|
||
if (data.substring(0, 2) == PLACEHOLDER)
|
||
data = data.substr(2);
|
||
else if (data.charAt(0) == PLACEHOLDER.charAt(0))
|
||
data = data.substr(1);
|
||
else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))
|
||
data = data.slice(0, -1);
|
||
if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))
|
||
data = data.slice(0, -1);
|
||
|
||
if (data)
|
||
host.onTextInput(data);
|
||
}
|
||
if (afterContextMenu)
|
||
afterContextMenu = false;
|
||
};
|
||
var onInput = function(e) {
|
||
if (inComposition)
|
||
return;
|
||
var data = text.value;
|
||
sendText(data);
|
||
resetValue();
|
||
};
|
||
|
||
var handleClipboardData = function(e, data) {
|
||
var clipboardData = e.clipboardData || window.clipboardData;
|
||
if (!clipboardData || BROKEN_SETDATA)
|
||
return;
|
||
var mime = USE_IE_MIME_TYPE ? "Text" : "text/plain";
|
||
if (data) {
|
||
return clipboardData.setData(mime, data) !== false;
|
||
} else {
|
||
return clipboardData.getData(mime);
|
||
}
|
||
};
|
||
|
||
var doCopy = function(e, isCut) {
|
||
var data = host.getCopyText();
|
||
if (!data)
|
||
return event.preventDefault(e);
|
||
|
||
if (handleClipboardData(e, data)) {
|
||
isCut ? host.onCut() : host.onCopy();
|
||
event.preventDefault(e);
|
||
} else {
|
||
copied = true;
|
||
text.value = data;
|
||
text.select();
|
||
setTimeout(function(){
|
||
copied = false;
|
||
resetValue();
|
||
resetSelection();
|
||
isCut ? host.onCut() : host.onCopy();
|
||
});
|
||
}
|
||
};
|
||
|
||
var onCut = function(e) {
|
||
doCopy(e, true);
|
||
};
|
||
|
||
var onCopy = function(e) {
|
||
doCopy(e, false);
|
||
};
|
||
|
||
var onPaste = function(e) {
|
||
var data = handleClipboardData(e);
|
||
if (typeof data == "string") {
|
||
if (data)
|
||
host.onPaste(data, e);
|
||
if (useragent.isIE)
|
||
setTimeout(resetSelection);
|
||
event.preventDefault(e);
|
||
}
|
||
else {
|
||
text.value = "";
|
||
pasted = true;
|
||
}
|
||
};
|
||
|
||
event.addCommandKeyListener(text, host.onCommandKey.bind(host));
|
||
|
||
event.addListener(text, "select", onSelect);
|
||
|
||
event.addListener(text, "input", onInput);
|
||
|
||
event.addListener(text, "cut", onCut);
|
||
event.addListener(text, "copy", onCopy);
|
||
event.addListener(text, "paste", onPaste);
|
||
if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){
|
||
event.addListener(parentNode, "keydown", function(e) {
|
||
if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)
|
||
return;
|
||
|
||
switch (e.keyCode) {
|
||
case 67:
|
||
onCopy(e);
|
||
break;
|
||
case 86:
|
||
onPaste(e);
|
||
break;
|
||
case 88:
|
||
onCut(e);
|
||
break;
|
||
}
|
||
});
|
||
}
|
||
var onCompositionStart = function(e) {
|
||
if (inComposition || !host.onCompositionStart || host.$readOnly)
|
||
return;
|
||
inComposition = {};
|
||
host.onCompositionStart();
|
||
setTimeout(onCompositionUpdate, 0);
|
||
host.on("mousedown", onCompositionEnd);
|
||
if (!host.selection.isEmpty()) {
|
||
host.insert("");
|
||
host.session.markUndoGroup();
|
||
host.selection.clearSelection();
|
||
}
|
||
host.session.markUndoGroup();
|
||
};
|
||
|
||
var onCompositionUpdate = function() {
|
||
if (!inComposition || !host.onCompositionUpdate || host.$readOnly)
|
||
return;
|
||
var val = text.value.replace(/\x01/g, "");
|
||
if (inComposition.lastValue === val) return;
|
||
|
||
host.onCompositionUpdate(val);
|
||
if (inComposition.lastValue)
|
||
host.undo();
|
||
inComposition.lastValue = val;
|
||
if (inComposition.lastValue) {
|
||
var r = host.selection.getRange();
|
||
host.insert(inComposition.lastValue);
|
||
host.session.markUndoGroup();
|
||
inComposition.range = host.selection.getRange();
|
||
host.selection.setRange(r);
|
||
host.selection.clearSelection();
|
||
}
|
||
};
|
||
|
||
var onCompositionEnd = function(e) {
|
||
if (!host.onCompositionEnd || host.$readOnly) return;
|
||
var c = inComposition;
|
||
inComposition = false;
|
||
var timer = setTimeout(function() {
|
||
timer = null;
|
||
var str = text.value.replace(/\x01/g, "");
|
||
if (inComposition)
|
||
return;
|
||
else if (str == c.lastValue)
|
||
resetValue();
|
||
else if (!c.lastValue && str) {
|
||
resetValue();
|
||
sendText(str);
|
||
}
|
||
});
|
||
inputHandler = function compositionInputHandler(str) {
|
||
if (timer)
|
||
clearTimeout(timer);
|
||
str = str.replace(/\x01/g, "");
|
||
if (str == c.lastValue)
|
||
return "";
|
||
if (c.lastValue && timer)
|
||
host.undo();
|
||
return str;
|
||
};
|
||
host.onCompositionEnd();
|
||
host.removeListener("mousedown", onCompositionEnd);
|
||
if (e.type == "compositionend" && c.range) {
|
||
host.selection.setRange(c.range);
|
||
}
|
||
};
|
||
|
||
|
||
|
||
var syncComposition = lang.delayedCall(onCompositionUpdate, 50);
|
||
|
||
event.addListener(text, "compositionstart", onCompositionStart);
|
||
if (useragent.isGecko) {
|
||
event.addListener(text, "text", function(){syncComposition.schedule()});
|
||
} else {
|
||
event.addListener(text, "keyup", function(){syncComposition.schedule()});
|
||
event.addListener(text, "keydown", function(){syncComposition.schedule()});
|
||
}
|
||
event.addListener(text, "compositionend", onCompositionEnd);
|
||
|
||
this.getElement = function() {
|
||
return text;
|
||
};
|
||
|
||
this.setReadOnly = function(readOnly) {
|
||
text.readOnly = readOnly;
|
||
};
|
||
|
||
this.onContextMenu = function(e) {
|
||
afterContextMenu = true;
|
||
resetSelection(host.selection.isEmpty());
|
||
host._emit("nativecontextmenu", {target: host, domEvent: e});
|
||
this.moveToMouse(e, true);
|
||
};
|
||
|
||
this.moveToMouse = function(e, bringToFront) {
|
||
if (!bringToFront && useragent.isOldIE)
|
||
return;
|
||
if (!tempStyle)
|
||
tempStyle = text.style.cssText;
|
||
text.style.cssText = (bringToFront ? "z-index:100000;" : "")
|
||
+ "height:" + text.style.height + ";"
|
||
+ (useragent.isIE ? "opacity:0.1;" : "");
|
||
|
||
var rect = host.container.getBoundingClientRect();
|
||
var style = dom.computedStyle(host.container);
|
||
var top = rect.top + (parseInt(style.borderTopWidth) || 0);
|
||
var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);
|
||
var maxTop = rect.bottom - top - text.clientHeight -2;
|
||
var move = function(e) {
|
||
text.style.left = e.clientX - left - 2 + "px";
|
||
text.style.top = Math.min(e.clientY - top - 2, maxTop) + "px";
|
||
};
|
||
move(e);
|
||
|
||
if (e.type != "mousedown")
|
||
return;
|
||
|
||
if (host.renderer.$keepTextAreaAtCursor)
|
||
host.renderer.$keepTextAreaAtCursor = null;
|
||
|
||
clearTimeout(closeTimeout);
|
||
if (useragent.isWin && !useragent.isOldIE)
|
||
event.capture(host.container, move, onContextMenuClose);
|
||
};
|
||
|
||
this.onContextMenuClose = onContextMenuClose;
|
||
var closeTimeout;
|
||
function onContextMenuClose() {
|
||
clearTimeout(closeTimeout);
|
||
closeTimeout = setTimeout(function () {
|
||
if (tempStyle) {
|
||
text.style.cssText = tempStyle;
|
||
tempStyle = '';
|
||
}
|
||
if (host.renderer.$keepTextAreaAtCursor == null) {
|
||
host.renderer.$keepTextAreaAtCursor = true;
|
||
host.renderer.$moveTextAreaToCursor();
|
||
}
|
||
}, useragent.isOldIE ? 200 : 0);
|
||
}
|
||
|
||
var onContextMenu = function(e) {
|
||
host.textInput.onContextMenu(e);
|
||
onContextMenuClose();
|
||
};
|
||
event.addListener(text, "mouseup", onContextMenu);
|
||
event.addListener(text, "mousedown", function(e) {
|
||
e.preventDefault();
|
||
onContextMenuClose();
|
||
});
|
||
event.addListener(host.renderer.scroller, "contextmenu", onContextMenu);
|
||
event.addListener(text, "contextmenu", onContextMenu);
|
||
};
|
||
|
||
exports.TextInput = TextInput;
|
||
});
|
||
|
||
ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
|
||
var DRAG_OFFSET = 0; // pixels
|
||
|
||
function DefaultHandlers(mouseHandler) {
|
||
mouseHandler.$clickSelection = null;
|
||
|
||
var editor = mouseHandler.editor;
|
||
editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler));
|
||
editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler));
|
||
editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler));
|
||
editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler));
|
||
editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler));
|
||
editor.setDefaultHandler("touchmove", this.onTouchMove.bind(mouseHandler));
|
||
|
||
var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd",
|
||
"selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"];
|
||
|
||
exports.forEach(function(x) {
|
||
mouseHandler[x] = this[x];
|
||
}, this);
|
||
|
||
mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange");
|
||
mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange");
|
||
}
|
||
|
||
(function() {
|
||
|
||
this.onMouseDown = function(ev) {
|
||
var inSelection = ev.inSelection();
|
||
var pos = ev.getDocumentPosition();
|
||
this.mousedownEvent = ev;
|
||
var editor = this.editor;
|
||
|
||
var button = ev.getButton();
|
||
if (button !== 0) {
|
||
var selectionRange = editor.getSelectionRange();
|
||
var selectionEmpty = selectionRange.isEmpty();
|
||
editor.$blockScrolling++;
|
||
if (selectionEmpty || button == 1)
|
||
editor.selection.moveToPosition(pos);
|
||
editor.$blockScrolling--;
|
||
if (button == 2)
|
||
editor.textInput.onContextMenu(ev.domEvent);
|
||
return; // stopping event here breaks contextmenu on ff mac
|
||
}
|
||
|
||
this.mousedownEvent.time = Date.now();
|
||
if (inSelection && !editor.isFocused()) {
|
||
editor.focus();
|
||
if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {
|
||
this.setState("focusWait");
|
||
this.captureMouse(ev);
|
||
return;
|
||
}
|
||
}
|
||
|
||
this.captureMouse(ev);
|
||
this.startSelect(pos, ev.domEvent._clicks > 1);
|
||
return ev.preventDefault();
|
||
};
|
||
|
||
this.startSelect = function(pos, waitForClickSelection) {
|
||
pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);
|
||
var editor = this.editor;
|
||
editor.$blockScrolling++;
|
||
if (this.mousedownEvent.getShiftKey())
|
||
editor.selection.selectToPosition(pos);
|
||
else if (!waitForClickSelection)
|
||
editor.selection.moveToPosition(pos);
|
||
if (!waitForClickSelection)
|
||
this.select();
|
||
if (editor.renderer.scroller.setCapture) {
|
||
editor.renderer.scroller.setCapture();
|
||
}
|
||
editor.setStyle("ace_selecting");
|
||
this.setState("select");
|
||
editor.$blockScrolling--;
|
||
};
|
||
|
||
this.select = function() {
|
||
var anchor, editor = this.editor;
|
||
var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);
|
||
editor.$blockScrolling++;
|
||
if (this.$clickSelection) {
|
||
var cmp = this.$clickSelection.comparePoint(cursor);
|
||
|
||
if (cmp == -1) {
|
||
anchor = this.$clickSelection.end;
|
||
} else if (cmp == 1) {
|
||
anchor = this.$clickSelection.start;
|
||
} else {
|
||
var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);
|
||
cursor = orientedRange.cursor;
|
||
anchor = orientedRange.anchor;
|
||
}
|
||
editor.selection.setSelectionAnchor(anchor.row, anchor.column);
|
||
}
|
||
editor.selection.selectToPosition(cursor);
|
||
editor.$blockScrolling--;
|
||
editor.renderer.scrollCursorIntoView();
|
||
};
|
||
|
||
this.extendSelectionBy = function(unitName) {
|
||
var anchor, editor = this.editor;
|
||
var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);
|
||
var range = editor.selection[unitName](cursor.row, cursor.column);
|
||
editor.$blockScrolling++;
|
||
if (this.$clickSelection) {
|
||
var cmpStart = this.$clickSelection.comparePoint(range.start);
|
||
var cmpEnd = this.$clickSelection.comparePoint(range.end);
|
||
|
||
if (cmpStart == -1 && cmpEnd <= 0) {
|
||
anchor = this.$clickSelection.end;
|
||
if (range.end.row != cursor.row || range.end.column != cursor.column)
|
||
cursor = range.start;
|
||
} else if (cmpEnd == 1 && cmpStart >= 0) {
|
||
anchor = this.$clickSelection.start;
|
||
if (range.start.row != cursor.row || range.start.column != cursor.column)
|
||
cursor = range.end;
|
||
} else if (cmpStart == -1 && cmpEnd == 1) {
|
||
cursor = range.end;
|
||
anchor = range.start;
|
||
} else {
|
||
var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);
|
||
cursor = orientedRange.cursor;
|
||
anchor = orientedRange.anchor;
|
||
}
|
||
editor.selection.setSelectionAnchor(anchor.row, anchor.column);
|
||
}
|
||
editor.selection.selectToPosition(cursor);
|
||
editor.$blockScrolling--;
|
||
editor.renderer.scrollCursorIntoView();
|
||
};
|
||
|
||
this.selectEnd =
|
||
this.selectAllEnd =
|
||
this.selectByWordsEnd =
|
||
this.selectByLinesEnd = function() {
|
||
this.$clickSelection = null;
|
||
this.editor.unsetStyle("ace_selecting");
|
||
if (this.editor.renderer.scroller.releaseCapture) {
|
||
this.editor.renderer.scroller.releaseCapture();
|
||
}
|
||
};
|
||
|
||
this.focusWait = function() {
|
||
var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
|
||
var time = Date.now();
|
||
|
||
if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)
|
||
this.startSelect(this.mousedownEvent.getDocumentPosition());
|
||
};
|
||
|
||
this.onDoubleClick = function(ev) {
|
||
var pos = ev.getDocumentPosition();
|
||
var editor = this.editor;
|
||
var session = editor.session;
|
||
|
||
var range = session.getBracketRange(pos);
|
||
if (range) {
|
||
if (range.isEmpty()) {
|
||
range.start.column--;
|
||
range.end.column++;
|
||
}
|
||
this.setState("select");
|
||
} else {
|
||
range = editor.selection.getWordRange(pos.row, pos.column);
|
||
this.setState("selectByWords");
|
||
}
|
||
this.$clickSelection = range;
|
||
this.select();
|
||
};
|
||
|
||
this.onTripleClick = function(ev) {
|
||
var pos = ev.getDocumentPosition();
|
||
var editor = this.editor;
|
||
|
||
this.setState("selectByLines");
|
||
var range = editor.getSelectionRange();
|
||
if (range.isMultiLine() && range.contains(pos.row, pos.column)) {
|
||
this.$clickSelection = editor.selection.getLineRange(range.start.row);
|
||
this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;
|
||
} else {
|
||
this.$clickSelection = editor.selection.getLineRange(pos.row);
|
||
}
|
||
this.select();
|
||
};
|
||
|
||
this.onQuadClick = function(ev) {
|
||
var editor = this.editor;
|
||
|
||
editor.selectAll();
|
||
this.$clickSelection = editor.getSelectionRange();
|
||
this.setState("selectAll");
|
||
};
|
||
|
||
this.onMouseWheel = function(ev) {
|
||
if (ev.getAccelKey())
|
||
return;
|
||
if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {
|
||
ev.wheelX = ev.wheelY;
|
||
ev.wheelY = 0;
|
||
}
|
||
|
||
var t = ev.domEvent.timeStamp;
|
||
var dt = t - (this.$lastScrollTime||0);
|
||
|
||
var editor = this.editor;
|
||
var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
|
||
if (isScrolable || dt < 200) {
|
||
this.$lastScrollTime = t;
|
||
editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
|
||
return ev.stop();
|
||
}
|
||
};
|
||
|
||
this.onTouchMove = function (ev) {
|
||
var t = ev.domEvent.timeStamp;
|
||
var dt = t - (this.$lastScrollTime || 0);
|
||
|
||
var editor = this.editor;
|
||
var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
|
||
if (isScrolable || dt < 200) {
|
||
this.$lastScrollTime = t;
|
||
editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);
|
||
return ev.stop();
|
||
}
|
||
};
|
||
|
||
}).call(DefaultHandlers.prototype);
|
||
|
||
exports.DefaultHandlers = DefaultHandlers;
|
||
|
||
function calcDistance(ax, ay, bx, by) {
|
||
return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));
|
||
}
|
||
|
||
function calcRangeOrientation(range, cursor) {
|
||
if (range.start.row == range.end.row)
|
||
var cmp = 2 * cursor.column - range.start.column - range.end.column;
|
||
else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)
|
||
var cmp = cursor.column - 4;
|
||
else
|
||
var cmp = 2 * cursor.row - range.start.row - range.end.row;
|
||
|
||
if (cmp < 0)
|
||
return {cursor: range.start, anchor: range.end};
|
||
else
|
||
return {cursor: range.end, anchor: range.start};
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var dom = acequire("./lib/dom");
|
||
function Tooltip (parentNode) {
|
||
this.isOpen = false;
|
||
this.$element = null;
|
||
this.$parentNode = parentNode;
|
||
}
|
||
|
||
(function() {
|
||
this.$init = function() {
|
||
this.$element = dom.createElement("div");
|
||
this.$element.className = "ace_tooltip";
|
||
this.$element.style.display = "none";
|
||
this.$parentNode.appendChild(this.$element);
|
||
return this.$element;
|
||
};
|
||
this.getElement = function() {
|
||
return this.$element || this.$init();
|
||
};
|
||
this.setText = function(text) {
|
||
dom.setInnerText(this.getElement(), text);
|
||
};
|
||
this.setHtml = function(html) {
|
||
this.getElement().innerHTML = html;
|
||
};
|
||
this.setPosition = function(x, y) {
|
||
this.getElement().style.left = x + "px";
|
||
this.getElement().style.top = y + "px";
|
||
};
|
||
this.setClassName = function(className) {
|
||
dom.addCssClass(this.getElement(), className);
|
||
};
|
||
this.show = function(text, x, y) {
|
||
if (text != null)
|
||
this.setText(text);
|
||
if (x != null && y != null)
|
||
this.setPosition(x, y);
|
||
if (!this.isOpen) {
|
||
this.getElement().style.display = "block";
|
||
this.isOpen = true;
|
||
}
|
||
};
|
||
|
||
this.hide = function() {
|
||
if (this.isOpen) {
|
||
this.getElement().style.display = "none";
|
||
this.isOpen = false;
|
||
}
|
||
};
|
||
this.getHeight = function() {
|
||
return this.getElement().offsetHeight;
|
||
};
|
||
this.getWidth = function() {
|
||
return this.getElement().offsetWidth;
|
||
};
|
||
|
||
}).call(Tooltip.prototype);
|
||
|
||
exports.Tooltip = Tooltip;
|
||
});
|
||
|
||
ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var dom = acequire("../lib/dom");
|
||
var oop = acequire("../lib/oop");
|
||
var event = acequire("../lib/event");
|
||
var Tooltip = acequire("../tooltip").Tooltip;
|
||
|
||
function GutterHandler(mouseHandler) {
|
||
var editor = mouseHandler.editor;
|
||
var gutter = editor.renderer.$gutterLayer;
|
||
var tooltip = new GutterTooltip(editor.container);
|
||
|
||
mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) {
|
||
if (!editor.isFocused() || e.getButton() != 0)
|
||
return;
|
||
var gutterRegion = gutter.getRegion(e);
|
||
|
||
if (gutterRegion == "foldWidgets")
|
||
return;
|
||
|
||
var row = e.getDocumentPosition().row;
|
||
var selection = editor.session.selection;
|
||
|
||
if (e.getShiftKey())
|
||
selection.selectTo(row, 0);
|
||
else {
|
||
if (e.domEvent.detail == 2) {
|
||
editor.selectAll();
|
||
return e.preventDefault();
|
||
}
|
||
mouseHandler.$clickSelection = editor.selection.getLineRange(row);
|
||
}
|
||
mouseHandler.setState("selectByLines");
|
||
mouseHandler.captureMouse(e);
|
||
return e.preventDefault();
|
||
});
|
||
|
||
|
||
var tooltipTimeout, mouseEvent, tooltipAnnotation;
|
||
|
||
function showTooltip() {
|
||
var row = mouseEvent.getDocumentPosition().row;
|
||
var annotation = gutter.$annotations[row];
|
||
if (!annotation)
|
||
return hideTooltip();
|
||
|
||
var maxRow = editor.session.getLength();
|
||
if (row == maxRow) {
|
||
var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;
|
||
var pos = mouseEvent.$pos;
|
||
if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))
|
||
return hideTooltip();
|
||
}
|
||
|
||
if (tooltipAnnotation == annotation)
|
||
return;
|
||
tooltipAnnotation = annotation.text.join("<br/>");
|
||
|
||
tooltip.setHtml(tooltipAnnotation);
|
||
tooltip.show();
|
||
editor.on("mousewheel", hideTooltip);
|
||
|
||
if (mouseHandler.$tooltipFollowsMouse) {
|
||
moveTooltip(mouseEvent);
|
||
} else {
|
||
var gutterElement = mouseEvent.domEvent.target;
|
||
var rect = gutterElement.getBoundingClientRect();
|
||
var style = tooltip.getElement().style;
|
||
style.left = rect.right + "px";
|
||
style.top = rect.bottom + "px";
|
||
}
|
||
}
|
||
|
||
function hideTooltip() {
|
||
if (tooltipTimeout)
|
||
tooltipTimeout = clearTimeout(tooltipTimeout);
|
||
if (tooltipAnnotation) {
|
||
tooltip.hide();
|
||
tooltipAnnotation = null;
|
||
editor.removeEventListener("mousewheel", hideTooltip);
|
||
}
|
||
}
|
||
|
||
function moveTooltip(e) {
|
||
tooltip.setPosition(e.x, e.y);
|
||
}
|
||
|
||
mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) {
|
||
var target = e.domEvent.target || e.domEvent.srcElement;
|
||
if (dom.hasCssClass(target, "ace_fold-widget"))
|
||
return hideTooltip();
|
||
|
||
if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)
|
||
moveTooltip(e);
|
||
|
||
mouseEvent = e;
|
||
if (tooltipTimeout)
|
||
return;
|
||
tooltipTimeout = setTimeout(function() {
|
||
tooltipTimeout = null;
|
||
if (mouseEvent && !mouseHandler.isMousePressed)
|
||
showTooltip();
|
||
else
|
||
hideTooltip();
|
||
}, 50);
|
||
});
|
||
|
||
event.addListener(editor.renderer.$gutter, "mouseout", function(e) {
|
||
mouseEvent = null;
|
||
if (!tooltipAnnotation || tooltipTimeout)
|
||
return;
|
||
|
||
tooltipTimeout = setTimeout(function() {
|
||
tooltipTimeout = null;
|
||
hideTooltip();
|
||
}, 50);
|
||
});
|
||
|
||
editor.on("changeSession", hideTooltip);
|
||
}
|
||
|
||
function GutterTooltip(parentNode) {
|
||
Tooltip.call(this, parentNode);
|
||
}
|
||
|
||
oop.inherits(GutterTooltip, Tooltip);
|
||
|
||
(function(){
|
||
this.setPosition = function(x, y) {
|
||
var windowWidth = window.innerWidth || document.documentElement.clientWidth;
|
||
var windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
||
var width = this.getWidth();
|
||
var height = this.getHeight();
|
||
x += 15;
|
||
y += 15;
|
||
if (x + width > windowWidth) {
|
||
x -= (x + width) - windowWidth;
|
||
}
|
||
if (y + height > windowHeight) {
|
||
y -= 20 + height;
|
||
}
|
||
Tooltip.prototype.setPosition.call(this, x, y);
|
||
};
|
||
|
||
}).call(GutterTooltip.prototype);
|
||
|
||
|
||
|
||
exports.GutterHandler = GutterHandler;
|
||
|
||
});
|
||
|
||
ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
var MouseEvent = exports.MouseEvent = function(domEvent, editor) {
|
||
this.domEvent = domEvent;
|
||
this.editor = editor;
|
||
|
||
this.x = this.clientX = domEvent.clientX;
|
||
this.y = this.clientY = domEvent.clientY;
|
||
|
||
this.$pos = null;
|
||
this.$inSelection = null;
|
||
|
||
this.propagationStopped = false;
|
||
this.defaultPrevented = false;
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.stopPropagation = function() {
|
||
event.stopPropagation(this.domEvent);
|
||
this.propagationStopped = true;
|
||
};
|
||
|
||
this.preventDefault = function() {
|
||
event.preventDefault(this.domEvent);
|
||
this.defaultPrevented = true;
|
||
};
|
||
|
||
this.stop = function() {
|
||
this.stopPropagation();
|
||
this.preventDefault();
|
||
};
|
||
this.getDocumentPosition = function() {
|
||
if (this.$pos)
|
||
return this.$pos;
|
||
|
||
this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);
|
||
return this.$pos;
|
||
};
|
||
this.inSelection = function() {
|
||
if (this.$inSelection !== null)
|
||
return this.$inSelection;
|
||
|
||
var editor = this.editor;
|
||
|
||
|
||
var selectionRange = editor.getSelectionRange();
|
||
if (selectionRange.isEmpty())
|
||
this.$inSelection = false;
|
||
else {
|
||
var pos = this.getDocumentPosition();
|
||
this.$inSelection = selectionRange.contains(pos.row, pos.column);
|
||
}
|
||
|
||
return this.$inSelection;
|
||
};
|
||
this.getButton = function() {
|
||
return event.getButton(this.domEvent);
|
||
};
|
||
this.getShiftKey = function() {
|
||
return this.domEvent.shiftKey;
|
||
};
|
||
|
||
this.getAccelKey = useragent.isMac
|
||
? function() { return this.domEvent.metaKey; }
|
||
: function() { return this.domEvent.ctrlKey; };
|
||
|
||
}).call(MouseEvent.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
|
||
var AUTOSCROLL_DELAY = 200;
|
||
var SCROLL_CURSOR_DELAY = 200;
|
||
var SCROLL_CURSOR_HYSTERESIS = 5;
|
||
|
||
function DragdropHandler(mouseHandler) {
|
||
|
||
var editor = mouseHandler.editor;
|
||
|
||
var blankImage = dom.createElement("img");
|
||
blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
|
||
if (useragent.isOpera)
|
||
blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;";
|
||
|
||
var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"];
|
||
|
||
exports.forEach(function(x) {
|
||
mouseHandler[x] = this[x];
|
||
}, this);
|
||
editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler));
|
||
|
||
|
||
var mouseTarget = editor.container;
|
||
var dragSelectionMarker, x, y;
|
||
var timerId, range;
|
||
var dragCursor, counter = 0;
|
||
var dragOperation;
|
||
var isInternal;
|
||
var autoScrollStartTime;
|
||
var cursorMovedTime;
|
||
var cursorPointOnCaretMoved;
|
||
|
||
this.onDragStart = function(e) {
|
||
if (this.cancelDrag || !mouseTarget.draggable) {
|
||
var self = this;
|
||
setTimeout(function(){
|
||
self.startSelect();
|
||
self.captureMouse(e);
|
||
}, 0);
|
||
return e.preventDefault();
|
||
}
|
||
range = editor.getSelectionRange();
|
||
|
||
var dataTransfer = e.dataTransfer;
|
||
dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove";
|
||
if (useragent.isOpera) {
|
||
editor.container.appendChild(blankImage);
|
||
blankImage.scrollTop = 0;
|
||
}
|
||
dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);
|
||
if (useragent.isOpera) {
|
||
editor.container.removeChild(blankImage);
|
||
}
|
||
dataTransfer.clearData();
|
||
dataTransfer.setData("Text", editor.session.getTextRange());
|
||
|
||
isInternal = true;
|
||
this.setState("drag");
|
||
};
|
||
|
||
this.onDragEnd = function(e) {
|
||
mouseTarget.draggable = false;
|
||
isInternal = false;
|
||
this.setState(null);
|
||
if (!editor.getReadOnly()) {
|
||
var dropEffect = e.dataTransfer.dropEffect;
|
||
if (!dragOperation && dropEffect == "move")
|
||
editor.session.remove(editor.getSelectionRange());
|
||
editor.renderer.$cursorLayer.setBlinking(true);
|
||
}
|
||
this.editor.unsetStyle("ace_dragging");
|
||
this.editor.renderer.setCursorStyle("");
|
||
};
|
||
|
||
this.onDragEnter = function(e) {
|
||
if (editor.getReadOnly() || !canAccept(e.dataTransfer))
|
||
return;
|
||
x = e.clientX;
|
||
y = e.clientY;
|
||
if (!dragSelectionMarker)
|
||
addDragMarker();
|
||
counter++;
|
||
e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);
|
||
return event.preventDefault(e);
|
||
};
|
||
|
||
this.onDragOver = function(e) {
|
||
if (editor.getReadOnly() || !canAccept(e.dataTransfer))
|
||
return;
|
||
x = e.clientX;
|
||
y = e.clientY;
|
||
if (!dragSelectionMarker) {
|
||
addDragMarker();
|
||
counter++;
|
||
}
|
||
if (onMouseMoveTimer !== null)
|
||
onMouseMoveTimer = null;
|
||
|
||
e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);
|
||
return event.preventDefault(e);
|
||
};
|
||
|
||
this.onDragLeave = function(e) {
|
||
counter--;
|
||
if (counter <= 0 && dragSelectionMarker) {
|
||
clearDragMarker();
|
||
dragOperation = null;
|
||
return event.preventDefault(e);
|
||
}
|
||
};
|
||
|
||
this.onDrop = function(e) {
|
||
if (!dragCursor)
|
||
return;
|
||
var dataTransfer = e.dataTransfer;
|
||
if (isInternal) {
|
||
switch (dragOperation) {
|
||
case "move":
|
||
if (range.contains(dragCursor.row, dragCursor.column)) {
|
||
range = {
|
||
start: dragCursor,
|
||
end: dragCursor
|
||
};
|
||
} else {
|
||
range = editor.moveText(range, dragCursor);
|
||
}
|
||
break;
|
||
case "copy":
|
||
range = editor.moveText(range, dragCursor, true);
|
||
break;
|
||
}
|
||
} else {
|
||
var dropData = dataTransfer.getData('Text');
|
||
range = {
|
||
start: dragCursor,
|
||
end: editor.session.insert(dragCursor, dropData)
|
||
};
|
||
editor.focus();
|
||
dragOperation = null;
|
||
}
|
||
clearDragMarker();
|
||
return event.preventDefault(e);
|
||
};
|
||
|
||
event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler));
|
||
event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler));
|
||
event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler));
|
||
event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler));
|
||
event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler));
|
||
event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler));
|
||
|
||
function scrollCursorIntoView(cursor, prevCursor) {
|
||
var now = Date.now();
|
||
var vMovement = !prevCursor || cursor.row != prevCursor.row;
|
||
var hMovement = !prevCursor || cursor.column != prevCursor.column;
|
||
if (!cursorMovedTime || vMovement || hMovement) {
|
||
editor.$blockScrolling += 1;
|
||
editor.moveCursorToPosition(cursor);
|
||
editor.$blockScrolling -= 1;
|
||
cursorMovedTime = now;
|
||
cursorPointOnCaretMoved = {x: x, y: y};
|
||
} else {
|
||
var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);
|
||
if (distance > SCROLL_CURSOR_HYSTERESIS) {
|
||
cursorMovedTime = null;
|
||
} else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {
|
||
editor.renderer.scrollCursorIntoView();
|
||
cursorMovedTime = null;
|
||
}
|
||
}
|
||
}
|
||
|
||
function autoScroll(cursor, prevCursor) {
|
||
var now = Date.now();
|
||
var lineHeight = editor.renderer.layerConfig.lineHeight;
|
||
var characterWidth = editor.renderer.layerConfig.characterWidth;
|
||
var editorRect = editor.renderer.scroller.getBoundingClientRect();
|
||
var offsets = {
|
||
x: {
|
||
left: x - editorRect.left,
|
||
right: editorRect.right - x
|
||
},
|
||
y: {
|
||
top: y - editorRect.top,
|
||
bottom: editorRect.bottom - y
|
||
}
|
||
};
|
||
var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);
|
||
var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);
|
||
var scrollCursor = {row: cursor.row, column: cursor.column};
|
||
if (nearestXOffset / characterWidth <= 2) {
|
||
scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);
|
||
}
|
||
if (nearestYOffset / lineHeight <= 1) {
|
||
scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);
|
||
}
|
||
var vScroll = cursor.row != scrollCursor.row;
|
||
var hScroll = cursor.column != scrollCursor.column;
|
||
var vMovement = !prevCursor || cursor.row != prevCursor.row;
|
||
if (vScroll || (hScroll && !vMovement)) {
|
||
if (!autoScrollStartTime)
|
||
autoScrollStartTime = now;
|
||
else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)
|
||
editor.renderer.scrollCursorIntoView(scrollCursor);
|
||
} else {
|
||
autoScrollStartTime = null;
|
||
}
|
||
}
|
||
|
||
function onDragInterval() {
|
||
var prevCursor = dragCursor;
|
||
dragCursor = editor.renderer.screenToTextCoordinates(x, y);
|
||
scrollCursorIntoView(dragCursor, prevCursor);
|
||
autoScroll(dragCursor, prevCursor);
|
||
}
|
||
|
||
function addDragMarker() {
|
||
range = editor.selection.toOrientedRange();
|
||
dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle());
|
||
editor.clearSelection();
|
||
if (editor.isFocused())
|
||
editor.renderer.$cursorLayer.setBlinking(false);
|
||
clearInterval(timerId);
|
||
onDragInterval();
|
||
timerId = setInterval(onDragInterval, 20);
|
||
counter = 0;
|
||
event.addListener(document, "mousemove", onMouseMove);
|
||
}
|
||
|
||
function clearDragMarker() {
|
||
clearInterval(timerId);
|
||
editor.session.removeMarker(dragSelectionMarker);
|
||
dragSelectionMarker = null;
|
||
editor.$blockScrolling += 1;
|
||
editor.selection.fromOrientedRange(range);
|
||
editor.$blockScrolling -= 1;
|
||
if (editor.isFocused() && !isInternal)
|
||
editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());
|
||
range = null;
|
||
dragCursor = null;
|
||
counter = 0;
|
||
autoScrollStartTime = null;
|
||
cursorMovedTime = null;
|
||
event.removeListener(document, "mousemove", onMouseMove);
|
||
}
|
||
var onMouseMoveTimer = null;
|
||
function onMouseMove() {
|
||
if (onMouseMoveTimer == null) {
|
||
onMouseMoveTimer = setTimeout(function() {
|
||
if (onMouseMoveTimer != null && dragSelectionMarker)
|
||
clearDragMarker();
|
||
}, 20);
|
||
}
|
||
}
|
||
|
||
function canAccept(dataTransfer) {
|
||
var types = dataTransfer.types;
|
||
return !types || Array.prototype.some.call(types, function(type) {
|
||
return type == 'text/plain' || type == 'Text';
|
||
});
|
||
}
|
||
|
||
function getDropEffect(e) {
|
||
var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];
|
||
var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];
|
||
|
||
var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;
|
||
var effectAllowed = "uninitialized";
|
||
try {
|
||
effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();
|
||
} catch (e) {}
|
||
var dropEffect = "none";
|
||
|
||
if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)
|
||
dropEffect = "copy";
|
||
else if (moveAllowed.indexOf(effectAllowed) >= 0)
|
||
dropEffect = "move";
|
||
else if (copyAllowed.indexOf(effectAllowed) >= 0)
|
||
dropEffect = "copy";
|
||
|
||
return dropEffect;
|
||
}
|
||
}
|
||
|
||
(function() {
|
||
|
||
this.dragWait = function() {
|
||
var interval = Date.now() - this.mousedownEvent.time;
|
||
if (interval > this.editor.getDragDelay())
|
||
this.startDrag();
|
||
};
|
||
|
||
this.dragWaitEnd = function() {
|
||
var target = this.editor.container;
|
||
target.draggable = false;
|
||
this.startSelect(this.mousedownEvent.getDocumentPosition());
|
||
this.selectEnd();
|
||
};
|
||
|
||
this.dragReadyEnd = function(e) {
|
||
this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());
|
||
this.editor.unsetStyle("ace_dragging");
|
||
this.editor.renderer.setCursorStyle("");
|
||
this.dragWaitEnd();
|
||
};
|
||
|
||
this.startDrag = function(){
|
||
this.cancelDrag = false;
|
||
var editor = this.editor;
|
||
var target = editor.container;
|
||
target.draggable = true;
|
||
editor.renderer.$cursorLayer.setBlinking(false);
|
||
editor.setStyle("ace_dragging");
|
||
var cursorStyle = useragent.isWin ? "default" : "move";
|
||
editor.renderer.setCursorStyle(cursorStyle);
|
||
this.setState("dragReady");
|
||
};
|
||
|
||
this.onMouseDrag = function(e) {
|
||
var target = this.editor.container;
|
||
if (useragent.isIE && this.state == "dragReady") {
|
||
var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
|
||
if (distance > 3)
|
||
target.dragDrop();
|
||
}
|
||
if (this.state === "dragWait") {
|
||
var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);
|
||
if (distance > 0) {
|
||
target.draggable = false;
|
||
this.startSelect(this.mousedownEvent.getDocumentPosition());
|
||
}
|
||
}
|
||
};
|
||
|
||
this.onMouseDown = function(e) {
|
||
if (!this.$dragEnabled)
|
||
return;
|
||
this.mousedownEvent = e;
|
||
var editor = this.editor;
|
||
|
||
var inSelection = e.inSelection();
|
||
var button = e.getButton();
|
||
var clickCount = e.domEvent.detail || 1;
|
||
if (clickCount === 1 && button === 0 && inSelection) {
|
||
if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))
|
||
return;
|
||
this.mousedownEvent.time = Date.now();
|
||
var eventTarget = e.domEvent.target || e.domEvent.srcElement;
|
||
if ("unselectable" in eventTarget)
|
||
eventTarget.unselectable = "on";
|
||
if (editor.getDragDelay()) {
|
||
if (useragent.isWebKit) {
|
||
this.cancelDrag = true;
|
||
var mouseTarget = editor.container;
|
||
mouseTarget.draggable = true;
|
||
}
|
||
this.setState("dragWait");
|
||
} else {
|
||
this.startDrag();
|
||
}
|
||
this.captureMouse(e, this.onMouseDrag.bind(this));
|
||
e.defaultPrevented = true;
|
||
}
|
||
};
|
||
|
||
}).call(DragdropHandler.prototype);
|
||
|
||
|
||
function calcDistance(ax, ay, bx, by) {
|
||
return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));
|
||
}
|
||
|
||
exports.DragdropHandler = DragdropHandler;
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var dom = acequire("./dom");
|
||
|
||
exports.get = function (url, callback) {
|
||
var xhr = new XMLHttpRequest();
|
||
xhr.open('GET', url, true);
|
||
xhr.onreadystatechange = function () {
|
||
if (xhr.readyState === 4) {
|
||
callback(xhr.responseText);
|
||
}
|
||
};
|
||
xhr.send(null);
|
||
};
|
||
|
||
exports.loadScript = function(path, callback) {
|
||
var head = dom.getDocumentHead();
|
||
var s = document.createElement('script');
|
||
|
||
s.src = path;
|
||
head.appendChild(s);
|
||
|
||
s.onload = s.onreadystatechange = function(_, isAbort) {
|
||
if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") {
|
||
s = s.onload = s.onreadystatechange = null;
|
||
if (!isAbort)
|
||
callback();
|
||
}
|
||
};
|
||
};
|
||
exports.qualifyURL = function(url) {
|
||
var a = document.createElement('a');
|
||
a.href = url;
|
||
return a.href;
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/event_emitter",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var EventEmitter = {};
|
||
var stopPropagation = function() { this.propagationStopped = true; };
|
||
var preventDefault = function() { this.defaultPrevented = true; };
|
||
|
||
EventEmitter._emit =
|
||
EventEmitter._dispatchEvent = function(eventName, e) {
|
||
this._eventRegistry || (this._eventRegistry = {});
|
||
this._defaultHandlers || (this._defaultHandlers = {});
|
||
|
||
var listeners = this._eventRegistry[eventName] || [];
|
||
var defaultHandler = this._defaultHandlers[eventName];
|
||
if (!listeners.length && !defaultHandler)
|
||
return;
|
||
|
||
if (typeof e != "object" || !e)
|
||
e = {};
|
||
|
||
if (!e.type)
|
||
e.type = eventName;
|
||
if (!e.stopPropagation)
|
||
e.stopPropagation = stopPropagation;
|
||
if (!e.preventDefault)
|
||
e.preventDefault = preventDefault;
|
||
|
||
listeners = listeners.slice();
|
||
for (var i=0; i<listeners.length; i++) {
|
||
listeners[i](e, this);
|
||
if (e.propagationStopped)
|
||
break;
|
||
}
|
||
|
||
if (defaultHandler && !e.defaultPrevented)
|
||
return defaultHandler(e, this);
|
||
};
|
||
|
||
|
||
EventEmitter._signal = function(eventName, e) {
|
||
var listeners = (this._eventRegistry || {})[eventName];
|
||
if (!listeners)
|
||
return;
|
||
listeners = listeners.slice();
|
||
for (var i=0; i<listeners.length; i++)
|
||
listeners[i](e, this);
|
||
};
|
||
|
||
EventEmitter.once = function(eventName, callback) {
|
||
var _self = this;
|
||
callback && this.addEventListener(eventName, function newCallback() {
|
||
_self.removeEventListener(eventName, newCallback);
|
||
callback.apply(null, arguments);
|
||
});
|
||
};
|
||
|
||
|
||
EventEmitter.setDefaultHandler = function(eventName, callback) {
|
||
var handlers = this._defaultHandlers
|
||
if (!handlers)
|
||
handlers = this._defaultHandlers = {_disabled_: {}};
|
||
|
||
if (handlers[eventName]) {
|
||
var old = handlers[eventName];
|
||
var disabled = handlers._disabled_[eventName];
|
||
if (!disabled)
|
||
handlers._disabled_[eventName] = disabled = [];
|
||
disabled.push(old);
|
||
var i = disabled.indexOf(callback);
|
||
if (i != -1)
|
||
disabled.splice(i, 1);
|
||
}
|
||
handlers[eventName] = callback;
|
||
};
|
||
EventEmitter.removeDefaultHandler = function(eventName, callback) {
|
||
var handlers = this._defaultHandlers
|
||
if (!handlers)
|
||
return;
|
||
var disabled = handlers._disabled_[eventName];
|
||
|
||
if (handlers[eventName] == callback) {
|
||
var old = handlers[eventName];
|
||
if (disabled)
|
||
this.setDefaultHandler(eventName, disabled.pop());
|
||
} else if (disabled) {
|
||
var i = disabled.indexOf(callback);
|
||
if (i != -1)
|
||
disabled.splice(i, 1);
|
||
}
|
||
};
|
||
|
||
EventEmitter.on =
|
||
EventEmitter.addEventListener = function(eventName, callback, capturing) {
|
||
this._eventRegistry = this._eventRegistry || {};
|
||
|
||
var listeners = this._eventRegistry[eventName];
|
||
if (!listeners)
|
||
listeners = this._eventRegistry[eventName] = [];
|
||
|
||
if (listeners.indexOf(callback) == -1)
|
||
listeners[capturing ? "unshift" : "push"](callback);
|
||
return callback;
|
||
};
|
||
|
||
EventEmitter.off =
|
||
EventEmitter.removeListener =
|
||
EventEmitter.removeEventListener = function(eventName, callback) {
|
||
this._eventRegistry = this._eventRegistry || {};
|
||
|
||
var listeners = this._eventRegistry[eventName];
|
||
if (!listeners)
|
||
return;
|
||
|
||
var index = listeners.indexOf(callback);
|
||
if (index !== -1)
|
||
listeners.splice(index, 1);
|
||
};
|
||
|
||
EventEmitter.removeAllListeners = function(eventName) {
|
||
if (this._eventRegistry) this._eventRegistry[eventName] = [];
|
||
};
|
||
|
||
exports.EventEmitter = EventEmitter;
|
||
|
||
});
|
||
|
||
ace.define("ace/lib/app_config",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"no use strict";
|
||
|
||
var oop = acequire("./oop");
|
||
var EventEmitter = acequire("./event_emitter").EventEmitter;
|
||
|
||
var optionsProvider = {
|
||
setOptions: function(optList) {
|
||
Object.keys(optList).forEach(function(key) {
|
||
this.setOption(key, optList[key]);
|
||
}, this);
|
||
},
|
||
getOptions: function(optionNames) {
|
||
var result = {};
|
||
if (!optionNames) {
|
||
optionNames = Object.keys(this.$options);
|
||
} else if (!Array.isArray(optionNames)) {
|
||
result = optionNames;
|
||
optionNames = Object.keys(result);
|
||
}
|
||
optionNames.forEach(function(key) {
|
||
result[key] = this.getOption(key);
|
||
}, this);
|
||
return result;
|
||
},
|
||
setOption: function(name, value) {
|
||
if (this["$" + name] === value)
|
||
return;
|
||
var opt = this.$options[name];
|
||
if (!opt) {
|
||
return warn('misspelled option "' + name + '"');
|
||
}
|
||
if (opt.forwardTo)
|
||
return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);
|
||
|
||
if (!opt.handlesSet)
|
||
this["$" + name] = value;
|
||
if (opt && opt.set)
|
||
opt.set.call(this, value);
|
||
},
|
||
getOption: function(name) {
|
||
var opt = this.$options[name];
|
||
if (!opt) {
|
||
return warn('misspelled option "' + name + '"');
|
||
}
|
||
if (opt.forwardTo)
|
||
return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);
|
||
return opt && opt.get ? opt.get.call(this) : this["$" + name];
|
||
}
|
||
};
|
||
|
||
function warn(message) {
|
||
if (typeof console != "undefined" && console.warn)
|
||
console.warn.apply(console, arguments);
|
||
}
|
||
|
||
function reportError(msg, data) {
|
||
var e = new Error(msg);
|
||
e.data = data;
|
||
if (typeof console == "object" && console.error)
|
||
console.error(e);
|
||
setTimeout(function() { throw e; });
|
||
}
|
||
|
||
var AppConfig = function() {
|
||
this.$defaultOptions = {};
|
||
};
|
||
|
||
(function() {
|
||
oop.implement(this, EventEmitter);
|
||
this.defineOptions = function(obj, path, options) {
|
||
if (!obj.$options)
|
||
this.$defaultOptions[path] = obj.$options = {};
|
||
|
||
Object.keys(options).forEach(function(key) {
|
||
var opt = options[key];
|
||
if (typeof opt == "string")
|
||
opt = {forwardTo: opt};
|
||
|
||
opt.name || (opt.name = key);
|
||
obj.$options[opt.name] = opt;
|
||
if ("initialValue" in opt)
|
||
obj["$" + opt.name] = opt.initialValue;
|
||
});
|
||
oop.implement(obj, optionsProvider);
|
||
|
||
return this;
|
||
};
|
||
|
||
this.resetOptions = function(obj) {
|
||
Object.keys(obj.$options).forEach(function(key) {
|
||
var opt = obj.$options[key];
|
||
if ("value" in opt)
|
||
obj.setOption(key, opt.value);
|
||
});
|
||
};
|
||
|
||
this.setDefaultValue = function(path, name, value) {
|
||
var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {});
|
||
if (opts[name]) {
|
||
if (opts.forwardTo)
|
||
this.setDefaultValue(opts.forwardTo, name, value);
|
||
else
|
||
opts[name].value = value;
|
||
}
|
||
};
|
||
|
||
this.setDefaultValues = function(path, optionHash) {
|
||
Object.keys(optionHash).forEach(function(key) {
|
||
this.setDefaultValue(path, key, optionHash[key]);
|
||
}, this);
|
||
};
|
||
|
||
this.warn = warn;
|
||
this.reportError = reportError;
|
||
|
||
}).call(AppConfig.prototype);
|
||
|
||
exports.AppConfig = AppConfig;
|
||
|
||
});
|
||
|
||
ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/app_config"], function(acequire, exports, module) {
|
||
"no use strict";
|
||
|
||
var lang = acequire("./lib/lang");
|
||
var oop = acequire("./lib/oop");
|
||
var net = acequire("./lib/net");
|
||
var AppConfig = acequire("./lib/app_config").AppConfig;
|
||
|
||
module.exports = exports = new AppConfig();
|
||
|
||
var global = (function() {
|
||
return this || typeof window != "undefined" && window;
|
||
})();
|
||
|
||
var options = {
|
||
packaged: false,
|
||
workerPath: null,
|
||
modePath: null,
|
||
themePath: null,
|
||
basePath: "",
|
||
suffix: ".js",
|
||
$moduleUrls: {}
|
||
};
|
||
|
||
exports.get = function(key) {
|
||
if (!options.hasOwnProperty(key))
|
||
throw new Error("Unknown config key: " + key);
|
||
|
||
return options[key];
|
||
};
|
||
|
||
exports.set = function(key, value) {
|
||
if (!options.hasOwnProperty(key))
|
||
throw new Error("Unknown config key: " + key);
|
||
|
||
options[key] = value;
|
||
};
|
||
|
||
exports.all = function() {
|
||
return lang.copyObject(options);
|
||
};
|
||
exports.moduleUrl = function(name, component) {
|
||
if (options.$moduleUrls[name])
|
||
return options.$moduleUrls[name];
|
||
|
||
var parts = name.split("/");
|
||
component = component || parts[parts.length - 2] || "";
|
||
var sep = component == "snippets" ? "/" : "-";
|
||
var base = parts[parts.length - 1];
|
||
if (component == "worker" && sep == "-") {
|
||
var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g");
|
||
base = base.replace(re, "");
|
||
}
|
||
|
||
if ((!base || base == component) && parts.length > 1)
|
||
base = parts[parts.length - 2];
|
||
var path = options[component + "Path"];
|
||
if (path == null) {
|
||
path = options.basePath;
|
||
} else if (sep == "/") {
|
||
component = sep = "";
|
||
}
|
||
if (path && path.slice(-1) != "/")
|
||
path += "/";
|
||
return path + component + sep + base + this.get("suffix");
|
||
};
|
||
|
||
exports.setModuleUrl = function(name, subst) {
|
||
return options.$moduleUrls[name] = subst;
|
||
};
|
||
|
||
exports.$loading = {};
|
||
exports.loadModule = function(moduleName, onLoad) {
|
||
var module, moduleType;
|
||
if (Array.isArray(moduleName)) {
|
||
moduleType = moduleName[0];
|
||
moduleName = moduleName[1];
|
||
}
|
||
|
||
try {
|
||
module = acequire(moduleName);
|
||
} catch (e) {}
|
||
if (module && !exports.$loading[moduleName])
|
||
return onLoad && onLoad(module);
|
||
|
||
if (!exports.$loading[moduleName])
|
||
exports.$loading[moduleName] = [];
|
||
|
||
exports.$loading[moduleName].push(onLoad);
|
||
|
||
if (exports.$loading[moduleName].length > 1)
|
||
return;
|
||
|
||
var afterLoad = function() {
|
||
acequire([moduleName], function(module) {
|
||
exports._emit("load.module", {name: moduleName, module: module});
|
||
var listeners = exports.$loading[moduleName];
|
||
exports.$loading[moduleName] = null;
|
||
listeners.forEach(function(onLoad) {
|
||
onLoad && onLoad(module);
|
||
});
|
||
});
|
||
};
|
||
|
||
if (!exports.get("packaged"))
|
||
return afterLoad();
|
||
net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);
|
||
};
|
||
init(true);function init(packaged) {
|
||
|
||
if (!global || !global.document)
|
||
return;
|
||
|
||
options.packaged = packaged || acequire.packaged || module.packaged || (global.define && __webpack_require__(13).packaged);
|
||
|
||
var scriptOptions = {};
|
||
var scriptUrl = "";
|
||
var currentScript = (document.currentScript || document._currentScript ); // native or polyfill
|
||
var currentDocument = currentScript && currentScript.ownerDocument || document;
|
||
|
||
var scripts = currentDocument.getElementsByTagName("script");
|
||
for (var i=0; i<scripts.length; i++) {
|
||
var script = scripts[i];
|
||
|
||
var src = script.src || script.getAttribute("src");
|
||
if (!src)
|
||
continue;
|
||
|
||
var attributes = script.attributes;
|
||
for (var j=0, l=attributes.length; j < l; j++) {
|
||
var attr = attributes[j];
|
||
if (attr.name.indexOf("data-ace-") === 0) {
|
||
scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, ""))] = attr.value;
|
||
}
|
||
}
|
||
|
||
var m = src.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/);
|
||
if (m)
|
||
scriptUrl = m[1];
|
||
}
|
||
|
||
if (scriptUrl) {
|
||
scriptOptions.base = scriptOptions.base || scriptUrl;
|
||
scriptOptions.packaged = true;
|
||
}
|
||
|
||
scriptOptions.basePath = scriptOptions.base;
|
||
scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;
|
||
scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;
|
||
scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;
|
||
delete scriptOptions.base;
|
||
|
||
for (var key in scriptOptions)
|
||
if (typeof scriptOptions[key] !== "undefined")
|
||
exports.set(key, scriptOptions[key]);
|
||
}
|
||
|
||
exports.init = init;
|
||
|
||
function deHyphenate(str) {
|
||
return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
var DefaultHandlers = acequire("./default_handlers").DefaultHandlers;
|
||
var DefaultGutterHandler = acequire("./default_gutter_handler").GutterHandler;
|
||
var MouseEvent = acequire("./mouse_event").MouseEvent;
|
||
var DragdropHandler = acequire("./dragdrop_handler").DragdropHandler;
|
||
var config = acequire("../config");
|
||
|
||
var MouseHandler = function(editor) {
|
||
var _self = this;
|
||
this.editor = editor;
|
||
|
||
new DefaultHandlers(this);
|
||
new DefaultGutterHandler(this);
|
||
new DragdropHandler(this);
|
||
|
||
var focusEditor = function(e) {
|
||
var windowBlurred = !document.hasFocus || !document.hasFocus()
|
||
|| !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement())
|
||
if (windowBlurred)
|
||
window.focus();
|
||
editor.focus();
|
||
};
|
||
|
||
var mouseTarget = editor.renderer.getMouseEventTarget();
|
||
event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"));
|
||
event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"));
|
||
event.addMultiMouseDownListener([
|
||
mouseTarget,
|
||
editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner,
|
||
editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner,
|
||
editor.textInput && editor.textInput.getElement()
|
||
].filter(Boolean), [400, 300, 250], this, "onMouseEvent");
|
||
event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"));
|
||
event.addTouchMoveListener(editor.container, this.onTouchMove.bind(this, "touchmove"));
|
||
|
||
var gutterEl = editor.renderer.$gutter;
|
||
event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"));
|
||
event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"));
|
||
event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"));
|
||
event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"));
|
||
|
||
event.addListener(mouseTarget, "mousedown", focusEditor);
|
||
event.addListener(gutterEl, "mousedown", focusEditor);
|
||
if (useragent.isIE && editor.renderer.scrollBarV) {
|
||
event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor);
|
||
event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor);
|
||
}
|
||
|
||
editor.on("mousemove", function(e){
|
||
if (_self.state || _self.$dragDelay || !_self.$dragEnabled)
|
||
return;
|
||
|
||
var character = editor.renderer.screenToTextCoordinates(e.x, e.y);
|
||
var range = editor.session.selection.getRange();
|
||
var renderer = editor.renderer;
|
||
|
||
if (!range.isEmpty() && range.insideStart(character.row, character.column)) {
|
||
renderer.setCursorStyle("default");
|
||
} else {
|
||
renderer.setCursorStyle("");
|
||
}
|
||
});
|
||
};
|
||
|
||
(function() {
|
||
this.onMouseEvent = function(name, e) {
|
||
this.editor._emit(name, new MouseEvent(e, this.editor));
|
||
};
|
||
|
||
this.onMouseMove = function(name, e) {
|
||
var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;
|
||
if (!listeners || !listeners.length)
|
||
return;
|
||
|
||
this.editor._emit(name, new MouseEvent(e, this.editor));
|
||
};
|
||
|
||
this.onMouseWheel = function(name, e) {
|
||
var mouseEvent = new MouseEvent(e, this.editor);
|
||
mouseEvent.speed = this.$scrollSpeed * 2;
|
||
mouseEvent.wheelX = e.wheelX;
|
||
mouseEvent.wheelY = e.wheelY;
|
||
|
||
this.editor._emit(name, mouseEvent);
|
||
};
|
||
|
||
this.onTouchMove = function (name, e) {
|
||
var mouseEvent = new MouseEvent(e, this.editor);
|
||
mouseEvent.speed = 1;//this.$scrollSpeed * 2;
|
||
mouseEvent.wheelX = e.wheelX;
|
||
mouseEvent.wheelY = e.wheelY;
|
||
this.editor._emit(name, mouseEvent);
|
||
};
|
||
|
||
this.setState = function(state) {
|
||
this.state = state;
|
||
};
|
||
|
||
this.captureMouse = function(ev, mouseMoveHandler) {
|
||
this.x = ev.x;
|
||
this.y = ev.y;
|
||
|
||
this.isMousePressed = true;
|
||
var renderer = this.editor.renderer;
|
||
if (renderer.$keepTextAreaAtCursor)
|
||
renderer.$keepTextAreaAtCursor = null;
|
||
|
||
var self = this;
|
||
var onMouseMove = function(e) {
|
||
if (!e) return;
|
||
if (useragent.isWebKit && !e.which && self.releaseMouse)
|
||
return self.releaseMouse();
|
||
|
||
self.x = e.clientX;
|
||
self.y = e.clientY;
|
||
mouseMoveHandler && mouseMoveHandler(e);
|
||
self.mouseEvent = new MouseEvent(e, self.editor);
|
||
self.$mouseMoved = true;
|
||
};
|
||
|
||
var onCaptureEnd = function(e) {
|
||
clearInterval(timerId);
|
||
onCaptureInterval();
|
||
self[self.state + "End"] && self[self.state + "End"](e);
|
||
self.state = "";
|
||
if (renderer.$keepTextAreaAtCursor == null) {
|
||
renderer.$keepTextAreaAtCursor = true;
|
||
renderer.$moveTextAreaToCursor();
|
||
}
|
||
self.isMousePressed = false;
|
||
self.$onCaptureMouseMove = self.releaseMouse = null;
|
||
e && self.onMouseEvent("mouseup", e);
|
||
};
|
||
|
||
var onCaptureInterval = function() {
|
||
self[self.state] && self[self.state]();
|
||
self.$mouseMoved = false;
|
||
};
|
||
|
||
if (useragent.isOldIE && ev.domEvent.type == "dblclick") {
|
||
return setTimeout(function() {onCaptureEnd(ev);});
|
||
}
|
||
|
||
self.$onCaptureMouseMove = onMouseMove;
|
||
self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);
|
||
var timerId = setInterval(onCaptureInterval, 20);
|
||
};
|
||
this.releaseMouse = null;
|
||
this.cancelContextMenu = function() {
|
||
var stop = function(e) {
|
||
if (e && e.domEvent && e.domEvent.type != "contextmenu")
|
||
return;
|
||
this.editor.off("nativecontextmenu", stop);
|
||
if (e && e.domEvent)
|
||
event.stopEvent(e.domEvent);
|
||
}.bind(this);
|
||
setTimeout(stop, 10);
|
||
this.editor.on("nativecontextmenu", stop);
|
||
};
|
||
}).call(MouseHandler.prototype);
|
||
|
||
config.defineOptions(MouseHandler.prototype, "mouseHandler", {
|
||
scrollSpeed: {initialValue: 2},
|
||
dragDelay: {initialValue: (useragent.isMac ? 150 : 0)},
|
||
dragEnabled: {initialValue: true},
|
||
focusTimout: {initialValue: 0},
|
||
tooltipFollowsMouse: {initialValue: true}
|
||
});
|
||
|
||
|
||
exports.MouseHandler = MouseHandler;
|
||
});
|
||
|
||
ace.define("ace/mouse/fold_handler",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
function FoldHandler(editor) {
|
||
|
||
editor.on("click", function(e) {
|
||
var position = e.getDocumentPosition();
|
||
var session = editor.session;
|
||
var fold = session.getFoldAt(position.row, position.column, 1);
|
||
if (fold) {
|
||
if (e.getAccelKey())
|
||
session.removeFold(fold);
|
||
else
|
||
session.expandFold(fold);
|
||
|
||
e.stop();
|
||
}
|
||
});
|
||
|
||
editor.on("gutterclick", function(e) {
|
||
var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);
|
||
|
||
if (gutterRegion == "foldWidgets") {
|
||
var row = e.getDocumentPosition().row;
|
||
var session = editor.session;
|
||
if (session.foldWidgets && session.foldWidgets[row])
|
||
editor.session.onFoldWidgetClick(row, e);
|
||
if (!editor.isFocused())
|
||
editor.focus();
|
||
e.stop();
|
||
}
|
||
});
|
||
|
||
editor.on("gutterdblclick", function(e) {
|
||
var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);
|
||
|
||
if (gutterRegion == "foldWidgets") {
|
||
var row = e.getDocumentPosition().row;
|
||
var session = editor.session;
|
||
var data = session.getParentFoldRangeData(row, true);
|
||
var range = data.range || data.firstRange;
|
||
|
||
if (range) {
|
||
row = range.start.row;
|
||
var fold = session.getFoldAt(row, session.getLine(row).length, 1);
|
||
|
||
if (fold) {
|
||
session.removeFold(fold);
|
||
} else {
|
||
session.addFold("...", range);
|
||
editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});
|
||
}
|
||
}
|
||
e.stop();
|
||
}
|
||
});
|
||
}
|
||
|
||
exports.FoldHandler = FoldHandler;
|
||
|
||
});
|
||
|
||
ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var keyUtil = acequire("../lib/keys");
|
||
var event = acequire("../lib/event");
|
||
|
||
var KeyBinding = function(editor) {
|
||
this.$editor = editor;
|
||
this.$data = {editor: editor};
|
||
this.$handlers = [];
|
||
this.setDefaultHandler(editor.commands);
|
||
};
|
||
|
||
(function() {
|
||
this.setDefaultHandler = function(kb) {
|
||
this.removeKeyboardHandler(this.$defaultHandler);
|
||
this.$defaultHandler = kb;
|
||
this.addKeyboardHandler(kb, 0);
|
||
};
|
||
|
||
this.setKeyboardHandler = function(kb) {
|
||
var h = this.$handlers;
|
||
if (h[h.length - 1] == kb)
|
||
return;
|
||
|
||
while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)
|
||
this.removeKeyboardHandler(h[h.length - 1]);
|
||
|
||
this.addKeyboardHandler(kb, 1);
|
||
};
|
||
|
||
this.addKeyboardHandler = function(kb, pos) {
|
||
if (!kb)
|
||
return;
|
||
if (typeof kb == "function" && !kb.handleKeyboard)
|
||
kb.handleKeyboard = kb;
|
||
var i = this.$handlers.indexOf(kb);
|
||
if (i != -1)
|
||
this.$handlers.splice(i, 1);
|
||
|
||
if (pos == undefined)
|
||
this.$handlers.push(kb);
|
||
else
|
||
this.$handlers.splice(pos, 0, kb);
|
||
|
||
if (i == -1 && kb.attach)
|
||
kb.attach(this.$editor);
|
||
};
|
||
|
||
this.removeKeyboardHandler = function(kb) {
|
||
var i = this.$handlers.indexOf(kb);
|
||
if (i == -1)
|
||
return false;
|
||
this.$handlers.splice(i, 1);
|
||
kb.detach && kb.detach(this.$editor);
|
||
return true;
|
||
};
|
||
|
||
this.getKeyboardHandler = function() {
|
||
return this.$handlers[this.$handlers.length - 1];
|
||
};
|
||
|
||
this.getStatusText = function() {
|
||
var data = this.$data;
|
||
var editor = data.editor;
|
||
return this.$handlers.map(function(h) {
|
||
return h.getStatusText && h.getStatusText(editor, data) || "";
|
||
}).filter(Boolean).join(" ");
|
||
};
|
||
|
||
this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) {
|
||
var toExecute;
|
||
var success = false;
|
||
var commands = this.$editor.commands;
|
||
|
||
for (var i = this.$handlers.length; i--;) {
|
||
toExecute = this.$handlers[i].handleKeyboard(
|
||
this.$data, hashId, keyString, keyCode, e
|
||
);
|
||
if (!toExecute || !toExecute.command)
|
||
continue;
|
||
if (toExecute.command == "null") {
|
||
success = true;
|
||
} else {
|
||
success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);
|
||
}
|
||
if (success && e && hashId != -1 &&
|
||
toExecute.passEvent != true && toExecute.command.passEvent != true
|
||
) {
|
||
event.stopEvent(e);
|
||
}
|
||
if (success)
|
||
break;
|
||
}
|
||
|
||
if (!success && hashId == -1) {
|
||
toExecute = {command: "insertstring"};
|
||
success = commands.exec("insertstring", this.$editor, keyString);
|
||
}
|
||
|
||
if (success)
|
||
this.$editor._signal("keyboardActivity", toExecute);
|
||
|
||
return success;
|
||
};
|
||
|
||
this.onCommandKey = function(e, hashId, keyCode) {
|
||
var keyString = keyUtil.keyCodeToString(keyCode);
|
||
this.$callKeyboardHandlers(hashId, keyString, keyCode, e);
|
||
};
|
||
|
||
this.onTextInput = function(text) {
|
||
this.$callKeyboardHandlers(-1, text);
|
||
};
|
||
|
||
}).call(KeyBinding.prototype);
|
||
|
||
exports.KeyBinding = KeyBinding;
|
||
});
|
||
|
||
ace.define("ace/range",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var comparePoints = function(p1, p2) {
|
||
return p1.row - p2.row || p1.column - p2.column;
|
||
};
|
||
var Range = function(startRow, startColumn, endRow, endColumn) {
|
||
this.start = {
|
||
row: startRow,
|
||
column: startColumn
|
||
};
|
||
|
||
this.end = {
|
||
row: endRow,
|
||
column: endColumn
|
||
};
|
||
};
|
||
|
||
(function() {
|
||
this.isEqual = function(range) {
|
||
return this.start.row === range.start.row &&
|
||
this.end.row === range.end.row &&
|
||
this.start.column === range.start.column &&
|
||
this.end.column === range.end.column;
|
||
};
|
||
this.toString = function() {
|
||
return ("Range: [" + this.start.row + "/" + this.start.column +
|
||
"] -> [" + this.end.row + "/" + this.end.column + "]");
|
||
};
|
||
|
||
this.contains = function(row, column) {
|
||
return this.compare(row, column) == 0;
|
||
};
|
||
this.compareRange = function(range) {
|
||
var cmp,
|
||
end = range.end,
|
||
start = range.start;
|
||
|
||
cmp = this.compare(end.row, end.column);
|
||
if (cmp == 1) {
|
||
cmp = this.compare(start.row, start.column);
|
||
if (cmp == 1) {
|
||
return 2;
|
||
} else if (cmp == 0) {
|
||
return 1;
|
||
} else {
|
||
return 0;
|
||
}
|
||
} else if (cmp == -1) {
|
||
return -2;
|
||
} else {
|
||
cmp = this.compare(start.row, start.column);
|
||
if (cmp == -1) {
|
||
return -1;
|
||
} else if (cmp == 1) {
|
||
return 42;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
};
|
||
this.comparePoint = function(p) {
|
||
return this.compare(p.row, p.column);
|
||
};
|
||
this.containsRange = function(range) {
|
||
return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
|
||
};
|
||
this.intersects = function(range) {
|
||
var cmp = this.compareRange(range);
|
||
return (cmp == -1 || cmp == 0 || cmp == 1);
|
||
};
|
||
this.isEnd = function(row, column) {
|
||
return this.end.row == row && this.end.column == column;
|
||
};
|
||
this.isStart = function(row, column) {
|
||
return this.start.row == row && this.start.column == column;
|
||
};
|
||
this.setStart = function(row, column) {
|
||
if (typeof row == "object") {
|
||
this.start.column = row.column;
|
||
this.start.row = row.row;
|
||
} else {
|
||
this.start.row = row;
|
||
this.start.column = column;
|
||
}
|
||
};
|
||
this.setEnd = function(row, column) {
|
||
if (typeof row == "object") {
|
||
this.end.column = row.column;
|
||
this.end.row = row.row;
|
||
} else {
|
||
this.end.row = row;
|
||
this.end.column = column;
|
||
}
|
||
};
|
||
this.inside = function(row, column) {
|
||
if (this.compare(row, column) == 0) {
|
||
if (this.isEnd(row, column) || this.isStart(row, column)) {
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
this.insideStart = function(row, column) {
|
||
if (this.compare(row, column) == 0) {
|
||
if (this.isEnd(row, column)) {
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
this.insideEnd = function(row, column) {
|
||
if (this.compare(row, column) == 0) {
|
||
if (this.isStart(row, column)) {
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
this.compare = function(row, column) {
|
||
if (!this.isMultiLine()) {
|
||
if (row === this.start.row) {
|
||
return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
|
||
}
|
||
}
|
||
|
||
if (row < this.start.row)
|
||
return -1;
|
||
|
||
if (row > this.end.row)
|
||
return 1;
|
||
|
||
if (this.start.row === row)
|
||
return column >= this.start.column ? 0 : -1;
|
||
|
||
if (this.end.row === row)
|
||
return column <= this.end.column ? 0 : 1;
|
||
|
||
return 0;
|
||
};
|
||
this.compareStart = function(row, column) {
|
||
if (this.start.row == row && this.start.column == column) {
|
||
return -1;
|
||
} else {
|
||
return this.compare(row, column);
|
||
}
|
||
};
|
||
this.compareEnd = function(row, column) {
|
||
if (this.end.row == row && this.end.column == column) {
|
||
return 1;
|
||
} else {
|
||
return this.compare(row, column);
|
||
}
|
||
};
|
||
this.compareInside = function(row, column) {
|
||
if (this.end.row == row && this.end.column == column) {
|
||
return 1;
|
||
} else if (this.start.row == row && this.start.column == column) {
|
||
return -1;
|
||
} else {
|
||
return this.compare(row, column);
|
||
}
|
||
};
|
||
this.clipRows = function(firstRow, lastRow) {
|
||
if (this.end.row > lastRow)
|
||
var end = {row: lastRow + 1, column: 0};
|
||
else if (this.end.row < firstRow)
|
||
var end = {row: firstRow, column: 0};
|
||
|
||
if (this.start.row > lastRow)
|
||
var start = {row: lastRow + 1, column: 0};
|
||
else if (this.start.row < firstRow)
|
||
var start = {row: firstRow, column: 0};
|
||
|
||
return Range.fromPoints(start || this.start, end || this.end);
|
||
};
|
||
this.extend = function(row, column) {
|
||
var cmp = this.compare(row, column);
|
||
|
||
if (cmp == 0)
|
||
return this;
|
||
else if (cmp == -1)
|
||
var start = {row: row, column: column};
|
||
else
|
||
var end = {row: row, column: column};
|
||
|
||
return Range.fromPoints(start || this.start, end || this.end);
|
||
};
|
||
|
||
this.isEmpty = function() {
|
||
return (this.start.row === this.end.row && this.start.column === this.end.column);
|
||
};
|
||
this.isMultiLine = function() {
|
||
return (this.start.row !== this.end.row);
|
||
};
|
||
this.clone = function() {
|
||
return Range.fromPoints(this.start, this.end);
|
||
};
|
||
this.collapseRows = function() {
|
||
if (this.end.column == 0)
|
||
return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
|
||
else
|
||
return new Range(this.start.row, 0, this.end.row, 0)
|
||
};
|
||
this.toScreenRange = function(session) {
|
||
var screenPosStart = session.documentToScreenPosition(this.start);
|
||
var screenPosEnd = session.documentToScreenPosition(this.end);
|
||
|
||
return new Range(
|
||
screenPosStart.row, screenPosStart.column,
|
||
screenPosEnd.row, screenPosEnd.column
|
||
);
|
||
};
|
||
this.moveBy = function(row, column) {
|
||
this.start.row += row;
|
||
this.start.column += column;
|
||
this.end.row += row;
|
||
this.end.column += column;
|
||
};
|
||
|
||
}).call(Range.prototype);
|
||
Range.fromPoints = function(start, end) {
|
||
return new Range(start.row, start.column, end.row, end.column);
|
||
};
|
||
Range.comparePoints = comparePoints;
|
||
|
||
Range.comparePoints = function(p1, p2) {
|
||
return p1.row - p2.row || p1.column - p2.column;
|
||
};
|
||
|
||
|
||
exports.Range = Range;
|
||
});
|
||
|
||
ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var lang = acequire("./lib/lang");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var Range = acequire("./range").Range;
|
||
var Selection = function(session) {
|
||
this.session = session;
|
||
this.doc = session.getDocument();
|
||
|
||
this.clearSelection();
|
||
this.lead = this.selectionLead = this.doc.createAnchor(0, 0);
|
||
this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);
|
||
|
||
var self = this;
|
||
this.lead.on("change", function(e) {
|
||
self._emit("changeCursor");
|
||
if (!self.$isEmpty)
|
||
self._emit("changeSelection");
|
||
if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)
|
||
self.$desiredColumn = null;
|
||
});
|
||
|
||
this.selectionAnchor.on("change", function() {
|
||
if (!self.$isEmpty)
|
||
self._emit("changeSelection");
|
||
});
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.isEmpty = function() {
|
||
return (this.$isEmpty || (
|
||
this.anchor.row == this.lead.row &&
|
||
this.anchor.column == this.lead.column
|
||
));
|
||
};
|
||
this.isMultiLine = function() {
|
||
if (this.isEmpty()) {
|
||
return false;
|
||
}
|
||
|
||
return this.getRange().isMultiLine();
|
||
};
|
||
this.getCursor = function() {
|
||
return this.lead.getPosition();
|
||
};
|
||
this.setSelectionAnchor = function(row, column) {
|
||
this.anchor.setPosition(row, column);
|
||
|
||
if (this.$isEmpty) {
|
||
this.$isEmpty = false;
|
||
this._emit("changeSelection");
|
||
}
|
||
};
|
||
this.getSelectionAnchor = function() {
|
||
if (this.$isEmpty)
|
||
return this.getSelectionLead();
|
||
else
|
||
return this.anchor.getPosition();
|
||
};
|
||
this.getSelectionLead = function() {
|
||
return this.lead.getPosition();
|
||
};
|
||
this.shiftSelection = function(columns) {
|
||
if (this.$isEmpty) {
|
||
this.moveCursorTo(this.lead.row, this.lead.column + columns);
|
||
return;
|
||
}
|
||
|
||
var anchor = this.getSelectionAnchor();
|
||
var lead = this.getSelectionLead();
|
||
|
||
var isBackwards = this.isBackwards();
|
||
|
||
if (!isBackwards || anchor.column !== 0)
|
||
this.setSelectionAnchor(anchor.row, anchor.column + columns);
|
||
|
||
if (isBackwards || lead.column !== 0) {
|
||
this.$moveSelection(function() {
|
||
this.moveCursorTo(lead.row, lead.column + columns);
|
||
});
|
||
}
|
||
};
|
||
this.isBackwards = function() {
|
||
var anchor = this.anchor;
|
||
var lead = this.lead;
|
||
return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));
|
||
};
|
||
this.getRange = function() {
|
||
var anchor = this.anchor;
|
||
var lead = this.lead;
|
||
|
||
if (this.isEmpty())
|
||
return Range.fromPoints(lead, lead);
|
||
|
||
if (this.isBackwards()) {
|
||
return Range.fromPoints(lead, anchor);
|
||
}
|
||
else {
|
||
return Range.fromPoints(anchor, lead);
|
||
}
|
||
};
|
||
this.clearSelection = function() {
|
||
if (!this.$isEmpty) {
|
||
this.$isEmpty = true;
|
||
this._emit("changeSelection");
|
||
}
|
||
};
|
||
this.selectAll = function() {
|
||
var lastRow = this.doc.getLength() - 1;
|
||
this.setSelectionAnchor(0, 0);
|
||
this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);
|
||
};
|
||
this.setRange =
|
||
this.setSelectionRange = function(range, reverse) {
|
||
if (reverse) {
|
||
this.setSelectionAnchor(range.end.row, range.end.column);
|
||
this.selectTo(range.start.row, range.start.column);
|
||
} else {
|
||
this.setSelectionAnchor(range.start.row, range.start.column);
|
||
this.selectTo(range.end.row, range.end.column);
|
||
}
|
||
if (this.getRange().isEmpty())
|
||
this.$isEmpty = true;
|
||
this.$desiredColumn = null;
|
||
};
|
||
|
||
this.$moveSelection = function(mover) {
|
||
var lead = this.lead;
|
||
if (this.$isEmpty)
|
||
this.setSelectionAnchor(lead.row, lead.column);
|
||
|
||
mover.call(this);
|
||
};
|
||
this.selectTo = function(row, column) {
|
||
this.$moveSelection(function() {
|
||
this.moveCursorTo(row, column);
|
||
});
|
||
};
|
||
this.selectToPosition = function(pos) {
|
||
this.$moveSelection(function() {
|
||
this.moveCursorToPosition(pos);
|
||
});
|
||
};
|
||
this.moveTo = function(row, column) {
|
||
this.clearSelection();
|
||
this.moveCursorTo(row, column);
|
||
};
|
||
this.moveToPosition = function(pos) {
|
||
this.clearSelection();
|
||
this.moveCursorToPosition(pos);
|
||
};
|
||
this.selectUp = function() {
|
||
this.$moveSelection(this.moveCursorUp);
|
||
};
|
||
this.selectDown = function() {
|
||
this.$moveSelection(this.moveCursorDown);
|
||
};
|
||
this.selectRight = function() {
|
||
this.$moveSelection(this.moveCursorRight);
|
||
};
|
||
this.selectLeft = function() {
|
||
this.$moveSelection(this.moveCursorLeft);
|
||
};
|
||
this.selectLineStart = function() {
|
||
this.$moveSelection(this.moveCursorLineStart);
|
||
};
|
||
this.selectLineEnd = function() {
|
||
this.$moveSelection(this.moveCursorLineEnd);
|
||
};
|
||
this.selectFileEnd = function() {
|
||
this.$moveSelection(this.moveCursorFileEnd);
|
||
};
|
||
this.selectFileStart = function() {
|
||
this.$moveSelection(this.moveCursorFileStart);
|
||
};
|
||
this.selectWordRight = function() {
|
||
this.$moveSelection(this.moveCursorWordRight);
|
||
};
|
||
this.selectWordLeft = function() {
|
||
this.$moveSelection(this.moveCursorWordLeft);
|
||
};
|
||
this.getWordRange = function(row, column) {
|
||
if (typeof column == "undefined") {
|
||
var cursor = row || this.lead;
|
||
row = cursor.row;
|
||
column = cursor.column;
|
||
}
|
||
return this.session.getWordRange(row, column);
|
||
};
|
||
this.selectWord = function() {
|
||
this.setSelectionRange(this.getWordRange());
|
||
};
|
||
this.selectAWord = function() {
|
||
var cursor = this.getCursor();
|
||
var range = this.session.getAWordRange(cursor.row, cursor.column);
|
||
this.setSelectionRange(range);
|
||
};
|
||
|
||
this.getLineRange = function(row, excludeLastChar) {
|
||
var rowStart = typeof row == "number" ? row : this.lead.row;
|
||
var rowEnd;
|
||
|
||
var foldLine = this.session.getFoldLine(rowStart);
|
||
if (foldLine) {
|
||
rowStart = foldLine.start.row;
|
||
rowEnd = foldLine.end.row;
|
||
} else {
|
||
rowEnd = rowStart;
|
||
}
|
||
if (excludeLastChar === true)
|
||
return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);
|
||
else
|
||
return new Range(rowStart, 0, rowEnd + 1, 0);
|
||
};
|
||
this.selectLine = function() {
|
||
this.setSelectionRange(this.getLineRange());
|
||
};
|
||
this.moveCursorUp = function() {
|
||
this.moveCursorBy(-1, 0);
|
||
};
|
||
this.moveCursorDown = function() {
|
||
this.moveCursorBy(1, 0);
|
||
};
|
||
this.moveCursorLeft = function() {
|
||
var cursor = this.lead.getPosition(),
|
||
fold;
|
||
|
||
if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {
|
||
this.moveCursorTo(fold.start.row, fold.start.column);
|
||
} else if (cursor.column === 0) {
|
||
if (cursor.row > 0) {
|
||
this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);
|
||
}
|
||
}
|
||
else {
|
||
var tabSize = this.session.getTabSize();
|
||
if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize)
|
||
this.moveCursorBy(0, -tabSize);
|
||
else
|
||
this.moveCursorBy(0, -1);
|
||
}
|
||
};
|
||
this.moveCursorRight = function() {
|
||
var cursor = this.lead.getPosition(),
|
||
fold;
|
||
if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {
|
||
this.moveCursorTo(fold.end.row, fold.end.column);
|
||
}
|
||
else if (this.lead.column == this.doc.getLine(this.lead.row).length) {
|
||
if (this.lead.row < this.doc.getLength() - 1) {
|
||
this.moveCursorTo(this.lead.row + 1, 0);
|
||
}
|
||
}
|
||
else {
|
||
var tabSize = this.session.getTabSize();
|
||
var cursor = this.lead;
|
||
if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize)
|
||
this.moveCursorBy(0, tabSize);
|
||
else
|
||
this.moveCursorBy(0, 1);
|
||
}
|
||
};
|
||
this.moveCursorLineStart = function() {
|
||
var row = this.lead.row;
|
||
var column = this.lead.column;
|
||
var screenRow = this.session.documentToScreenRow(row, column);
|
||
var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);
|
||
var beforeCursor = this.session.getDisplayLine(
|
||
row, null, firstColumnPosition.row,
|
||
firstColumnPosition.column
|
||
);
|
||
|
||
var leadingSpace = beforeCursor.match(/^\s*/);
|
||
if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)
|
||
firstColumnPosition.column += leadingSpace[0].length;
|
||
this.moveCursorToPosition(firstColumnPosition);
|
||
};
|
||
this.moveCursorLineEnd = function() {
|
||
var lead = this.lead;
|
||
var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);
|
||
if (this.lead.column == lineEnd.column) {
|
||
var line = this.session.getLine(lineEnd.row);
|
||
if (lineEnd.column == line.length) {
|
||
var textEnd = line.search(/\s+$/);
|
||
if (textEnd > 0)
|
||
lineEnd.column = textEnd;
|
||
}
|
||
}
|
||
|
||
this.moveCursorTo(lineEnd.row, lineEnd.column);
|
||
};
|
||
this.moveCursorFileEnd = function() {
|
||
var row = this.doc.getLength() - 1;
|
||
var column = this.doc.getLine(row).length;
|
||
this.moveCursorTo(row, column);
|
||
};
|
||
this.moveCursorFileStart = function() {
|
||
this.moveCursorTo(0, 0);
|
||
};
|
||
this.moveCursorLongWordRight = function() {
|
||
var row = this.lead.row;
|
||
var column = this.lead.column;
|
||
var line = this.doc.getLine(row);
|
||
var rightOfCursor = line.substring(column);
|
||
|
||
var match;
|
||
this.session.nonTokenRe.lastIndex = 0;
|
||
this.session.tokenRe.lastIndex = 0;
|
||
var fold = this.session.getFoldAt(row, column, 1);
|
||
if (fold) {
|
||
this.moveCursorTo(fold.end.row, fold.end.column);
|
||
return;
|
||
}
|
||
if (match = this.session.nonTokenRe.exec(rightOfCursor)) {
|
||
column += this.session.nonTokenRe.lastIndex;
|
||
this.session.nonTokenRe.lastIndex = 0;
|
||
rightOfCursor = line.substring(column);
|
||
}
|
||
if (column >= line.length) {
|
||
this.moveCursorTo(row, line.length);
|
||
this.moveCursorRight();
|
||
if (row < this.doc.getLength() - 1)
|
||
this.moveCursorWordRight();
|
||
return;
|
||
}
|
||
if (match = this.session.tokenRe.exec(rightOfCursor)) {
|
||
column += this.session.tokenRe.lastIndex;
|
||
this.session.tokenRe.lastIndex = 0;
|
||
}
|
||
|
||
this.moveCursorTo(row, column);
|
||
};
|
||
this.moveCursorLongWordLeft = function() {
|
||
var row = this.lead.row;
|
||
var column = this.lead.column;
|
||
var fold;
|
||
if (fold = this.session.getFoldAt(row, column, -1)) {
|
||
this.moveCursorTo(fold.start.row, fold.start.column);
|
||
return;
|
||
}
|
||
|
||
var str = this.session.getFoldStringAt(row, column, -1);
|
||
if (str == null) {
|
||
str = this.doc.getLine(row).substring(0, column);
|
||
}
|
||
|
||
var leftOfCursor = lang.stringReverse(str);
|
||
var match;
|
||
this.session.nonTokenRe.lastIndex = 0;
|
||
this.session.tokenRe.lastIndex = 0;
|
||
if (match = this.session.nonTokenRe.exec(leftOfCursor)) {
|
||
column -= this.session.nonTokenRe.lastIndex;
|
||
leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);
|
||
this.session.nonTokenRe.lastIndex = 0;
|
||
}
|
||
if (column <= 0) {
|
||
this.moveCursorTo(row, 0);
|
||
this.moveCursorLeft();
|
||
if (row > 0)
|
||
this.moveCursorWordLeft();
|
||
return;
|
||
}
|
||
if (match = this.session.tokenRe.exec(leftOfCursor)) {
|
||
column -= this.session.tokenRe.lastIndex;
|
||
this.session.tokenRe.lastIndex = 0;
|
||
}
|
||
|
||
this.moveCursorTo(row, column);
|
||
};
|
||
|
||
this.$shortWordEndIndex = function(rightOfCursor) {
|
||
var match, index = 0, ch;
|
||
var whitespaceRe = /\s/;
|
||
var tokenRe = this.session.tokenRe;
|
||
|
||
tokenRe.lastIndex = 0;
|
||
if (match = this.session.tokenRe.exec(rightOfCursor)) {
|
||
index = this.session.tokenRe.lastIndex;
|
||
} else {
|
||
while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))
|
||
index ++;
|
||
|
||
if (index < 1) {
|
||
tokenRe.lastIndex = 0;
|
||
while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {
|
||
tokenRe.lastIndex = 0;
|
||
index ++;
|
||
if (whitespaceRe.test(ch)) {
|
||
if (index > 2) {
|
||
index--;
|
||
break;
|
||
} else {
|
||
while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))
|
||
index ++;
|
||
if (index > 2)
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
tokenRe.lastIndex = 0;
|
||
|
||
return index;
|
||
};
|
||
|
||
this.moveCursorShortWordRight = function() {
|
||
var row = this.lead.row;
|
||
var column = this.lead.column;
|
||
var line = this.doc.getLine(row);
|
||
var rightOfCursor = line.substring(column);
|
||
|
||
var fold = this.session.getFoldAt(row, column, 1);
|
||
if (fold)
|
||
return this.moveCursorTo(fold.end.row, fold.end.column);
|
||
|
||
if (column == line.length) {
|
||
var l = this.doc.getLength();
|
||
do {
|
||
row++;
|
||
rightOfCursor = this.doc.getLine(row);
|
||
} while (row < l && /^\s*$/.test(rightOfCursor));
|
||
|
||
if (!/^\s+/.test(rightOfCursor))
|
||
rightOfCursor = "";
|
||
column = 0;
|
||
}
|
||
|
||
var index = this.$shortWordEndIndex(rightOfCursor);
|
||
|
||
this.moveCursorTo(row, column + index);
|
||
};
|
||
|
||
this.moveCursorShortWordLeft = function() {
|
||
var row = this.lead.row;
|
||
var column = this.lead.column;
|
||
|
||
var fold;
|
||
if (fold = this.session.getFoldAt(row, column, -1))
|
||
return this.moveCursorTo(fold.start.row, fold.start.column);
|
||
|
||
var line = this.session.getLine(row).substring(0, column);
|
||
if (column === 0) {
|
||
do {
|
||
row--;
|
||
line = this.doc.getLine(row);
|
||
} while (row > 0 && /^\s*$/.test(line));
|
||
|
||
column = line.length;
|
||
if (!/\s+$/.test(line))
|
||
line = "";
|
||
}
|
||
|
||
var leftOfCursor = lang.stringReverse(line);
|
||
var index = this.$shortWordEndIndex(leftOfCursor);
|
||
|
||
return this.moveCursorTo(row, column - index);
|
||
};
|
||
|
||
this.moveCursorWordRight = function() {
|
||
if (this.session.$selectLongWords)
|
||
this.moveCursorLongWordRight();
|
||
else
|
||
this.moveCursorShortWordRight();
|
||
};
|
||
|
||
this.moveCursorWordLeft = function() {
|
||
if (this.session.$selectLongWords)
|
||
this.moveCursorLongWordLeft();
|
||
else
|
||
this.moveCursorShortWordLeft();
|
||
};
|
||
this.moveCursorBy = function(rows, chars) {
|
||
var screenPos = this.session.documentToScreenPosition(
|
||
this.lead.row,
|
||
this.lead.column
|
||
);
|
||
|
||
if (chars === 0) {
|
||
if (this.$desiredColumn)
|
||
screenPos.column = this.$desiredColumn;
|
||
else
|
||
this.$desiredColumn = screenPos.column;
|
||
}
|
||
|
||
var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);
|
||
|
||
if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {
|
||
if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {
|
||
if (docPos.row > 0 || rows > 0)
|
||
docPos.row++;
|
||
}
|
||
}
|
||
this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);
|
||
};
|
||
this.moveCursorToPosition = function(position) {
|
||
this.moveCursorTo(position.row, position.column);
|
||
};
|
||
this.moveCursorTo = function(row, column, keepDesiredColumn) {
|
||
var fold = this.session.getFoldAt(row, column, 1);
|
||
if (fold) {
|
||
row = fold.start.row;
|
||
column = fold.start.column;
|
||
}
|
||
|
||
this.$keepDesiredColumnOnChange = true;
|
||
this.lead.setPosition(row, column);
|
||
this.$keepDesiredColumnOnChange = false;
|
||
|
||
if (!keepDesiredColumn)
|
||
this.$desiredColumn = null;
|
||
};
|
||
this.moveCursorToScreen = function(row, column, keepDesiredColumn) {
|
||
var pos = this.session.screenToDocumentPosition(row, column);
|
||
this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);
|
||
};
|
||
this.detach = function() {
|
||
this.lead.detach();
|
||
this.anchor.detach();
|
||
this.session = this.doc = null;
|
||
};
|
||
|
||
this.fromOrientedRange = function(range) {
|
||
this.setSelectionRange(range, range.cursor == range.start);
|
||
this.$desiredColumn = range.desiredColumn || this.$desiredColumn;
|
||
};
|
||
|
||
this.toOrientedRange = function(range) {
|
||
var r = this.getRange();
|
||
if (range) {
|
||
range.start.column = r.start.column;
|
||
range.start.row = r.start.row;
|
||
range.end.column = r.end.column;
|
||
range.end.row = r.end.row;
|
||
} else {
|
||
range = r;
|
||
}
|
||
|
||
range.cursor = this.isBackwards() ? range.start : range.end;
|
||
range.desiredColumn = this.$desiredColumn;
|
||
return range;
|
||
};
|
||
this.getRangeOfMovements = function(func) {
|
||
var start = this.getCursor();
|
||
try {
|
||
func(this);
|
||
var end = this.getCursor();
|
||
return Range.fromPoints(start,end);
|
||
} catch(e) {
|
||
return Range.fromPoints(start,start);
|
||
} finally {
|
||
this.moveCursorToPosition(start);
|
||
}
|
||
};
|
||
|
||
this.toJSON = function() {
|
||
if (this.rangeCount) {
|
||
var data = this.ranges.map(function(r) {
|
||
var r1 = r.clone();
|
||
r1.isBackwards = r.cursor == r.start;
|
||
return r1;
|
||
});
|
||
} else {
|
||
var data = this.getRange();
|
||
data.isBackwards = this.isBackwards();
|
||
}
|
||
return data;
|
||
};
|
||
|
||
this.fromJSON = function(data) {
|
||
if (data.start == undefined) {
|
||
if (this.rangeList) {
|
||
this.toSingleRange(data[0]);
|
||
for (var i = data.length; i--; ) {
|
||
var r = Range.fromPoints(data[i].start, data[i].end);
|
||
if (data[i].isBackwards)
|
||
r.cursor = r.start;
|
||
this.addRange(r, true);
|
||
}
|
||
return;
|
||
} else
|
||
data = data[0];
|
||
}
|
||
if (this.rangeList)
|
||
this.toSingleRange(data);
|
||
this.setSelectionRange(data, data.isBackwards);
|
||
};
|
||
|
||
this.isEqual = function(data) {
|
||
if ((data.length || this.rangeCount) && data.length != this.rangeCount)
|
||
return false;
|
||
if (!data.length || !this.ranges)
|
||
return this.getRange().isEqual(data);
|
||
|
||
for (var i = this.ranges.length; i--; ) {
|
||
if (!this.ranges[i].isEqual(data[i]))
|
||
return false;
|
||
}
|
||
return true;
|
||
};
|
||
|
||
}).call(Selection.prototype);
|
||
|
||
exports.Selection = Selection;
|
||
});
|
||
|
||
ace.define("ace/tokenizer",["require","exports","module","ace/config"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var config = acequire("./config");
|
||
var MAX_TOKEN_COUNT = 2000;
|
||
var Tokenizer = function(rules) {
|
||
this.states = rules;
|
||
|
||
this.regExps = {};
|
||
this.matchMappings = {};
|
||
for (var key in this.states) {
|
||
var state = this.states[key];
|
||
var ruleRegExps = [];
|
||
var matchTotal = 0;
|
||
var mapping = this.matchMappings[key] = {defaultToken: "text"};
|
||
var flag = "g";
|
||
|
||
var splitterRurles = [];
|
||
for (var i = 0; i < state.length; i++) {
|
||
var rule = state[i];
|
||
if (rule.defaultToken)
|
||
mapping.defaultToken = rule.defaultToken;
|
||
if (rule.caseInsensitive)
|
||
flag = "gi";
|
||
if (rule.regex == null)
|
||
continue;
|
||
|
||
if (rule.regex instanceof RegExp)
|
||
rule.regex = rule.regex.toString().slice(1, -1);
|
||
var adjustedregex = rule.regex;
|
||
var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2;
|
||
if (Array.isArray(rule.token)) {
|
||
if (rule.token.length == 1 || matchcount == 1) {
|
||
rule.token = rule.token[0];
|
||
} else if (matchcount - 1 != rule.token.length) {
|
||
this.reportError("number of classes and regexp groups doesn't match", {
|
||
rule: rule,
|
||
groupCount: matchcount - 1
|
||
});
|
||
rule.token = rule.token[0];
|
||
} else {
|
||
rule.tokenArray = rule.token;
|
||
rule.token = null;
|
||
rule.onMatch = this.$arrayTokens;
|
||
}
|
||
} else if (typeof rule.token == "function" && !rule.onMatch) {
|
||
if (matchcount > 1)
|
||
rule.onMatch = this.$applyToken;
|
||
else
|
||
rule.onMatch = rule.token;
|
||
}
|
||
|
||
if (matchcount > 1) {
|
||
if (/\\\d/.test(rule.regex)) {
|
||
adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) {
|
||
return "\\" + (parseInt(digit, 10) + matchTotal + 1);
|
||
});
|
||
} else {
|
||
matchcount = 1;
|
||
adjustedregex = this.removeCapturingGroups(rule.regex);
|
||
}
|
||
if (!rule.splitRegex && typeof rule.token != "string")
|
||
splitterRurles.push(rule); // flag will be known only at the very end
|
||
}
|
||
|
||
mapping[matchTotal] = i;
|
||
matchTotal += matchcount;
|
||
|
||
ruleRegExps.push(adjustedregex);
|
||
if (!rule.onMatch)
|
||
rule.onMatch = null;
|
||
}
|
||
|
||
if (!ruleRegExps.length) {
|
||
mapping[0] = 0;
|
||
ruleRegExps.push("$");
|
||
}
|
||
|
||
splitterRurles.forEach(function(rule) {
|
||
rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);
|
||
}, this);
|
||
|
||
this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag);
|
||
}
|
||
};
|
||
|
||
(function() {
|
||
this.$setMaxTokenCount = function(m) {
|
||
MAX_TOKEN_COUNT = m | 0;
|
||
};
|
||
|
||
this.$applyToken = function(str) {
|
||
var values = this.splitRegex.exec(str).slice(1);
|
||
var types = this.token.apply(this, values);
|
||
if (typeof types === "string")
|
||
return [{type: types, value: str}];
|
||
|
||
var tokens = [];
|
||
for (var i = 0, l = types.length; i < l; i++) {
|
||
if (values[i])
|
||
tokens[tokens.length] = {
|
||
type: types[i],
|
||
value: values[i]
|
||
};
|
||
}
|
||
return tokens;
|
||
};
|
||
|
||
this.$arrayTokens = function(str) {
|
||
if (!str)
|
||
return [];
|
||
var values = this.splitRegex.exec(str);
|
||
if (!values)
|
||
return "text";
|
||
var tokens = [];
|
||
var types = this.tokenArray;
|
||
for (var i = 0, l = types.length; i < l; i++) {
|
||
if (values[i + 1])
|
||
tokens[tokens.length] = {
|
||
type: types[i],
|
||
value: values[i + 1]
|
||
};
|
||
}
|
||
return tokens;
|
||
};
|
||
|
||
this.removeCapturingGroups = function(src) {
|
||
var r = src.replace(
|
||
/\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g,
|
||
function(x, y) {return y ? "(?:" : x;}
|
||
);
|
||
return r;
|
||
};
|
||
|
||
this.createSplitterRegexp = function(src, flag) {
|
||
if (src.indexOf("(?=") != -1) {
|
||
var stack = 0;
|
||
var inChClass = false;
|
||
var lastCapture = {};
|
||
src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function(
|
||
m, esc, parenOpen, parenClose, square, index
|
||
) {
|
||
if (inChClass) {
|
||
inChClass = square != "]";
|
||
} else if (square) {
|
||
inChClass = true;
|
||
} else if (parenClose) {
|
||
if (stack == lastCapture.stack) {
|
||
lastCapture.end = index+1;
|
||
lastCapture.stack = -1;
|
||
}
|
||
stack--;
|
||
} else if (parenOpen) {
|
||
stack++;
|
||
if (parenOpen.length != 1) {
|
||
lastCapture.stack = stack
|
||
lastCapture.start = index;
|
||
}
|
||
}
|
||
return m;
|
||
});
|
||
|
||
if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end)))
|
||
src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);
|
||
}
|
||
if (src.charAt(0) != "^") src = "^" + src;
|
||
if (src.charAt(src.length - 1) != "$") src += "$";
|
||
|
||
return new RegExp(src, (flag||"").replace("g", ""));
|
||
};
|
||
this.getLineTokens = function(line, startState) {
|
||
if (startState && typeof startState != "string") {
|
||
var stack = startState.slice(0);
|
||
startState = stack[0];
|
||
if (startState === "#tmp") {
|
||
stack.shift()
|
||
startState = stack.shift()
|
||
}
|
||
} else
|
||
var stack = [];
|
||
|
||
var currentState = startState || "start";
|
||
var state = this.states[currentState];
|
||
if (!state) {
|
||
currentState = "start";
|
||
state = this.states[currentState];
|
||
}
|
||
var mapping = this.matchMappings[currentState];
|
||
var re = this.regExps[currentState];
|
||
re.lastIndex = 0;
|
||
|
||
var match, tokens = [];
|
||
var lastIndex = 0;
|
||
var matchAttempts = 0;
|
||
|
||
var token = {type: null, value: ""};
|
||
|
||
while (match = re.exec(line)) {
|
||
var type = mapping.defaultToken;
|
||
var rule = null;
|
||
var value = match[0];
|
||
var index = re.lastIndex;
|
||
|
||
if (index - value.length > lastIndex) {
|
||
var skipped = line.substring(lastIndex, index - value.length);
|
||
if (token.type == type) {
|
||
token.value += skipped;
|
||
} else {
|
||
if (token.type)
|
||
tokens.push(token);
|
||
token = {type: type, value: skipped};
|
||
}
|
||
}
|
||
|
||
for (var i = 0; i < match.length-2; i++) {
|
||
if (match[i + 1] === undefined)
|
||
continue;
|
||
|
||
rule = state[mapping[i]];
|
||
|
||
if (rule.onMatch)
|
||
type = rule.onMatch(value, currentState, stack);
|
||
else
|
||
type = rule.token;
|
||
|
||
if (rule.next) {
|
||
if (typeof rule.next == "string") {
|
||
currentState = rule.next;
|
||
} else {
|
||
currentState = rule.next(currentState, stack);
|
||
}
|
||
|
||
state = this.states[currentState];
|
||
if (!state) {
|
||
this.reportError("state doesn't exist", currentState);
|
||
currentState = "start";
|
||
state = this.states[currentState];
|
||
}
|
||
mapping = this.matchMappings[currentState];
|
||
lastIndex = index;
|
||
re = this.regExps[currentState];
|
||
re.lastIndex = index;
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (value) {
|
||
if (typeof type === "string") {
|
||
if ((!rule || rule.merge !== false) && token.type === type) {
|
||
token.value += value;
|
||
} else {
|
||
if (token.type)
|
||
tokens.push(token);
|
||
token = {type: type, value: value};
|
||
}
|
||
} else if (type) {
|
||
if (token.type)
|
||
tokens.push(token);
|
||
token = {type: null, value: ""};
|
||
for (var i = 0; i < type.length; i++)
|
||
tokens.push(type[i]);
|
||
}
|
||
}
|
||
|
||
if (lastIndex == line.length)
|
||
break;
|
||
|
||
lastIndex = index;
|
||
|
||
if (matchAttempts++ > MAX_TOKEN_COUNT) {
|
||
if (matchAttempts > 2 * line.length) {
|
||
this.reportError("infinite loop with in ace tokenizer", {
|
||
startState: startState,
|
||
line: line
|
||
});
|
||
}
|
||
while (lastIndex < line.length) {
|
||
if (token.type)
|
||
tokens.push(token);
|
||
token = {
|
||
value: line.substring(lastIndex, lastIndex += 2000),
|
||
type: "overflow"
|
||
};
|
||
}
|
||
currentState = "start";
|
||
stack = [];
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (token.type)
|
||
tokens.push(token);
|
||
|
||
if (stack.length > 1) {
|
||
if (stack[0] !== currentState)
|
||
stack.unshift("#tmp", currentState);
|
||
}
|
||
return {
|
||
tokens : tokens,
|
||
state : stack.length ? stack : currentState
|
||
};
|
||
};
|
||
|
||
this.reportError = config.reportError;
|
||
|
||
}).call(Tokenizer.prototype);
|
||
|
||
exports.Tokenizer = Tokenizer;
|
||
});
|
||
|
||
ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var lang = acequire("../lib/lang");
|
||
|
||
var TextHighlightRules = function() {
|
||
|
||
this.$rules = {
|
||
"start" : [{
|
||
token : "empty_line",
|
||
regex : '^$'
|
||
}, {
|
||
defaultToken : "text"
|
||
}]
|
||
};
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.addRules = function(rules, prefix) {
|
||
if (!prefix) {
|
||
for (var key in rules)
|
||
this.$rules[key] = rules[key];
|
||
return;
|
||
}
|
||
for (var key in rules) {
|
||
var state = rules[key];
|
||
for (var i = 0; i < state.length; i++) {
|
||
var rule = state[i];
|
||
if (rule.next || rule.onMatch) {
|
||
if (typeof rule.next == "string") {
|
||
if (rule.next.indexOf(prefix) !== 0)
|
||
rule.next = prefix + rule.next;
|
||
}
|
||
if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)
|
||
rule.nextState = prefix + rule.nextState;
|
||
}
|
||
}
|
||
this.$rules[prefix + key] = state;
|
||
}
|
||
};
|
||
|
||
this.getRules = function() {
|
||
return this.$rules;
|
||
};
|
||
|
||
this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {
|
||
var embedRules = typeof HighlightRules == "function"
|
||
? new HighlightRules().getRules()
|
||
: HighlightRules;
|
||
if (states) {
|
||
for (var i = 0; i < states.length; i++)
|
||
states[i] = prefix + states[i];
|
||
} else {
|
||
states = [];
|
||
for (var key in embedRules)
|
||
states.push(prefix + key);
|
||
}
|
||
|
||
this.addRules(embedRules, prefix);
|
||
|
||
if (escapeRules) {
|
||
var addRules = Array.prototype[append ? "push" : "unshift"];
|
||
for (var i = 0; i < states.length; i++)
|
||
addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));
|
||
}
|
||
|
||
if (!this.$embeds)
|
||
this.$embeds = [];
|
||
this.$embeds.push(prefix);
|
||
};
|
||
|
||
this.getEmbeds = function() {
|
||
return this.$embeds;
|
||
};
|
||
|
||
var pushState = function(currentState, stack) {
|
||
if (currentState != "start" || stack.length)
|
||
stack.unshift(this.nextState, currentState);
|
||
return this.nextState;
|
||
};
|
||
var popState = function(currentState, stack) {
|
||
stack.shift();
|
||
return stack.shift() || "start";
|
||
};
|
||
|
||
this.normalizeRules = function() {
|
||
var id = 0;
|
||
var rules = this.$rules;
|
||
function processState(key) {
|
||
var state = rules[key];
|
||
state.processed = true;
|
||
for (var i = 0; i < state.length; i++) {
|
||
var rule = state[i];
|
||
if (!rule.regex && rule.start) {
|
||
rule.regex = rule.start;
|
||
if (!rule.next)
|
||
rule.next = [];
|
||
rule.next.push({
|
||
defaultToken: rule.token
|
||
}, {
|
||
token: rule.token + ".end",
|
||
regex: rule.end || rule.start,
|
||
next: "pop"
|
||
});
|
||
rule.token = rule.token + ".start";
|
||
rule.push = true;
|
||
}
|
||
var next = rule.next || rule.push;
|
||
if (next && Array.isArray(next)) {
|
||
var stateName = rule.stateName;
|
||
if (!stateName) {
|
||
stateName = rule.token;
|
||
if (typeof stateName != "string")
|
||
stateName = stateName[0] || "";
|
||
if (rules[stateName])
|
||
stateName += id++;
|
||
}
|
||
rules[stateName] = next;
|
||
rule.next = stateName;
|
||
processState(stateName);
|
||
} else if (next == "pop") {
|
||
rule.next = popState;
|
||
}
|
||
|
||
if (rule.push) {
|
||
rule.nextState = rule.next || rule.push;
|
||
rule.next = pushState;
|
||
delete rule.push;
|
||
}
|
||
|
||
if (rule.rules) {
|
||
for (var r in rule.rules) {
|
||
if (rules[r]) {
|
||
if (rules[r].push)
|
||
rules[r].push.apply(rules[r], rule.rules[r]);
|
||
} else {
|
||
rules[r] = rule.rules[r];
|
||
}
|
||
}
|
||
}
|
||
if (rule.include || typeof rule == "string") {
|
||
var includeName = rule.include || rule;
|
||
var toInsert = rules[includeName];
|
||
} else if (Array.isArray(rule))
|
||
toInsert = rule;
|
||
|
||
if (toInsert) {
|
||
var args = [i, 1].concat(toInsert);
|
||
if (rule.noEscape)
|
||
args = args.filter(function(x) {return !x.next;});
|
||
state.splice.apply(state, args);
|
||
i--;
|
||
toInsert = null;
|
||
}
|
||
|
||
if (rule.keywordMap) {
|
||
rule.token = this.createKeywordMapper(
|
||
rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive
|
||
);
|
||
delete rule.defaultToken;
|
||
}
|
||
}
|
||
}
|
||
Object.keys(rules).forEach(processState, this);
|
||
};
|
||
|
||
this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {
|
||
var keywords = Object.create(null);
|
||
Object.keys(map).forEach(function(className) {
|
||
var a = map[className];
|
||
if (ignoreCase)
|
||
a = a.toLowerCase();
|
||
var list = a.split(splitChar || "|");
|
||
for (var i = list.length; i--; )
|
||
keywords[list[i]] = className;
|
||
});
|
||
if (Object.getPrototypeOf(keywords)) {
|
||
keywords.__proto__ = null;
|
||
}
|
||
this.$keywordList = Object.keys(keywords);
|
||
map = null;
|
||
return ignoreCase
|
||
? function(value) {return keywords[value.toLowerCase()] || defaultToken }
|
||
: function(value) {return keywords[value] || defaultToken };
|
||
};
|
||
|
||
this.getKeywords = function() {
|
||
return this.$keywords;
|
||
};
|
||
|
||
}).call(TextHighlightRules.prototype);
|
||
|
||
exports.TextHighlightRules = TextHighlightRules;
|
||
});
|
||
|
||
ace.define("ace/mode/behaviour",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Behaviour = function() {
|
||
this.$behaviours = {};
|
||
};
|
||
|
||
(function () {
|
||
|
||
this.add = function (name, action, callback) {
|
||
switch (undefined) {
|
||
case this.$behaviours:
|
||
this.$behaviours = {};
|
||
case this.$behaviours[name]:
|
||
this.$behaviours[name] = {};
|
||
}
|
||
this.$behaviours[name][action] = callback;
|
||
}
|
||
|
||
this.addBehaviours = function (behaviours) {
|
||
for (var key in behaviours) {
|
||
for (var action in behaviours[key]) {
|
||
this.add(key, action, behaviours[key][action]);
|
||
}
|
||
}
|
||
}
|
||
|
||
this.remove = function (name) {
|
||
if (this.$behaviours && this.$behaviours[name]) {
|
||
delete this.$behaviours[name];
|
||
}
|
||
}
|
||
|
||
this.inherit = function (mode, filter) {
|
||
if (typeof mode === "function") {
|
||
var behaviours = new mode().getBehaviours(filter);
|
||
} else {
|
||
var behaviours = mode.getBehaviours(filter);
|
||
}
|
||
this.addBehaviours(behaviours);
|
||
}
|
||
|
||
this.getBehaviours = function (filter) {
|
||
if (!filter) {
|
||
return this.$behaviours;
|
||
} else {
|
||
var ret = {}
|
||
for (var i = 0; i < filter.length; i++) {
|
||
if (this.$behaviours[filter[i]]) {
|
||
ret[filter[i]] = this.$behaviours[filter[i]];
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
}
|
||
|
||
}).call(Behaviour.prototype);
|
||
|
||
exports.Behaviour = Behaviour;
|
||
});
|
||
|
||
ace.define("ace/unicode",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
exports.packages = {};
|
||
|
||
addUnicodePackage({
|
||
L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",
|
||
Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",
|
||
Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",
|
||
Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",
|
||
Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",
|
||
Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",
|
||
M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",
|
||
Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",
|
||
Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",
|
||
Me: "0488048906DE20DD-20E020E2-20E4A670-A672",
|
||
N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",
|
||
Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",
|
||
Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",
|
||
No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",
|
||
P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",
|
||
Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",
|
||
Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",
|
||
Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",
|
||
Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",
|
||
Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21",
|
||
Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F",
|
||
Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",
|
||
S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",
|
||
Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",
|
||
Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",
|
||
Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",
|
||
So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",
|
||
Z: "002000A01680180E2000-200A20282029202F205F3000",
|
||
Zs: "002000A01680180E2000-200A202F205F3000",
|
||
Zl: "2028",
|
||
Zp: "2029",
|
||
C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",
|
||
Cc: "0000-001F007F-009F",
|
||
Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",
|
||
Co: "E000-F8FF",
|
||
Cs: "D800-DFFF",
|
||
Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"
|
||
});
|
||
|
||
function addUnicodePackage (pack) {
|
||
var codePoint = /\w{4}/g;
|
||
for (var name in pack)
|
||
exports.packages[name] = pack[name].replace(codePoint, "\\u$&");
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/token_iterator",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var TokenIterator = function(session, initialRow, initialColumn) {
|
||
this.$session = session;
|
||
this.$row = initialRow;
|
||
this.$rowTokens = session.getTokens(initialRow);
|
||
|
||
var token = session.getTokenAt(initialRow, initialColumn);
|
||
this.$tokenIndex = token ? token.index : -1;
|
||
};
|
||
|
||
(function() {
|
||
this.stepBackward = function() {
|
||
this.$tokenIndex -= 1;
|
||
|
||
while (this.$tokenIndex < 0) {
|
||
this.$row -= 1;
|
||
if (this.$row < 0) {
|
||
this.$row = 0;
|
||
return null;
|
||
}
|
||
|
||
this.$rowTokens = this.$session.getTokens(this.$row);
|
||
this.$tokenIndex = this.$rowTokens.length - 1;
|
||
}
|
||
|
||
return this.$rowTokens[this.$tokenIndex];
|
||
};
|
||
this.stepForward = function() {
|
||
this.$tokenIndex += 1;
|
||
var rowCount;
|
||
while (this.$tokenIndex >= this.$rowTokens.length) {
|
||
this.$row += 1;
|
||
if (!rowCount)
|
||
rowCount = this.$session.getLength();
|
||
if (this.$row >= rowCount) {
|
||
this.$row = rowCount - 1;
|
||
return null;
|
||
}
|
||
|
||
this.$rowTokens = this.$session.getTokens(this.$row);
|
||
this.$tokenIndex = 0;
|
||
}
|
||
|
||
return this.$rowTokens[this.$tokenIndex];
|
||
};
|
||
this.getCurrentToken = function () {
|
||
return this.$rowTokens[this.$tokenIndex];
|
||
};
|
||
this.getCurrentTokenRow = function () {
|
||
return this.$row;
|
||
};
|
||
this.getCurrentTokenColumn = function() {
|
||
var rowTokens = this.$rowTokens;
|
||
var tokenIndex = this.$tokenIndex;
|
||
var column = rowTokens[tokenIndex].start;
|
||
if (column !== undefined)
|
||
return column;
|
||
|
||
column = 0;
|
||
while (tokenIndex > 0) {
|
||
tokenIndex -= 1;
|
||
column += rowTokens[tokenIndex].value.length;
|
||
}
|
||
|
||
return column;
|
||
};
|
||
this.getCurrentTokenPosition = function() {
|
||
return {row: this.$row, column: this.getCurrentTokenColumn()};
|
||
};
|
||
|
||
}).call(TokenIterator.prototype);
|
||
|
||
exports.TokenIterator = TokenIterator;
|
||
});
|
||
|
||
ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Tokenizer = acequire("../tokenizer").Tokenizer;
|
||
var TextHighlightRules = acequire("./text_highlight_rules").TextHighlightRules;
|
||
var Behaviour = acequire("./behaviour").Behaviour;
|
||
var unicode = acequire("../unicode");
|
||
var lang = acequire("../lib/lang");
|
||
var TokenIterator = acequire("../token_iterator").TokenIterator;
|
||
var Range = acequire("../range").Range;
|
||
|
||
var Mode = function() {
|
||
this.HighlightRules = TextHighlightRules;
|
||
this.$behaviour = new Behaviour();
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.tokenRe = new RegExp("^["
|
||
+ unicode.packages.L
|
||
+ unicode.packages.Mn + unicode.packages.Mc
|
||
+ unicode.packages.Nd
|
||
+ unicode.packages.Pc + "\\$_]+", "g"
|
||
);
|
||
|
||
this.nonTokenRe = new RegExp("^(?:[^"
|
||
+ unicode.packages.L
|
||
+ unicode.packages.Mn + unicode.packages.Mc
|
||
+ unicode.packages.Nd
|
||
+ unicode.packages.Pc + "\\$_]|\\s])+", "g"
|
||
);
|
||
|
||
this.getTokenizer = function() {
|
||
if (!this.$tokenizer) {
|
||
this.$highlightRules = this.$highlightRules || new this.HighlightRules();
|
||
this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());
|
||
}
|
||
return this.$tokenizer;
|
||
};
|
||
|
||
this.lineCommentStart = "";
|
||
this.blockComment = "";
|
||
|
||
this.toggleCommentLines = function(state, session, startRow, endRow) {
|
||
var doc = session.doc;
|
||
|
||
var ignoreBlankLines = true;
|
||
var shouldRemove = true;
|
||
var minIndent = Infinity;
|
||
var tabSize = session.getTabSize();
|
||
var insertAtTabStop = false;
|
||
|
||
if (!this.lineCommentStart) {
|
||
if (!this.blockComment)
|
||
return false;
|
||
var lineCommentStart = this.blockComment.start;
|
||
var lineCommentEnd = this.blockComment.end;
|
||
var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")");
|
||
var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$");
|
||
|
||
var comment = function(line, i) {
|
||
if (testRemove(line, i))
|
||
return;
|
||
if (!ignoreBlankLines || /\S/.test(line)) {
|
||
doc.insertInLine({row: i, column: line.length}, lineCommentEnd);
|
||
doc.insertInLine({row: i, column: minIndent}, lineCommentStart);
|
||
}
|
||
};
|
||
|
||
var uncomment = function(line, i) {
|
||
var m;
|
||
if (m = line.match(regexpEnd))
|
||
doc.removeInLine(i, line.length - m[0].length, line.length);
|
||
if (m = line.match(regexpStart))
|
||
doc.removeInLine(i, m[1].length, m[0].length);
|
||
};
|
||
|
||
var testRemove = function(line, row) {
|
||
if (regexpStart.test(line))
|
||
return true;
|
||
var tokens = session.getTokens(row);
|
||
for (var i = 0; i < tokens.length; i++) {
|
||
if (tokens[i].type === "comment")
|
||
return true;
|
||
}
|
||
};
|
||
} else {
|
||
if (Array.isArray(this.lineCommentStart)) {
|
||
var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|");
|
||
var lineCommentStart = this.lineCommentStart[0];
|
||
} else {
|
||
var regexpStart = lang.escapeRegExp(this.lineCommentStart);
|
||
var lineCommentStart = this.lineCommentStart;
|
||
}
|
||
regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?");
|
||
|
||
insertAtTabStop = session.getUseSoftTabs();
|
||
|
||
var uncomment = function(line, i) {
|
||
var m = line.match(regexpStart);
|
||
if (!m) return;
|
||
var start = m[1].length, end = m[0].length;
|
||
if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ")
|
||
end--;
|
||
doc.removeInLine(i, start, end);
|
||
};
|
||
var commentWithSpace = lineCommentStart + " ";
|
||
var comment = function(line, i) {
|
||
if (!ignoreBlankLines || /\S/.test(line)) {
|
||
if (shouldInsertSpace(line, minIndent, minIndent))
|
||
doc.insertInLine({row: i, column: minIndent}, commentWithSpace);
|
||
else
|
||
doc.insertInLine({row: i, column: minIndent}, lineCommentStart);
|
||
}
|
||
};
|
||
var testRemove = function(line, i) {
|
||
return regexpStart.test(line);
|
||
};
|
||
|
||
var shouldInsertSpace = function(line, before, after) {
|
||
var spaces = 0;
|
||
while (before-- && line.charAt(before) == " ")
|
||
spaces++;
|
||
if (spaces % tabSize != 0)
|
||
return false;
|
||
var spaces = 0;
|
||
while (line.charAt(after++) == " ")
|
||
spaces++;
|
||
if (tabSize > 2)
|
||
return spaces % tabSize != tabSize - 1;
|
||
else
|
||
return spaces % tabSize == 0;
|
||
return true;
|
||
};
|
||
}
|
||
|
||
function iter(fun) {
|
||
for (var i = startRow; i <= endRow; i++)
|
||
fun(doc.getLine(i), i);
|
||
}
|
||
|
||
|
||
var minEmptyLength = Infinity;
|
||
iter(function(line, i) {
|
||
var indent = line.search(/\S/);
|
||
if (indent !== -1) {
|
||
if (indent < minIndent)
|
||
minIndent = indent;
|
||
if (shouldRemove && !testRemove(line, i))
|
||
shouldRemove = false;
|
||
} else if (minEmptyLength > line.length) {
|
||
minEmptyLength = line.length;
|
||
}
|
||
});
|
||
|
||
if (minIndent == Infinity) {
|
||
minIndent = minEmptyLength;
|
||
ignoreBlankLines = false;
|
||
shouldRemove = false;
|
||
}
|
||
|
||
if (insertAtTabStop && minIndent % tabSize != 0)
|
||
minIndent = Math.floor(minIndent / tabSize) * tabSize;
|
||
|
||
iter(shouldRemove ? uncomment : comment);
|
||
};
|
||
|
||
this.toggleBlockComment = function(state, session, range, cursor) {
|
||
var comment = this.blockComment;
|
||
if (!comment)
|
||
return;
|
||
if (!comment.start && comment[0])
|
||
comment = comment[0];
|
||
|
||
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||
var token = iterator.getCurrentToken();
|
||
|
||
var sel = session.selection;
|
||
var initialRange = session.selection.toOrientedRange();
|
||
var startRow, colDiff;
|
||
|
||
if (token && /comment/.test(token.type)) {
|
||
var startRange, endRange;
|
||
while (token && /comment/.test(token.type)) {
|
||
var i = token.value.indexOf(comment.start);
|
||
if (i != -1) {
|
||
var row = iterator.getCurrentTokenRow();
|
||
var column = iterator.getCurrentTokenColumn() + i;
|
||
startRange = new Range(row, column, row, column + comment.start.length);
|
||
break;
|
||
}
|
||
token = iterator.stepBackward();
|
||
}
|
||
|
||
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||
var token = iterator.getCurrentToken();
|
||
while (token && /comment/.test(token.type)) {
|
||
var i = token.value.indexOf(comment.end);
|
||
if (i != -1) {
|
||
var row = iterator.getCurrentTokenRow();
|
||
var column = iterator.getCurrentTokenColumn() + i;
|
||
endRange = new Range(row, column, row, column + comment.end.length);
|
||
break;
|
||
}
|
||
token = iterator.stepForward();
|
||
}
|
||
if (endRange)
|
||
session.remove(endRange);
|
||
if (startRange) {
|
||
session.remove(startRange);
|
||
startRow = startRange.start.row;
|
||
colDiff = -comment.start.length;
|
||
}
|
||
} else {
|
||
colDiff = comment.start.length;
|
||
startRow = range.start.row;
|
||
session.insert(range.end, comment.end);
|
||
session.insert(range.start, comment.start);
|
||
}
|
||
if (initialRange.start.row == startRow)
|
||
initialRange.start.column += colDiff;
|
||
if (initialRange.end.row == startRow)
|
||
initialRange.end.column += colDiff;
|
||
session.selection.fromOrientedRange(initialRange);
|
||
};
|
||
|
||
this.getNextLineIndent = function(state, line, tab) {
|
||
return this.$getIndent(line);
|
||
};
|
||
|
||
this.checkOutdent = function(state, line, input) {
|
||
return false;
|
||
};
|
||
|
||
this.autoOutdent = function(state, doc, row) {
|
||
};
|
||
|
||
this.$getIndent = function(line) {
|
||
return line.match(/^\s*/)[0];
|
||
};
|
||
|
||
this.createWorker = function(session) {
|
||
return null;
|
||
};
|
||
|
||
this.createModeDelegates = function (mapping) {
|
||
this.$embeds = [];
|
||
this.$modes = {};
|
||
for (var i in mapping) {
|
||
if (mapping[i]) {
|
||
this.$embeds.push(i);
|
||
this.$modes[i] = new mapping[i]();
|
||
}
|
||
}
|
||
|
||
var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent",
|
||
"checkOutdent", "autoOutdent", "transformAction", "getCompletions"];
|
||
|
||
for (var i = 0; i < delegations.length; i++) {
|
||
(function(scope) {
|
||
var functionName = delegations[i];
|
||
var defaultHandler = scope[functionName];
|
||
scope[delegations[i]] = function() {
|
||
return this.$delegator(functionName, arguments, defaultHandler);
|
||
};
|
||
}(this));
|
||
}
|
||
};
|
||
|
||
this.$delegator = function(method, args, defaultHandler) {
|
||
var state = args[0];
|
||
if (typeof state != "string")
|
||
state = state[0];
|
||
for (var i = 0; i < this.$embeds.length; i++) {
|
||
if (!this.$modes[this.$embeds[i]]) continue;
|
||
|
||
var split = state.split(this.$embeds[i]);
|
||
if (!split[0] && split[1]) {
|
||
args[0] = split[1];
|
||
var mode = this.$modes[this.$embeds[i]];
|
||
return mode[method].apply(mode, args);
|
||
}
|
||
}
|
||
var ret = defaultHandler.apply(this, args);
|
||
return defaultHandler ? ret : undefined;
|
||
};
|
||
|
||
this.transformAction = function(state, action, editor, session, param) {
|
||
if (this.$behaviour) {
|
||
var behaviours = this.$behaviour.getBehaviours();
|
||
for (var key in behaviours) {
|
||
if (behaviours[key][action]) {
|
||
var ret = behaviours[key][action].apply(this, arguments);
|
||
if (ret) {
|
||
return ret;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
this.getKeywords = function(append) {
|
||
if (!this.completionKeywords) {
|
||
var rules = this.$tokenizer.rules;
|
||
var completionKeywords = [];
|
||
for (var rule in rules) {
|
||
var ruleItr = rules[rule];
|
||
for (var r = 0, l = ruleItr.length; r < l; r++) {
|
||
if (typeof ruleItr[r].token === "string") {
|
||
if (/keyword|support|storage/.test(ruleItr[r].token))
|
||
completionKeywords.push(ruleItr[r].regex);
|
||
}
|
||
else if (typeof ruleItr[r].token === "object") {
|
||
for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {
|
||
if (/keyword|support|storage/.test(ruleItr[r].token[a])) {
|
||
var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a];
|
||
completionKeywords.push(rule.substr(1, rule.length - 2));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
this.completionKeywords = completionKeywords;
|
||
}
|
||
if (!append)
|
||
return this.$keywordList;
|
||
return completionKeywords.concat(this.$keywordList || []);
|
||
};
|
||
|
||
this.$createKeywordList = function() {
|
||
if (!this.$highlightRules)
|
||
this.getTokenizer();
|
||
return this.$keywordList = this.$highlightRules.$keywordList || [];
|
||
};
|
||
|
||
this.getCompletions = function(state, session, pos, prefix) {
|
||
var keywords = this.$keywordList || this.$createKeywordList();
|
||
return keywords.map(function(word) {
|
||
return {
|
||
name: word,
|
||
value: word,
|
||
score: 0,
|
||
meta: "keyword"
|
||
};
|
||
});
|
||
};
|
||
|
||
this.$id = "ace/mode/text";
|
||
}).call(Mode.prototype);
|
||
|
||
exports.Mode = Mode;
|
||
});
|
||
|
||
ace.define("ace/apply_delta",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
function throwDeltaError(delta, errorText){
|
||
console.log("Invalid Delta:", delta);
|
||
throw "Invalid Delta: " + errorText;
|
||
}
|
||
|
||
function positionInDocument(docLines, position) {
|
||
return position.row >= 0 && position.row < docLines.length &&
|
||
position.column >= 0 && position.column <= docLines[position.row].length;
|
||
}
|
||
|
||
function validateDelta(docLines, delta) {
|
||
if (delta.action != "insert" && delta.action != "remove")
|
||
throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
|
||
if (!(delta.lines instanceof Array))
|
||
throwDeltaError(delta, "delta.lines must be an Array");
|
||
if (!delta.start || !delta.end)
|
||
throwDeltaError(delta, "delta.start/end must be an present");
|
||
var start = delta.start;
|
||
if (!positionInDocument(docLines, delta.start))
|
||
throwDeltaError(delta, "delta.start must be contained in document");
|
||
var end = delta.end;
|
||
if (delta.action == "remove" && !positionInDocument(docLines, end))
|
||
throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
|
||
var numRangeRows = end.row - start.row;
|
||
var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
|
||
if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
|
||
throwDeltaError(delta, "delta.range must match delta lines");
|
||
}
|
||
|
||
exports.applyDelta = function(docLines, delta, doNotValidate) {
|
||
|
||
var row = delta.start.row;
|
||
var startColumn = delta.start.column;
|
||
var line = docLines[row] || "";
|
||
switch (delta.action) {
|
||
case "insert":
|
||
var lines = delta.lines;
|
||
if (lines.length === 1) {
|
||
docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
|
||
} else {
|
||
var args = [row, 1].concat(delta.lines);
|
||
docLines.splice.apply(docLines, args);
|
||
docLines[row] = line.substring(0, startColumn) + docLines[row];
|
||
docLines[row + delta.lines.length - 1] += line.substring(startColumn);
|
||
}
|
||
break;
|
||
case "remove":
|
||
var endColumn = delta.end.column;
|
||
var endRow = delta.end.row;
|
||
if (row === endRow) {
|
||
docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
|
||
} else {
|
||
docLines.splice(
|
||
row, endRow - row + 1,
|
||
line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
|
||
);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
});
|
||
|
||
ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
|
||
var Anchor = exports.Anchor = function(doc, row, column) {
|
||
this.$onChange = this.onChange.bind(this);
|
||
this.attach(doc);
|
||
|
||
if (typeof column == "undefined")
|
||
this.setPosition(row.row, row.column);
|
||
else
|
||
this.setPosition(row, column);
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.getPosition = function() {
|
||
return this.$clipPositionToDocument(this.row, this.column);
|
||
};
|
||
this.getDocument = function() {
|
||
return this.document;
|
||
};
|
||
this.$insertRight = false;
|
||
this.onChange = function(delta) {
|
||
if (delta.start.row == delta.end.row && delta.start.row != this.row)
|
||
return;
|
||
|
||
if (delta.start.row > this.row)
|
||
return;
|
||
|
||
var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
|
||
this.setPosition(point.row, point.column, true);
|
||
};
|
||
|
||
function $pointsInOrder(point1, point2, equalPointsInOrder) {
|
||
var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
|
||
return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
|
||
}
|
||
|
||
function $getTransformedPoint(delta, point, moveIfEqual) {
|
||
var deltaIsInsert = delta.action == "insert";
|
||
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
|
||
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
|
||
var deltaStart = delta.start;
|
||
var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.
|
||
if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
|
||
return {
|
||
row: point.row,
|
||
column: point.column
|
||
};
|
||
}
|
||
if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
|
||
return {
|
||
row: point.row + deltaRowShift,
|
||
column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
|
||
};
|
||
}
|
||
|
||
return {
|
||
row: deltaStart.row,
|
||
column: deltaStart.column
|
||
};
|
||
}
|
||
this.setPosition = function(row, column, noClip) {
|
||
var pos;
|
||
if (noClip) {
|
||
pos = {
|
||
row: row,
|
||
column: column
|
||
};
|
||
} else {
|
||
pos = this.$clipPositionToDocument(row, column);
|
||
}
|
||
|
||
if (this.row == pos.row && this.column == pos.column)
|
||
return;
|
||
|
||
var old = {
|
||
row: this.row,
|
||
column: this.column
|
||
};
|
||
|
||
this.row = pos.row;
|
||
this.column = pos.column;
|
||
this._signal("change", {
|
||
old: old,
|
||
value: pos
|
||
});
|
||
};
|
||
this.detach = function() {
|
||
this.document.removeEventListener("change", this.$onChange);
|
||
};
|
||
this.attach = function(doc) {
|
||
this.document = doc || this.document;
|
||
this.document.on("change", this.$onChange);
|
||
};
|
||
this.$clipPositionToDocument = function(row, column) {
|
||
var pos = {};
|
||
|
||
if (row >= this.document.getLength()) {
|
||
pos.row = Math.max(0, this.document.getLength() - 1);
|
||
pos.column = this.document.getLine(pos.row).length;
|
||
}
|
||
else if (row < 0) {
|
||
pos.row = 0;
|
||
pos.column = 0;
|
||
}
|
||
else {
|
||
pos.row = row;
|
||
pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));
|
||
}
|
||
|
||
if (column < 0)
|
||
pos.column = 0;
|
||
|
||
return pos;
|
||
};
|
||
|
||
}).call(Anchor.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var applyDelta = acequire("./apply_delta").applyDelta;
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var Range = acequire("./range").Range;
|
||
var Anchor = acequire("./anchor").Anchor;
|
||
|
||
var Document = function(textOrLines) {
|
||
this.$lines = [""];
|
||
if (textOrLines.length === 0) {
|
||
this.$lines = [""];
|
||
} else if (Array.isArray(textOrLines)) {
|
||
this.insertMergedLines({row: 0, column: 0}, textOrLines);
|
||
} else {
|
||
this.insert({row: 0, column:0}, textOrLines);
|
||
}
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.setValue = function(text) {
|
||
var len = this.getLength() - 1;
|
||
this.remove(new Range(0, 0, len, this.getLine(len).length));
|
||
this.insert({row: 0, column: 0}, text);
|
||
};
|
||
this.getValue = function() {
|
||
return this.getAllLines().join(this.getNewLineCharacter());
|
||
};
|
||
this.createAnchor = function(row, column) {
|
||
return new Anchor(this, row, column);
|
||
};
|
||
if ("aaa".split(/a/).length === 0) {
|
||
this.$split = function(text) {
|
||
return text.replace(/\r\n|\r/g, "\n").split("\n");
|
||
};
|
||
} else {
|
||
this.$split = function(text) {
|
||
return text.split(/\r\n|\r|\n/);
|
||
};
|
||
}
|
||
|
||
|
||
this.$detectNewLine = function(text) {
|
||
var match = text.match(/^.*?(\r\n|\r|\n)/m);
|
||
this.$autoNewLine = match ? match[1] : "\n";
|
||
this._signal("changeNewLineMode");
|
||
};
|
||
this.getNewLineCharacter = function() {
|
||
switch (this.$newLineMode) {
|
||
case "windows":
|
||
return "\r\n";
|
||
case "unix":
|
||
return "\n";
|
||
default:
|
||
return this.$autoNewLine || "\n";
|
||
}
|
||
};
|
||
|
||
this.$autoNewLine = "";
|
||
this.$newLineMode = "auto";
|
||
this.setNewLineMode = function(newLineMode) {
|
||
if (this.$newLineMode === newLineMode)
|
||
return;
|
||
|
||
this.$newLineMode = newLineMode;
|
||
this._signal("changeNewLineMode");
|
||
};
|
||
this.getNewLineMode = function() {
|
||
return this.$newLineMode;
|
||
};
|
||
this.isNewLine = function(text) {
|
||
return (text == "\r\n" || text == "\r" || text == "\n");
|
||
};
|
||
this.getLine = function(row) {
|
||
return this.$lines[row] || "";
|
||
};
|
||
this.getLines = function(firstRow, lastRow) {
|
||
return this.$lines.slice(firstRow, lastRow + 1);
|
||
};
|
||
this.getAllLines = function() {
|
||
return this.getLines(0, this.getLength());
|
||
};
|
||
this.getLength = function() {
|
||
return this.$lines.length;
|
||
};
|
||
this.getTextRange = function(range) {
|
||
return this.getLinesForRange(range).join(this.getNewLineCharacter());
|
||
};
|
||
this.getLinesForRange = function(range) {
|
||
var lines;
|
||
if (range.start.row === range.end.row) {
|
||
lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
|
||
} else {
|
||
lines = this.getLines(range.start.row, range.end.row);
|
||
lines[0] = (lines[0] || "").substring(range.start.column);
|
||
var l = lines.length - 1;
|
||
if (range.end.row - range.start.row == l)
|
||
lines[l] = lines[l].substring(0, range.end.column);
|
||
}
|
||
return lines;
|
||
};
|
||
this.insertLines = function(row, lines) {
|
||
console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
|
||
return this.insertFullLines(row, lines);
|
||
};
|
||
this.removeLines = function(firstRow, lastRow) {
|
||
console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
|
||
return this.removeFullLines(firstRow, lastRow);
|
||
};
|
||
this.insertNewLine = function(position) {
|
||
console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
|
||
return this.insertMergedLines(position, ["", ""]);
|
||
};
|
||
this.insert = function(position, text) {
|
||
if (this.getLength() <= 1)
|
||
this.$detectNewLine(text);
|
||
|
||
return this.insertMergedLines(position, this.$split(text));
|
||
};
|
||
this.insertInLine = function(position, text) {
|
||
var start = this.clippedPos(position.row, position.column);
|
||
var end = this.pos(position.row, position.column + text.length);
|
||
|
||
this.applyDelta({
|
||
start: start,
|
||
end: end,
|
||
action: "insert",
|
||
lines: [text]
|
||
}, true);
|
||
|
||
return this.clonePos(end);
|
||
};
|
||
|
||
this.clippedPos = function(row, column) {
|
||
var length = this.getLength();
|
||
if (row === undefined) {
|
||
row = length;
|
||
} else if (row < 0) {
|
||
row = 0;
|
||
} else if (row >= length) {
|
||
row = length - 1;
|
||
column = undefined;
|
||
}
|
||
var line = this.getLine(row);
|
||
if (column == undefined)
|
||
column = line.length;
|
||
column = Math.min(Math.max(column, 0), line.length);
|
||
return {row: row, column: column};
|
||
};
|
||
|
||
this.clonePos = function(pos) {
|
||
return {row: pos.row, column: pos.column};
|
||
};
|
||
|
||
this.pos = function(row, column) {
|
||
return {row: row, column: column};
|
||
};
|
||
|
||
this.$clipPosition = function(position) {
|
||
var length = this.getLength();
|
||
if (position.row >= length) {
|
||
position.row = Math.max(0, length - 1);
|
||
position.column = this.getLine(length - 1).length;
|
||
} else {
|
||
position.row = Math.max(0, position.row);
|
||
position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);
|
||
}
|
||
return position;
|
||
};
|
||
this.insertFullLines = function(row, lines) {
|
||
row = Math.min(Math.max(row, 0), this.getLength());
|
||
var column = 0;
|
||
if (row < this.getLength()) {
|
||
lines = lines.concat([""]);
|
||
column = 0;
|
||
} else {
|
||
lines = [""].concat(lines);
|
||
row--;
|
||
column = this.$lines[row].length;
|
||
}
|
||
this.insertMergedLines({row: row, column: column}, lines);
|
||
};
|
||
this.insertMergedLines = function(position, lines) {
|
||
var start = this.clippedPos(position.row, position.column);
|
||
var end = {
|
||
row: start.row + lines.length - 1,
|
||
column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length
|
||
};
|
||
|
||
this.applyDelta({
|
||
start: start,
|
||
end: end,
|
||
action: "insert",
|
||
lines: lines
|
||
});
|
||
|
||
return this.clonePos(end);
|
||
};
|
||
this.remove = function(range) {
|
||
var start = this.clippedPos(range.start.row, range.start.column);
|
||
var end = this.clippedPos(range.end.row, range.end.column);
|
||
this.applyDelta({
|
||
start: start,
|
||
end: end,
|
||
action: "remove",
|
||
lines: this.getLinesForRange({start: start, end: end})
|
||
});
|
||
return this.clonePos(start);
|
||
};
|
||
this.removeInLine = function(row, startColumn, endColumn) {
|
||
var start = this.clippedPos(row, startColumn);
|
||
var end = this.clippedPos(row, endColumn);
|
||
|
||
this.applyDelta({
|
||
start: start,
|
||
end: end,
|
||
action: "remove",
|
||
lines: this.getLinesForRange({start: start, end: end})
|
||
}, true);
|
||
|
||
return this.clonePos(start);
|
||
};
|
||
this.removeFullLines = function(firstRow, lastRow) {
|
||
firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
|
||
lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
|
||
var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;
|
||
var deleteLastNewLine = lastRow < this.getLength() - 1;
|
||
var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );
|
||
var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );
|
||
var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );
|
||
var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length );
|
||
var range = new Range(startRow, startCol, endRow, endCol);
|
||
var deletedLines = this.$lines.slice(firstRow, lastRow + 1);
|
||
|
||
this.applyDelta({
|
||
start: range.start,
|
||
end: range.end,
|
||
action: "remove",
|
||
lines: this.getLinesForRange(range)
|
||
});
|
||
return deletedLines;
|
||
};
|
||
this.removeNewLine = function(row) {
|
||
if (row < this.getLength() - 1 && row >= 0) {
|
||
this.applyDelta({
|
||
start: this.pos(row, this.getLine(row).length),
|
||
end: this.pos(row + 1, 0),
|
||
action: "remove",
|
||
lines: ["", ""]
|
||
});
|
||
}
|
||
};
|
||
this.replace = function(range, text) {
|
||
if (!(range instanceof Range))
|
||
range = Range.fromPoints(range.start, range.end);
|
||
if (text.length === 0 && range.isEmpty())
|
||
return range.start;
|
||
if (text == this.getTextRange(range))
|
||
return range.end;
|
||
|
||
this.remove(range);
|
||
var end;
|
||
if (text) {
|
||
end = this.insert(range.start, text);
|
||
}
|
||
else {
|
||
end = range.start;
|
||
}
|
||
|
||
return end;
|
||
};
|
||
this.applyDeltas = function(deltas) {
|
||
for (var i=0; i<deltas.length; i++) {
|
||
this.applyDelta(deltas[i]);
|
||
}
|
||
};
|
||
this.revertDeltas = function(deltas) {
|
||
for (var i=deltas.length-1; i>=0; i--) {
|
||
this.revertDelta(deltas[i]);
|
||
}
|
||
};
|
||
this.applyDelta = function(delta, doNotValidate) {
|
||
var isInsert = delta.action == "insert";
|
||
if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]
|
||
: !Range.comparePoints(delta.start, delta.end)) {
|
||
return;
|
||
}
|
||
|
||
if (isInsert && delta.lines.length > 20000)
|
||
this.$splitAndapplyLargeDelta(delta, 20000);
|
||
applyDelta(this.$lines, delta, doNotValidate);
|
||
this._signal("change", delta);
|
||
};
|
||
|
||
this.$splitAndapplyLargeDelta = function(delta, MAX) {
|
||
var lines = delta.lines;
|
||
var l = lines.length;
|
||
var row = delta.start.row;
|
||
var column = delta.start.column;
|
||
var from = 0, to = 0;
|
||
do {
|
||
from = to;
|
||
to += MAX - 1;
|
||
var chunk = lines.slice(from, to);
|
||
if (to > l) {
|
||
delta.lines = chunk;
|
||
delta.start.row = row + from;
|
||
delta.start.column = column;
|
||
break;
|
||
}
|
||
chunk.push("");
|
||
this.applyDelta({
|
||
start: this.pos(row + from, column),
|
||
end: this.pos(row + to, column = 0),
|
||
action: delta.action,
|
||
lines: chunk
|
||
}, true);
|
||
} while(true);
|
||
};
|
||
this.revertDelta = function(delta) {
|
||
this.applyDelta({
|
||
start: this.clonePos(delta.start),
|
||
end: this.clonePos(delta.end),
|
||
action: (delta.action == "insert" ? "remove" : "insert"),
|
||
lines: delta.lines.slice()
|
||
});
|
||
};
|
||
this.indexToPosition = function(index, startRow) {
|
||
var lines = this.$lines || this.getAllLines();
|
||
var newlineLength = this.getNewLineCharacter().length;
|
||
for (var i = startRow || 0, l = lines.length; i < l; i++) {
|
||
index -= lines[i].length + newlineLength;
|
||
if (index < 0)
|
||
return {row: i, column: index + lines[i].length + newlineLength};
|
||
}
|
||
return {row: l-1, column: lines[l-1].length};
|
||
};
|
||
this.positionToIndex = function(pos, startRow) {
|
||
var lines = this.$lines || this.getAllLines();
|
||
var newlineLength = this.getNewLineCharacter().length;
|
||
var index = 0;
|
||
var row = Math.min(pos.row, lines.length);
|
||
for (var i = startRow || 0; i < row; ++i)
|
||
index += lines[i].length + newlineLength;
|
||
|
||
return index + pos.column;
|
||
};
|
||
|
||
}).call(Document.prototype);
|
||
|
||
exports.Document = Document;
|
||
});
|
||
|
||
ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
|
||
var BackgroundTokenizer = function(tokenizer, editor) {
|
||
this.running = false;
|
||
this.lines = [];
|
||
this.states = [];
|
||
this.currentLine = 0;
|
||
this.tokenizer = tokenizer;
|
||
|
||
var self = this;
|
||
|
||
this.$worker = function() {
|
||
if (!self.running) { return; }
|
||
|
||
var workerStart = new Date();
|
||
var currentLine = self.currentLine;
|
||
var endLine = -1;
|
||
var doc = self.doc;
|
||
|
||
var startLine = currentLine;
|
||
while (self.lines[currentLine])
|
||
currentLine++;
|
||
|
||
var len = doc.getLength();
|
||
var processedLines = 0;
|
||
self.running = false;
|
||
while (currentLine < len) {
|
||
self.$tokenizeRow(currentLine);
|
||
endLine = currentLine;
|
||
do {
|
||
currentLine++;
|
||
} while (self.lines[currentLine]);
|
||
processedLines ++;
|
||
if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {
|
||
self.running = setTimeout(self.$worker, 20);
|
||
break;
|
||
}
|
||
}
|
||
self.currentLine = currentLine;
|
||
|
||
if (startLine <= endLine)
|
||
self.fireUpdateEvent(startLine, endLine);
|
||
};
|
||
};
|
||
|
||
(function(){
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.setTokenizer = function(tokenizer) {
|
||
this.tokenizer = tokenizer;
|
||
this.lines = [];
|
||
this.states = [];
|
||
|
||
this.start(0);
|
||
};
|
||
this.setDocument = function(doc) {
|
||
this.doc = doc;
|
||
this.lines = [];
|
||
this.states = [];
|
||
|
||
this.stop();
|
||
};
|
||
this.fireUpdateEvent = function(firstRow, lastRow) {
|
||
var data = {
|
||
first: firstRow,
|
||
last: lastRow
|
||
};
|
||
this._signal("update", {data: data});
|
||
};
|
||
this.start = function(startRow) {
|
||
this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());
|
||
this.lines.splice(this.currentLine, this.lines.length);
|
||
this.states.splice(this.currentLine, this.states.length);
|
||
|
||
this.stop();
|
||
this.running = setTimeout(this.$worker, 700);
|
||
};
|
||
|
||
this.scheduleStart = function() {
|
||
if (!this.running)
|
||
this.running = setTimeout(this.$worker, 700);
|
||
}
|
||
|
||
this.$updateOnChange = function(delta) {
|
||
var startRow = delta.start.row;
|
||
var len = delta.end.row - startRow;
|
||
|
||
if (len === 0) {
|
||
this.lines[startRow] = null;
|
||
} else if (delta.action == "remove") {
|
||
this.lines.splice(startRow, len + 1, null);
|
||
this.states.splice(startRow, len + 1, null);
|
||
} else {
|
||
var args = Array(len + 1);
|
||
args.unshift(startRow, 1);
|
||
this.lines.splice.apply(this.lines, args);
|
||
this.states.splice.apply(this.states, args);
|
||
}
|
||
|
||
this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());
|
||
|
||
this.stop();
|
||
};
|
||
this.stop = function() {
|
||
if (this.running)
|
||
clearTimeout(this.running);
|
||
this.running = false;
|
||
};
|
||
this.getTokens = function(row) {
|
||
return this.lines[row] || this.$tokenizeRow(row);
|
||
};
|
||
this.getState = function(row) {
|
||
if (this.currentLine == row)
|
||
this.$tokenizeRow(row);
|
||
return this.states[row] || "start";
|
||
};
|
||
|
||
this.$tokenizeRow = function(row) {
|
||
var line = this.doc.getLine(row);
|
||
var state = this.states[row - 1];
|
||
|
||
var data = this.tokenizer.getLineTokens(line, state, row);
|
||
|
||
if (this.states[row] + "" !== data.state + "") {
|
||
this.states[row] = data.state;
|
||
this.lines[row + 1] = null;
|
||
if (this.currentLine > row + 1)
|
||
this.currentLine = row + 1;
|
||
} else if (this.currentLine == row) {
|
||
this.currentLine = row + 1;
|
||
}
|
||
|
||
return this.lines[row] = data.tokens;
|
||
};
|
||
|
||
}).call(BackgroundTokenizer.prototype);
|
||
|
||
exports.BackgroundTokenizer = BackgroundTokenizer;
|
||
});
|
||
|
||
ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var lang = acequire("./lib/lang");
|
||
var oop = acequire("./lib/oop");
|
||
var Range = acequire("./range").Range;
|
||
|
||
var SearchHighlight = function(regExp, clazz, type) {
|
||
this.setRegexp(regExp);
|
||
this.clazz = clazz;
|
||
this.type = type || "text";
|
||
};
|
||
|
||
(function() {
|
||
this.MAX_RANGES = 500;
|
||
|
||
this.setRegexp = function(regExp) {
|
||
if (this.regExp+"" == regExp+"")
|
||
return;
|
||
this.regExp = regExp;
|
||
this.cache = [];
|
||
};
|
||
|
||
this.update = function(html, markerLayer, session, config) {
|
||
if (!this.regExp)
|
||
return;
|
||
var start = config.firstRow, end = config.lastRow;
|
||
|
||
for (var i = start; i <= end; i++) {
|
||
var ranges = this.cache[i];
|
||
if (ranges == null) {
|
||
ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);
|
||
if (ranges.length > this.MAX_RANGES)
|
||
ranges = ranges.slice(0, this.MAX_RANGES);
|
||
ranges = ranges.map(function(match) {
|
||
return new Range(i, match.offset, i, match.offset + match.length);
|
||
});
|
||
this.cache[i] = ranges.length ? ranges : "";
|
||
}
|
||
|
||
for (var j = ranges.length; j --; ) {
|
||
markerLayer.drawSingleLineMarker(
|
||
html, ranges[j].toScreenRange(session), this.clazz, config);
|
||
}
|
||
}
|
||
};
|
||
|
||
}).call(SearchHighlight.prototype);
|
||
|
||
exports.SearchHighlight = SearchHighlight;
|
||
});
|
||
|
||
ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../range").Range;
|
||
function FoldLine(foldData, folds) {
|
||
this.foldData = foldData;
|
||
if (Array.isArray(folds)) {
|
||
this.folds = folds;
|
||
} else {
|
||
folds = this.folds = [ folds ];
|
||
}
|
||
|
||
var last = folds[folds.length - 1];
|
||
this.range = new Range(folds[0].start.row, folds[0].start.column,
|
||
last.end.row, last.end.column);
|
||
this.start = this.range.start;
|
||
this.end = this.range.end;
|
||
|
||
this.folds.forEach(function(fold) {
|
||
fold.setFoldLine(this);
|
||
}, this);
|
||
}
|
||
|
||
(function() {
|
||
this.shiftRow = function(shift) {
|
||
this.start.row += shift;
|
||
this.end.row += shift;
|
||
this.folds.forEach(function(fold) {
|
||
fold.start.row += shift;
|
||
fold.end.row += shift;
|
||
});
|
||
};
|
||
|
||
this.addFold = function(fold) {
|
||
if (fold.sameRow) {
|
||
if (fold.start.row < this.startRow || fold.endRow > this.endRow) {
|
||
throw new Error("Can't add a fold to this FoldLine as it has no connection");
|
||
}
|
||
this.folds.push(fold);
|
||
this.folds.sort(function(a, b) {
|
||
return -a.range.compareEnd(b.start.row, b.start.column);
|
||
});
|
||
if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {
|
||
this.end.row = fold.end.row;
|
||
this.end.column = fold.end.column;
|
||
} else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {
|
||
this.start.row = fold.start.row;
|
||
this.start.column = fold.start.column;
|
||
}
|
||
} else if (fold.start.row == this.end.row) {
|
||
this.folds.push(fold);
|
||
this.end.row = fold.end.row;
|
||
this.end.column = fold.end.column;
|
||
} else if (fold.end.row == this.start.row) {
|
||
this.folds.unshift(fold);
|
||
this.start.row = fold.start.row;
|
||
this.start.column = fold.start.column;
|
||
} else {
|
||
throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");
|
||
}
|
||
fold.foldLine = this;
|
||
};
|
||
|
||
this.containsRow = function(row) {
|
||
return row >= this.start.row && row <= this.end.row;
|
||
};
|
||
|
||
this.walk = function(callback, endRow, endColumn) {
|
||
var lastEnd = 0,
|
||
folds = this.folds,
|
||
fold,
|
||
cmp, stop, isNewRow = true;
|
||
|
||
if (endRow == null) {
|
||
endRow = this.end.row;
|
||
endColumn = this.end.column;
|
||
}
|
||
|
||
for (var i = 0; i < folds.length; i++) {
|
||
fold = folds[i];
|
||
|
||
cmp = fold.range.compareStart(endRow, endColumn);
|
||
if (cmp == -1) {
|
||
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
||
return;
|
||
}
|
||
|
||
stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);
|
||
stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);
|
||
if (stop || cmp === 0) {
|
||
return;
|
||
}
|
||
isNewRow = !fold.sameRow;
|
||
lastEnd = fold.end.column;
|
||
}
|
||
callback(null, endRow, endColumn, lastEnd, isNewRow);
|
||
};
|
||
|
||
this.getNextFoldTo = function(row, column) {
|
||
var fold, cmp;
|
||
for (var i = 0; i < this.folds.length; i++) {
|
||
fold = this.folds[i];
|
||
cmp = fold.range.compareEnd(row, column);
|
||
if (cmp == -1) {
|
||
return {
|
||
fold: fold,
|
||
kind: "after"
|
||
};
|
||
} else if (cmp === 0) {
|
||
return {
|
||
fold: fold,
|
||
kind: "inside"
|
||
};
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
|
||
this.addRemoveChars = function(row, column, len) {
|
||
var ret = this.getNextFoldTo(row, column),
|
||
fold, folds;
|
||
if (ret) {
|
||
fold = ret.fold;
|
||
if (ret.kind == "inside"
|
||
&& fold.start.column != column
|
||
&& fold.start.row != row)
|
||
{
|
||
window.console && window.console.log(row, column, fold);
|
||
} else if (fold.start.row == row) {
|
||
folds = this.folds;
|
||
var i = folds.indexOf(fold);
|
||
if (i === 0) {
|
||
this.start.column += len;
|
||
}
|
||
for (i; i < folds.length; i++) {
|
||
fold = folds[i];
|
||
fold.start.column += len;
|
||
if (!fold.sameRow) {
|
||
return;
|
||
}
|
||
fold.end.column += len;
|
||
}
|
||
this.end.column += len;
|
||
}
|
||
}
|
||
};
|
||
|
||
this.split = function(row, column) {
|
||
var pos = this.getNextFoldTo(row, column);
|
||
|
||
if (!pos || pos.kind == "inside")
|
||
return null;
|
||
|
||
var fold = pos.fold;
|
||
var folds = this.folds;
|
||
var foldData = this.foldData;
|
||
|
||
var i = folds.indexOf(fold);
|
||
var foldBefore = folds[i - 1];
|
||
this.end.row = foldBefore.end.row;
|
||
this.end.column = foldBefore.end.column;
|
||
folds = folds.splice(i, folds.length - i);
|
||
|
||
var newFoldLine = new FoldLine(foldData, folds);
|
||
foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);
|
||
return newFoldLine;
|
||
};
|
||
|
||
this.merge = function(foldLineNext) {
|
||
var folds = foldLineNext.folds;
|
||
for (var i = 0; i < folds.length; i++) {
|
||
this.addFold(folds[i]);
|
||
}
|
||
var foldData = this.foldData;
|
||
foldData.splice(foldData.indexOf(foldLineNext), 1);
|
||
};
|
||
|
||
this.toString = function() {
|
||
var ret = [this.range.toString() + ": [" ];
|
||
|
||
this.folds.forEach(function(fold) {
|
||
ret.push(" " + fold.toString());
|
||
});
|
||
ret.push("]");
|
||
return ret.join("\n");
|
||
};
|
||
|
||
this.idxToPosition = function(idx) {
|
||
var lastFoldEndColumn = 0;
|
||
|
||
for (var i = 0; i < this.folds.length; i++) {
|
||
var fold = this.folds[i];
|
||
|
||
idx -= fold.start.column - lastFoldEndColumn;
|
||
if (idx < 0) {
|
||
return {
|
||
row: fold.start.row,
|
||
column: fold.start.column + idx
|
||
};
|
||
}
|
||
|
||
idx -= fold.placeholder.length;
|
||
if (idx < 0) {
|
||
return fold.start;
|
||
}
|
||
|
||
lastFoldEndColumn = fold.end.column;
|
||
}
|
||
|
||
return {
|
||
row: this.end.row,
|
||
column: this.end.column + idx
|
||
};
|
||
};
|
||
}).call(FoldLine.prototype);
|
||
|
||
exports.FoldLine = FoldLine;
|
||
});
|
||
|
||
ace.define("ace/range_list",["require","exports","module","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var Range = acequire("./range").Range;
|
||
var comparePoints = Range.comparePoints;
|
||
|
||
var RangeList = function() {
|
||
this.ranges = [];
|
||
};
|
||
|
||
(function() {
|
||
this.comparePoints = comparePoints;
|
||
|
||
this.pointIndex = function(pos, excludeEdges, startIndex) {
|
||
var list = this.ranges;
|
||
|
||
for (var i = startIndex || 0; i < list.length; i++) {
|
||
var range = list[i];
|
||
var cmpEnd = comparePoints(pos, range.end);
|
||
if (cmpEnd > 0)
|
||
continue;
|
||
var cmpStart = comparePoints(pos, range.start);
|
||
if (cmpEnd === 0)
|
||
return excludeEdges && cmpStart !== 0 ? -i-2 : i;
|
||
if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))
|
||
return i;
|
||
|
||
return -i-1;
|
||
}
|
||
return -i - 1;
|
||
};
|
||
|
||
this.add = function(range) {
|
||
var excludeEdges = !range.isEmpty();
|
||
var startIndex = this.pointIndex(range.start, excludeEdges);
|
||
if (startIndex < 0)
|
||
startIndex = -startIndex - 1;
|
||
|
||
var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);
|
||
|
||
if (endIndex < 0)
|
||
endIndex = -endIndex - 1;
|
||
else
|
||
endIndex++;
|
||
return this.ranges.splice(startIndex, endIndex - startIndex, range);
|
||
};
|
||
|
||
this.addList = function(list) {
|
||
var removed = [];
|
||
for (var i = list.length; i--; ) {
|
||
removed.push.apply(removed, this.add(list[i]));
|
||
}
|
||
return removed;
|
||
};
|
||
|
||
this.substractPoint = function(pos) {
|
||
var i = this.pointIndex(pos);
|
||
|
||
if (i >= 0)
|
||
return this.ranges.splice(i, 1);
|
||
};
|
||
this.merge = function() {
|
||
var removed = [];
|
||
var list = this.ranges;
|
||
|
||
list = list.sort(function(a, b) {
|
||
return comparePoints(a.start, b.start);
|
||
});
|
||
|
||
var next = list[0], range;
|
||
for (var i = 1; i < list.length; i++) {
|
||
range = next;
|
||
next = list[i];
|
||
var cmp = comparePoints(range.end, next.start);
|
||
if (cmp < 0)
|
||
continue;
|
||
|
||
if (cmp == 0 && !range.isEmpty() && !next.isEmpty())
|
||
continue;
|
||
|
||
if (comparePoints(range.end, next.end) < 0) {
|
||
range.end.row = next.end.row;
|
||
range.end.column = next.end.column;
|
||
}
|
||
|
||
list.splice(i, 1);
|
||
removed.push(next);
|
||
next = range;
|
||
i--;
|
||
}
|
||
|
||
this.ranges = list;
|
||
|
||
return removed;
|
||
};
|
||
|
||
this.contains = function(row, column) {
|
||
return this.pointIndex({row: row, column: column}) >= 0;
|
||
};
|
||
|
||
this.containsPoint = function(pos) {
|
||
return this.pointIndex(pos) >= 0;
|
||
};
|
||
|
||
this.rangeAtPoint = function(pos) {
|
||
var i = this.pointIndex(pos);
|
||
if (i >= 0)
|
||
return this.ranges[i];
|
||
};
|
||
|
||
|
||
this.clipRows = function(startRow, endRow) {
|
||
var list = this.ranges;
|
||
if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)
|
||
return [];
|
||
|
||
var startIndex = this.pointIndex({row: startRow, column: 0});
|
||
if (startIndex < 0)
|
||
startIndex = -startIndex - 1;
|
||
var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);
|
||
if (endIndex < 0)
|
||
endIndex = -endIndex - 1;
|
||
|
||
var clipped = [];
|
||
for (var i = startIndex; i < endIndex; i++) {
|
||
clipped.push(list[i]);
|
||
}
|
||
return clipped;
|
||
};
|
||
|
||
this.removeAll = function() {
|
||
return this.ranges.splice(0, this.ranges.length);
|
||
};
|
||
|
||
this.attach = function(session) {
|
||
if (this.session)
|
||
this.detach();
|
||
|
||
this.session = session;
|
||
this.onChange = this.$onChange.bind(this);
|
||
|
||
this.session.on('change', this.onChange);
|
||
};
|
||
|
||
this.detach = function() {
|
||
if (!this.session)
|
||
return;
|
||
this.session.removeListener('change', this.onChange);
|
||
this.session = null;
|
||
};
|
||
|
||
this.$onChange = function(delta) {
|
||
if (delta.action == "insert"){
|
||
var start = delta.start;
|
||
var end = delta.end;
|
||
} else {
|
||
var end = delta.start;
|
||
var start = delta.end;
|
||
}
|
||
var startRow = start.row;
|
||
var endRow = end.row;
|
||
var lineDif = endRow - startRow;
|
||
|
||
var colDiff = -start.column + end.column;
|
||
var ranges = this.ranges;
|
||
|
||
for (var i = 0, n = ranges.length; i < n; i++) {
|
||
var r = ranges[i];
|
||
if (r.end.row < startRow)
|
||
continue;
|
||
if (r.start.row > startRow)
|
||
break;
|
||
|
||
if (r.start.row == startRow && r.start.column >= start.column ) {
|
||
if (r.start.column == start.column && this.$insertRight) {
|
||
} else {
|
||
r.start.column += colDiff;
|
||
r.start.row += lineDif;
|
||
}
|
||
}
|
||
if (r.end.row == startRow && r.end.column >= start.column) {
|
||
if (r.end.column == start.column && this.$insertRight) {
|
||
continue;
|
||
}
|
||
if (r.end.column == start.column && colDiff > 0 && i < n - 1) {
|
||
if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)
|
||
r.end.column -= colDiff;
|
||
}
|
||
r.end.column += colDiff;
|
||
r.end.row += lineDif;
|
||
}
|
||
}
|
||
|
||
if (lineDif != 0 && i < n) {
|
||
for (; i < n; i++) {
|
||
var r = ranges[i];
|
||
r.start.row += lineDif;
|
||
r.end.row += lineDif;
|
||
}
|
||
}
|
||
};
|
||
|
||
}).call(RangeList.prototype);
|
||
|
||
exports.RangeList = RangeList;
|
||
});
|
||
|
||
ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../range").Range;
|
||
var RangeList = acequire("../range_list").RangeList;
|
||
var oop = acequire("../lib/oop")
|
||
var Fold = exports.Fold = function(range, placeholder) {
|
||
this.foldLine = null;
|
||
this.placeholder = placeholder;
|
||
this.range = range;
|
||
this.start = range.start;
|
||
this.end = range.end;
|
||
|
||
this.sameRow = range.start.row == range.end.row;
|
||
this.subFolds = this.ranges = [];
|
||
};
|
||
|
||
oop.inherits(Fold, RangeList);
|
||
|
||
(function() {
|
||
|
||
this.toString = function() {
|
||
return '"' + this.placeholder + '" ' + this.range.toString();
|
||
};
|
||
|
||
this.setFoldLine = function(foldLine) {
|
||
this.foldLine = foldLine;
|
||
this.subFolds.forEach(function(fold) {
|
||
fold.setFoldLine(foldLine);
|
||
});
|
||
};
|
||
|
||
this.clone = function() {
|
||
var range = this.range.clone();
|
||
var fold = new Fold(range, this.placeholder);
|
||
this.subFolds.forEach(function(subFold) {
|
||
fold.subFolds.push(subFold.clone());
|
||
});
|
||
fold.collapseChildren = this.collapseChildren;
|
||
return fold;
|
||
};
|
||
|
||
this.addSubFold = function(fold) {
|
||
if (this.range.isEqual(fold))
|
||
return;
|
||
|
||
if (!this.range.containsRange(fold))
|
||
throw new Error("A fold can't intersect already existing fold" + fold.range + this.range);
|
||
consumeRange(fold, this.start);
|
||
|
||
var row = fold.start.row, column = fold.start.column;
|
||
for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {
|
||
cmp = this.subFolds[i].range.compare(row, column);
|
||
if (cmp != 1)
|
||
break;
|
||
}
|
||
var afterStart = this.subFolds[i];
|
||
|
||
if (cmp == 0)
|
||
return afterStart.addSubFold(fold);
|
||
var row = fold.range.end.row, column = fold.range.end.column;
|
||
for (var j = i, cmp = -1; j < this.subFolds.length; j++) {
|
||
cmp = this.subFolds[j].range.compare(row, column);
|
||
if (cmp != 1)
|
||
break;
|
||
}
|
||
var afterEnd = this.subFolds[j];
|
||
|
||
if (cmp == 0)
|
||
throw new Error("A fold can't intersect already existing fold" + fold.range + this.range);
|
||
|
||
var consumedFolds = this.subFolds.splice(i, j - i, fold);
|
||
fold.setFoldLine(this.foldLine);
|
||
|
||
return fold;
|
||
};
|
||
|
||
this.restoreRange = function(range) {
|
||
return restoreRange(range, this.start);
|
||
};
|
||
|
||
}).call(Fold.prototype);
|
||
|
||
function consumePoint(point, anchor) {
|
||
point.row -= anchor.row;
|
||
if (point.row == 0)
|
||
point.column -= anchor.column;
|
||
}
|
||
function consumeRange(range, anchor) {
|
||
consumePoint(range.start, anchor);
|
||
consumePoint(range.end, anchor);
|
||
}
|
||
function restorePoint(point, anchor) {
|
||
if (point.row == 0)
|
||
point.column += anchor.column;
|
||
point.row += anchor.row;
|
||
}
|
||
function restoreRange(range, anchor) {
|
||
restorePoint(range.start, anchor);
|
||
restorePoint(range.end, anchor);
|
||
}
|
||
|
||
});
|
||
|
||
ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../range").Range;
|
||
var FoldLine = acequire("./fold_line").FoldLine;
|
||
var Fold = acequire("./fold").Fold;
|
||
var TokenIterator = acequire("../token_iterator").TokenIterator;
|
||
|
||
function Folding() {
|
||
this.getFoldAt = function(row, column, side) {
|
||
var foldLine = this.getFoldLine(row);
|
||
if (!foldLine)
|
||
return null;
|
||
|
||
var folds = foldLine.folds;
|
||
for (var i = 0; i < folds.length; i++) {
|
||
var fold = folds[i];
|
||
if (fold.range.contains(row, column)) {
|
||
if (side == 1 && fold.range.isEnd(row, column)) {
|
||
continue;
|
||
} else if (side == -1 && fold.range.isStart(row, column)) {
|
||
continue;
|
||
}
|
||
return fold;
|
||
}
|
||
}
|
||
};
|
||
this.getFoldsInRange = function(range) {
|
||
var start = range.start;
|
||
var end = range.end;
|
||
var foldLines = this.$foldData;
|
||
var foundFolds = [];
|
||
|
||
start.column += 1;
|
||
end.column -= 1;
|
||
|
||
for (var i = 0; i < foldLines.length; i++) {
|
||
var cmp = foldLines[i].range.compareRange(range);
|
||
if (cmp == 2) {
|
||
continue;
|
||
}
|
||
else if (cmp == -2) {
|
||
break;
|
||
}
|
||
|
||
var folds = foldLines[i].folds;
|
||
for (var j = 0; j < folds.length; j++) {
|
||
var fold = folds[j];
|
||
cmp = fold.range.compareRange(range);
|
||
if (cmp == -2) {
|
||
break;
|
||
} else if (cmp == 2) {
|
||
continue;
|
||
} else
|
||
if (cmp == 42) {
|
||
break;
|
||
}
|
||
foundFolds.push(fold);
|
||
}
|
||
}
|
||
start.column -= 1;
|
||
end.column += 1;
|
||
|
||
return foundFolds;
|
||
};
|
||
|
||
this.getFoldsInRangeList = function(ranges) {
|
||
if (Array.isArray(ranges)) {
|
||
var folds = [];
|
||
ranges.forEach(function(range) {
|
||
folds = folds.concat(this.getFoldsInRange(range));
|
||
}, this);
|
||
} else {
|
||
var folds = this.getFoldsInRange(ranges);
|
||
}
|
||
return folds;
|
||
};
|
||
this.getAllFolds = function() {
|
||
var folds = [];
|
||
var foldLines = this.$foldData;
|
||
|
||
for (var i = 0; i < foldLines.length; i++)
|
||
for (var j = 0; j < foldLines[i].folds.length; j++)
|
||
folds.push(foldLines[i].folds[j]);
|
||
|
||
return folds;
|
||
};
|
||
this.getFoldStringAt = function(row, column, trim, foldLine) {
|
||
foldLine = foldLine || this.getFoldLine(row);
|
||
if (!foldLine)
|
||
return null;
|
||
|
||
var lastFold = {
|
||
end: { column: 0 }
|
||
};
|
||
var str, fold;
|
||
for (var i = 0; i < foldLine.folds.length; i++) {
|
||
fold = foldLine.folds[i];
|
||
var cmp = fold.range.compareEnd(row, column);
|
||
if (cmp == -1) {
|
||
str = this
|
||
.getLine(fold.start.row)
|
||
.substring(lastFold.end.column, fold.start.column);
|
||
break;
|
||
}
|
||
else if (cmp === 0) {
|
||
return null;
|
||
}
|
||
lastFold = fold;
|
||
}
|
||
if (!str)
|
||
str = this.getLine(fold.start.row).substring(lastFold.end.column);
|
||
|
||
if (trim == -1)
|
||
return str.substring(0, column - lastFold.end.column);
|
||
else if (trim == 1)
|
||
return str.substring(column - lastFold.end.column);
|
||
else
|
||
return str;
|
||
};
|
||
|
||
this.getFoldLine = function(docRow, startFoldLine) {
|
||
var foldData = this.$foldData;
|
||
var i = 0;
|
||
if (startFoldLine)
|
||
i = foldData.indexOf(startFoldLine);
|
||
if (i == -1)
|
||
i = 0;
|
||
for (i; i < foldData.length; i++) {
|
||
var foldLine = foldData[i];
|
||
if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {
|
||
return foldLine;
|
||
} else if (foldLine.end.row > docRow) {
|
||
return null;
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
this.getNextFoldLine = function(docRow, startFoldLine) {
|
||
var foldData = this.$foldData;
|
||
var i = 0;
|
||
if (startFoldLine)
|
||
i = foldData.indexOf(startFoldLine);
|
||
if (i == -1)
|
||
i = 0;
|
||
for (i; i < foldData.length; i++) {
|
||
var foldLine = foldData[i];
|
||
if (foldLine.end.row >= docRow) {
|
||
return foldLine;
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
|
||
this.getFoldedRowCount = function(first, last) {
|
||
var foldData = this.$foldData, rowCount = last-first+1;
|
||
for (var i = 0; i < foldData.length; i++) {
|
||
var foldLine = foldData[i],
|
||
end = foldLine.end.row,
|
||
start = foldLine.start.row;
|
||
if (end >= last) {
|
||
if (start < last) {
|
||
if (start >= first)
|
||
rowCount -= last-start;
|
||
else
|
||
rowCount = 0; // in one fold
|
||
}
|
||
break;
|
||
} else if (end >= first){
|
||
if (start >= first) // fold inside range
|
||
rowCount -= end-start;
|
||
else
|
||
rowCount -= end-first+1;
|
||
}
|
||
}
|
||
return rowCount;
|
||
};
|
||
|
||
this.$addFoldLine = function(foldLine) {
|
||
this.$foldData.push(foldLine);
|
||
this.$foldData.sort(function(a, b) {
|
||
return a.start.row - b.start.row;
|
||
});
|
||
return foldLine;
|
||
};
|
||
this.addFold = function(placeholder, range) {
|
||
var foldData = this.$foldData;
|
||
var added = false;
|
||
var fold;
|
||
|
||
if (placeholder instanceof Fold)
|
||
fold = placeholder;
|
||
else {
|
||
fold = new Fold(range, placeholder);
|
||
fold.collapseChildren = range.collapseChildren;
|
||
}
|
||
this.$clipRangeToDocument(fold.range);
|
||
|
||
var startRow = fold.start.row;
|
||
var startColumn = fold.start.column;
|
||
var endRow = fold.end.row;
|
||
var endColumn = fold.end.column;
|
||
if (!(startRow < endRow ||
|
||
startRow == endRow && startColumn <= endColumn - 2))
|
||
throw new Error("The range has to be at least 2 characters width");
|
||
|
||
var startFold = this.getFoldAt(startRow, startColumn, 1);
|
||
var endFold = this.getFoldAt(endRow, endColumn, -1);
|
||
if (startFold && endFold == startFold)
|
||
return startFold.addSubFold(fold);
|
||
|
||
if (startFold && !startFold.range.isStart(startRow, startColumn))
|
||
this.removeFold(startFold);
|
||
|
||
if (endFold && !endFold.range.isEnd(endRow, endColumn))
|
||
this.removeFold(endFold);
|
||
var folds = this.getFoldsInRange(fold.range);
|
||
if (folds.length > 0) {
|
||
this.removeFolds(folds);
|
||
folds.forEach(function(subFold) {
|
||
fold.addSubFold(subFold);
|
||
});
|
||
}
|
||
|
||
for (var i = 0; i < foldData.length; i++) {
|
||
var foldLine = foldData[i];
|
||
if (endRow == foldLine.start.row) {
|
||
foldLine.addFold(fold);
|
||
added = true;
|
||
break;
|
||
} else if (startRow == foldLine.end.row) {
|
||
foldLine.addFold(fold);
|
||
added = true;
|
||
if (!fold.sameRow) {
|
||
var foldLineNext = foldData[i + 1];
|
||
if (foldLineNext && foldLineNext.start.row == endRow) {
|
||
foldLine.merge(foldLineNext);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
} else if (endRow <= foldLine.start.row) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!added)
|
||
foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));
|
||
|
||
if (this.$useWrapMode)
|
||
this.$updateWrapData(foldLine.start.row, foldLine.start.row);
|
||
else
|
||
this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);
|
||
this.$modified = true;
|
||
this._signal("changeFold", { data: fold, action: "add" });
|
||
|
||
return fold;
|
||
};
|
||
|
||
this.addFolds = function(folds) {
|
||
folds.forEach(function(fold) {
|
||
this.addFold(fold);
|
||
}, this);
|
||
};
|
||
|
||
this.removeFold = function(fold) {
|
||
var foldLine = fold.foldLine;
|
||
var startRow = foldLine.start.row;
|
||
var endRow = foldLine.end.row;
|
||
|
||
var foldLines = this.$foldData;
|
||
var folds = foldLine.folds;
|
||
if (folds.length == 1) {
|
||
foldLines.splice(foldLines.indexOf(foldLine), 1);
|
||
} else
|
||
if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {
|
||
folds.pop();
|
||
foldLine.end.row = folds[folds.length - 1].end.row;
|
||
foldLine.end.column = folds[folds.length - 1].end.column;
|
||
} else
|
||
if (foldLine.range.isStart(fold.start.row, fold.start.column)) {
|
||
folds.shift();
|
||
foldLine.start.row = folds[0].start.row;
|
||
foldLine.start.column = folds[0].start.column;
|
||
} else
|
||
if (fold.sameRow) {
|
||
folds.splice(folds.indexOf(fold), 1);
|
||
} else
|
||
{
|
||
var newFoldLine = foldLine.split(fold.start.row, fold.start.column);
|
||
folds = newFoldLine.folds;
|
||
folds.shift();
|
||
newFoldLine.start.row = folds[0].start.row;
|
||
newFoldLine.start.column = folds[0].start.column;
|
||
}
|
||
|
||
if (!this.$updating) {
|
||
if (this.$useWrapMode)
|
||
this.$updateWrapData(startRow, endRow);
|
||
else
|
||
this.$updateRowLengthCache(startRow, endRow);
|
||
}
|
||
this.$modified = true;
|
||
this._signal("changeFold", { data: fold, action: "remove" });
|
||
};
|
||
|
||
this.removeFolds = function(folds) {
|
||
var cloneFolds = [];
|
||
for (var i = 0; i < folds.length; i++) {
|
||
cloneFolds.push(folds[i]);
|
||
}
|
||
|
||
cloneFolds.forEach(function(fold) {
|
||
this.removeFold(fold);
|
||
}, this);
|
||
this.$modified = true;
|
||
};
|
||
|
||
this.expandFold = function(fold) {
|
||
this.removeFold(fold);
|
||
fold.subFolds.forEach(function(subFold) {
|
||
fold.restoreRange(subFold);
|
||
this.addFold(subFold);
|
||
}, this);
|
||
if (fold.collapseChildren > 0) {
|
||
this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);
|
||
}
|
||
fold.subFolds = [];
|
||
};
|
||
|
||
this.expandFolds = function(folds) {
|
||
folds.forEach(function(fold) {
|
||
this.expandFold(fold);
|
||
}, this);
|
||
};
|
||
|
||
this.unfold = function(location, expandInner) {
|
||
var range, folds;
|
||
if (location == null) {
|
||
range = new Range(0, 0, this.getLength(), 0);
|
||
expandInner = true;
|
||
} else if (typeof location == "number")
|
||
range = new Range(location, 0, location, this.getLine(location).length);
|
||
else if ("row" in location)
|
||
range = Range.fromPoints(location, location);
|
||
else
|
||
range = location;
|
||
|
||
folds = this.getFoldsInRangeList(range);
|
||
if (expandInner) {
|
||
this.removeFolds(folds);
|
||
} else {
|
||
var subFolds = folds;
|
||
while (subFolds.length) {
|
||
this.expandFolds(subFolds);
|
||
subFolds = this.getFoldsInRangeList(range);
|
||
}
|
||
}
|
||
if (folds.length)
|
||
return folds;
|
||
};
|
||
this.isRowFolded = function(docRow, startFoldRow) {
|
||
return !!this.getFoldLine(docRow, startFoldRow);
|
||
};
|
||
|
||
this.getRowFoldEnd = function(docRow, startFoldRow) {
|
||
var foldLine = this.getFoldLine(docRow, startFoldRow);
|
||
return foldLine ? foldLine.end.row : docRow;
|
||
};
|
||
|
||
this.getRowFoldStart = function(docRow, startFoldRow) {
|
||
var foldLine = this.getFoldLine(docRow, startFoldRow);
|
||
return foldLine ? foldLine.start.row : docRow;
|
||
};
|
||
|
||
this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {
|
||
if (startRow == null)
|
||
startRow = foldLine.start.row;
|
||
if (startColumn == null)
|
||
startColumn = 0;
|
||
if (endRow == null)
|
||
endRow = foldLine.end.row;
|
||
if (endColumn == null)
|
||
endColumn = this.getLine(endRow).length;
|
||
var doc = this.doc;
|
||
var textLine = "";
|
||
|
||
foldLine.walk(function(placeholder, row, column, lastColumn) {
|
||
if (row < startRow)
|
||
return;
|
||
if (row == startRow) {
|
||
if (column < startColumn)
|
||
return;
|
||
lastColumn = Math.max(startColumn, lastColumn);
|
||
}
|
||
|
||
if (placeholder != null) {
|
||
textLine += placeholder;
|
||
} else {
|
||
textLine += doc.getLine(row).substring(lastColumn, column);
|
||
}
|
||
}, endRow, endColumn);
|
||
return textLine;
|
||
};
|
||
|
||
this.getDisplayLine = function(row, endColumn, startRow, startColumn) {
|
||
var foldLine = this.getFoldLine(row);
|
||
|
||
if (!foldLine) {
|
||
var line;
|
||
line = this.doc.getLine(row);
|
||
return line.substring(startColumn || 0, endColumn || line.length);
|
||
} else {
|
||
return this.getFoldDisplayLine(
|
||
foldLine, row, endColumn, startRow, startColumn);
|
||
}
|
||
};
|
||
|
||
this.$cloneFoldData = function() {
|
||
var fd = [];
|
||
fd = this.$foldData.map(function(foldLine) {
|
||
var folds = foldLine.folds.map(function(fold) {
|
||
return fold.clone();
|
||
});
|
||
return new FoldLine(fd, folds);
|
||
});
|
||
|
||
return fd;
|
||
};
|
||
|
||
this.toggleFold = function(tryToUnfold) {
|
||
var selection = this.selection;
|
||
var range = selection.getRange();
|
||
var fold;
|
||
var bracketPos;
|
||
|
||
if (range.isEmpty()) {
|
||
var cursor = range.start;
|
||
fold = this.getFoldAt(cursor.row, cursor.column);
|
||
|
||
if (fold) {
|
||
this.expandFold(fold);
|
||
return;
|
||
} else if (bracketPos = this.findMatchingBracket(cursor)) {
|
||
if (range.comparePoint(bracketPos) == 1) {
|
||
range.end = bracketPos;
|
||
} else {
|
||
range.start = bracketPos;
|
||
range.start.column++;
|
||
range.end.column--;
|
||
}
|
||
} else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {
|
||
if (range.comparePoint(bracketPos) == 1)
|
||
range.end = bracketPos;
|
||
else
|
||
range.start = bracketPos;
|
||
|
||
range.start.column++;
|
||
} else {
|
||
range = this.getCommentFoldRange(cursor.row, cursor.column) || range;
|
||
}
|
||
} else {
|
||
var folds = this.getFoldsInRange(range);
|
||
if (tryToUnfold && folds.length) {
|
||
this.expandFolds(folds);
|
||
return;
|
||
} else if (folds.length == 1 ) {
|
||
fold = folds[0];
|
||
}
|
||
}
|
||
|
||
if (!fold)
|
||
fold = this.getFoldAt(range.start.row, range.start.column);
|
||
|
||
if (fold && fold.range.toString() == range.toString()) {
|
||
this.expandFold(fold);
|
||
return;
|
||
}
|
||
|
||
var placeholder = "...";
|
||
if (!range.isMultiLine()) {
|
||
placeholder = this.getTextRange(range);
|
||
if (placeholder.length < 4)
|
||
return;
|
||
placeholder = placeholder.trim().substring(0, 2) + "..";
|
||
}
|
||
|
||
this.addFold(placeholder, range);
|
||
};
|
||
|
||
this.getCommentFoldRange = function(row, column, dir) {
|
||
var iterator = new TokenIterator(this, row, column);
|
||
var token = iterator.getCurrentToken();
|
||
if (token && /^comment|string/.test(token.type)) {
|
||
var range = new Range();
|
||
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
||
if (dir != 1) {
|
||
do {
|
||
token = iterator.stepBackward();
|
||
} while (token && re.test(token.type));
|
||
iterator.stepForward();
|
||
}
|
||
|
||
range.start.row = iterator.getCurrentTokenRow();
|
||
range.start.column = iterator.getCurrentTokenColumn() + 2;
|
||
|
||
iterator = new TokenIterator(this, row, column);
|
||
|
||
if (dir != -1) {
|
||
do {
|
||
token = iterator.stepForward();
|
||
} while (token && re.test(token.type));
|
||
token = iterator.stepBackward();
|
||
} else
|
||
token = iterator.getCurrentToken();
|
||
|
||
range.end.row = iterator.getCurrentTokenRow();
|
||
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;
|
||
return range;
|
||
}
|
||
};
|
||
|
||
this.foldAll = function(startRow, endRow, depth) {
|
||
if (depth == undefined)
|
||
depth = 100000; // JSON.stringify doesn't hanle Infinity
|
||
var foldWidgets = this.foldWidgets;
|
||
if (!foldWidgets)
|
||
return; // mode doesn't support folding
|
||
endRow = endRow || this.getLength();
|
||
startRow = startRow || 0;
|
||
for (var row = startRow; row < endRow; row++) {
|
||
if (foldWidgets[row] == null)
|
||
foldWidgets[row] = this.getFoldWidget(row);
|
||
if (foldWidgets[row] != "start")
|
||
continue;
|
||
|
||
var range = this.getFoldWidgetRange(row);
|
||
if (range && range.isMultiLine()
|
||
&& range.end.row <= endRow
|
||
&& range.start.row >= startRow
|
||
) {
|
||
row = range.end.row;
|
||
try {
|
||
var fold = this.addFold("...", range);
|
||
if (fold)
|
||
fold.collapseChildren = depth;
|
||
} catch(e) {}
|
||
}
|
||
}
|
||
};
|
||
this.$foldStyles = {
|
||
"manual": 1,
|
||
"markbegin": 1,
|
||
"markbeginend": 1
|
||
};
|
||
this.$foldStyle = "markbegin";
|
||
this.setFoldStyle = function(style) {
|
||
if (!this.$foldStyles[style])
|
||
throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]");
|
||
|
||
if (this.$foldStyle == style)
|
||
return;
|
||
|
||
this.$foldStyle = style;
|
||
|
||
if (style == "manual")
|
||
this.unfold();
|
||
var mode = this.$foldMode;
|
||
this.$setFolding(null);
|
||
this.$setFolding(mode);
|
||
};
|
||
|
||
this.$setFolding = function(foldMode) {
|
||
if (this.$foldMode == foldMode)
|
||
return;
|
||
|
||
this.$foldMode = foldMode;
|
||
|
||
this.off('change', this.$updateFoldWidgets);
|
||
this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);
|
||
this._signal("changeAnnotation");
|
||
|
||
if (!foldMode || this.$foldStyle == "manual") {
|
||
this.foldWidgets = null;
|
||
return;
|
||
}
|
||
|
||
this.foldWidgets = [];
|
||
this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);
|
||
this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);
|
||
|
||
this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
|
||
this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);
|
||
this.on('change', this.$updateFoldWidgets);
|
||
this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);
|
||
};
|
||
|
||
this.getParentFoldRangeData = function (row, ignoreCurrent) {
|
||
var fw = this.foldWidgets;
|
||
if (!fw || (ignoreCurrent && fw[row]))
|
||
return {};
|
||
|
||
var i = row - 1, firstRange;
|
||
while (i >= 0) {
|
||
var c = fw[i];
|
||
if (c == null)
|
||
c = fw[i] = this.getFoldWidget(i);
|
||
|
||
if (c == "start") {
|
||
var range = this.getFoldWidgetRange(i);
|
||
if (!firstRange)
|
||
firstRange = range;
|
||
if (range && range.end.row >= row)
|
||
break;
|
||
}
|
||
i--;
|
||
}
|
||
|
||
return {
|
||
range: i !== -1 && range,
|
||
firstRange: firstRange
|
||
};
|
||
};
|
||
|
||
this.onFoldWidgetClick = function(row, e) {
|
||
e = e.domEvent;
|
||
var options = {
|
||
children: e.shiftKey,
|
||
all: e.ctrlKey || e.metaKey,
|
||
siblings: e.altKey
|
||
};
|
||
|
||
var range = this.$toggleFoldWidget(row, options);
|
||
if (!range) {
|
||
var el = (e.target || e.srcElement);
|
||
if (el && /ace_fold-widget/.test(el.className))
|
||
el.className += " ace_invalid";
|
||
}
|
||
};
|
||
|
||
this.$toggleFoldWidget = function(row, options) {
|
||
if (!this.getFoldWidget)
|
||
return;
|
||
var type = this.getFoldWidget(row);
|
||
var line = this.getLine(row);
|
||
|
||
var dir = type === "end" ? -1 : 1;
|
||
var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);
|
||
|
||
if (fold) {
|
||
if (options.children || options.all)
|
||
this.removeFold(fold);
|
||
else
|
||
this.expandFold(fold);
|
||
return;
|
||
}
|
||
|
||
var range = this.getFoldWidgetRange(row, true);
|
||
if (range && !range.isMultiLine()) {
|
||
fold = this.getFoldAt(range.start.row, range.start.column, 1);
|
||
if (fold && range.isEqual(fold.range)) {
|
||
this.removeFold(fold);
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (options.siblings) {
|
||
var data = this.getParentFoldRangeData(row);
|
||
if (data.range) {
|
||
var startRow = data.range.start.row + 1;
|
||
var endRow = data.range.end.row;
|
||
}
|
||
this.foldAll(startRow, endRow, options.all ? 10000 : 0);
|
||
} else if (options.children) {
|
||
endRow = range ? range.end.row : this.getLength();
|
||
this.foldAll(row + 1, endRow, options.all ? 10000 : 0);
|
||
} else if (range) {
|
||
if (options.all)
|
||
range.collapseChildren = 10000;
|
||
this.addFold("...", range);
|
||
}
|
||
|
||
return range;
|
||
};
|
||
|
||
|
||
|
||
this.toggleFoldWidget = function(toggleParent) {
|
||
var row = this.selection.getCursor().row;
|
||
row = this.getRowFoldStart(row);
|
||
var range = this.$toggleFoldWidget(row, {});
|
||
|
||
if (range)
|
||
return;
|
||
var data = this.getParentFoldRangeData(row, true);
|
||
range = data.range || data.firstRange;
|
||
|
||
if (range) {
|
||
row = range.start.row;
|
||
var fold = this.getFoldAt(row, this.getLine(row).length, 1);
|
||
|
||
if (fold) {
|
||
this.removeFold(fold);
|
||
} else {
|
||
this.addFold("...", range);
|
||
}
|
||
}
|
||
};
|
||
|
||
this.updateFoldWidgets = function(delta) {
|
||
var firstRow = delta.start.row;
|
||
var len = delta.end.row - firstRow;
|
||
|
||
if (len === 0) {
|
||
this.foldWidgets[firstRow] = null;
|
||
} else if (delta.action == 'remove') {
|
||
this.foldWidgets.splice(firstRow, len + 1, null);
|
||
} else {
|
||
var args = Array(len + 1);
|
||
args.unshift(firstRow, 1);
|
||
this.foldWidgets.splice.apply(this.foldWidgets, args);
|
||
}
|
||
};
|
||
this.tokenizerUpdateFoldWidgets = function(e) {
|
||
var rows = e.data;
|
||
if (rows.first != rows.last) {
|
||
if (this.foldWidgets.length > rows.first)
|
||
this.foldWidgets.splice(rows.first, this.foldWidgets.length);
|
||
}
|
||
};
|
||
}
|
||
|
||
exports.Folding = Folding;
|
||
|
||
});
|
||
|
||
ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var TokenIterator = acequire("../token_iterator").TokenIterator;
|
||
var Range = acequire("../range").Range;
|
||
|
||
|
||
function BracketMatch() {
|
||
|
||
this.findMatchingBracket = function(position, chr) {
|
||
if (position.column == 0) return null;
|
||
|
||
var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);
|
||
if (charBeforeCursor == "") return null;
|
||
|
||
var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/);
|
||
if (!match)
|
||
return null;
|
||
|
||
if (match[1])
|
||
return this.$findClosingBracket(match[1], position);
|
||
else
|
||
return this.$findOpeningBracket(match[2], position);
|
||
};
|
||
|
||
this.getBracketRange = function(pos) {
|
||
var line = this.getLine(pos.row);
|
||
var before = true, range;
|
||
|
||
var chr = line.charAt(pos.column-1);
|
||
var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/);
|
||
if (!match) {
|
||
chr = line.charAt(pos.column);
|
||
pos = {row: pos.row, column: pos.column + 1};
|
||
match = chr && chr.match(/([\(\[\{])|([\)\]\}])/);
|
||
before = false;
|
||
}
|
||
if (!match)
|
||
return null;
|
||
|
||
if (match[1]) {
|
||
var bracketPos = this.$findClosingBracket(match[1], pos);
|
||
if (!bracketPos)
|
||
return null;
|
||
range = Range.fromPoints(pos, bracketPos);
|
||
if (!before) {
|
||
range.end.column++;
|
||
range.start.column--;
|
||
}
|
||
range.cursor = range.end;
|
||
} else {
|
||
var bracketPos = this.$findOpeningBracket(match[2], pos);
|
||
if (!bracketPos)
|
||
return null;
|
||
range = Range.fromPoints(bracketPos, pos);
|
||
if (!before) {
|
||
range.start.column++;
|
||
range.end.column--;
|
||
}
|
||
range.cursor = range.start;
|
||
}
|
||
|
||
return range;
|
||
};
|
||
|
||
this.$brackets = {
|
||
")": "(",
|
||
"(": ")",
|
||
"]": "[",
|
||
"[": "]",
|
||
"{": "}",
|
||
"}": "{"
|
||
};
|
||
|
||
this.$findOpeningBracket = function(bracket, position, typeRe) {
|
||
var openBracket = this.$brackets[bracket];
|
||
var depth = 1;
|
||
|
||
var iterator = new TokenIterator(this, position.row, position.column);
|
||
var token = iterator.getCurrentToken();
|
||
if (!token)
|
||
token = iterator.stepForward();
|
||
if (!token)
|
||
return;
|
||
|
||
if (!typeRe){
|
||
typeRe = new RegExp(
|
||
"(\\.?" +
|
||
token.type.replace(".", "\\.").replace("rparen", ".paren")
|
||
.replace(/\b(?:end)\b/, "(?:start|begin|end)")
|
||
+ ")+"
|
||
);
|
||
}
|
||
var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;
|
||
var value = token.value;
|
||
|
||
while (true) {
|
||
|
||
while (valueIndex >= 0) {
|
||
var chr = value.charAt(valueIndex);
|
||
if (chr == openBracket) {
|
||
depth -= 1;
|
||
if (depth == 0) {
|
||
return {row: iterator.getCurrentTokenRow(),
|
||
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||
}
|
||
}
|
||
else if (chr == bracket) {
|
||
depth += 1;
|
||
}
|
||
valueIndex -= 1;
|
||
}
|
||
do {
|
||
token = iterator.stepBackward();
|
||
} while (token && !typeRe.test(token.type));
|
||
|
||
if (token == null)
|
||
break;
|
||
|
||
value = token.value;
|
||
valueIndex = value.length - 1;
|
||
}
|
||
|
||
return null;
|
||
};
|
||
|
||
this.$findClosingBracket = function(bracket, position, typeRe) {
|
||
var closingBracket = this.$brackets[bracket];
|
||
var depth = 1;
|
||
|
||
var iterator = new TokenIterator(this, position.row, position.column);
|
||
var token = iterator.getCurrentToken();
|
||
if (!token)
|
||
token = iterator.stepForward();
|
||
if (!token)
|
||
return;
|
||
|
||
if (!typeRe){
|
||
typeRe = new RegExp(
|
||
"(\\.?" +
|
||
token.type.replace(".", "\\.").replace("lparen", ".paren")
|
||
.replace(/\b(?:start|begin)\b/, "(?:start|begin|end)")
|
||
+ ")+"
|
||
);
|
||
}
|
||
var valueIndex = position.column - iterator.getCurrentTokenColumn();
|
||
|
||
while (true) {
|
||
|
||
var value = token.value;
|
||
var valueLength = value.length;
|
||
while (valueIndex < valueLength) {
|
||
var chr = value.charAt(valueIndex);
|
||
if (chr == closingBracket) {
|
||
depth -= 1;
|
||
if (depth == 0) {
|
||
return {row: iterator.getCurrentTokenRow(),
|
||
column: valueIndex + iterator.getCurrentTokenColumn()};
|
||
}
|
||
}
|
||
else if (chr == bracket) {
|
||
depth += 1;
|
||
}
|
||
valueIndex += 1;
|
||
}
|
||
do {
|
||
token = iterator.stepForward();
|
||
} while (token && !typeRe.test(token.type));
|
||
|
||
if (token == null)
|
||
break;
|
||
|
||
valueIndex = 0;
|
||
}
|
||
|
||
return null;
|
||
};
|
||
}
|
||
exports.BracketMatch = BracketMatch;
|
||
|
||
});
|
||
|
||
ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var lang = acequire("./lib/lang");
|
||
var config = acequire("./config");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var Selection = acequire("./selection").Selection;
|
||
var TextMode = acequire("./mode/text").Mode;
|
||
var Range = acequire("./range").Range;
|
||
var Document = acequire("./document").Document;
|
||
var BackgroundTokenizer = acequire("./background_tokenizer").BackgroundTokenizer;
|
||
var SearchHighlight = acequire("./search_highlight").SearchHighlight;
|
||
|
||
var EditSession = function(text, mode) {
|
||
this.$breakpoints = [];
|
||
this.$decorations = [];
|
||
this.$frontMarkers = {};
|
||
this.$backMarkers = {};
|
||
this.$markerId = 1;
|
||
this.$undoSelect = true;
|
||
|
||
this.$foldData = [];
|
||
this.$foldData.toString = function() {
|
||
return this.join("\n");
|
||
};
|
||
this.on("changeFold", this.onChangeFold.bind(this));
|
||
this.$onChange = this.onChange.bind(this);
|
||
|
||
if (typeof text != "object" || !text.getLine)
|
||
text = new Document(text);
|
||
|
||
this.setDocument(text);
|
||
this.selection = new Selection(this);
|
||
|
||
config.resetOptions(this);
|
||
this.setMode(mode);
|
||
config._signal("session", this);
|
||
};
|
||
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.setDocument = function(doc) {
|
||
if (this.doc)
|
||
this.doc.removeListener("change", this.$onChange);
|
||
|
||
this.doc = doc;
|
||
doc.on("change", this.$onChange);
|
||
|
||
if (this.bgTokenizer)
|
||
this.bgTokenizer.setDocument(this.getDocument());
|
||
|
||
this.resetCaches();
|
||
};
|
||
this.getDocument = function() {
|
||
return this.doc;
|
||
};
|
||
this.$resetRowCache = function(docRow) {
|
||
if (!docRow) {
|
||
this.$docRowCache = [];
|
||
this.$screenRowCache = [];
|
||
return;
|
||
}
|
||
var l = this.$docRowCache.length;
|
||
var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;
|
||
if (l > i) {
|
||
this.$docRowCache.splice(i, l);
|
||
this.$screenRowCache.splice(i, l);
|
||
}
|
||
};
|
||
|
||
this.$getRowCacheIndex = function(cacheArray, val) {
|
||
var low = 0;
|
||
var hi = cacheArray.length - 1;
|
||
|
||
while (low <= hi) {
|
||
var mid = (low + hi) >> 1;
|
||
var c = cacheArray[mid];
|
||
|
||
if (val > c)
|
||
low = mid + 1;
|
||
else if (val < c)
|
||
hi = mid - 1;
|
||
else
|
||
return mid;
|
||
}
|
||
|
||
return low -1;
|
||
};
|
||
|
||
this.resetCaches = function() {
|
||
this.$modified = true;
|
||
this.$wrapData = [];
|
||
this.$rowLengthCache = [];
|
||
this.$resetRowCache(0);
|
||
if (this.bgTokenizer)
|
||
this.bgTokenizer.start(0);
|
||
};
|
||
|
||
this.onChangeFold = function(e) {
|
||
var fold = e.data;
|
||
this.$resetRowCache(fold.start.row);
|
||
};
|
||
|
||
this.onChange = function(delta) {
|
||
this.$modified = true;
|
||
|
||
this.$resetRowCache(delta.start.row);
|
||
|
||
var removedFolds = this.$updateInternalDataOnChange(delta);
|
||
if (!this.$fromUndo && this.$undoManager && !delta.ignore) {
|
||
this.$deltasDoc.push(delta);
|
||
if (removedFolds && removedFolds.length != 0) {
|
||
this.$deltasFold.push({
|
||
action: "removeFolds",
|
||
folds: removedFolds
|
||
});
|
||
}
|
||
|
||
this.$informUndoManager.schedule();
|
||
}
|
||
|
||
this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);
|
||
this._signal("change", delta);
|
||
};
|
||
this.setValue = function(text) {
|
||
this.doc.setValue(text);
|
||
this.selection.moveTo(0, 0);
|
||
|
||
this.$resetRowCache(0);
|
||
this.$deltas = [];
|
||
this.$deltasDoc = [];
|
||
this.$deltasFold = [];
|
||
this.setUndoManager(this.$undoManager);
|
||
this.getUndoManager().reset();
|
||
};
|
||
this.getValue =
|
||
this.toString = function() {
|
||
return this.doc.getValue();
|
||
};
|
||
this.getSelection = function() {
|
||
return this.selection;
|
||
};
|
||
this.getState = function(row) {
|
||
return this.bgTokenizer.getState(row);
|
||
};
|
||
this.getTokens = function(row) {
|
||
return this.bgTokenizer.getTokens(row);
|
||
};
|
||
this.getTokenAt = function(row, column) {
|
||
var tokens = this.bgTokenizer.getTokens(row);
|
||
var token, c = 0;
|
||
if (column == null) {
|
||
i = tokens.length - 1;
|
||
c = this.getLine(row).length;
|
||
} else {
|
||
for (var i = 0; i < tokens.length; i++) {
|
||
c += tokens[i].value.length;
|
||
if (c >= column)
|
||
break;
|
||
}
|
||
}
|
||
token = tokens[i];
|
||
if (!token)
|
||
return null;
|
||
token.index = i;
|
||
token.start = c - token.value.length;
|
||
return token;
|
||
};
|
||
this.setUndoManager = function(undoManager) {
|
||
this.$undoManager = undoManager;
|
||
this.$deltas = [];
|
||
this.$deltasDoc = [];
|
||
this.$deltasFold = [];
|
||
|
||
if (this.$informUndoManager)
|
||
this.$informUndoManager.cancel();
|
||
|
||
if (undoManager) {
|
||
var self = this;
|
||
|
||
this.$syncInformUndoManager = function() {
|
||
self.$informUndoManager.cancel();
|
||
|
||
if (self.$deltasFold.length) {
|
||
self.$deltas.push({
|
||
group: "fold",
|
||
deltas: self.$deltasFold
|
||
});
|
||
self.$deltasFold = [];
|
||
}
|
||
|
||
if (self.$deltasDoc.length) {
|
||
self.$deltas.push({
|
||
group: "doc",
|
||
deltas: self.$deltasDoc
|
||
});
|
||
self.$deltasDoc = [];
|
||
}
|
||
|
||
if (self.$deltas.length > 0) {
|
||
undoManager.execute({
|
||
action: "aceupdate",
|
||
args: [self.$deltas, self],
|
||
merge: self.mergeUndoDeltas
|
||
});
|
||
}
|
||
self.mergeUndoDeltas = false;
|
||
self.$deltas = [];
|
||
};
|
||
this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);
|
||
}
|
||
};
|
||
this.markUndoGroup = function() {
|
||
if (this.$syncInformUndoManager)
|
||
this.$syncInformUndoManager();
|
||
};
|
||
|
||
this.$defaultUndoManager = {
|
||
undo: function() {},
|
||
redo: function() {},
|
||
reset: function() {}
|
||
};
|
||
this.getUndoManager = function() {
|
||
return this.$undoManager || this.$defaultUndoManager;
|
||
};
|
||
this.getTabString = function() {
|
||
if (this.getUseSoftTabs()) {
|
||
return lang.stringRepeat(" ", this.getTabSize());
|
||
} else {
|
||
return "\t";
|
||
}
|
||
};
|
||
this.setUseSoftTabs = function(val) {
|
||
this.setOption("useSoftTabs", val);
|
||
};
|
||
this.getUseSoftTabs = function() {
|
||
return this.$useSoftTabs && !this.$mode.$indentWithTabs;
|
||
};
|
||
this.setTabSize = function(tabSize) {
|
||
this.setOption("tabSize", tabSize);
|
||
};
|
||
this.getTabSize = function() {
|
||
return this.$tabSize;
|
||
};
|
||
this.isTabStop = function(position) {
|
||
return this.$useSoftTabs && (position.column % this.$tabSize === 0);
|
||
};
|
||
|
||
this.$overwrite = false;
|
||
this.setOverwrite = function(overwrite) {
|
||
this.setOption("overwrite", overwrite);
|
||
};
|
||
this.getOverwrite = function() {
|
||
return this.$overwrite;
|
||
};
|
||
this.toggleOverwrite = function() {
|
||
this.setOverwrite(!this.$overwrite);
|
||
};
|
||
this.addGutterDecoration = function(row, className) {
|
||
if (!this.$decorations[row])
|
||
this.$decorations[row] = "";
|
||
this.$decorations[row] += " " + className;
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.removeGutterDecoration = function(row, className) {
|
||
this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, "");
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.getBreakpoints = function() {
|
||
return this.$breakpoints;
|
||
};
|
||
this.setBreakpoints = function(rows) {
|
||
this.$breakpoints = [];
|
||
for (var i=0; i<rows.length; i++) {
|
||
this.$breakpoints[rows[i]] = "ace_breakpoint";
|
||
}
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.clearBreakpoints = function() {
|
||
this.$breakpoints = [];
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.setBreakpoint = function(row, className) {
|
||
if (className === undefined)
|
||
className = "ace_breakpoint";
|
||
if (className)
|
||
this.$breakpoints[row] = className;
|
||
else
|
||
delete this.$breakpoints[row];
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.clearBreakpoint = function(row) {
|
||
delete this.$breakpoints[row];
|
||
this._signal("changeBreakpoint", {});
|
||
};
|
||
this.addMarker = function(range, clazz, type, inFront) {
|
||
var id = this.$markerId++;
|
||
|
||
var marker = {
|
||
range : range,
|
||
type : type || "line",
|
||
renderer: typeof type == "function" ? type : null,
|
||
clazz : clazz,
|
||
inFront: !!inFront,
|
||
id: id
|
||
};
|
||
|
||
if (inFront) {
|
||
this.$frontMarkers[id] = marker;
|
||
this._signal("changeFrontMarker");
|
||
} else {
|
||
this.$backMarkers[id] = marker;
|
||
this._signal("changeBackMarker");
|
||
}
|
||
|
||
return id;
|
||
};
|
||
this.addDynamicMarker = function(marker, inFront) {
|
||
if (!marker.update)
|
||
return;
|
||
var id = this.$markerId++;
|
||
marker.id = id;
|
||
marker.inFront = !!inFront;
|
||
|
||
if (inFront) {
|
||
this.$frontMarkers[id] = marker;
|
||
this._signal("changeFrontMarker");
|
||
} else {
|
||
this.$backMarkers[id] = marker;
|
||
this._signal("changeBackMarker");
|
||
}
|
||
|
||
return marker;
|
||
};
|
||
this.removeMarker = function(markerId) {
|
||
var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];
|
||
if (!marker)
|
||
return;
|
||
|
||
var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;
|
||
if (marker) {
|
||
delete (markers[markerId]);
|
||
this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker");
|
||
}
|
||
};
|
||
this.getMarkers = function(inFront) {
|
||
return inFront ? this.$frontMarkers : this.$backMarkers;
|
||
};
|
||
|
||
this.highlight = function(re) {
|
||
if (!this.$searchHighlight) {
|
||
var highlight = new SearchHighlight(null, "ace_selected-word", "text");
|
||
this.$searchHighlight = this.addDynamicMarker(highlight);
|
||
}
|
||
this.$searchHighlight.setRegexp(re);
|
||
};
|
||
this.highlightLines = function(startRow, endRow, clazz, inFront) {
|
||
if (typeof endRow != "number") {
|
||
clazz = endRow;
|
||
endRow = startRow;
|
||
}
|
||
if (!clazz)
|
||
clazz = "ace_step";
|
||
|
||
var range = new Range(startRow, 0, endRow, Infinity);
|
||
range.id = this.addMarker(range, clazz, "fullLine", inFront);
|
||
return range;
|
||
};
|
||
this.setAnnotations = function(annotations) {
|
||
this.$annotations = annotations;
|
||
this._signal("changeAnnotation", {});
|
||
};
|
||
this.getAnnotations = function() {
|
||
return this.$annotations || [];
|
||
};
|
||
this.clearAnnotations = function() {
|
||
this.setAnnotations([]);
|
||
};
|
||
this.$detectNewLine = function(text) {
|
||
var match = text.match(/^.*?(\r?\n)/m);
|
||
if (match) {
|
||
this.$autoNewLine = match[1];
|
||
} else {
|
||
this.$autoNewLine = "\n";
|
||
}
|
||
};
|
||
this.getWordRange = function(row, column) {
|
||
var line = this.getLine(row);
|
||
|
||
var inToken = false;
|
||
if (column > 0)
|
||
inToken = !!line.charAt(column - 1).match(this.tokenRe);
|
||
|
||
if (!inToken)
|
||
inToken = !!line.charAt(column).match(this.tokenRe);
|
||
|
||
if (inToken)
|
||
var re = this.tokenRe;
|
||
else if (/^\s+$/.test(line.slice(column-1, column+1)))
|
||
var re = /\s/;
|
||
else
|
||
var re = this.nonTokenRe;
|
||
|
||
var start = column;
|
||
if (start > 0) {
|
||
do {
|
||
start--;
|
||
}
|
||
while (start >= 0 && line.charAt(start).match(re));
|
||
start++;
|
||
}
|
||
|
||
var end = column;
|
||
while (end < line.length && line.charAt(end).match(re)) {
|
||
end++;
|
||
}
|
||
|
||
return new Range(row, start, row, end);
|
||
};
|
||
this.getAWordRange = function(row, column) {
|
||
var wordRange = this.getWordRange(row, column);
|
||
var line = this.getLine(wordRange.end.row);
|
||
|
||
while (line.charAt(wordRange.end.column).match(/[ \t]/)) {
|
||
wordRange.end.column += 1;
|
||
}
|
||
return wordRange;
|
||
};
|
||
this.setNewLineMode = function(newLineMode) {
|
||
this.doc.setNewLineMode(newLineMode);
|
||
};
|
||
this.getNewLineMode = function() {
|
||
return this.doc.getNewLineMode();
|
||
};
|
||
this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); };
|
||
this.getUseWorker = function() { return this.$useWorker; };
|
||
this.onReloadTokenizer = function(e) {
|
||
var rows = e.data;
|
||
this.bgTokenizer.start(rows.first);
|
||
this._signal("tokenizerUpdate", e);
|
||
};
|
||
|
||
this.$modes = {};
|
||
this.$mode = null;
|
||
this.$modeId = null;
|
||
this.setMode = function(mode, cb) {
|
||
if (mode && typeof mode === "object") {
|
||
if (mode.getTokenizer)
|
||
return this.$onChangeMode(mode);
|
||
var options = mode;
|
||
var path = options.path;
|
||
} else {
|
||
path = mode || "ace/mode/text";
|
||
}
|
||
if (!this.$modes["ace/mode/text"])
|
||
this.$modes["ace/mode/text"] = new TextMode();
|
||
|
||
if (this.$modes[path] && !options) {
|
||
this.$onChangeMode(this.$modes[path]);
|
||
cb && cb();
|
||
return;
|
||
}
|
||
this.$modeId = path;
|
||
config.loadModule(["mode", path], function(m) {
|
||
if (this.$modeId !== path)
|
||
return cb && cb();
|
||
if (this.$modes[path] && !options) {
|
||
this.$onChangeMode(this.$modes[path]);
|
||
} else if (m && m.Mode) {
|
||
m = new m.Mode(options);
|
||
if (!options) {
|
||
this.$modes[path] = m;
|
||
m.$id = path;
|
||
}
|
||
this.$onChangeMode(m);
|
||
}
|
||
cb && cb();
|
||
}.bind(this));
|
||
if (!this.$mode)
|
||
this.$onChangeMode(this.$modes["ace/mode/text"], true);
|
||
};
|
||
|
||
this.$onChangeMode = function(mode, $isPlaceholder) {
|
||
if (!$isPlaceholder)
|
||
this.$modeId = mode.$id;
|
||
if (this.$mode === mode)
|
||
return;
|
||
|
||
this.$mode = mode;
|
||
|
||
this.$stopWorker();
|
||
|
||
if (this.$useWorker)
|
||
this.$startWorker();
|
||
|
||
var tokenizer = mode.getTokenizer();
|
||
|
||
if(tokenizer.addEventListener !== undefined) {
|
||
var onReloadTokenizer = this.onReloadTokenizer.bind(this);
|
||
tokenizer.addEventListener("update", onReloadTokenizer);
|
||
}
|
||
|
||
if (!this.bgTokenizer) {
|
||
this.bgTokenizer = new BackgroundTokenizer(tokenizer);
|
||
var _self = this;
|
||
this.bgTokenizer.addEventListener("update", function(e) {
|
||
_self._signal("tokenizerUpdate", e);
|
||
});
|
||
} else {
|
||
this.bgTokenizer.setTokenizer(tokenizer);
|
||
}
|
||
|
||
this.bgTokenizer.setDocument(this.getDocument());
|
||
|
||
this.tokenRe = mode.tokenRe;
|
||
this.nonTokenRe = mode.nonTokenRe;
|
||
|
||
|
||
if (!$isPlaceholder) {
|
||
if (mode.attachToSession)
|
||
mode.attachToSession(this);
|
||
this.$options.wrapMethod.set.call(this, this.$wrapMethod);
|
||
this.$setFolding(mode.foldingRules);
|
||
this.bgTokenizer.start(0);
|
||
this._emit("changeMode");
|
||
}
|
||
};
|
||
|
||
this.$stopWorker = function() {
|
||
if (this.$worker) {
|
||
this.$worker.terminate();
|
||
this.$worker = null;
|
||
}
|
||
};
|
||
|
||
this.$startWorker = function() {
|
||
try {
|
||
this.$worker = this.$mode.createWorker(this);
|
||
} catch (e) {
|
||
config.warn("Could not load worker", e);
|
||
this.$worker = null;
|
||
}
|
||
};
|
||
this.getMode = function() {
|
||
return this.$mode;
|
||
};
|
||
|
||
this.$scrollTop = 0;
|
||
this.setScrollTop = function(scrollTop) {
|
||
if (this.$scrollTop === scrollTop || isNaN(scrollTop))
|
||
return;
|
||
|
||
this.$scrollTop = scrollTop;
|
||
this._signal("changeScrollTop", scrollTop);
|
||
};
|
||
this.getScrollTop = function() {
|
||
return this.$scrollTop;
|
||
};
|
||
|
||
this.$scrollLeft = 0;
|
||
this.setScrollLeft = function(scrollLeft) {
|
||
if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))
|
||
return;
|
||
|
||
this.$scrollLeft = scrollLeft;
|
||
this._signal("changeScrollLeft", scrollLeft);
|
||
};
|
||
this.getScrollLeft = function() {
|
||
return this.$scrollLeft;
|
||
};
|
||
this.getScreenWidth = function() {
|
||
this.$computeWidth();
|
||
if (this.lineWidgets)
|
||
return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);
|
||
return this.screenWidth;
|
||
};
|
||
|
||
this.getLineWidgetMaxWidth = function() {
|
||
if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;
|
||
var width = 0;
|
||
this.lineWidgets.forEach(function(w) {
|
||
if (w && w.screenWidth > width)
|
||
width = w.screenWidth;
|
||
});
|
||
return this.lineWidgetWidth = width;
|
||
};
|
||
|
||
this.$computeWidth = function(force) {
|
||
if (this.$modified || force) {
|
||
this.$modified = false;
|
||
|
||
if (this.$useWrapMode)
|
||
return this.screenWidth = this.$wrapLimit;
|
||
|
||
var lines = this.doc.getAllLines();
|
||
var cache = this.$rowLengthCache;
|
||
var longestScreenLine = 0;
|
||
var foldIndex = 0;
|
||
var foldLine = this.$foldData[foldIndex];
|
||
var foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
var len = lines.length;
|
||
|
||
for (var i = 0; i < len; i++) {
|
||
if (i > foldStart) {
|
||
i = foldLine.end.row + 1;
|
||
if (i >= len)
|
||
break;
|
||
foldLine = this.$foldData[foldIndex++];
|
||
foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
}
|
||
|
||
if (cache[i] == null)
|
||
cache[i] = this.$getStringScreenWidth(lines[i])[0];
|
||
|
||
if (cache[i] > longestScreenLine)
|
||
longestScreenLine = cache[i];
|
||
}
|
||
this.screenWidth = longestScreenLine;
|
||
}
|
||
};
|
||
this.getLine = function(row) {
|
||
return this.doc.getLine(row);
|
||
};
|
||
this.getLines = function(firstRow, lastRow) {
|
||
return this.doc.getLines(firstRow, lastRow);
|
||
};
|
||
this.getLength = function() {
|
||
return this.doc.getLength();
|
||
};
|
||
this.getTextRange = function(range) {
|
||
return this.doc.getTextRange(range || this.selection.getRange());
|
||
};
|
||
this.insert = function(position, text) {
|
||
return this.doc.insert(position, text);
|
||
};
|
||
this.remove = function(range) {
|
||
return this.doc.remove(range);
|
||
};
|
||
this.removeFullLines = function(firstRow, lastRow){
|
||
return this.doc.removeFullLines(firstRow, lastRow);
|
||
};
|
||
this.undoChanges = function(deltas, dontSelect) {
|
||
if (!deltas.length)
|
||
return;
|
||
|
||
this.$fromUndo = true;
|
||
var lastUndoRange = null;
|
||
for (var i = deltas.length - 1; i != -1; i--) {
|
||
var delta = deltas[i];
|
||
if (delta.group == "doc") {
|
||
this.doc.revertDeltas(delta.deltas);
|
||
lastUndoRange =
|
||
this.$getUndoSelection(delta.deltas, true, lastUndoRange);
|
||
} else {
|
||
delta.deltas.forEach(function(foldDelta) {
|
||
this.addFolds(foldDelta.folds);
|
||
}, this);
|
||
}
|
||
}
|
||
this.$fromUndo = false;
|
||
lastUndoRange &&
|
||
this.$undoSelect &&
|
||
!dontSelect &&
|
||
this.selection.setSelectionRange(lastUndoRange);
|
||
return lastUndoRange;
|
||
};
|
||
this.redoChanges = function(deltas, dontSelect) {
|
||
if (!deltas.length)
|
||
return;
|
||
|
||
this.$fromUndo = true;
|
||
var lastUndoRange = null;
|
||
for (var i = 0; i < deltas.length; i++) {
|
||
var delta = deltas[i];
|
||
if (delta.group == "doc") {
|
||
this.doc.applyDeltas(delta.deltas);
|
||
lastUndoRange =
|
||
this.$getUndoSelection(delta.deltas, false, lastUndoRange);
|
||
}
|
||
}
|
||
this.$fromUndo = false;
|
||
lastUndoRange &&
|
||
this.$undoSelect &&
|
||
!dontSelect &&
|
||
this.selection.setSelectionRange(lastUndoRange);
|
||
return lastUndoRange;
|
||
};
|
||
this.setUndoSelect = function(enable) {
|
||
this.$undoSelect = enable;
|
||
};
|
||
|
||
this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {
|
||
function isInsert(delta) {
|
||
return isUndo ? delta.action !== "insert" : delta.action === "insert";
|
||
}
|
||
|
||
var delta = deltas[0];
|
||
var range, point;
|
||
var lastDeltaIsInsert = false;
|
||
if (isInsert(delta)) {
|
||
range = Range.fromPoints(delta.start, delta.end);
|
||
lastDeltaIsInsert = true;
|
||
} else {
|
||
range = Range.fromPoints(delta.start, delta.start);
|
||
lastDeltaIsInsert = false;
|
||
}
|
||
|
||
for (var i = 1; i < deltas.length; i++) {
|
||
delta = deltas[i];
|
||
if (isInsert(delta)) {
|
||
point = delta.start;
|
||
if (range.compare(point.row, point.column) == -1) {
|
||
range.setStart(point);
|
||
}
|
||
point = delta.end;
|
||
if (range.compare(point.row, point.column) == 1) {
|
||
range.setEnd(point);
|
||
}
|
||
lastDeltaIsInsert = true;
|
||
} else {
|
||
point = delta.start;
|
||
if (range.compare(point.row, point.column) == -1) {
|
||
range = Range.fromPoints(delta.start, delta.start);
|
||
}
|
||
lastDeltaIsInsert = false;
|
||
}
|
||
}
|
||
if (lastUndoRange != null) {
|
||
if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {
|
||
lastUndoRange.start.column += range.end.column - range.start.column;
|
||
lastUndoRange.end.column += range.end.column - range.start.column;
|
||
}
|
||
|
||
var cmp = lastUndoRange.compareRange(range);
|
||
if (cmp == 1) {
|
||
range.setStart(lastUndoRange.start);
|
||
} else if (cmp == -1) {
|
||
range.setEnd(lastUndoRange.end);
|
||
}
|
||
}
|
||
|
||
return range;
|
||
};
|
||
this.replace = function(range, text) {
|
||
return this.doc.replace(range, text);
|
||
};
|
||
this.moveText = function(fromRange, toPosition, copy) {
|
||
var text = this.getTextRange(fromRange);
|
||
var folds = this.getFoldsInRange(fromRange);
|
||
|
||
var toRange = Range.fromPoints(toPosition, toPosition);
|
||
if (!copy) {
|
||
this.remove(fromRange);
|
||
var rowDiff = fromRange.start.row - fromRange.end.row;
|
||
var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;
|
||
if (collDiff) {
|
||
if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)
|
||
toRange.start.column += collDiff;
|
||
if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)
|
||
toRange.end.column += collDiff;
|
||
}
|
||
if (rowDiff && toRange.start.row >= fromRange.end.row) {
|
||
toRange.start.row += rowDiff;
|
||
toRange.end.row += rowDiff;
|
||
}
|
||
}
|
||
|
||
toRange.end = this.insert(toRange.start, text);
|
||
if (folds.length) {
|
||
var oldStart = fromRange.start;
|
||
var newStart = toRange.start;
|
||
var rowDiff = newStart.row - oldStart.row;
|
||
var collDiff = newStart.column - oldStart.column;
|
||
this.addFolds(folds.map(function(x) {
|
||
x = x.clone();
|
||
if (x.start.row == oldStart.row)
|
||
x.start.column += collDiff;
|
||
if (x.end.row == oldStart.row)
|
||
x.end.column += collDiff;
|
||
x.start.row += rowDiff;
|
||
x.end.row += rowDiff;
|
||
return x;
|
||
}));
|
||
}
|
||
|
||
return toRange;
|
||
};
|
||
this.indentRows = function(startRow, endRow, indentString) {
|
||
indentString = indentString.replace(/\t/g, this.getTabString());
|
||
for (var row=startRow; row<=endRow; row++)
|
||
this.doc.insertInLine({row: row, column: 0}, indentString);
|
||
};
|
||
this.outdentRows = function (range) {
|
||
var rowRange = range.collapseRows();
|
||
var deleteRange = new Range(0, 0, 0, 0);
|
||
var size = this.getTabSize();
|
||
|
||
for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {
|
||
var line = this.getLine(i);
|
||
|
||
deleteRange.start.row = i;
|
||
deleteRange.end.row = i;
|
||
for (var j = 0; j < size; ++j)
|
||
if (line.charAt(j) != ' ')
|
||
break;
|
||
if (j < size && line.charAt(j) == '\t') {
|
||
deleteRange.start.column = j;
|
||
deleteRange.end.column = j + 1;
|
||
} else {
|
||
deleteRange.start.column = 0;
|
||
deleteRange.end.column = j;
|
||
}
|
||
this.remove(deleteRange);
|
||
}
|
||
};
|
||
|
||
this.$moveLines = function(firstRow, lastRow, dir) {
|
||
firstRow = this.getRowFoldStart(firstRow);
|
||
lastRow = this.getRowFoldEnd(lastRow);
|
||
if (dir < 0) {
|
||
var row = this.getRowFoldStart(firstRow + dir);
|
||
if (row < 0) return 0;
|
||
var diff = row-firstRow;
|
||
} else if (dir > 0) {
|
||
var row = this.getRowFoldEnd(lastRow + dir);
|
||
if (row > this.doc.getLength()-1) return 0;
|
||
var diff = row-lastRow;
|
||
} else {
|
||
firstRow = this.$clipRowToDocument(firstRow);
|
||
lastRow = this.$clipRowToDocument(lastRow);
|
||
var diff = lastRow - firstRow + 1;
|
||
}
|
||
|
||
var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);
|
||
var folds = this.getFoldsInRange(range).map(function(x){
|
||
x = x.clone();
|
||
x.start.row += diff;
|
||
x.end.row += diff;
|
||
return x;
|
||
});
|
||
|
||
var lines = dir == 0
|
||
? this.doc.getLines(firstRow, lastRow)
|
||
: this.doc.removeFullLines(firstRow, lastRow);
|
||
this.doc.insertFullLines(firstRow+diff, lines);
|
||
folds.length && this.addFolds(folds);
|
||
return diff;
|
||
};
|
||
this.moveLinesUp = function(firstRow, lastRow) {
|
||
return this.$moveLines(firstRow, lastRow, -1);
|
||
};
|
||
this.moveLinesDown = function(firstRow, lastRow) {
|
||
return this.$moveLines(firstRow, lastRow, 1);
|
||
};
|
||
this.duplicateLines = function(firstRow, lastRow) {
|
||
return this.$moveLines(firstRow, lastRow, 0);
|
||
};
|
||
|
||
|
||
this.$clipRowToDocument = function(row) {
|
||
return Math.max(0, Math.min(row, this.doc.getLength()-1));
|
||
};
|
||
|
||
this.$clipColumnToRow = function(row, column) {
|
||
if (column < 0)
|
||
return 0;
|
||
return Math.min(this.doc.getLine(row).length, column);
|
||
};
|
||
|
||
|
||
this.$clipPositionToDocument = function(row, column) {
|
||
column = Math.max(0, column);
|
||
|
||
if (row < 0) {
|
||
row = 0;
|
||
column = 0;
|
||
} else {
|
||
var len = this.doc.getLength();
|
||
if (row >= len) {
|
||
row = len - 1;
|
||
column = this.doc.getLine(len-1).length;
|
||
} else {
|
||
column = Math.min(this.doc.getLine(row).length, column);
|
||
}
|
||
}
|
||
|
||
return {
|
||
row: row,
|
||
column: column
|
||
};
|
||
};
|
||
|
||
this.$clipRangeToDocument = function(range) {
|
||
if (range.start.row < 0) {
|
||
range.start.row = 0;
|
||
range.start.column = 0;
|
||
} else {
|
||
range.start.column = this.$clipColumnToRow(
|
||
range.start.row,
|
||
range.start.column
|
||
);
|
||
}
|
||
|
||
var len = this.doc.getLength() - 1;
|
||
if (range.end.row > len) {
|
||
range.end.row = len;
|
||
range.end.column = this.doc.getLine(len).length;
|
||
} else {
|
||
range.end.column = this.$clipColumnToRow(
|
||
range.end.row,
|
||
range.end.column
|
||
);
|
||
}
|
||
return range;
|
||
};
|
||
this.$wrapLimit = 80;
|
||
this.$useWrapMode = false;
|
||
this.$wrapLimitRange = {
|
||
min : null,
|
||
max : null
|
||
};
|
||
this.setUseWrapMode = function(useWrapMode) {
|
||
if (useWrapMode != this.$useWrapMode) {
|
||
this.$useWrapMode = useWrapMode;
|
||
this.$modified = true;
|
||
this.$resetRowCache(0);
|
||
if (useWrapMode) {
|
||
var len = this.getLength();
|
||
this.$wrapData = Array(len);
|
||
this.$updateWrapData(0, len - 1);
|
||
}
|
||
|
||
this._signal("changeWrapMode");
|
||
}
|
||
};
|
||
this.getUseWrapMode = function() {
|
||
return this.$useWrapMode;
|
||
};
|
||
this.setWrapLimitRange = function(min, max) {
|
||
if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {
|
||
this.$wrapLimitRange = { min: min, max: max };
|
||
this.$modified = true;
|
||
if (this.$useWrapMode)
|
||
this._signal("changeWrapMode");
|
||
}
|
||
};
|
||
this.adjustWrapLimit = function(desiredLimit, $printMargin) {
|
||
var limits = this.$wrapLimitRange;
|
||
if (limits.max < 0)
|
||
limits = {min: $printMargin, max: $printMargin};
|
||
var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);
|
||
if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {
|
||
this.$wrapLimit = wrapLimit;
|
||
this.$modified = true;
|
||
if (this.$useWrapMode) {
|
||
this.$updateWrapData(0, this.getLength() - 1);
|
||
this.$resetRowCache(0);
|
||
this._signal("changeWrapLimit");
|
||
}
|
||
return true;
|
||
}
|
||
return false;
|
||
};
|
||
|
||
this.$constrainWrapLimit = function(wrapLimit, min, max) {
|
||
if (min)
|
||
wrapLimit = Math.max(min, wrapLimit);
|
||
|
||
if (max)
|
||
wrapLimit = Math.min(max, wrapLimit);
|
||
|
||
return wrapLimit;
|
||
};
|
||
this.getWrapLimit = function() {
|
||
return this.$wrapLimit;
|
||
};
|
||
this.setWrapLimit = function (limit) {
|
||
this.setWrapLimitRange(limit, limit);
|
||
};
|
||
this.getWrapLimitRange = function() {
|
||
return {
|
||
min : this.$wrapLimitRange.min,
|
||
max : this.$wrapLimitRange.max
|
||
};
|
||
};
|
||
|
||
this.$updateInternalDataOnChange = function(delta) {
|
||
var useWrapMode = this.$useWrapMode;
|
||
var action = delta.action;
|
||
var start = delta.start;
|
||
var end = delta.end;
|
||
var firstRow = start.row;
|
||
var lastRow = end.row;
|
||
var len = lastRow - firstRow;
|
||
var removedFolds = null;
|
||
|
||
this.$updating = true;
|
||
if (len != 0) {
|
||
if (action === "remove") {
|
||
this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len);
|
||
|
||
var foldLines = this.$foldData;
|
||
removedFolds = this.getFoldsInRange(delta);
|
||
this.removeFolds(removedFolds);
|
||
|
||
var foldLine = this.getFoldLine(end.row);
|
||
var idx = 0;
|
||
if (foldLine) {
|
||
foldLine.addRemoveChars(end.row, end.column, start.column - end.column);
|
||
foldLine.shiftRow(-len);
|
||
|
||
var foldLineBefore = this.getFoldLine(firstRow);
|
||
if (foldLineBefore && foldLineBefore !== foldLine) {
|
||
foldLineBefore.merge(foldLine);
|
||
foldLine = foldLineBefore;
|
||
}
|
||
idx = foldLines.indexOf(foldLine) + 1;
|
||
}
|
||
|
||
for (idx; idx < foldLines.length; idx++) {
|
||
var foldLine = foldLines[idx];
|
||
if (foldLine.start.row >= end.row) {
|
||
foldLine.shiftRow(-len);
|
||
}
|
||
}
|
||
|
||
lastRow = firstRow;
|
||
} else {
|
||
var args = Array(len);
|
||
args.unshift(firstRow, 0);
|
||
var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache
|
||
arr.splice.apply(arr, args);
|
||
var foldLines = this.$foldData;
|
||
var foldLine = this.getFoldLine(firstRow);
|
||
var idx = 0;
|
||
if (foldLine) {
|
||
var cmp = foldLine.range.compareInside(start.row, start.column);
|
||
if (cmp == 0) {
|
||
foldLine = foldLine.split(start.row, start.column);
|
||
if (foldLine) {
|
||
foldLine.shiftRow(len);
|
||
foldLine.addRemoveChars(lastRow, 0, end.column - start.column);
|
||
}
|
||
} else
|
||
if (cmp == -1) {
|
||
foldLine.addRemoveChars(firstRow, 0, end.column - start.column);
|
||
foldLine.shiftRow(len);
|
||
}
|
||
idx = foldLines.indexOf(foldLine) + 1;
|
||
}
|
||
|
||
for (idx; idx < foldLines.length; idx++) {
|
||
var foldLine = foldLines[idx];
|
||
if (foldLine.start.row >= firstRow) {
|
||
foldLine.shiftRow(len);
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
len = Math.abs(delta.start.column - delta.end.column);
|
||
if (action === "remove") {
|
||
removedFolds = this.getFoldsInRange(delta);
|
||
this.removeFolds(removedFolds);
|
||
|
||
len = -len;
|
||
}
|
||
var foldLine = this.getFoldLine(firstRow);
|
||
if (foldLine) {
|
||
foldLine.addRemoveChars(firstRow, start.column, len);
|
||
}
|
||
}
|
||
|
||
if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {
|
||
console.error("doc.getLength() and $wrapData.length have to be the same!");
|
||
}
|
||
this.$updating = false;
|
||
|
||
if (useWrapMode)
|
||
this.$updateWrapData(firstRow, lastRow);
|
||
else
|
||
this.$updateRowLengthCache(firstRow, lastRow);
|
||
|
||
return removedFolds;
|
||
};
|
||
|
||
this.$updateRowLengthCache = function(firstRow, lastRow, b) {
|
||
this.$rowLengthCache[firstRow] = null;
|
||
this.$rowLengthCache[lastRow] = null;
|
||
};
|
||
|
||
this.$updateWrapData = function(firstRow, lastRow) {
|
||
var lines = this.doc.getAllLines();
|
||
var tabSize = this.getTabSize();
|
||
var wrapData = this.$wrapData;
|
||
var wrapLimit = this.$wrapLimit;
|
||
var tokens;
|
||
var foldLine;
|
||
|
||
var row = firstRow;
|
||
lastRow = Math.min(lastRow, lines.length - 1);
|
||
while (row <= lastRow) {
|
||
foldLine = this.getFoldLine(row, foldLine);
|
||
if (!foldLine) {
|
||
tokens = this.$getDisplayTokens(lines[row]);
|
||
wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);
|
||
row ++;
|
||
} else {
|
||
tokens = [];
|
||
foldLine.walk(function(placeholder, row, column, lastColumn) {
|
||
var walkTokens;
|
||
if (placeholder != null) {
|
||
walkTokens = this.$getDisplayTokens(
|
||
placeholder, tokens.length);
|
||
walkTokens[0] = PLACEHOLDER_START;
|
||
for (var i = 1; i < walkTokens.length; i++) {
|
||
walkTokens[i] = PLACEHOLDER_BODY;
|
||
}
|
||
} else {
|
||
walkTokens = this.$getDisplayTokens(
|
||
lines[row].substring(lastColumn, column),
|
||
tokens.length);
|
||
}
|
||
tokens = tokens.concat(walkTokens);
|
||
}.bind(this),
|
||
foldLine.end.row,
|
||
lines[foldLine.end.row].length + 1
|
||
);
|
||
|
||
wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);
|
||
row = foldLine.end.row + 1;
|
||
}
|
||
}
|
||
};
|
||
var CHAR = 1,
|
||
CHAR_EXT = 2,
|
||
PLACEHOLDER_START = 3,
|
||
PLACEHOLDER_BODY = 4,
|
||
PUNCTUATION = 9,
|
||
SPACE = 10,
|
||
TAB = 11,
|
||
TAB_SPACE = 12;
|
||
|
||
|
||
this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {
|
||
if (tokens.length == 0) {
|
||
return [];
|
||
}
|
||
|
||
var splits = [];
|
||
var displayLength = tokens.length;
|
||
var lastSplit = 0, lastDocSplit = 0;
|
||
|
||
var isCode = this.$wrapAsCode;
|
||
|
||
var indentedSoftWrap = this.$indentedSoftWrap;
|
||
var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)
|
||
|| indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);
|
||
|
||
function getWrapIndent() {
|
||
var indentation = 0;
|
||
if (maxIndent === 0)
|
||
return indentation;
|
||
if (indentedSoftWrap) {
|
||
for (var i = 0; i < tokens.length; i++) {
|
||
var token = tokens[i];
|
||
if (token == SPACE)
|
||
indentation += 1;
|
||
else if (token == TAB)
|
||
indentation += tabSize;
|
||
else if (token == TAB_SPACE)
|
||
continue;
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
if (isCode && indentedSoftWrap !== false)
|
||
indentation += tabSize;
|
||
return Math.min(indentation, maxIndent);
|
||
}
|
||
function addSplit(screenPos) {
|
||
var displayed = tokens.slice(lastSplit, screenPos);
|
||
var len = displayed.length;
|
||
displayed.join("")
|
||
.replace(/12/g, function() {
|
||
len -= 1;
|
||
})
|
||
.replace(/2/g, function() {
|
||
len -= 1;
|
||
});
|
||
|
||
if (!splits.length) {
|
||
indent = getWrapIndent();
|
||
splits.indent = indent;
|
||
}
|
||
lastDocSplit += len;
|
||
splits.push(lastDocSplit);
|
||
lastSplit = screenPos;
|
||
}
|
||
var indent = 0;
|
||
while (displayLength - lastSplit > wrapLimit - indent) {
|
||
var split = lastSplit + wrapLimit - indent;
|
||
if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {
|
||
addSplit(split);
|
||
continue;
|
||
}
|
||
if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {
|
||
for (split; split != lastSplit - 1; split--) {
|
||
if (tokens[split] == PLACEHOLDER_START) {
|
||
break;
|
||
}
|
||
}
|
||
if (split > lastSplit) {
|
||
addSplit(split);
|
||
continue;
|
||
}
|
||
split = lastSplit + wrapLimit;
|
||
for (split; split < tokens.length; split++) {
|
||
if (tokens[split] != PLACEHOLDER_BODY) {
|
||
break;
|
||
}
|
||
}
|
||
if (split == tokens.length) {
|
||
break; // Breaks the while-loop.
|
||
}
|
||
addSplit(split);
|
||
continue;
|
||
}
|
||
var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);
|
||
while (split > minSplit && tokens[split] < PLACEHOLDER_START) {
|
||
split --;
|
||
}
|
||
if (isCode) {
|
||
while (split > minSplit && tokens[split] < PLACEHOLDER_START) {
|
||
split --;
|
||
}
|
||
while (split > minSplit && tokens[split] == PUNCTUATION) {
|
||
split --;
|
||
}
|
||
} else {
|
||
while (split > minSplit && tokens[split] < SPACE) {
|
||
split --;
|
||
}
|
||
}
|
||
if (split > minSplit) {
|
||
addSplit(++split);
|
||
continue;
|
||
}
|
||
split = lastSplit + wrapLimit;
|
||
if (tokens[split] == CHAR_EXT)
|
||
split--;
|
||
addSplit(split - indent);
|
||
}
|
||
return splits;
|
||
};
|
||
this.$getDisplayTokens = function(str, offset) {
|
||
var arr = [];
|
||
var tabSize;
|
||
offset = offset || 0;
|
||
|
||
for (var i = 0; i < str.length; i++) {
|
||
var c = str.charCodeAt(i);
|
||
if (c == 9) {
|
||
tabSize = this.getScreenTabSize(arr.length + offset);
|
||
arr.push(TAB);
|
||
for (var n = 1; n < tabSize; n++) {
|
||
arr.push(TAB_SPACE);
|
||
}
|
||
}
|
||
else if (c == 32) {
|
||
arr.push(SPACE);
|
||
} else if((c > 39 && c < 48) || (c > 57 && c < 64)) {
|
||
arr.push(PUNCTUATION);
|
||
}
|
||
else if (c >= 0x1100 && isFullWidth(c)) {
|
||
arr.push(CHAR, CHAR_EXT);
|
||
} else {
|
||
arr.push(CHAR);
|
||
}
|
||
}
|
||
return arr;
|
||
};
|
||
this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {
|
||
if (maxScreenColumn == 0)
|
||
return [0, 0];
|
||
if (maxScreenColumn == null)
|
||
maxScreenColumn = Infinity;
|
||
screenColumn = screenColumn || 0;
|
||
|
||
var c, column;
|
||
for (column = 0; column < str.length; column++) {
|
||
c = str.charCodeAt(column);
|
||
if (c == 9) {
|
||
screenColumn += this.getScreenTabSize(screenColumn);
|
||
}
|
||
else if (c >= 0x1100 && isFullWidth(c)) {
|
||
screenColumn += 2;
|
||
} else {
|
||
screenColumn += 1;
|
||
}
|
||
if (screenColumn > maxScreenColumn) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
return [screenColumn, column];
|
||
};
|
||
|
||
this.lineWidgets = null;
|
||
this.getRowLength = function(row) {
|
||
if (this.lineWidgets)
|
||
var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;
|
||
else
|
||
h = 0
|
||
if (!this.$useWrapMode || !this.$wrapData[row]) {
|
||
return 1 + h;
|
||
} else {
|
||
return this.$wrapData[row].length + 1 + h;
|
||
}
|
||
};
|
||
this.getRowLineCount = function(row) {
|
||
if (!this.$useWrapMode || !this.$wrapData[row]) {
|
||
return 1;
|
||
} else {
|
||
return this.$wrapData[row].length + 1;
|
||
}
|
||
};
|
||
|
||
this.getRowWrapIndent = function(screenRow) {
|
||
if (this.$useWrapMode) {
|
||
var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);
|
||
var splits = this.$wrapData[pos.row];
|
||
return splits.length && splits[0] < pos.column ? splits.indent : 0;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
this.getScreenLastRowColumn = function(screenRow) {
|
||
var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);
|
||
return this.documentToScreenColumn(pos.row, pos.column);
|
||
};
|
||
this.getDocumentLastRowColumn = function(docRow, docColumn) {
|
||
var screenRow = this.documentToScreenRow(docRow, docColumn);
|
||
return this.getScreenLastRowColumn(screenRow);
|
||
};
|
||
this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {
|
||
var screenRow = this.documentToScreenRow(docRow, docColumn);
|
||
return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);
|
||
};
|
||
this.getRowSplitData = function(row) {
|
||
if (!this.$useWrapMode) {
|
||
return undefined;
|
||
} else {
|
||
return this.$wrapData[row];
|
||
}
|
||
};
|
||
this.getScreenTabSize = function(screenColumn) {
|
||
return this.$tabSize - screenColumn % this.$tabSize;
|
||
};
|
||
|
||
|
||
this.screenToDocumentRow = function(screenRow, screenColumn) {
|
||
return this.screenToDocumentPosition(screenRow, screenColumn).row;
|
||
};
|
||
|
||
|
||
this.screenToDocumentColumn = function(screenRow, screenColumn) {
|
||
return this.screenToDocumentPosition(screenRow, screenColumn).column;
|
||
};
|
||
this.screenToDocumentPosition = function(screenRow, screenColumn) {
|
||
if (screenRow < 0)
|
||
return {row: 0, column: 0};
|
||
|
||
var line;
|
||
var docRow = 0;
|
||
var docColumn = 0;
|
||
var column;
|
||
var row = 0;
|
||
var rowLength = 0;
|
||
|
||
var rowCache = this.$screenRowCache;
|
||
var i = this.$getRowCacheIndex(rowCache, screenRow);
|
||
var l = rowCache.length;
|
||
if (l && i >= 0) {
|
||
var row = rowCache[i];
|
||
var docRow = this.$docRowCache[i];
|
||
var doCache = screenRow > rowCache[l - 1];
|
||
} else {
|
||
var doCache = !l;
|
||
}
|
||
|
||
var maxRow = this.getLength() - 1;
|
||
var foldLine = this.getNextFoldLine(docRow);
|
||
var foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
|
||
while (row <= screenRow) {
|
||
rowLength = this.getRowLength(docRow);
|
||
if (row + rowLength > screenRow || docRow >= maxRow) {
|
||
break;
|
||
} else {
|
||
row += rowLength;
|
||
docRow++;
|
||
if (docRow > foldStart) {
|
||
docRow = foldLine.end.row+1;
|
||
foldLine = this.getNextFoldLine(docRow, foldLine);
|
||
foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
}
|
||
}
|
||
|
||
if (doCache) {
|
||
this.$docRowCache.push(docRow);
|
||
this.$screenRowCache.push(row);
|
||
}
|
||
}
|
||
|
||
if (foldLine && foldLine.start.row <= docRow) {
|
||
line = this.getFoldDisplayLine(foldLine);
|
||
docRow = foldLine.start.row;
|
||
} else if (row + rowLength <= screenRow || docRow > maxRow) {
|
||
return {
|
||
row: maxRow,
|
||
column: this.getLine(maxRow).length
|
||
};
|
||
} else {
|
||
line = this.getLine(docRow);
|
||
foldLine = null;
|
||
}
|
||
var wrapIndent = 0;
|
||
if (this.$useWrapMode) {
|
||
var splits = this.$wrapData[docRow];
|
||
if (splits) {
|
||
var splitIndex = Math.floor(screenRow - row);
|
||
column = splits[splitIndex];
|
||
if(splitIndex > 0 && splits.length) {
|
||
wrapIndent = splits.indent;
|
||
docColumn = splits[splitIndex - 1] || splits[splits.length - 1];
|
||
line = line.substring(docColumn);
|
||
}
|
||
}
|
||
}
|
||
|
||
docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];
|
||
if (this.$useWrapMode && docColumn >= column)
|
||
docColumn = column - 1;
|
||
|
||
if (foldLine)
|
||
return foldLine.idxToPosition(docColumn);
|
||
|
||
return {row: docRow, column: docColumn};
|
||
};
|
||
this.documentToScreenPosition = function(docRow, docColumn) {
|
||
if (typeof docColumn === "undefined")
|
||
var pos = this.$clipPositionToDocument(docRow.row, docRow.column);
|
||
else
|
||
pos = this.$clipPositionToDocument(docRow, docColumn);
|
||
|
||
docRow = pos.row;
|
||
docColumn = pos.column;
|
||
|
||
var screenRow = 0;
|
||
var foldStartRow = null;
|
||
var fold = null;
|
||
fold = this.getFoldAt(docRow, docColumn, 1);
|
||
if (fold) {
|
||
docRow = fold.start.row;
|
||
docColumn = fold.start.column;
|
||
}
|
||
|
||
var rowEnd, row = 0;
|
||
|
||
|
||
var rowCache = this.$docRowCache;
|
||
var i = this.$getRowCacheIndex(rowCache, docRow);
|
||
var l = rowCache.length;
|
||
if (l && i >= 0) {
|
||
var row = rowCache[i];
|
||
var screenRow = this.$screenRowCache[i];
|
||
var doCache = docRow > rowCache[l - 1];
|
||
} else {
|
||
var doCache = !l;
|
||
}
|
||
|
||
var foldLine = this.getNextFoldLine(row);
|
||
var foldStart = foldLine ?foldLine.start.row :Infinity;
|
||
|
||
while (row < docRow) {
|
||
if (row >= foldStart) {
|
||
rowEnd = foldLine.end.row + 1;
|
||
if (rowEnd > docRow)
|
||
break;
|
||
foldLine = this.getNextFoldLine(rowEnd, foldLine);
|
||
foldStart = foldLine ?foldLine.start.row :Infinity;
|
||
}
|
||
else {
|
||
rowEnd = row + 1;
|
||
}
|
||
|
||
screenRow += this.getRowLength(row);
|
||
row = rowEnd;
|
||
|
||
if (doCache) {
|
||
this.$docRowCache.push(row);
|
||
this.$screenRowCache.push(screenRow);
|
||
}
|
||
}
|
||
var textLine = "";
|
||
if (foldLine && row >= foldStart) {
|
||
textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);
|
||
foldStartRow = foldLine.start.row;
|
||
} else {
|
||
textLine = this.getLine(docRow).substring(0, docColumn);
|
||
foldStartRow = docRow;
|
||
}
|
||
var wrapIndent = 0;
|
||
if (this.$useWrapMode) {
|
||
var wrapRow = this.$wrapData[foldStartRow];
|
||
if (wrapRow) {
|
||
var screenRowOffset = 0;
|
||
while (textLine.length >= wrapRow[screenRowOffset]) {
|
||
screenRow ++;
|
||
screenRowOffset++;
|
||
}
|
||
textLine = textLine.substring(
|
||
wrapRow[screenRowOffset - 1] || 0, textLine.length
|
||
);
|
||
wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;
|
||
}
|
||
}
|
||
|
||
return {
|
||
row: screenRow,
|
||
column: wrapIndent + this.$getStringScreenWidth(textLine)[0]
|
||
};
|
||
};
|
||
this.documentToScreenColumn = function(row, docColumn) {
|
||
return this.documentToScreenPosition(row, docColumn).column;
|
||
};
|
||
this.documentToScreenRow = function(docRow, docColumn) {
|
||
return this.documentToScreenPosition(docRow, docColumn).row;
|
||
};
|
||
this.getScreenLength = function() {
|
||
var screenRows = 0;
|
||
var fold = null;
|
||
if (!this.$useWrapMode) {
|
||
screenRows = this.getLength();
|
||
var foldData = this.$foldData;
|
||
for (var i = 0; i < foldData.length; i++) {
|
||
fold = foldData[i];
|
||
screenRows -= fold.end.row - fold.start.row;
|
||
}
|
||
} else {
|
||
var lastRow = this.$wrapData.length;
|
||
var row = 0, i = 0;
|
||
var fold = this.$foldData[i++];
|
||
var foldStart = fold ? fold.start.row :Infinity;
|
||
|
||
while (row < lastRow) {
|
||
var splits = this.$wrapData[row];
|
||
screenRows += splits ? splits.length + 1 : 1;
|
||
row ++;
|
||
if (row > foldStart) {
|
||
row = fold.end.row+1;
|
||
fold = this.$foldData[i++];
|
||
foldStart = fold ?fold.start.row :Infinity;
|
||
}
|
||
}
|
||
}
|
||
if (this.lineWidgets)
|
||
screenRows += this.$getWidgetScreenLength();
|
||
|
||
return screenRows;
|
||
};
|
||
this.$setFontMetrics = function(fm) {
|
||
if (!this.$enableVarChar) return;
|
||
this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {
|
||
if (maxScreenColumn === 0)
|
||
return [0, 0];
|
||
if (!maxScreenColumn)
|
||
maxScreenColumn = Infinity;
|
||
screenColumn = screenColumn || 0;
|
||
|
||
var c, column;
|
||
for (column = 0; column < str.length; column++) {
|
||
c = str.charAt(column);
|
||
if (c === "\t") {
|
||
screenColumn += this.getScreenTabSize(screenColumn);
|
||
} else {
|
||
screenColumn += fm.getCharacterWidth(c);
|
||
}
|
||
if (screenColumn > maxScreenColumn) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
return [screenColumn, column];
|
||
};
|
||
};
|
||
|
||
this.destroy = function() {
|
||
if (this.bgTokenizer) {
|
||
this.bgTokenizer.setDocument(null);
|
||
this.bgTokenizer = null;
|
||
}
|
||
this.$stopWorker();
|
||
};
|
||
function isFullWidth(c) {
|
||
if (c < 0x1100)
|
||
return false;
|
||
return c >= 0x1100 && c <= 0x115F ||
|
||
c >= 0x11A3 && c <= 0x11A7 ||
|
||
c >= 0x11FA && c <= 0x11FF ||
|
||
c >= 0x2329 && c <= 0x232A ||
|
||
c >= 0x2E80 && c <= 0x2E99 ||
|
||
c >= 0x2E9B && c <= 0x2EF3 ||
|
||
c >= 0x2F00 && c <= 0x2FD5 ||
|
||
c >= 0x2FF0 && c <= 0x2FFB ||
|
||
c >= 0x3000 && c <= 0x303E ||
|
||
c >= 0x3041 && c <= 0x3096 ||
|
||
c >= 0x3099 && c <= 0x30FF ||
|
||
c >= 0x3105 && c <= 0x312D ||
|
||
c >= 0x3131 && c <= 0x318E ||
|
||
c >= 0x3190 && c <= 0x31BA ||
|
||
c >= 0x31C0 && c <= 0x31E3 ||
|
||
c >= 0x31F0 && c <= 0x321E ||
|
||
c >= 0x3220 && c <= 0x3247 ||
|
||
c >= 0x3250 && c <= 0x32FE ||
|
||
c >= 0x3300 && c <= 0x4DBF ||
|
||
c >= 0x4E00 && c <= 0xA48C ||
|
||
c >= 0xA490 && c <= 0xA4C6 ||
|
||
c >= 0xA960 && c <= 0xA97C ||
|
||
c >= 0xAC00 && c <= 0xD7A3 ||
|
||
c >= 0xD7B0 && c <= 0xD7C6 ||
|
||
c >= 0xD7CB && c <= 0xD7FB ||
|
||
c >= 0xF900 && c <= 0xFAFF ||
|
||
c >= 0xFE10 && c <= 0xFE19 ||
|
||
c >= 0xFE30 && c <= 0xFE52 ||
|
||
c >= 0xFE54 && c <= 0xFE66 ||
|
||
c >= 0xFE68 && c <= 0xFE6B ||
|
||
c >= 0xFF01 && c <= 0xFF60 ||
|
||
c >= 0xFFE0 && c <= 0xFFE6;
|
||
}
|
||
|
||
}).call(EditSession.prototype);
|
||
|
||
acequire("./edit_session/folding").Folding.call(EditSession.prototype);
|
||
acequire("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype);
|
||
|
||
|
||
config.defineOptions(EditSession.prototype, "session", {
|
||
wrap: {
|
||
set: function(value) {
|
||
if (!value || value == "off")
|
||
value = false;
|
||
else if (value == "free")
|
||
value = true;
|
||
else if (value == "printMargin")
|
||
value = -1;
|
||
else if (typeof value == "string")
|
||
value = parseInt(value, 10) || false;
|
||
|
||
if (this.$wrap == value)
|
||
return;
|
||
this.$wrap = value;
|
||
if (!value) {
|
||
this.setUseWrapMode(false);
|
||
} else {
|
||
var col = typeof value == "number" ? value : null;
|
||
this.setWrapLimitRange(col, col);
|
||
this.setUseWrapMode(true);
|
||
}
|
||
},
|
||
get: function() {
|
||
if (this.getUseWrapMode()) {
|
||
if (this.$wrap == -1)
|
||
return "printMargin";
|
||
if (!this.getWrapLimitRange().min)
|
||
return "free";
|
||
return this.$wrap;
|
||
}
|
||
return "off";
|
||
},
|
||
handlesSet: true
|
||
},
|
||
wrapMethod: {
|
||
set: function(val) {
|
||
val = val == "auto"
|
||
? this.$mode.type != "text"
|
||
: val != "text";
|
||
if (val != this.$wrapAsCode) {
|
||
this.$wrapAsCode = val;
|
||
if (this.$useWrapMode) {
|
||
this.$modified = true;
|
||
this.$resetRowCache(0);
|
||
this.$updateWrapData(0, this.getLength() - 1);
|
||
}
|
||
}
|
||
},
|
||
initialValue: "auto"
|
||
},
|
||
indentedSoftWrap: { initialValue: true },
|
||
firstLineNumber: {
|
||
set: function() {this._signal("changeBreakpoint");},
|
||
initialValue: 1
|
||
},
|
||
useWorker: {
|
||
set: function(useWorker) {
|
||
this.$useWorker = useWorker;
|
||
|
||
this.$stopWorker();
|
||
if (useWorker)
|
||
this.$startWorker();
|
||
},
|
||
initialValue: true
|
||
},
|
||
useSoftTabs: {initialValue: true},
|
||
tabSize: {
|
||
set: function(tabSize) {
|
||
if (isNaN(tabSize) || this.$tabSize === tabSize) return;
|
||
|
||
this.$modified = true;
|
||
this.$rowLengthCache = [];
|
||
this.$tabSize = tabSize;
|
||
this._signal("changeTabSize");
|
||
},
|
||
initialValue: 4,
|
||
handlesSet: true
|
||
},
|
||
overwrite: {
|
||
set: function(val) {this._signal("changeOverwrite");},
|
||
initialValue: false
|
||
},
|
||
newLineMode: {
|
||
set: function(val) {this.doc.setNewLineMode(val)},
|
||
get: function() {return this.doc.getNewLineMode()},
|
||
handlesSet: true
|
||
},
|
||
mode: {
|
||
set: function(val) { this.setMode(val) },
|
||
get: function() { return this.$modeId }
|
||
}
|
||
});
|
||
|
||
exports.EditSession = EditSession;
|
||
});
|
||
|
||
ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var lang = acequire("./lib/lang");
|
||
var oop = acequire("./lib/oop");
|
||
var Range = acequire("./range").Range;
|
||
|
||
var Search = function() {
|
||
this.$options = {};
|
||
};
|
||
|
||
(function() {
|
||
this.set = function(options) {
|
||
oop.mixin(this.$options, options);
|
||
return this;
|
||
};
|
||
this.getOptions = function() {
|
||
return lang.copyObject(this.$options);
|
||
};
|
||
this.setOptions = function(options) {
|
||
this.$options = options;
|
||
};
|
||
this.find = function(session) {
|
||
var options = this.$options;
|
||
var iterator = this.$matchIterator(session, options);
|
||
if (!iterator)
|
||
return false;
|
||
|
||
var firstRange = null;
|
||
iterator.forEach(function(range, row, offset) {
|
||
if (!range.start) {
|
||
var column = range.offset + (offset || 0);
|
||
firstRange = new Range(row, column, row, column + range.length);
|
||
if (!range.length && options.start && options.start.start
|
||
&& options.skipCurrent != false && firstRange.isEqual(options.start)
|
||
) {
|
||
firstRange = null;
|
||
return false;
|
||
}
|
||
} else
|
||
firstRange = range;
|
||
return true;
|
||
});
|
||
|
||
return firstRange;
|
||
};
|
||
this.findAll = function(session) {
|
||
var options = this.$options;
|
||
if (!options.needle)
|
||
return [];
|
||
this.$assembleRegExp(options);
|
||
|
||
var range = options.range;
|
||
var lines = range
|
||
? session.getLines(range.start.row, range.end.row)
|
||
: session.doc.getAllLines();
|
||
|
||
var ranges = [];
|
||
var re = options.re;
|
||
if (options.$isMultiLine) {
|
||
var len = re.length;
|
||
var maxRow = lines.length - len;
|
||
var prevRange;
|
||
outer: for (var row = re.offset || 0; row <= maxRow; row++) {
|
||
for (var j = 0; j < len; j++)
|
||
if (lines[row + j].search(re[j]) == -1)
|
||
continue outer;
|
||
|
||
var startLine = lines[row];
|
||
var line = lines[row + len - 1];
|
||
var startIndex = startLine.length - startLine.match(re[0])[0].length;
|
||
var endIndex = line.match(re[len - 1])[0].length;
|
||
|
||
if (prevRange && prevRange.end.row === row &&
|
||
prevRange.end.column > startIndex
|
||
) {
|
||
continue;
|
||
}
|
||
ranges.push(prevRange = new Range(
|
||
row, startIndex, row + len - 1, endIndex
|
||
));
|
||
if (len > 2)
|
||
row = row + len - 2;
|
||
}
|
||
} else {
|
||
for (var i = 0; i < lines.length; i++) {
|
||
var matches = lang.getMatchOffsets(lines[i], re);
|
||
for (var j = 0; j < matches.length; j++) {
|
||
var match = matches[j];
|
||
ranges.push(new Range(i, match.offset, i, match.offset + match.length));
|
||
}
|
||
}
|
||
}
|
||
|
||
if (range) {
|
||
var startColumn = range.start.column;
|
||
var endColumn = range.start.column;
|
||
var i = 0, j = ranges.length - 1;
|
||
while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)
|
||
i++;
|
||
|
||
while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)
|
||
j--;
|
||
|
||
ranges = ranges.slice(i, j + 1);
|
||
for (i = 0, j = ranges.length; i < j; i++) {
|
||
ranges[i].start.row += range.start.row;
|
||
ranges[i].end.row += range.start.row;
|
||
}
|
||
}
|
||
|
||
return ranges;
|
||
};
|
||
this.replace = function(input, replacement) {
|
||
var options = this.$options;
|
||
|
||
var re = this.$assembleRegExp(options);
|
||
if (options.$isMultiLine)
|
||
return replacement;
|
||
|
||
if (!re)
|
||
return;
|
||
|
||
var match = re.exec(input);
|
||
if (!match || match[0].length != input.length)
|
||
return null;
|
||
|
||
replacement = input.replace(re, replacement);
|
||
if (options.preserveCase) {
|
||
replacement = replacement.split("");
|
||
for (var i = Math.min(input.length, input.length); i--; ) {
|
||
var ch = input[i];
|
||
if (ch && ch.toLowerCase() != ch)
|
||
replacement[i] = replacement[i].toUpperCase();
|
||
else
|
||
replacement[i] = replacement[i].toLowerCase();
|
||
}
|
||
replacement = replacement.join("");
|
||
}
|
||
|
||
return replacement;
|
||
};
|
||
|
||
this.$matchIterator = function(session, options) {
|
||
var re = this.$assembleRegExp(options);
|
||
if (!re)
|
||
return false;
|
||
|
||
var callback;
|
||
if (options.$isMultiLine) {
|
||
var len = re.length;
|
||
var matchIterator = function(line, row, offset) {
|
||
var startIndex = line.search(re[0]);
|
||
if (startIndex == -1)
|
||
return;
|
||
for (var i = 1; i < len; i++) {
|
||
line = session.getLine(row + i);
|
||
if (line.search(re[i]) == -1)
|
||
return;
|
||
}
|
||
|
||
var endIndex = line.match(re[len - 1])[0].length;
|
||
|
||
var range = new Range(row, startIndex, row + len - 1, endIndex);
|
||
if (re.offset == 1) {
|
||
range.start.row--;
|
||
range.start.column = Number.MAX_VALUE;
|
||
} else if (offset)
|
||
range.start.column += offset;
|
||
|
||
if (callback(range))
|
||
return true;
|
||
};
|
||
} else if (options.backwards) {
|
||
var matchIterator = function(line, row, startIndex) {
|
||
var matches = lang.getMatchOffsets(line, re);
|
||
for (var i = matches.length-1; i >= 0; i--)
|
||
if (callback(matches[i], row, startIndex))
|
||
return true;
|
||
};
|
||
} else {
|
||
var matchIterator = function(line, row, startIndex) {
|
||
var matches = lang.getMatchOffsets(line, re);
|
||
for (var i = 0; i < matches.length; i++)
|
||
if (callback(matches[i], row, startIndex))
|
||
return true;
|
||
};
|
||
}
|
||
|
||
var lineIterator = this.$lineIterator(session, options);
|
||
|
||
return {
|
||
forEach: function(_callback) {
|
||
callback = _callback;
|
||
lineIterator.forEach(matchIterator);
|
||
}
|
||
};
|
||
};
|
||
|
||
this.$assembleRegExp = function(options, $disableFakeMultiline) {
|
||
if (options.needle instanceof RegExp)
|
||
return options.re = options.needle;
|
||
|
||
var needle = options.needle;
|
||
|
||
if (!options.needle)
|
||
return options.re = false;
|
||
|
||
if (!options.regExp)
|
||
needle = lang.escapeRegExp(needle);
|
||
|
||
if (options.wholeWord)
|
||
needle = "\\b" + needle + "\\b";
|
||
|
||
var modifier = options.caseSensitive ? "gm" : "gmi";
|
||
|
||
options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle);
|
||
if (options.$isMultiLine)
|
||
return options.re = this.$assembleMultilineRegExp(needle, modifier);
|
||
|
||
try {
|
||
var re = new RegExp(needle, modifier);
|
||
} catch(e) {
|
||
re = false;
|
||
}
|
||
return options.re = re;
|
||
};
|
||
|
||
this.$assembleMultilineRegExp = function(needle, modifier) {
|
||
var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n");
|
||
var re = [];
|
||
for (var i = 0; i < parts.length; i++) try {
|
||
re.push(new RegExp(parts[i], modifier));
|
||
} catch(e) {
|
||
return false;
|
||
}
|
||
if (parts[0] == "") {
|
||
re.shift();
|
||
re.offset = 1;
|
||
} else {
|
||
re.offset = 0;
|
||
}
|
||
return re;
|
||
};
|
||
|
||
this.$lineIterator = function(session, options) {
|
||
var backwards = options.backwards == true;
|
||
var skipCurrent = options.skipCurrent != false;
|
||
|
||
var range = options.range;
|
||
var start = options.start;
|
||
if (!start)
|
||
start = range ? range[backwards ? "end" : "start"] : session.selection.getRange();
|
||
|
||
if (start.start)
|
||
start = start[skipCurrent != backwards ? "end" : "start"];
|
||
|
||
var firstRow = range ? range.start.row : 0;
|
||
var lastRow = range ? range.end.row : session.getLength() - 1;
|
||
|
||
var forEach = backwards ? function(callback) {
|
||
var row = start.row;
|
||
|
||
var line = session.getLine(row).substring(0, start.column);
|
||
if (callback(line, row))
|
||
return;
|
||
|
||
for (row--; row >= firstRow; row--)
|
||
if (callback(session.getLine(row), row))
|
||
return;
|
||
|
||
if (options.wrap == false)
|
||
return;
|
||
|
||
for (row = lastRow, firstRow = start.row; row >= firstRow; row--)
|
||
if (callback(session.getLine(row), row))
|
||
return;
|
||
} : function(callback) {
|
||
var row = start.row;
|
||
|
||
var line = session.getLine(row).substr(start.column);
|
||
if (callback(line, row, start.column))
|
||
return;
|
||
|
||
for (row = row+1; row <= lastRow; row++)
|
||
if (callback(session.getLine(row), row))
|
||
return;
|
||
|
||
if (options.wrap == false)
|
||
return;
|
||
|
||
for (row = firstRow, lastRow = start.row; row <= lastRow; row++)
|
||
if (callback(session.getLine(row), row))
|
||
return;
|
||
};
|
||
|
||
return {forEach: forEach};
|
||
};
|
||
|
||
}).call(Search.prototype);
|
||
|
||
exports.Search = Search;
|
||
});
|
||
|
||
ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var keyUtil = acequire("../lib/keys");
|
||
var useragent = acequire("../lib/useragent");
|
||
var KEY_MODS = keyUtil.KEY_MODS;
|
||
|
||
function HashHandler(config, platform) {
|
||
this.platform = platform || (useragent.isMac ? "mac" : "win");
|
||
this.commands = {};
|
||
this.commandKeyBinding = {};
|
||
this.addCommands(config);
|
||
this.$singleCommand = true;
|
||
}
|
||
|
||
function MultiHashHandler(config, platform) {
|
||
HashHandler.call(this, config, platform);
|
||
this.$singleCommand = false;
|
||
}
|
||
|
||
MultiHashHandler.prototype = HashHandler.prototype;
|
||
|
||
(function() {
|
||
|
||
|
||
this.addCommand = function(command) {
|
||
if (this.commands[command.name])
|
||
this.removeCommand(command);
|
||
|
||
this.commands[command.name] = command;
|
||
|
||
if (command.bindKey)
|
||
this._buildKeyHash(command);
|
||
};
|
||
|
||
this.removeCommand = function(command, keepCommand) {
|
||
var name = command && (typeof command === 'string' ? command : command.name);
|
||
command = this.commands[name];
|
||
if (!keepCommand)
|
||
delete this.commands[name];
|
||
var ckb = this.commandKeyBinding;
|
||
for (var keyId in ckb) {
|
||
var cmdGroup = ckb[keyId];
|
||
if (cmdGroup == command) {
|
||
delete ckb[keyId];
|
||
} else if (Array.isArray(cmdGroup)) {
|
||
var i = cmdGroup.indexOf(command);
|
||
if (i != -1) {
|
||
cmdGroup.splice(i, 1);
|
||
if (cmdGroup.length == 1)
|
||
ckb[keyId] = cmdGroup[0];
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
this.bindKey = function(key, command, position) {
|
||
if (typeof key == "object" && key) {
|
||
if (position == undefined)
|
||
position = key.position;
|
||
key = key[this.platform];
|
||
}
|
||
if (!key)
|
||
return;
|
||
if (typeof command == "function")
|
||
return this.addCommand({exec: command, bindKey: key, name: command.name || key});
|
||
|
||
key.split("|").forEach(function(keyPart) {
|
||
var chain = "";
|
||
if (keyPart.indexOf(" ") != -1) {
|
||
var parts = keyPart.split(/\s+/);
|
||
keyPart = parts.pop();
|
||
parts.forEach(function(keyPart) {
|
||
var binding = this.parseKeys(keyPart);
|
||
var id = KEY_MODS[binding.hashId] + binding.key;
|
||
chain += (chain ? " " : "") + id;
|
||
this._addCommandToBinding(chain, "chainKeys");
|
||
}, this);
|
||
chain += " ";
|
||
}
|
||
var binding = this.parseKeys(keyPart);
|
||
var id = KEY_MODS[binding.hashId] + binding.key;
|
||
this._addCommandToBinding(chain + id, command, position);
|
||
}, this);
|
||
};
|
||
|
||
function getPosition(command) {
|
||
return typeof command == "object" && command.bindKey
|
||
&& command.bindKey.position || 0;
|
||
}
|
||
this._addCommandToBinding = function(keyId, command, position) {
|
||
var ckb = this.commandKeyBinding, i;
|
||
if (!command) {
|
||
delete ckb[keyId];
|
||
} else if (!ckb[keyId] || this.$singleCommand) {
|
||
ckb[keyId] = command;
|
||
} else {
|
||
if (!Array.isArray(ckb[keyId])) {
|
||
ckb[keyId] = [ckb[keyId]];
|
||
} else if ((i = ckb[keyId].indexOf(command)) != -1) {
|
||
ckb[keyId].splice(i, 1);
|
||
}
|
||
|
||
if (typeof position != "number") {
|
||
if (position || command.isDefault)
|
||
position = -100;
|
||
else
|
||
position = getPosition(command);
|
||
}
|
||
var commands = ckb[keyId];
|
||
for (i = 0; i < commands.length; i++) {
|
||
var other = commands[i];
|
||
var otherPos = getPosition(other);
|
||
if (otherPos > position)
|
||
break;
|
||
}
|
||
commands.splice(i, 0, command);
|
||
}
|
||
};
|
||
|
||
this.addCommands = function(commands) {
|
||
commands && Object.keys(commands).forEach(function(name) {
|
||
var command = commands[name];
|
||
if (!command)
|
||
return;
|
||
|
||
if (typeof command === "string")
|
||
return this.bindKey(command, name);
|
||
|
||
if (typeof command === "function")
|
||
command = { exec: command };
|
||
|
||
if (typeof command !== "object")
|
||
return;
|
||
|
||
if (!command.name)
|
||
command.name = name;
|
||
|
||
this.addCommand(command);
|
||
}, this);
|
||
};
|
||
|
||
this.removeCommands = function(commands) {
|
||
Object.keys(commands).forEach(function(name) {
|
||
this.removeCommand(commands[name]);
|
||
}, this);
|
||
};
|
||
|
||
this.bindKeys = function(keyList) {
|
||
Object.keys(keyList).forEach(function(key) {
|
||
this.bindKey(key, keyList[key]);
|
||
}, this);
|
||
};
|
||
|
||
this._buildKeyHash = function(command) {
|
||
this.bindKey(command.bindKey, command);
|
||
};
|
||
this.parseKeys = function(keys) {
|
||
var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x});
|
||
var key = parts.pop();
|
||
|
||
var keyCode = keyUtil[key];
|
||
if (keyUtil.FUNCTION_KEYS[keyCode])
|
||
key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();
|
||
else if (!parts.length)
|
||
return {key: key, hashId: -1};
|
||
else if (parts.length == 1 && parts[0] == "shift")
|
||
return {key: key.toUpperCase(), hashId: -1};
|
||
|
||
var hashId = 0;
|
||
for (var i = parts.length; i--;) {
|
||
var modifier = keyUtil.KEY_MODS[parts[i]];
|
||
if (modifier == null) {
|
||
if (typeof console != "undefined")
|
||
console.error("invalid modifier " + parts[i] + " in " + keys);
|
||
return false;
|
||
}
|
||
hashId |= modifier;
|
||
}
|
||
return {key: key, hashId: hashId};
|
||
};
|
||
|
||
this.findKeyCommand = function findKeyCommand(hashId, keyString) {
|
||
var key = KEY_MODS[hashId] + keyString;
|
||
return this.commandKeyBinding[key];
|
||
};
|
||
|
||
this.handleKeyboard = function(data, hashId, keyString, keyCode) {
|
||
if (keyCode < 0) return;
|
||
var key = KEY_MODS[hashId] + keyString;
|
||
var command = this.commandKeyBinding[key];
|
||
if (data.$keyChain) {
|
||
data.$keyChain += " " + key;
|
||
command = this.commandKeyBinding[data.$keyChain] || command;
|
||
}
|
||
|
||
if (command) {
|
||
if (command == "chainKeys" || command[command.length - 1] == "chainKeys") {
|
||
data.$keyChain = data.$keyChain || key;
|
||
return {command: "null"};
|
||
}
|
||
}
|
||
|
||
if (data.$keyChain) {
|
||
if ((!hashId || hashId == 4) && keyString.length == 1)
|
||
data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input
|
||
else if (hashId == -1 || keyCode > 0)
|
||
data.$keyChain = ""; // reset keyChain
|
||
}
|
||
return {command: command};
|
||
};
|
||
|
||
this.getStatusText = function(editor, data) {
|
||
return data.$keyChain || "";
|
||
};
|
||
|
||
}).call(HashHandler.prototype);
|
||
|
||
exports.HashHandler = HashHandler;
|
||
exports.MultiHashHandler = MultiHashHandler;
|
||
});
|
||
|
||
ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var MultiHashHandler = acequire("../keyboard/hash_handler").MultiHashHandler;
|
||
var EventEmitter = acequire("../lib/event_emitter").EventEmitter;
|
||
|
||
var CommandManager = function(platform, commands) {
|
||
MultiHashHandler.call(this, commands, platform);
|
||
this.byName = this.commands;
|
||
this.setDefaultHandler("exec", function(e) {
|
||
return e.command.exec(e.editor, e.args || {});
|
||
});
|
||
};
|
||
|
||
oop.inherits(CommandManager, MultiHashHandler);
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.exec = function(command, editor, args) {
|
||
if (Array.isArray(command)) {
|
||
for (var i = command.length; i--; ) {
|
||
if (this.exec(command[i], editor, args)) return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
if (typeof command === "string")
|
||
command = this.commands[command];
|
||
|
||
if (!command)
|
||
return false;
|
||
|
||
if (editor && editor.$readOnly && !command.readOnly)
|
||
return false;
|
||
|
||
var e = {editor: editor, command: command, args: args};
|
||
e.returnValue = this._emit("exec", e);
|
||
this._signal("afterExec", e);
|
||
|
||
return e.returnValue === false ? false : true;
|
||
};
|
||
|
||
this.toggleRecording = function(editor) {
|
||
if (this.$inReplay)
|
||
return;
|
||
|
||
editor && editor._emit("changeStatus");
|
||
if (this.recording) {
|
||
this.macro.pop();
|
||
this.removeEventListener("exec", this.$addCommandToMacro);
|
||
|
||
if (!this.macro.length)
|
||
this.macro = this.oldMacro;
|
||
|
||
return this.recording = false;
|
||
}
|
||
if (!this.$addCommandToMacro) {
|
||
this.$addCommandToMacro = function(e) {
|
||
this.macro.push([e.command, e.args]);
|
||
}.bind(this);
|
||
}
|
||
|
||
this.oldMacro = this.macro;
|
||
this.macro = [];
|
||
this.on("exec", this.$addCommandToMacro);
|
||
return this.recording = true;
|
||
};
|
||
|
||
this.replay = function(editor) {
|
||
if (this.$inReplay || !this.macro)
|
||
return;
|
||
|
||
if (this.recording)
|
||
return this.toggleRecording(editor);
|
||
|
||
try {
|
||
this.$inReplay = true;
|
||
this.macro.forEach(function(x) {
|
||
if (typeof x == "string")
|
||
this.exec(x, editor);
|
||
else
|
||
this.exec(x[0], editor, x[1]);
|
||
}, this);
|
||
} finally {
|
||
this.$inReplay = false;
|
||
}
|
||
};
|
||
|
||
this.trimMacro = function(m) {
|
||
return m.map(function(x){
|
||
if (typeof x[0] != "string")
|
||
x[0] = x[0].name;
|
||
if (!x[1])
|
||
x = x[0];
|
||
return x;
|
||
});
|
||
};
|
||
|
||
}).call(CommandManager.prototype);
|
||
|
||
exports.CommandManager = CommandManager;
|
||
|
||
});
|
||
|
||
ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var lang = acequire("../lib/lang");
|
||
var config = acequire("../config");
|
||
var Range = acequire("../range").Range;
|
||
|
||
function bindKey(win, mac) {
|
||
return {win: win, mac: mac};
|
||
}
|
||
exports.commands = [{
|
||
name: "showSettingsMenu",
|
||
bindKey: bindKey("Ctrl-,", "Command-,"),
|
||
exec: function(editor) {
|
||
config.loadModule("ace/ext/settings_menu", function(module) {
|
||
module.init(editor);
|
||
editor.showSettingsMenu();
|
||
});
|
||
},
|
||
readOnly: true
|
||
}, {
|
||
name: "goToNextError",
|
||
bindKey: bindKey("Alt-E", "Ctrl-E"),
|
||
exec: function(editor) {
|
||
config.loadModule("ace/ext/error_marker", function(module) {
|
||
module.showErrorMarker(editor, 1);
|
||
});
|
||
},
|
||
scrollIntoView: "animate",
|
||
readOnly: true
|
||
}, {
|
||
name: "goToPreviousError",
|
||
bindKey: bindKey("Alt-Shift-E", "Ctrl-Shift-E"),
|
||
exec: function(editor) {
|
||
config.loadModule("ace/ext/error_marker", function(module) {
|
||
module.showErrorMarker(editor, -1);
|
||
});
|
||
},
|
||
scrollIntoView: "animate",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectall",
|
||
bindKey: bindKey("Ctrl-A", "Command-A"),
|
||
exec: function(editor) { editor.selectAll(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "centerselection",
|
||
bindKey: bindKey(null, "Ctrl-L"),
|
||
exec: function(editor) { editor.centerSelection(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "gotoline",
|
||
bindKey: bindKey("Ctrl-L", "Command-L"),
|
||
exec: function(editor) {
|
||
var line = parseInt(prompt("Enter line number:"), 10);
|
||
if (!isNaN(line)) {
|
||
editor.gotoLine(line);
|
||
}
|
||
},
|
||
readOnly: true
|
||
}, {
|
||
name: "fold",
|
||
bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"),
|
||
exec: function(editor) { editor.session.toggleFold(false); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "unfold",
|
||
bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"),
|
||
exec: function(editor) { editor.session.toggleFold(true); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "toggleFoldWidget",
|
||
bindKey: bindKey("F2", "F2"),
|
||
exec: function(editor) { editor.session.toggleFoldWidget(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "toggleParentFoldWidget",
|
||
bindKey: bindKey("Alt-F2", "Alt-F2"),
|
||
exec: function(editor) { editor.session.toggleFoldWidget(true); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "foldall",
|
||
bindKey: bindKey(null, "Ctrl-Command-Option-0"),
|
||
exec: function(editor) { editor.session.foldAll(); },
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "foldOther",
|
||
bindKey: bindKey("Alt-0", "Command-Option-0"),
|
||
exec: function(editor) {
|
||
editor.session.foldAll();
|
||
editor.session.unfold(editor.selection.getAllRanges());
|
||
},
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "unfoldall",
|
||
bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"),
|
||
exec: function(editor) { editor.session.unfold(); },
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "findnext",
|
||
bindKey: bindKey("Ctrl-K", "Command-G"),
|
||
exec: function(editor) { editor.findNext(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "findprevious",
|
||
bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"),
|
||
exec: function(editor) { editor.findPrevious(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "center",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectOrFindNext",
|
||
bindKey: bindKey("Alt-K", "Ctrl-G"),
|
||
exec: function(editor) {
|
||
if (editor.selection.isEmpty())
|
||
editor.selection.selectWord();
|
||
else
|
||
editor.findNext();
|
||
},
|
||
readOnly: true
|
||
}, {
|
||
name: "selectOrFindPrevious",
|
||
bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"),
|
||
exec: function(editor) {
|
||
if (editor.selection.isEmpty())
|
||
editor.selection.selectWord();
|
||
else
|
||
editor.findPrevious();
|
||
},
|
||
readOnly: true
|
||
}, {
|
||
name: "find",
|
||
bindKey: bindKey("Ctrl-F", "Command-F"),
|
||
exec: function(editor) {
|
||
config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)});
|
||
},
|
||
readOnly: true
|
||
}, {
|
||
name: "overwrite",
|
||
bindKey: "Insert",
|
||
exec: function(editor) { editor.toggleOverwrite(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "selecttostart",
|
||
bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"),
|
||
exec: function(editor) { editor.getSelection().selectFileStart(); },
|
||
multiSelectAction: "forEach",
|
||
readOnly: true,
|
||
scrollIntoView: "animate",
|
||
aceCommandGroup: "fileJump"
|
||
}, {
|
||
name: "gotostart",
|
||
bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"),
|
||
exec: function(editor) { editor.navigateFileStart(); },
|
||
multiSelectAction: "forEach",
|
||
readOnly: true,
|
||
scrollIntoView: "animate",
|
||
aceCommandGroup: "fileJump"
|
||
}, {
|
||
name: "selectup",
|
||
bindKey: bindKey("Shift-Up", "Shift-Up"),
|
||
exec: function(editor) { editor.getSelection().selectUp(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "golineup",
|
||
bindKey: bindKey("Up", "Up|Ctrl-P"),
|
||
exec: function(editor, args) { editor.navigateUp(args.times); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selecttoend",
|
||
bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"),
|
||
exec: function(editor) { editor.getSelection().selectFileEnd(); },
|
||
multiSelectAction: "forEach",
|
||
readOnly: true,
|
||
scrollIntoView: "animate",
|
||
aceCommandGroup: "fileJump"
|
||
}, {
|
||
name: "gotoend",
|
||
bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"),
|
||
exec: function(editor) { editor.navigateFileEnd(); },
|
||
multiSelectAction: "forEach",
|
||
readOnly: true,
|
||
scrollIntoView: "animate",
|
||
aceCommandGroup: "fileJump"
|
||
}, {
|
||
name: "selectdown",
|
||
bindKey: bindKey("Shift-Down", "Shift-Down"),
|
||
exec: function(editor) { editor.getSelection().selectDown(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "golinedown",
|
||
bindKey: bindKey("Down", "Down|Ctrl-N"),
|
||
exec: function(editor, args) { editor.navigateDown(args.times); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectwordleft",
|
||
bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"),
|
||
exec: function(editor) { editor.getSelection().selectWordLeft(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotowordleft",
|
||
bindKey: bindKey("Ctrl-Left", "Option-Left"),
|
||
exec: function(editor) { editor.navigateWordLeft(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selecttolinestart",
|
||
bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"),
|
||
exec: function(editor) { editor.getSelection().selectLineStart(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotolinestart",
|
||
bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"),
|
||
exec: function(editor) { editor.navigateLineStart(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectleft",
|
||
bindKey: bindKey("Shift-Left", "Shift-Left"),
|
||
exec: function(editor) { editor.getSelection().selectLeft(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotoleft",
|
||
bindKey: bindKey("Left", "Left|Ctrl-B"),
|
||
exec: function(editor, args) { editor.navigateLeft(args.times); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectwordright",
|
||
bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"),
|
||
exec: function(editor) { editor.getSelection().selectWordRight(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotowordright",
|
||
bindKey: bindKey("Ctrl-Right", "Option-Right"),
|
||
exec: function(editor) { editor.navigateWordRight(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selecttolineend",
|
||
bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"),
|
||
exec: function(editor) { editor.getSelection().selectLineEnd(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotolineend",
|
||
bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"),
|
||
exec: function(editor) { editor.navigateLineEnd(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectright",
|
||
bindKey: bindKey("Shift-Right", "Shift-Right"),
|
||
exec: function(editor) { editor.getSelection().selectRight(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "gotoright",
|
||
bindKey: bindKey("Right", "Right|Ctrl-F"),
|
||
exec: function(editor, args) { editor.navigateRight(args.times); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectpagedown",
|
||
bindKey: "Shift-PageDown",
|
||
exec: function(editor) { editor.selectPageDown(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "pagedown",
|
||
bindKey: bindKey(null, "Option-PageDown"),
|
||
exec: function(editor) { editor.scrollPageDown(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "gotopagedown",
|
||
bindKey: bindKey("PageDown", "PageDown|Ctrl-V"),
|
||
exec: function(editor) { editor.gotoPageDown(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "selectpageup",
|
||
bindKey: "Shift-PageUp",
|
||
exec: function(editor) { editor.selectPageUp(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "pageup",
|
||
bindKey: bindKey(null, "Option-PageUp"),
|
||
exec: function(editor) { editor.scrollPageUp(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "gotopageup",
|
||
bindKey: "PageUp",
|
||
exec: function(editor) { editor.gotoPageUp(); },
|
||
readOnly: true
|
||
}, {
|
||
name: "scrollup",
|
||
bindKey: bindKey("Ctrl-Up", null),
|
||
exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },
|
||
readOnly: true
|
||
}, {
|
||
name: "scrolldown",
|
||
bindKey: bindKey("Ctrl-Down", null),
|
||
exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },
|
||
readOnly: true
|
||
}, {
|
||
name: "selectlinestart",
|
||
bindKey: "Shift-Home",
|
||
exec: function(editor) { editor.getSelection().selectLineStart(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectlineend",
|
||
bindKey: "Shift-End",
|
||
exec: function(editor) { editor.getSelection().selectLineEnd(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "togglerecording",
|
||
bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"),
|
||
exec: function(editor) { editor.commands.toggleRecording(editor); },
|
||
readOnly: true
|
||
}, {
|
||
name: "replaymacro",
|
||
bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"),
|
||
exec: function(editor) { editor.commands.replay(editor); },
|
||
readOnly: true
|
||
}, {
|
||
name: "jumptomatching",
|
||
bindKey: bindKey("Ctrl-P", "Ctrl-P"),
|
||
exec: function(editor) { editor.jumpToMatching(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "animate",
|
||
readOnly: true
|
||
}, {
|
||
name: "selecttomatching",
|
||
bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"),
|
||
exec: function(editor) { editor.jumpToMatching(true); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "animate",
|
||
readOnly: true
|
||
}, {
|
||
name: "expandToMatching",
|
||
bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"),
|
||
exec: function(editor) { editor.jumpToMatching(true, true); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "animate",
|
||
readOnly: true
|
||
}, {
|
||
name: "passKeysToBrowser",
|
||
bindKey: bindKey(null, null),
|
||
exec: function() {},
|
||
passEvent: true,
|
||
readOnly: true
|
||
}, {
|
||
name: "copy",
|
||
exec: function(editor) {
|
||
},
|
||
readOnly: true
|
||
},
|
||
{
|
||
name: "cut",
|
||
exec: function(editor) {
|
||
var range = editor.getSelectionRange();
|
||
editor._emit("cut", range);
|
||
|
||
if (!editor.selection.isEmpty()) {
|
||
editor.session.remove(range);
|
||
editor.clearSelection();
|
||
}
|
||
},
|
||
scrollIntoView: "cursor",
|
||
multiSelectAction: "forEach"
|
||
}, {
|
||
name: "paste",
|
||
exec: function(editor, args) {
|
||
editor.$handlePaste(args);
|
||
},
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "removeline",
|
||
bindKey: bindKey("Ctrl-D", "Command-D"),
|
||
exec: function(editor) { editor.removeLines(); },
|
||
scrollIntoView: "cursor",
|
||
multiSelectAction: "forEachLine"
|
||
}, {
|
||
name: "duplicateSelection",
|
||
bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"),
|
||
exec: function(editor) { editor.duplicateSelection(); },
|
||
scrollIntoView: "cursor",
|
||
multiSelectAction: "forEach"
|
||
}, {
|
||
name: "sortlines",
|
||
bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"),
|
||
exec: function(editor) { editor.sortLines(); },
|
||
scrollIntoView: "selection",
|
||
multiSelectAction: "forEachLine"
|
||
}, {
|
||
name: "togglecomment",
|
||
bindKey: bindKey("Ctrl-/", "Command-/"),
|
||
exec: function(editor) { editor.toggleCommentLines(); },
|
||
multiSelectAction: "forEachLine",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "toggleBlockComment",
|
||
bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"),
|
||
exec: function(editor) { editor.toggleBlockComment(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "modifyNumberUp",
|
||
bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"),
|
||
exec: function(editor) { editor.modifyNumber(1); },
|
||
scrollIntoView: "cursor",
|
||
multiSelectAction: "forEach"
|
||
}, {
|
||
name: "modifyNumberDown",
|
||
bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"),
|
||
exec: function(editor) { editor.modifyNumber(-1); },
|
||
scrollIntoView: "cursor",
|
||
multiSelectAction: "forEach"
|
||
}, {
|
||
name: "replace",
|
||
bindKey: bindKey("Ctrl-H", "Command-Option-F"),
|
||
exec: function(editor) {
|
||
config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)});
|
||
}
|
||
}, {
|
||
name: "undo",
|
||
bindKey: bindKey("Ctrl-Z", "Command-Z"),
|
||
exec: function(editor) { editor.undo(); }
|
||
}, {
|
||
name: "redo",
|
||
bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"),
|
||
exec: function(editor) { editor.redo(); }
|
||
}, {
|
||
name: "copylinesup",
|
||
bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"),
|
||
exec: function(editor) { editor.copyLinesUp(); },
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "movelinesup",
|
||
bindKey: bindKey("Alt-Up", "Option-Up"),
|
||
exec: function(editor) { editor.moveLinesUp(); },
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "copylinesdown",
|
||
bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"),
|
||
exec: function(editor) { editor.copyLinesDown(); },
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "movelinesdown",
|
||
bindKey: bindKey("Alt-Down", "Option-Down"),
|
||
exec: function(editor) { editor.moveLinesDown(); },
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "del",
|
||
bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"),
|
||
exec: function(editor) { editor.remove("right"); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "backspace",
|
||
bindKey: bindKey(
|
||
"Shift-Backspace|Backspace",
|
||
"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"
|
||
),
|
||
exec: function(editor) { editor.remove("left"); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "cut_or_delete",
|
||
bindKey: bindKey("Shift-Delete", null),
|
||
exec: function(editor) {
|
||
if (editor.selection.isEmpty()) {
|
||
editor.remove("left");
|
||
} else {
|
||
return false;
|
||
}
|
||
},
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "removetolinestart",
|
||
bindKey: bindKey("Alt-Backspace", "Command-Backspace"),
|
||
exec: function(editor) { editor.removeToLineStart(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "removetolineend",
|
||
bindKey: bindKey("Alt-Delete", "Ctrl-K"),
|
||
exec: function(editor) { editor.removeToLineEnd(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "removewordleft",
|
||
bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"),
|
||
exec: function(editor) { editor.removeWordLeft(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "removewordright",
|
||
bindKey: bindKey("Ctrl-Delete", "Alt-Delete"),
|
||
exec: function(editor) { editor.removeWordRight(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "outdent",
|
||
bindKey: bindKey("Shift-Tab", "Shift-Tab"),
|
||
exec: function(editor) { editor.blockOutdent(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "indent",
|
||
bindKey: bindKey("Tab", "Tab"),
|
||
exec: function(editor) { editor.indent(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "blockoutdent",
|
||
bindKey: bindKey("Ctrl-[", "Ctrl-["),
|
||
exec: function(editor) { editor.blockOutdent(); },
|
||
multiSelectAction: "forEachLine",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "blockindent",
|
||
bindKey: bindKey("Ctrl-]", "Ctrl-]"),
|
||
exec: function(editor) { editor.blockIndent(); },
|
||
multiSelectAction: "forEachLine",
|
||
scrollIntoView: "selectionPart"
|
||
}, {
|
||
name: "insertstring",
|
||
exec: function(editor, str) { editor.insert(str); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "inserttext",
|
||
exec: function(editor, args) {
|
||
editor.insert(lang.stringRepeat(args.text || "", args.times || 1));
|
||
},
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "splitline",
|
||
bindKey: bindKey(null, "Ctrl-O"),
|
||
exec: function(editor) { editor.splitLine(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "transposeletters",
|
||
bindKey: bindKey("Ctrl-T", "Ctrl-T"),
|
||
exec: function(editor) { editor.transposeLetters(); },
|
||
multiSelectAction: function(editor) {editor.transposeSelections(1); },
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "touppercase",
|
||
bindKey: bindKey("Ctrl-U", "Ctrl-U"),
|
||
exec: function(editor) { editor.toUpperCase(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "tolowercase",
|
||
bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"),
|
||
exec: function(editor) { editor.toLowerCase(); },
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "expandtoline",
|
||
bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"),
|
||
exec: function(editor) {
|
||
var range = editor.selection.getRange();
|
||
|
||
range.start.column = range.end.column = 0;
|
||
range.end.row++;
|
||
editor.selection.setRange(range, false);
|
||
},
|
||
multiSelectAction: "forEach",
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "joinlines",
|
||
bindKey: bindKey(null, null),
|
||
exec: function(editor) {
|
||
var isBackwards = editor.selection.isBackwards();
|
||
var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();
|
||
var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();
|
||
var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;
|
||
var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());
|
||
var selectedCount = selectedText.replace(/\n\s*/, " ").length;
|
||
var insertLine = editor.session.doc.getLine(selectionStart.row);
|
||
|
||
for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {
|
||
var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));
|
||
if (curLine.length !== 0) {
|
||
curLine = " " + curLine;
|
||
}
|
||
insertLine += curLine;
|
||
}
|
||
|
||
if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {
|
||
insertLine += editor.session.doc.getNewLineCharacter();
|
||
}
|
||
|
||
editor.clearSelection();
|
||
editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);
|
||
|
||
if (selectedCount > 0) {
|
||
editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);
|
||
editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);
|
||
} else {
|
||
firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;
|
||
editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);
|
||
}
|
||
},
|
||
multiSelectAction: "forEach",
|
||
readOnly: true
|
||
}, {
|
||
name: "invertSelection",
|
||
bindKey: bindKey(null, null),
|
||
exec: function(editor) {
|
||
var endRow = editor.session.doc.getLength() - 1;
|
||
var endCol = editor.session.doc.getLine(endRow).length;
|
||
var ranges = editor.selection.rangeList.ranges;
|
||
var newRanges = [];
|
||
if (ranges.length < 1) {
|
||
ranges = [editor.selection.getRange()];
|
||
}
|
||
|
||
for (var i = 0; i < ranges.length; i++) {
|
||
if (i == (ranges.length - 1)) {
|
||
if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {
|
||
newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));
|
||
}
|
||
}
|
||
|
||
if (i === 0) {
|
||
if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {
|
||
newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));
|
||
}
|
||
} else {
|
||
newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));
|
||
}
|
||
}
|
||
|
||
editor.exitMultiSelectMode();
|
||
editor.clearSelection();
|
||
|
||
for(var i = 0; i < newRanges.length; i++) {
|
||
editor.selection.addRange(newRanges[i], false);
|
||
}
|
||
},
|
||
readOnly: true,
|
||
scrollIntoView: "none"
|
||
}];
|
||
|
||
});
|
||
|
||
ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
acequire("./lib/fixoldbrowsers");
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var dom = acequire("./lib/dom");
|
||
var lang = acequire("./lib/lang");
|
||
var useragent = acequire("./lib/useragent");
|
||
var TextInput = acequire("./keyboard/textinput").TextInput;
|
||
var MouseHandler = acequire("./mouse/mouse_handler").MouseHandler;
|
||
var FoldHandler = acequire("./mouse/fold_handler").FoldHandler;
|
||
var KeyBinding = acequire("./keyboard/keybinding").KeyBinding;
|
||
var EditSession = acequire("./edit_session").EditSession;
|
||
var Search = acequire("./search").Search;
|
||
var Range = acequire("./range").Range;
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var CommandManager = acequire("./commands/command_manager").CommandManager;
|
||
var defaultCommands = acequire("./commands/default_commands").commands;
|
||
var config = acequire("./config");
|
||
var TokenIterator = acequire("./token_iterator").TokenIterator;
|
||
var Editor = function(renderer, session) {
|
||
var container = renderer.getContainerElement();
|
||
this.container = container;
|
||
this.renderer = renderer;
|
||
|
||
this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands);
|
||
this.textInput = new TextInput(renderer.getTextAreaContainer(), this);
|
||
this.renderer.textarea = this.textInput.getElement();
|
||
this.keyBinding = new KeyBinding(this);
|
||
this.$mouseHandler = new MouseHandler(this);
|
||
new FoldHandler(this);
|
||
|
||
this.$blockScrolling = 0;
|
||
this.$search = new Search().set({
|
||
wrap: true
|
||
});
|
||
|
||
this.$historyTracker = this.$historyTracker.bind(this);
|
||
this.commands.on("exec", this.$historyTracker);
|
||
|
||
this.$initOperationListeners();
|
||
|
||
this._$emitInputEvent = lang.delayedCall(function() {
|
||
this._signal("input", {});
|
||
if (this.session && this.session.bgTokenizer)
|
||
this.session.bgTokenizer.scheduleStart();
|
||
}.bind(this));
|
||
|
||
this.on("change", function(_, _self) {
|
||
_self._$emitInputEvent.schedule(31);
|
||
});
|
||
|
||
this.setSession(session || new EditSession(""));
|
||
config.resetOptions(this);
|
||
config._signal("editor", this);
|
||
};
|
||
|
||
(function(){
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.$initOperationListeners = function() {
|
||
function last(a) {return a[a.length - 1]}
|
||
|
||
this.selections = [];
|
||
this.commands.on("exec", this.startOperation.bind(this), true);
|
||
this.commands.on("afterExec", this.endOperation.bind(this), true);
|
||
|
||
this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));
|
||
|
||
this.on("change", function() {
|
||
this.curOp || this.startOperation();
|
||
this.curOp.docChanged = true;
|
||
}.bind(this), true);
|
||
|
||
this.on("changeSelection", function() {
|
||
this.curOp || this.startOperation();
|
||
this.curOp.selectionChanged = true;
|
||
}.bind(this), true);
|
||
};
|
||
|
||
this.curOp = null;
|
||
this.prevOp = {};
|
||
this.startOperation = function(commadEvent) {
|
||
if (this.curOp) {
|
||
if (!commadEvent || this.curOp.command)
|
||
return;
|
||
this.prevOp = this.curOp;
|
||
}
|
||
if (!commadEvent) {
|
||
this.previousCommand = null;
|
||
commadEvent = {};
|
||
}
|
||
|
||
this.$opResetTimer.schedule();
|
||
this.curOp = {
|
||
command: commadEvent.command || {},
|
||
args: commadEvent.args,
|
||
scrollTop: this.renderer.scrollTop
|
||
};
|
||
if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)
|
||
this.$blockScrolling++;
|
||
};
|
||
|
||
this.endOperation = function(e) {
|
||
if (this.curOp) {
|
||
if (e && e.returnValue === false)
|
||
return this.curOp = null;
|
||
this._signal("beforeEndOperation");
|
||
var command = this.curOp.command;
|
||
if (command.name && this.$blockScrolling > 0)
|
||
this.$blockScrolling--;
|
||
var scrollIntoView = command && command.scrollIntoView;
|
||
if (scrollIntoView) {
|
||
switch (scrollIntoView) {
|
||
case "center-animate":
|
||
scrollIntoView = "animate";
|
||
case "center":
|
||
this.renderer.scrollCursorIntoView(null, 0.5);
|
||
break;
|
||
case "animate":
|
||
case "cursor":
|
||
this.renderer.scrollCursorIntoView();
|
||
break;
|
||
case "selectionPart":
|
||
var range = this.selection.getRange();
|
||
var config = this.renderer.layerConfig;
|
||
if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {
|
||
this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
if (scrollIntoView == "animate")
|
||
this.renderer.animateScrolling(this.curOp.scrollTop);
|
||
}
|
||
|
||
this.prevOp = this.curOp;
|
||
this.curOp = null;
|
||
}
|
||
};
|
||
this.$mergeableCommands = ["backspace", "del", "insertstring"];
|
||
this.$historyTracker = function(e) {
|
||
if (!this.$mergeUndoDeltas)
|
||
return;
|
||
|
||
var prev = this.prevOp;
|
||
var mergeableCommands = this.$mergeableCommands;
|
||
var shouldMerge = prev.command && (e.command.name == prev.command.name);
|
||
if (e.command.name == "insertstring") {
|
||
var text = e.args;
|
||
if (this.mergeNextCommand === undefined)
|
||
this.mergeNextCommand = true;
|
||
|
||
shouldMerge = shouldMerge
|
||
&& this.mergeNextCommand // previous command allows to coalesce with
|
||
&& (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type
|
||
|
||
this.mergeNextCommand = true;
|
||
} else {
|
||
shouldMerge = shouldMerge
|
||
&& mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable
|
||
}
|
||
|
||
if (
|
||
this.$mergeUndoDeltas != "always"
|
||
&& Date.now() - this.sequenceStartTime > 2000
|
||
) {
|
||
shouldMerge = false; // the sequence is too long
|
||
}
|
||
|
||
if (shouldMerge)
|
||
this.session.mergeUndoDeltas = true;
|
||
else if (mergeableCommands.indexOf(e.command.name) !== -1)
|
||
this.sequenceStartTime = Date.now();
|
||
};
|
||
this.setKeyboardHandler = function(keyboardHandler, cb) {
|
||
if (keyboardHandler && typeof keyboardHandler === "string") {
|
||
this.$keybindingId = keyboardHandler;
|
||
var _self = this;
|
||
config.loadModule(["keybinding", keyboardHandler], function(module) {
|
||
if (_self.$keybindingId == keyboardHandler)
|
||
_self.keyBinding.setKeyboardHandler(module && module.handler);
|
||
cb && cb();
|
||
});
|
||
} else {
|
||
this.$keybindingId = null;
|
||
this.keyBinding.setKeyboardHandler(keyboardHandler);
|
||
cb && cb();
|
||
}
|
||
};
|
||
this.getKeyboardHandler = function() {
|
||
return this.keyBinding.getKeyboardHandler();
|
||
};
|
||
this.setSession = function(session) {
|
||
if (this.session == session)
|
||
return;
|
||
if (this.curOp) this.endOperation();
|
||
this.curOp = {};
|
||
|
||
var oldSession = this.session;
|
||
if (oldSession) {
|
||
this.session.off("change", this.$onDocumentChange);
|
||
this.session.off("changeMode", this.$onChangeMode);
|
||
this.session.off("tokenizerUpdate", this.$onTokenizerUpdate);
|
||
this.session.off("changeTabSize", this.$onChangeTabSize);
|
||
this.session.off("changeWrapLimit", this.$onChangeWrapLimit);
|
||
this.session.off("changeWrapMode", this.$onChangeWrapMode);
|
||
this.session.off("changeFold", this.$onChangeFold);
|
||
this.session.off("changeFrontMarker", this.$onChangeFrontMarker);
|
||
this.session.off("changeBackMarker", this.$onChangeBackMarker);
|
||
this.session.off("changeBreakpoint", this.$onChangeBreakpoint);
|
||
this.session.off("changeAnnotation", this.$onChangeAnnotation);
|
||
this.session.off("changeOverwrite", this.$onCursorChange);
|
||
this.session.off("changeScrollTop", this.$onScrollTopChange);
|
||
this.session.off("changeScrollLeft", this.$onScrollLeftChange);
|
||
|
||
var selection = this.session.getSelection();
|
||
selection.off("changeCursor", this.$onCursorChange);
|
||
selection.off("changeSelection", this.$onSelectionChange);
|
||
}
|
||
|
||
this.session = session;
|
||
if (session) {
|
||
this.$onDocumentChange = this.onDocumentChange.bind(this);
|
||
session.on("change", this.$onDocumentChange);
|
||
this.renderer.setSession(session);
|
||
|
||
this.$onChangeMode = this.onChangeMode.bind(this);
|
||
session.on("changeMode", this.$onChangeMode);
|
||
|
||
this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);
|
||
session.on("tokenizerUpdate", this.$onTokenizerUpdate);
|
||
|
||
this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);
|
||
session.on("changeTabSize", this.$onChangeTabSize);
|
||
|
||
this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);
|
||
session.on("changeWrapLimit", this.$onChangeWrapLimit);
|
||
|
||
this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);
|
||
session.on("changeWrapMode", this.$onChangeWrapMode);
|
||
|
||
this.$onChangeFold = this.onChangeFold.bind(this);
|
||
session.on("changeFold", this.$onChangeFold);
|
||
|
||
this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);
|
||
this.session.on("changeFrontMarker", this.$onChangeFrontMarker);
|
||
|
||
this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);
|
||
this.session.on("changeBackMarker", this.$onChangeBackMarker);
|
||
|
||
this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);
|
||
this.session.on("changeBreakpoint", this.$onChangeBreakpoint);
|
||
|
||
this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);
|
||
this.session.on("changeAnnotation", this.$onChangeAnnotation);
|
||
|
||
this.$onCursorChange = this.onCursorChange.bind(this);
|
||
this.session.on("changeOverwrite", this.$onCursorChange);
|
||
|
||
this.$onScrollTopChange = this.onScrollTopChange.bind(this);
|
||
this.session.on("changeScrollTop", this.$onScrollTopChange);
|
||
|
||
this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);
|
||
this.session.on("changeScrollLeft", this.$onScrollLeftChange);
|
||
|
||
this.selection = session.getSelection();
|
||
this.selection.on("changeCursor", this.$onCursorChange);
|
||
|
||
this.$onSelectionChange = this.onSelectionChange.bind(this);
|
||
this.selection.on("changeSelection", this.$onSelectionChange);
|
||
|
||
this.onChangeMode();
|
||
|
||
this.$blockScrolling += 1;
|
||
this.onCursorChange();
|
||
this.$blockScrolling -= 1;
|
||
|
||
this.onScrollTopChange();
|
||
this.onScrollLeftChange();
|
||
this.onSelectionChange();
|
||
this.onChangeFrontMarker();
|
||
this.onChangeBackMarker();
|
||
this.onChangeBreakpoint();
|
||
this.onChangeAnnotation();
|
||
this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();
|
||
this.renderer.updateFull();
|
||
} else {
|
||
this.selection = null;
|
||
this.renderer.setSession(session);
|
||
}
|
||
|
||
this._signal("changeSession", {
|
||
session: session,
|
||
oldSession: oldSession
|
||
});
|
||
|
||
this.curOp = null;
|
||
|
||
oldSession && oldSession._signal("changeEditor", {oldEditor: this});
|
||
session && session._signal("changeEditor", {editor: this});
|
||
};
|
||
this.getSession = function() {
|
||
return this.session;
|
||
};
|
||
this.setValue = function(val, cursorPos) {
|
||
this.session.doc.setValue(val);
|
||
|
||
if (!cursorPos)
|
||
this.selectAll();
|
||
else if (cursorPos == 1)
|
||
this.navigateFileEnd();
|
||
else if (cursorPos == -1)
|
||
this.navigateFileStart();
|
||
|
||
return val;
|
||
};
|
||
this.getValue = function() {
|
||
return this.session.getValue();
|
||
};
|
||
this.getSelection = function() {
|
||
return this.selection;
|
||
};
|
||
this.resize = function(force) {
|
||
this.renderer.onResize(force);
|
||
};
|
||
this.setTheme = function(theme, cb) {
|
||
this.renderer.setTheme(theme, cb);
|
||
};
|
||
this.getTheme = function() {
|
||
return this.renderer.getTheme();
|
||
};
|
||
this.setStyle = function(style) {
|
||
this.renderer.setStyle(style);
|
||
};
|
||
this.unsetStyle = function(style) {
|
||
this.renderer.unsetStyle(style);
|
||
};
|
||
this.getFontSize = function () {
|
||
return this.getOption("fontSize") ||
|
||
dom.computedStyle(this.container, "fontSize");
|
||
};
|
||
this.setFontSize = function(size) {
|
||
this.setOption("fontSize", size);
|
||
};
|
||
|
||
this.$highlightBrackets = function() {
|
||
if (this.session.$bracketHighlight) {
|
||
this.session.removeMarker(this.session.$bracketHighlight);
|
||
this.session.$bracketHighlight = null;
|
||
}
|
||
|
||
if (this.$highlightPending) {
|
||
return;
|
||
}
|
||
var self = this;
|
||
this.$highlightPending = true;
|
||
setTimeout(function() {
|
||
self.$highlightPending = false;
|
||
var session = self.session;
|
||
if (!session || !session.bgTokenizer) return;
|
||
var pos = session.findMatchingBracket(self.getCursorPosition());
|
||
if (pos) {
|
||
var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);
|
||
} else if (session.$mode.getMatching) {
|
||
var range = session.$mode.getMatching(self.session);
|
||
}
|
||
if (range)
|
||
session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text");
|
||
}, 50);
|
||
};
|
||
this.$highlightTags = function() {
|
||
if (this.$highlightTagPending)
|
||
return;
|
||
var self = this;
|
||
this.$highlightTagPending = true;
|
||
setTimeout(function() {
|
||
self.$highlightTagPending = false;
|
||
|
||
var session = self.session;
|
||
if (!session || !session.bgTokenizer) return;
|
||
|
||
var pos = self.getCursorPosition();
|
||
var iterator = new TokenIterator(self.session, pos.row, pos.column);
|
||
var token = iterator.getCurrentToken();
|
||
|
||
if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) {
|
||
session.removeMarker(session.$tagHighlight);
|
||
session.$tagHighlight = null;
|
||
return;
|
||
}
|
||
|
||
if (token.type.indexOf("tag-open") != -1) {
|
||
token = iterator.stepForward();
|
||
if (!token)
|
||
return;
|
||
}
|
||
|
||
var tag = token.value;
|
||
var depth = 0;
|
||
var prevToken = iterator.stepBackward();
|
||
|
||
if (prevToken.value == '<'){
|
||
do {
|
||
prevToken = token;
|
||
token = iterator.stepForward();
|
||
|
||
if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {
|
||
if (prevToken.value === '<'){
|
||
depth++;
|
||
} else if (prevToken.value === '</'){
|
||
depth--;
|
||
}
|
||
}
|
||
|
||
} while (token && depth >= 0);
|
||
} else {
|
||
do {
|
||
token = prevToken;
|
||
prevToken = iterator.stepBackward();
|
||
|
||
if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {
|
||
if (prevToken.value === '<') {
|
||
depth++;
|
||
} else if (prevToken.value === '</') {
|
||
depth--;
|
||
}
|
||
}
|
||
} while (prevToken && depth <= 0);
|
||
iterator.stepForward();
|
||
}
|
||
|
||
if (!token) {
|
||
session.removeMarker(session.$tagHighlight);
|
||
session.$tagHighlight = null;
|
||
return;
|
||
}
|
||
|
||
var row = iterator.getCurrentTokenRow();
|
||
var column = iterator.getCurrentTokenColumn();
|
||
var range = new Range(row, column, row, column+token.value.length);
|
||
if (session.$tagHighlight && range.compareRange(session.$backMarkers[session.$tagHighlight].range)!==0) {
|
||
session.removeMarker(session.$tagHighlight);
|
||
session.$tagHighlight = null;
|
||
}
|
||
|
||
if (range && !session.$tagHighlight)
|
||
session.$tagHighlight = session.addMarker(range, "ace_bracket", "text");
|
||
}, 50);
|
||
};
|
||
this.focus = function() {
|
||
var _self = this;
|
||
setTimeout(function() {
|
||
_self.textInput.focus();
|
||
});
|
||
this.textInput.focus();
|
||
};
|
||
this.isFocused = function() {
|
||
return this.textInput.isFocused();
|
||
};
|
||
this.blur = function() {
|
||
this.textInput.blur();
|
||
};
|
||
this.onFocus = function(e) {
|
||
if (this.$isFocused)
|
||
return;
|
||
this.$isFocused = true;
|
||
this.renderer.showCursor();
|
||
this.renderer.visualizeFocus();
|
||
this._emit("focus", e);
|
||
};
|
||
this.onBlur = function(e) {
|
||
if (!this.$isFocused)
|
||
return;
|
||
this.$isFocused = false;
|
||
this.renderer.hideCursor();
|
||
this.renderer.visualizeBlur();
|
||
this._emit("blur", e);
|
||
};
|
||
|
||
this.$cursorChange = function() {
|
||
this.renderer.updateCursor();
|
||
};
|
||
this.onDocumentChange = function(delta) {
|
||
var wrap = this.session.$useWrapMode;
|
||
var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);
|
||
this.renderer.updateLines(delta.start.row, lastRow, wrap);
|
||
|
||
this._signal("change", delta);
|
||
this.$cursorChange();
|
||
this.$updateHighlightActiveLine();
|
||
};
|
||
|
||
this.onTokenizerUpdate = function(e) {
|
||
var rows = e.data;
|
||
this.renderer.updateLines(rows.first, rows.last);
|
||
};
|
||
|
||
|
||
this.onScrollTopChange = function() {
|
||
this.renderer.scrollToY(this.session.getScrollTop());
|
||
};
|
||
|
||
this.onScrollLeftChange = function() {
|
||
this.renderer.scrollToX(this.session.getScrollLeft());
|
||
};
|
||
this.onCursorChange = function() {
|
||
this.$cursorChange();
|
||
|
||
if (!this.$blockScrolling) {
|
||
config.warn("Automatically scrolling cursor into view after selection change",
|
||
"this will be disabled in the next version",
|
||
"set editor.$blockScrolling = Infinity to disable this message"
|
||
);
|
||
this.renderer.scrollCursorIntoView();
|
||
}
|
||
|
||
this.$highlightBrackets();
|
||
this.$highlightTags();
|
||
this.$updateHighlightActiveLine();
|
||
this._signal("changeSelection");
|
||
};
|
||
|
||
this.$updateHighlightActiveLine = function() {
|
||
var session = this.getSession();
|
||
|
||
var highlight;
|
||
if (this.$highlightActiveLine) {
|
||
if ((this.$selectionStyle != "line" || !this.selection.isMultiLine()))
|
||
highlight = this.getCursorPosition();
|
||
if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))
|
||
highlight = false;
|
||
}
|
||
|
||
if (session.$highlightLineMarker && !highlight) {
|
||
session.removeMarker(session.$highlightLineMarker.id);
|
||
session.$highlightLineMarker = null;
|
||
} else if (!session.$highlightLineMarker && highlight) {
|
||
var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);
|
||
range.id = session.addMarker(range, "ace_active-line", "screenLine");
|
||
session.$highlightLineMarker = range;
|
||
} else if (highlight) {
|
||
session.$highlightLineMarker.start.row = highlight.row;
|
||
session.$highlightLineMarker.end.row = highlight.row;
|
||
session.$highlightLineMarker.start.column = highlight.column;
|
||
session._signal("changeBackMarker");
|
||
}
|
||
};
|
||
|
||
this.onSelectionChange = function(e) {
|
||
var session = this.session;
|
||
|
||
if (session.$selectionMarker) {
|
||
session.removeMarker(session.$selectionMarker);
|
||
}
|
||
session.$selectionMarker = null;
|
||
|
||
if (!this.selection.isEmpty()) {
|
||
var range = this.selection.getRange();
|
||
var style = this.getSelectionStyle();
|
||
session.$selectionMarker = session.addMarker(range, "ace_selection", style);
|
||
} else {
|
||
this.$updateHighlightActiveLine();
|
||
}
|
||
|
||
var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();
|
||
this.session.highlight(re);
|
||
|
||
this._signal("changeSelection");
|
||
};
|
||
|
||
this.$getSelectionHighLightRegexp = function() {
|
||
var session = this.session;
|
||
|
||
var selection = this.getSelectionRange();
|
||
if (selection.isEmpty() || selection.isMultiLine())
|
||
return;
|
||
|
||
var startOuter = selection.start.column - 1;
|
||
var endOuter = selection.end.column + 1;
|
||
var line = session.getLine(selection.start.row);
|
||
var lineCols = line.length;
|
||
var needle = line.substring(Math.max(startOuter, 0),
|
||
Math.min(endOuter, lineCols));
|
||
if ((startOuter >= 0 && /^[\w\d]/.test(needle)) ||
|
||
(endOuter <= lineCols && /[\w\d]$/.test(needle)))
|
||
return;
|
||
|
||
needle = line.substring(selection.start.column, selection.end.column);
|
||
if (!/^[\w\d]+$/.test(needle))
|
||
return;
|
||
|
||
var re = this.$search.$assembleRegExp({
|
||
wholeWord: true,
|
||
caseSensitive: true,
|
||
needle: needle
|
||
});
|
||
|
||
return re;
|
||
};
|
||
|
||
|
||
this.onChangeFrontMarker = function() {
|
||
this.renderer.updateFrontMarkers();
|
||
};
|
||
|
||
this.onChangeBackMarker = function() {
|
||
this.renderer.updateBackMarkers();
|
||
};
|
||
|
||
|
||
this.onChangeBreakpoint = function() {
|
||
this.renderer.updateBreakpoints();
|
||
};
|
||
|
||
this.onChangeAnnotation = function() {
|
||
this.renderer.setAnnotations(this.session.getAnnotations());
|
||
};
|
||
|
||
|
||
this.onChangeMode = function(e) {
|
||
this.renderer.updateText();
|
||
this._emit("changeMode", e);
|
||
};
|
||
|
||
|
||
this.onChangeWrapLimit = function() {
|
||
this.renderer.updateFull();
|
||
};
|
||
|
||
this.onChangeWrapMode = function() {
|
||
this.renderer.onResize(true);
|
||
};
|
||
|
||
|
||
this.onChangeFold = function() {
|
||
this.$updateHighlightActiveLine();
|
||
this.renderer.updateFull();
|
||
};
|
||
this.getSelectedText = function() {
|
||
return this.session.getTextRange(this.getSelectionRange());
|
||
};
|
||
this.getCopyText = function() {
|
||
var text = this.getSelectedText();
|
||
this._signal("copy", text);
|
||
return text;
|
||
};
|
||
this.onCopy = function() {
|
||
this.commands.exec("copy", this);
|
||
};
|
||
this.onCut = function() {
|
||
this.commands.exec("cut", this);
|
||
};
|
||
this.onPaste = function(text, event) {
|
||
var e = {text: text, event: event};
|
||
this.commands.exec("paste", this, e);
|
||
};
|
||
|
||
this.$handlePaste = function(e) {
|
||
if (typeof e == "string")
|
||
e = {text: e};
|
||
this._signal("paste", e);
|
||
var text = e.text;
|
||
if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {
|
||
this.insert(text);
|
||
} else {
|
||
var lines = text.split(/\r\n|\r|\n/);
|
||
var ranges = this.selection.rangeList.ranges;
|
||
|
||
if (lines.length > ranges.length || lines.length < 2 || !lines[1])
|
||
return this.commands.exec("insertstring", this, text);
|
||
|
||
for (var i = ranges.length; i--;) {
|
||
var range = ranges[i];
|
||
if (!range.isEmpty())
|
||
this.session.remove(range);
|
||
|
||
this.session.insert(range.start, lines[i]);
|
||
}
|
||
}
|
||
};
|
||
|
||
this.execCommand = function(command, args) {
|
||
return this.commands.exec(command, this, args);
|
||
};
|
||
this.insert = function(text, pasted) {
|
||
var session = this.session;
|
||
var mode = session.getMode();
|
||
var cursor = this.getCursorPosition();
|
||
|
||
if (this.getBehavioursEnabled() && !pasted) {
|
||
var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);
|
||
if (transform) {
|
||
if (text !== transform.text) {
|
||
this.session.mergeUndoDeltas = false;
|
||
this.$mergeNextCommand = false;
|
||
}
|
||
text = transform.text;
|
||
|
||
}
|
||
}
|
||
|
||
if (text == "\t")
|
||
text = this.session.getTabString();
|
||
if (!this.selection.isEmpty()) {
|
||
var range = this.getSelectionRange();
|
||
cursor = this.session.remove(range);
|
||
this.clearSelection();
|
||
}
|
||
else if (this.session.getOverwrite()) {
|
||
var range = new Range.fromPoints(cursor, cursor);
|
||
range.end.column += text.length;
|
||
this.session.remove(range);
|
||
}
|
||
|
||
if (text == "\n" || text == "\r\n") {
|
||
var line = session.getLine(cursor.row);
|
||
if (cursor.column > line.search(/\S|$/)) {
|
||
var d = line.substr(cursor.column).search(/\S|$/);
|
||
session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);
|
||
}
|
||
}
|
||
this.clearSelection();
|
||
|
||
var start = cursor.column;
|
||
var lineState = session.getState(cursor.row);
|
||
var line = session.getLine(cursor.row);
|
||
var shouldOutdent = mode.checkOutdent(lineState, line, text);
|
||
var end = session.insert(cursor, text);
|
||
|
||
if (transform && transform.selection) {
|
||
if (transform.selection.length == 2) { // Transform relative to the current column
|
||
this.selection.setSelectionRange(
|
||
new Range(cursor.row, start + transform.selection[0],
|
||
cursor.row, start + transform.selection[1]));
|
||
} else { // Transform relative to the current row.
|
||
this.selection.setSelectionRange(
|
||
new Range(cursor.row + transform.selection[0],
|
||
transform.selection[1],
|
||
cursor.row + transform.selection[2],
|
||
transform.selection[3]));
|
||
}
|
||
}
|
||
|
||
if (session.getDocument().isNewLine(text)) {
|
||
var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());
|
||
|
||
session.insert({row: cursor.row+1, column: 0}, lineIndent);
|
||
}
|
||
if (shouldOutdent)
|
||
mode.autoOutdent(lineState, session, cursor.row);
|
||
};
|
||
|
||
this.onTextInput = function(text) {
|
||
this.keyBinding.onTextInput(text);
|
||
};
|
||
|
||
this.onCommandKey = function(e, hashId, keyCode) {
|
||
this.keyBinding.onCommandKey(e, hashId, keyCode);
|
||
};
|
||
this.setOverwrite = function(overwrite) {
|
||
this.session.setOverwrite(overwrite);
|
||
};
|
||
this.getOverwrite = function() {
|
||
return this.session.getOverwrite();
|
||
};
|
||
this.toggleOverwrite = function() {
|
||
this.session.toggleOverwrite();
|
||
};
|
||
this.setScrollSpeed = function(speed) {
|
||
this.setOption("scrollSpeed", speed);
|
||
};
|
||
this.getScrollSpeed = function() {
|
||
return this.getOption("scrollSpeed");
|
||
};
|
||
this.setDragDelay = function(dragDelay) {
|
||
this.setOption("dragDelay", dragDelay);
|
||
};
|
||
this.getDragDelay = function() {
|
||
return this.getOption("dragDelay");
|
||
};
|
||
this.setSelectionStyle = function(val) {
|
||
this.setOption("selectionStyle", val);
|
||
};
|
||
this.getSelectionStyle = function() {
|
||
return this.getOption("selectionStyle");
|
||
};
|
||
this.setHighlightActiveLine = function(shouldHighlight) {
|
||
this.setOption("highlightActiveLine", shouldHighlight);
|
||
};
|
||
this.getHighlightActiveLine = function() {
|
||
return this.getOption("highlightActiveLine");
|
||
};
|
||
this.setHighlightGutterLine = function(shouldHighlight) {
|
||
this.setOption("highlightGutterLine", shouldHighlight);
|
||
};
|
||
|
||
this.getHighlightGutterLine = function() {
|
||
return this.getOption("highlightGutterLine");
|
||
};
|
||
this.setHighlightSelectedWord = function(shouldHighlight) {
|
||
this.setOption("highlightSelectedWord", shouldHighlight);
|
||
};
|
||
this.getHighlightSelectedWord = function() {
|
||
return this.$highlightSelectedWord;
|
||
};
|
||
|
||
this.setAnimatedScroll = function(shouldAnimate){
|
||
this.renderer.setAnimatedScroll(shouldAnimate);
|
||
};
|
||
|
||
this.getAnimatedScroll = function(){
|
||
return this.renderer.getAnimatedScroll();
|
||
};
|
||
this.setShowInvisibles = function(showInvisibles) {
|
||
this.renderer.setShowInvisibles(showInvisibles);
|
||
};
|
||
this.getShowInvisibles = function() {
|
||
return this.renderer.getShowInvisibles();
|
||
};
|
||
|
||
this.setDisplayIndentGuides = function(display) {
|
||
this.renderer.setDisplayIndentGuides(display);
|
||
};
|
||
|
||
this.getDisplayIndentGuides = function() {
|
||
return this.renderer.getDisplayIndentGuides();
|
||
};
|
||
this.setShowPrintMargin = function(showPrintMargin) {
|
||
this.renderer.setShowPrintMargin(showPrintMargin);
|
||
};
|
||
this.getShowPrintMargin = function() {
|
||
return this.renderer.getShowPrintMargin();
|
||
};
|
||
this.setPrintMarginColumn = function(showPrintMargin) {
|
||
this.renderer.setPrintMarginColumn(showPrintMargin);
|
||
};
|
||
this.getPrintMarginColumn = function() {
|
||
return this.renderer.getPrintMarginColumn();
|
||
};
|
||
this.setReadOnly = function(readOnly) {
|
||
this.setOption("readOnly", readOnly);
|
||
};
|
||
this.getReadOnly = function() {
|
||
return this.getOption("readOnly");
|
||
};
|
||
this.setBehavioursEnabled = function (enabled) {
|
||
this.setOption("behavioursEnabled", enabled);
|
||
};
|
||
this.getBehavioursEnabled = function () {
|
||
return this.getOption("behavioursEnabled");
|
||
};
|
||
this.setWrapBehavioursEnabled = function (enabled) {
|
||
this.setOption("wrapBehavioursEnabled", enabled);
|
||
};
|
||
this.getWrapBehavioursEnabled = function () {
|
||
return this.getOption("wrapBehavioursEnabled");
|
||
};
|
||
this.setShowFoldWidgets = function(show) {
|
||
this.setOption("showFoldWidgets", show);
|
||
|
||
};
|
||
this.getShowFoldWidgets = function() {
|
||
return this.getOption("showFoldWidgets");
|
||
};
|
||
|
||
this.setFadeFoldWidgets = function(fade) {
|
||
this.setOption("fadeFoldWidgets", fade);
|
||
};
|
||
|
||
this.getFadeFoldWidgets = function() {
|
||
return this.getOption("fadeFoldWidgets");
|
||
};
|
||
this.remove = function(dir) {
|
||
if (this.selection.isEmpty()){
|
||
if (dir == "left")
|
||
this.selection.selectLeft();
|
||
else
|
||
this.selection.selectRight();
|
||
}
|
||
|
||
var range = this.getSelectionRange();
|
||
if (this.getBehavioursEnabled()) {
|
||
var session = this.session;
|
||
var state = session.getState(range.start.row);
|
||
var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);
|
||
|
||
if (range.end.column === 0) {
|
||
var text = session.getTextRange(range);
|
||
if (text[text.length - 1] == "\n") {
|
||
var line = session.getLine(range.end.row);
|
||
if (/^\s+$/.test(line)) {
|
||
range.end.column = line.length;
|
||
}
|
||
}
|
||
}
|
||
if (new_range)
|
||
range = new_range;
|
||
}
|
||
|
||
this.session.remove(range);
|
||
this.clearSelection();
|
||
};
|
||
this.removeWordRight = function() {
|
||
if (this.selection.isEmpty())
|
||
this.selection.selectWordRight();
|
||
|
||
this.session.remove(this.getSelectionRange());
|
||
this.clearSelection();
|
||
};
|
||
this.removeWordLeft = function() {
|
||
if (this.selection.isEmpty())
|
||
this.selection.selectWordLeft();
|
||
|
||
this.session.remove(this.getSelectionRange());
|
||
this.clearSelection();
|
||
};
|
||
this.removeToLineStart = function() {
|
||
if (this.selection.isEmpty())
|
||
this.selection.selectLineStart();
|
||
|
||
this.session.remove(this.getSelectionRange());
|
||
this.clearSelection();
|
||
};
|
||
this.removeToLineEnd = function() {
|
||
if (this.selection.isEmpty())
|
||
this.selection.selectLineEnd();
|
||
|
||
var range = this.getSelectionRange();
|
||
if (range.start.column == range.end.column && range.start.row == range.end.row) {
|
||
range.end.column = 0;
|
||
range.end.row++;
|
||
}
|
||
|
||
this.session.remove(range);
|
||
this.clearSelection();
|
||
};
|
||
this.splitLine = function() {
|
||
if (!this.selection.isEmpty()) {
|
||
this.session.remove(this.getSelectionRange());
|
||
this.clearSelection();
|
||
}
|
||
|
||
var cursor = this.getCursorPosition();
|
||
this.insert("\n");
|
||
this.moveCursorToPosition(cursor);
|
||
};
|
||
this.transposeLetters = function() {
|
||
if (!this.selection.isEmpty()) {
|
||
return;
|
||
}
|
||
|
||
var cursor = this.getCursorPosition();
|
||
var column = cursor.column;
|
||
if (column === 0)
|
||
return;
|
||
|
||
var line = this.session.getLine(cursor.row);
|
||
var swap, range;
|
||
if (column < line.length) {
|
||
swap = line.charAt(column) + line.charAt(column-1);
|
||
range = new Range(cursor.row, column-1, cursor.row, column+1);
|
||
}
|
||
else {
|
||
swap = line.charAt(column-1) + line.charAt(column-2);
|
||
range = new Range(cursor.row, column-2, cursor.row, column);
|
||
}
|
||
this.session.replace(range, swap);
|
||
};
|
||
this.toLowerCase = function() {
|
||
var originalRange = this.getSelectionRange();
|
||
if (this.selection.isEmpty()) {
|
||
this.selection.selectWord();
|
||
}
|
||
|
||
var range = this.getSelectionRange();
|
||
var text = this.session.getTextRange(range);
|
||
this.session.replace(range, text.toLowerCase());
|
||
this.selection.setSelectionRange(originalRange);
|
||
};
|
||
this.toUpperCase = function() {
|
||
var originalRange = this.getSelectionRange();
|
||
if (this.selection.isEmpty()) {
|
||
this.selection.selectWord();
|
||
}
|
||
|
||
var range = this.getSelectionRange();
|
||
var text = this.session.getTextRange(range);
|
||
this.session.replace(range, text.toUpperCase());
|
||
this.selection.setSelectionRange(originalRange);
|
||
};
|
||
this.indent = function() {
|
||
var session = this.session;
|
||
var range = this.getSelectionRange();
|
||
|
||
if (range.start.row < range.end.row) {
|
||
var rows = this.$getSelectedRows();
|
||
session.indentRows(rows.first, rows.last, "\t");
|
||
return;
|
||
} else if (range.start.column < range.end.column) {
|
||
var text = session.getTextRange(range);
|
||
if (!/^\s+$/.test(text)) {
|
||
var rows = this.$getSelectedRows();
|
||
session.indentRows(rows.first, rows.last, "\t");
|
||
return;
|
||
}
|
||
}
|
||
|
||
var line = session.getLine(range.start.row);
|
||
var position = range.start;
|
||
var size = session.getTabSize();
|
||
var column = session.documentToScreenColumn(position.row, position.column);
|
||
|
||
if (this.session.getUseSoftTabs()) {
|
||
var count = (size - column % size);
|
||
var indentString = lang.stringRepeat(" ", count);
|
||
} else {
|
||
var count = column % size;
|
||
while (line[range.start.column] == " " && count) {
|
||
range.start.column--;
|
||
count--;
|
||
}
|
||
this.selection.setSelectionRange(range);
|
||
indentString = "\t";
|
||
}
|
||
return this.insert(indentString);
|
||
};
|
||
this.blockIndent = function() {
|
||
var rows = this.$getSelectedRows();
|
||
this.session.indentRows(rows.first, rows.last, "\t");
|
||
};
|
||
this.blockOutdent = function() {
|
||
var selection = this.session.getSelection();
|
||
this.session.outdentRows(selection.getRange());
|
||
};
|
||
this.sortLines = function() {
|
||
var rows = this.$getSelectedRows();
|
||
var session = this.session;
|
||
|
||
var lines = [];
|
||
for (i = rows.first; i <= rows.last; i++)
|
||
lines.push(session.getLine(i));
|
||
|
||
lines.sort(function(a, b) {
|
||
if (a.toLowerCase() < b.toLowerCase()) return -1;
|
||
if (a.toLowerCase() > b.toLowerCase()) return 1;
|
||
return 0;
|
||
});
|
||
|
||
var deleteRange = new Range(0, 0, 0, 0);
|
||
for (var i = rows.first; i <= rows.last; i++) {
|
||
var line = session.getLine(i);
|
||
deleteRange.start.row = i;
|
||
deleteRange.end.row = i;
|
||
deleteRange.end.column = line.length;
|
||
session.replace(deleteRange, lines[i-rows.first]);
|
||
}
|
||
};
|
||
this.toggleCommentLines = function() {
|
||
var state = this.session.getState(this.getCursorPosition().row);
|
||
var rows = this.$getSelectedRows();
|
||
this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);
|
||
};
|
||
|
||
this.toggleBlockComment = function() {
|
||
var cursor = this.getCursorPosition();
|
||
var state = this.session.getState(cursor.row);
|
||
var range = this.getSelectionRange();
|
||
this.session.getMode().toggleBlockComment(state, this.session, range, cursor);
|
||
};
|
||
this.getNumberAt = function(row, column) {
|
||
var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g;
|
||
_numberRx.lastIndex = 0;
|
||
|
||
var s = this.session.getLine(row);
|
||
while (_numberRx.lastIndex < column) {
|
||
var m = _numberRx.exec(s);
|
||
if(m.index <= column && m.index+m[0].length >= column){
|
||
var number = {
|
||
value: m[0],
|
||
start: m.index,
|
||
end: m.index+m[0].length
|
||
};
|
||
return number;
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
this.modifyNumber = function(amount) {
|
||
var row = this.selection.getCursor().row;
|
||
var column = this.selection.getCursor().column;
|
||
var charRange = new Range(row, column-1, row, column);
|
||
|
||
var c = this.session.getTextRange(charRange);
|
||
if (!isNaN(parseFloat(c)) && isFinite(c)) {
|
||
var nr = this.getNumberAt(row, column);
|
||
if (nr) {
|
||
var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end;
|
||
var decimals = nr.start + nr.value.length - fp;
|
||
|
||
var t = parseFloat(nr.value);
|
||
t *= Math.pow(10, decimals);
|
||
|
||
|
||
if(fp !== nr.end && column < fp){
|
||
amount *= Math.pow(10, nr.end - column - 1);
|
||
} else {
|
||
amount *= Math.pow(10, nr.end - column);
|
||
}
|
||
|
||
t += amount;
|
||
t /= Math.pow(10, decimals);
|
||
var nnr = t.toFixed(decimals);
|
||
var replaceRange = new Range(row, nr.start, row, nr.end);
|
||
this.session.replace(replaceRange, nnr);
|
||
this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));
|
||
|
||
}
|
||
}
|
||
};
|
||
this.removeLines = function() {
|
||
var rows = this.$getSelectedRows();
|
||
this.session.removeFullLines(rows.first, rows.last);
|
||
this.clearSelection();
|
||
};
|
||
|
||
this.duplicateSelection = function() {
|
||
var sel = this.selection;
|
||
var doc = this.session;
|
||
var range = sel.getRange();
|
||
var reverse = sel.isBackwards();
|
||
if (range.isEmpty()) {
|
||
var row = range.start.row;
|
||
doc.duplicateLines(row, row);
|
||
} else {
|
||
var point = reverse ? range.start : range.end;
|
||
var endPoint = doc.insert(point, doc.getTextRange(range), false);
|
||
range.start = point;
|
||
range.end = endPoint;
|
||
|
||
sel.setSelectionRange(range, reverse);
|
||
}
|
||
};
|
||
this.moveLinesDown = function() {
|
||
this.$moveLines(1, false);
|
||
};
|
||
this.moveLinesUp = function() {
|
||
this.$moveLines(-1, false);
|
||
};
|
||
this.moveText = function(range, toPosition, copy) {
|
||
return this.session.moveText(range, toPosition, copy);
|
||
};
|
||
this.copyLinesUp = function() {
|
||
this.$moveLines(-1, true);
|
||
};
|
||
this.copyLinesDown = function() {
|
||
this.$moveLines(1, true);
|
||
};
|
||
this.$moveLines = function(dir, copy) {
|
||
var rows, moved;
|
||
var selection = this.selection;
|
||
if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {
|
||
var range = selection.toOrientedRange();
|
||
rows = this.$getSelectedRows(range);
|
||
moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);
|
||
if (copy && dir == -1) moved = 0;
|
||
range.moveBy(moved, 0);
|
||
selection.fromOrientedRange(range);
|
||
} else {
|
||
var ranges = selection.rangeList.ranges;
|
||
selection.rangeList.detach(this.session);
|
||
this.inVirtualSelectionMode = true;
|
||
|
||
var diff = 0;
|
||
var totalDiff = 0;
|
||
var l = ranges.length;
|
||
for (var i = 0; i < l; i++) {
|
||
var rangeIndex = i;
|
||
ranges[i].moveBy(diff, 0);
|
||
rows = this.$getSelectedRows(ranges[i]);
|
||
var first = rows.first;
|
||
var last = rows.last;
|
||
while (++i < l) {
|
||
if (totalDiff) ranges[i].moveBy(totalDiff, 0);
|
||
var subRows = this.$getSelectedRows(ranges[i]);
|
||
if (copy && subRows.first != last)
|
||
break;
|
||
else if (!copy && subRows.first > last + 1)
|
||
break;
|
||
last = subRows.last;
|
||
}
|
||
i--;
|
||
diff = this.session.$moveLines(first, last, copy ? 0 : dir);
|
||
if (copy && dir == -1) rangeIndex = i + 1;
|
||
while (rangeIndex <= i) {
|
||
ranges[rangeIndex].moveBy(diff, 0);
|
||
rangeIndex++;
|
||
}
|
||
if (!copy) diff = 0;
|
||
totalDiff += diff;
|
||
}
|
||
|
||
selection.fromOrientedRange(selection.ranges[0]);
|
||
selection.rangeList.attach(this.session);
|
||
this.inVirtualSelectionMode = false;
|
||
}
|
||
};
|
||
this.$getSelectedRows = function(range) {
|
||
range = (range || this.getSelectionRange()).collapseRows();
|
||
|
||
return {
|
||
first: this.session.getRowFoldStart(range.start.row),
|
||
last: this.session.getRowFoldEnd(range.end.row)
|
||
};
|
||
};
|
||
|
||
this.onCompositionStart = function(text) {
|
||
this.renderer.showComposition(this.getCursorPosition());
|
||
};
|
||
|
||
this.onCompositionUpdate = function(text) {
|
||
this.renderer.setCompositionText(text);
|
||
};
|
||
|
||
this.onCompositionEnd = function() {
|
||
this.renderer.hideComposition();
|
||
};
|
||
this.getFirstVisibleRow = function() {
|
||
return this.renderer.getFirstVisibleRow();
|
||
};
|
||
this.getLastVisibleRow = function() {
|
||
return this.renderer.getLastVisibleRow();
|
||
};
|
||
this.isRowVisible = function(row) {
|
||
return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());
|
||
};
|
||
this.isRowFullyVisible = function(row) {
|
||
return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());
|
||
};
|
||
this.$getVisibleRowCount = function() {
|
||
return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;
|
||
};
|
||
|
||
this.$moveByPage = function(dir, select) {
|
||
var renderer = this.renderer;
|
||
var config = this.renderer.layerConfig;
|
||
var rows = dir * Math.floor(config.height / config.lineHeight);
|
||
|
||
this.$blockScrolling++;
|
||
if (select === true) {
|
||
this.selection.$moveSelection(function(){
|
||
this.moveCursorBy(rows, 0);
|
||
});
|
||
} else if (select === false) {
|
||
this.selection.moveCursorBy(rows, 0);
|
||
this.selection.clearSelection();
|
||
}
|
||
this.$blockScrolling--;
|
||
|
||
var scrollTop = renderer.scrollTop;
|
||
|
||
renderer.scrollBy(0, rows * config.lineHeight);
|
||
if (select != null)
|
||
renderer.scrollCursorIntoView(null, 0.5);
|
||
|
||
renderer.animateScrolling(scrollTop);
|
||
};
|
||
this.selectPageDown = function() {
|
||
this.$moveByPage(1, true);
|
||
};
|
||
this.selectPageUp = function() {
|
||
this.$moveByPage(-1, true);
|
||
};
|
||
this.gotoPageDown = function() {
|
||
this.$moveByPage(1, false);
|
||
};
|
||
this.gotoPageUp = function() {
|
||
this.$moveByPage(-1, false);
|
||
};
|
||
this.scrollPageDown = function() {
|
||
this.$moveByPage(1);
|
||
};
|
||
this.scrollPageUp = function() {
|
||
this.$moveByPage(-1);
|
||
};
|
||
this.scrollToRow = function(row) {
|
||
this.renderer.scrollToRow(row);
|
||
};
|
||
this.scrollToLine = function(line, center, animate, callback) {
|
||
this.renderer.scrollToLine(line, center, animate, callback);
|
||
};
|
||
this.centerSelection = function() {
|
||
var range = this.getSelectionRange();
|
||
var pos = {
|
||
row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),
|
||
column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)
|
||
};
|
||
this.renderer.alignCursor(pos, 0.5);
|
||
};
|
||
this.getCursorPosition = function() {
|
||
return this.selection.getCursor();
|
||
};
|
||
this.getCursorPositionScreen = function() {
|
||
return this.session.documentToScreenPosition(this.getCursorPosition());
|
||
};
|
||
this.getSelectionRange = function() {
|
||
return this.selection.getRange();
|
||
};
|
||
this.selectAll = function() {
|
||
this.$blockScrolling += 1;
|
||
this.selection.selectAll();
|
||
this.$blockScrolling -= 1;
|
||
};
|
||
this.clearSelection = function() {
|
||
this.selection.clearSelection();
|
||
};
|
||
this.moveCursorTo = function(row, column) {
|
||
this.selection.moveCursorTo(row, column);
|
||
};
|
||
this.moveCursorToPosition = function(pos) {
|
||
this.selection.moveCursorToPosition(pos);
|
||
};
|
||
this.jumpToMatching = function(select, expand) {
|
||
var cursor = this.getCursorPosition();
|
||
var iterator = new TokenIterator(this.session, cursor.row, cursor.column);
|
||
var prevToken = iterator.getCurrentToken();
|
||
var token = prevToken || iterator.stepForward();
|
||
|
||
if (!token) return;
|
||
var matchType;
|
||
var found = false;
|
||
var depth = {};
|
||
var i = cursor.column - token.start;
|
||
var bracketType;
|
||
var brackets = {
|
||
")": "(",
|
||
"(": "(",
|
||
"]": "[",
|
||
"[": "[",
|
||
"{": "{",
|
||
"}": "{"
|
||
};
|
||
|
||
do {
|
||
if (token.value.match(/[{}()\[\]]/g)) {
|
||
for (; i < token.value.length && !found; i++) {
|
||
if (!brackets[token.value[i]]) {
|
||
continue;
|
||
}
|
||
|
||
bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen");
|
||
|
||
if (isNaN(depth[bracketType])) {
|
||
depth[bracketType] = 0;
|
||
}
|
||
|
||
switch (token.value[i]) {
|
||
case '(':
|
||
case '[':
|
||
case '{':
|
||
depth[bracketType]++;
|
||
break;
|
||
case ')':
|
||
case ']':
|
||
case '}':
|
||
depth[bracketType]--;
|
||
|
||
if (depth[bracketType] === -1) {
|
||
matchType = 'bracket';
|
||
found = true;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else if (token && token.type.indexOf('tag-name') !== -1) {
|
||
if (isNaN(depth[token.value])) {
|
||
depth[token.value] = 0;
|
||
}
|
||
|
||
if (prevToken.value === '<') {
|
||
depth[token.value]++;
|
||
}
|
||
else if (prevToken.value === '</') {
|
||
depth[token.value]--;
|
||
}
|
||
|
||
if (depth[token.value] === -1) {
|
||
matchType = 'tag';
|
||
found = true;
|
||
}
|
||
}
|
||
|
||
if (!found) {
|
||
prevToken = token;
|
||
token = iterator.stepForward();
|
||
i = 0;
|
||
}
|
||
} while (token && !found);
|
||
if (!matchType)
|
||
return;
|
||
|
||
var range, pos;
|
||
if (matchType === 'bracket') {
|
||
range = this.session.getBracketRange(cursor);
|
||
if (!range) {
|
||
range = new Range(
|
||
iterator.getCurrentTokenRow(),
|
||
iterator.getCurrentTokenColumn() + i - 1,
|
||
iterator.getCurrentTokenRow(),
|
||
iterator.getCurrentTokenColumn() + i - 1
|
||
);
|
||
pos = range.start;
|
||
if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)
|
||
range = this.session.getBracketRange(pos);
|
||
}
|
||
}
|
||
else if (matchType === 'tag') {
|
||
if (token && token.type.indexOf('tag-name') !== -1)
|
||
var tag = token.value;
|
||
else
|
||
return;
|
||
|
||
range = new Range(
|
||
iterator.getCurrentTokenRow(),
|
||
iterator.getCurrentTokenColumn() - 2,
|
||
iterator.getCurrentTokenRow(),
|
||
iterator.getCurrentTokenColumn() - 2
|
||
);
|
||
if (range.compare(cursor.row, cursor.column) === 0) {
|
||
found = false;
|
||
do {
|
||
token = prevToken;
|
||
prevToken = iterator.stepBackward();
|
||
|
||
if (prevToken) {
|
||
if (prevToken.type.indexOf('tag-close') !== -1) {
|
||
range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1);
|
||
}
|
||
|
||
if (token.value === tag && token.type.indexOf('tag-name') !== -1) {
|
||
if (prevToken.value === '<') {
|
||
depth[tag]++;
|
||
}
|
||
else if (prevToken.value === '</') {
|
||
depth[tag]--;
|
||
}
|
||
|
||
if (depth[tag] === 0)
|
||
found = true;
|
||
}
|
||
}
|
||
} while (prevToken && !found);
|
||
}
|
||
if (token && token.type.indexOf('tag-name')) {
|
||
pos = range.start;
|
||
if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)
|
||
pos = range.end;
|
||
}
|
||
}
|
||
|
||
pos = range && range.cursor || pos;
|
||
if (pos) {
|
||
if (select) {
|
||
if (range && expand) {
|
||
this.selection.setRange(range);
|
||
} else if (range && range.isEqual(this.getSelectionRange())) {
|
||
this.clearSelection();
|
||
} else {
|
||
this.selection.selectTo(pos.row, pos.column);
|
||
}
|
||
} else {
|
||
this.selection.moveTo(pos.row, pos.column);
|
||
}
|
||
}
|
||
};
|
||
this.gotoLine = function(lineNumber, column, animate) {
|
||
this.selection.clearSelection();
|
||
this.session.unfold({row: lineNumber - 1, column: column || 0});
|
||
|
||
this.$blockScrolling += 1;
|
||
this.exitMultiSelectMode && this.exitMultiSelectMode();
|
||
this.moveCursorTo(lineNumber - 1, column || 0);
|
||
this.$blockScrolling -= 1;
|
||
|
||
if (!this.isRowFullyVisible(lineNumber - 1))
|
||
this.scrollToLine(lineNumber - 1, true, animate);
|
||
};
|
||
this.navigateTo = function(row, column) {
|
||
this.selection.moveTo(row, column);
|
||
};
|
||
this.navigateUp = function(times) {
|
||
if (this.selection.isMultiLine() && !this.selection.isBackwards()) {
|
||
var selectionStart = this.selection.anchor.getPosition();
|
||
return this.moveCursorToPosition(selectionStart);
|
||
}
|
||
this.selection.clearSelection();
|
||
this.selection.moveCursorBy(-times || -1, 0);
|
||
};
|
||
this.navigateDown = function(times) {
|
||
if (this.selection.isMultiLine() && this.selection.isBackwards()) {
|
||
var selectionEnd = this.selection.anchor.getPosition();
|
||
return this.moveCursorToPosition(selectionEnd);
|
||
}
|
||
this.selection.clearSelection();
|
||
this.selection.moveCursorBy(times || 1, 0);
|
||
};
|
||
this.navigateLeft = function(times) {
|
||
if (!this.selection.isEmpty()) {
|
||
var selectionStart = this.getSelectionRange().start;
|
||
this.moveCursorToPosition(selectionStart);
|
||
}
|
||
else {
|
||
times = times || 1;
|
||
while (times--) {
|
||
this.selection.moveCursorLeft();
|
||
}
|
||
}
|
||
this.clearSelection();
|
||
};
|
||
this.navigateRight = function(times) {
|
||
if (!this.selection.isEmpty()) {
|
||
var selectionEnd = this.getSelectionRange().end;
|
||
this.moveCursorToPosition(selectionEnd);
|
||
}
|
||
else {
|
||
times = times || 1;
|
||
while (times--) {
|
||
this.selection.moveCursorRight();
|
||
}
|
||
}
|
||
this.clearSelection();
|
||
};
|
||
this.navigateLineStart = function() {
|
||
this.selection.moveCursorLineStart();
|
||
this.clearSelection();
|
||
};
|
||
this.navigateLineEnd = function() {
|
||
this.selection.moveCursorLineEnd();
|
||
this.clearSelection();
|
||
};
|
||
this.navigateFileEnd = function() {
|
||
this.selection.moveCursorFileEnd();
|
||
this.clearSelection();
|
||
};
|
||
this.navigateFileStart = function() {
|
||
this.selection.moveCursorFileStart();
|
||
this.clearSelection();
|
||
};
|
||
this.navigateWordRight = function() {
|
||
this.selection.moveCursorWordRight();
|
||
this.clearSelection();
|
||
};
|
||
this.navigateWordLeft = function() {
|
||
this.selection.moveCursorWordLeft();
|
||
this.clearSelection();
|
||
};
|
||
this.replace = function(replacement, options) {
|
||
if (options)
|
||
this.$search.set(options);
|
||
|
||
var range = this.$search.find(this.session);
|
||
var replaced = 0;
|
||
if (!range)
|
||
return replaced;
|
||
|
||
if (this.$tryReplace(range, replacement)) {
|
||
replaced = 1;
|
||
}
|
||
if (range !== null) {
|
||
this.selection.setSelectionRange(range);
|
||
this.renderer.scrollSelectionIntoView(range.start, range.end);
|
||
}
|
||
|
||
return replaced;
|
||
};
|
||
this.replaceAll = function(replacement, options) {
|
||
if (options) {
|
||
this.$search.set(options);
|
||
}
|
||
|
||
var ranges = this.$search.findAll(this.session);
|
||
var replaced = 0;
|
||
if (!ranges.length)
|
||
return replaced;
|
||
|
||
this.$blockScrolling += 1;
|
||
|
||
var selection = this.getSelectionRange();
|
||
this.selection.moveTo(0, 0);
|
||
|
||
for (var i = ranges.length - 1; i >= 0; --i) {
|
||
if(this.$tryReplace(ranges[i], replacement)) {
|
||
replaced++;
|
||
}
|
||
}
|
||
|
||
this.selection.setSelectionRange(selection);
|
||
this.$blockScrolling -= 1;
|
||
|
||
return replaced;
|
||
};
|
||
|
||
this.$tryReplace = function(range, replacement) {
|
||
var input = this.session.getTextRange(range);
|
||
replacement = this.$search.replace(input, replacement);
|
||
if (replacement !== null) {
|
||
range.end = this.session.replace(range, replacement);
|
||
return range;
|
||
} else {
|
||
return null;
|
||
}
|
||
};
|
||
this.getLastSearchOptions = function() {
|
||
return this.$search.getOptions();
|
||
};
|
||
this.find = function(needle, options, animate) {
|
||
if (!options)
|
||
options = {};
|
||
|
||
if (typeof needle == "string" || needle instanceof RegExp)
|
||
options.needle = needle;
|
||
else if (typeof needle == "object")
|
||
oop.mixin(options, needle);
|
||
|
||
var range = this.selection.getRange();
|
||
if (options.needle == null) {
|
||
needle = this.session.getTextRange(range)
|
||
|| this.$search.$options.needle;
|
||
if (!needle) {
|
||
range = this.session.getWordRange(range.start.row, range.start.column);
|
||
needle = this.session.getTextRange(range);
|
||
}
|
||
this.$search.set({needle: needle});
|
||
}
|
||
|
||
this.$search.set(options);
|
||
if (!options.start)
|
||
this.$search.set({start: range});
|
||
|
||
var newRange = this.$search.find(this.session);
|
||
if (options.preventScroll)
|
||
return newRange;
|
||
if (newRange) {
|
||
this.revealRange(newRange, animate);
|
||
return newRange;
|
||
}
|
||
if (options.backwards)
|
||
range.start = range.end;
|
||
else
|
||
range.end = range.start;
|
||
this.selection.setRange(range);
|
||
};
|
||
this.findNext = function(options, animate) {
|
||
this.find({skipCurrent: true, backwards: false}, options, animate);
|
||
};
|
||
this.findPrevious = function(options, animate) {
|
||
this.find(options, {skipCurrent: true, backwards: true}, animate);
|
||
};
|
||
|
||
this.revealRange = function(range, animate) {
|
||
this.$blockScrolling += 1;
|
||
this.session.unfold(range);
|
||
this.selection.setSelectionRange(range);
|
||
this.$blockScrolling -= 1;
|
||
|
||
var scrollTop = this.renderer.scrollTop;
|
||
this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);
|
||
if (animate !== false)
|
||
this.renderer.animateScrolling(scrollTop);
|
||
};
|
||
this.undo = function() {
|
||
this.$blockScrolling++;
|
||
this.session.getUndoManager().undo();
|
||
this.$blockScrolling--;
|
||
this.renderer.scrollCursorIntoView(null, 0.5);
|
||
};
|
||
this.redo = function() {
|
||
this.$blockScrolling++;
|
||
this.session.getUndoManager().redo();
|
||
this.$blockScrolling--;
|
||
this.renderer.scrollCursorIntoView(null, 0.5);
|
||
};
|
||
this.destroy = function() {
|
||
this.renderer.destroy();
|
||
this._signal("destroy", this);
|
||
if (this.session) {
|
||
this.session.destroy();
|
||
}
|
||
};
|
||
this.setAutoScrollEditorIntoView = function(enable) {
|
||
if (!enable)
|
||
return;
|
||
var rect;
|
||
var self = this;
|
||
var shouldScroll = false;
|
||
if (!this.$scrollAnchor)
|
||
this.$scrollAnchor = document.createElement("div");
|
||
var scrollAnchor = this.$scrollAnchor;
|
||
scrollAnchor.style.cssText = "position:absolute";
|
||
this.container.insertBefore(scrollAnchor, this.container.firstChild);
|
||
var onChangeSelection = this.on("changeSelection", function() {
|
||
shouldScroll = true;
|
||
});
|
||
var onBeforeRender = this.renderer.on("beforeRender", function() {
|
||
if (shouldScroll)
|
||
rect = self.renderer.container.getBoundingClientRect();
|
||
});
|
||
var onAfterRender = this.renderer.on("afterRender", function() {
|
||
if (shouldScroll && rect && (self.isFocused()
|
||
|| self.searchBox && self.searchBox.isFocused())
|
||
) {
|
||
var renderer = self.renderer;
|
||
var pos = renderer.$cursorLayer.$pixelPos;
|
||
var config = renderer.layerConfig;
|
||
var top = pos.top - config.offset;
|
||
if (pos.top >= 0 && top + rect.top < 0) {
|
||
shouldScroll = true;
|
||
} else if (pos.top < config.height &&
|
||
pos.top + rect.top + config.lineHeight > window.innerHeight) {
|
||
shouldScroll = false;
|
||
} else {
|
||
shouldScroll = null;
|
||
}
|
||
if (shouldScroll != null) {
|
||
scrollAnchor.style.top = top + "px";
|
||
scrollAnchor.style.left = pos.left + "px";
|
||
scrollAnchor.style.height = config.lineHeight + "px";
|
||
scrollAnchor.scrollIntoView(shouldScroll);
|
||
}
|
||
shouldScroll = rect = null;
|
||
}
|
||
});
|
||
this.setAutoScrollEditorIntoView = function(enable) {
|
||
if (enable)
|
||
return;
|
||
delete this.setAutoScrollEditorIntoView;
|
||
this.off("changeSelection", onChangeSelection);
|
||
this.renderer.off("afterRender", onAfterRender);
|
||
this.renderer.off("beforeRender", onBeforeRender);
|
||
};
|
||
};
|
||
|
||
|
||
this.$resetCursorStyle = function() {
|
||
var style = this.$cursorStyle || "ace";
|
||
var cursorLayer = this.renderer.$cursorLayer;
|
||
if (!cursorLayer)
|
||
return;
|
||
cursorLayer.setSmoothBlinking(/smooth/.test(style));
|
||
cursorLayer.isBlinking = !this.$readOnly && style != "wide";
|
||
dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style));
|
||
};
|
||
|
||
}).call(Editor.prototype);
|
||
|
||
|
||
|
||
config.defineOptions(Editor.prototype, "editor", {
|
||
selectionStyle: {
|
||
set: function(style) {
|
||
this.onSelectionChange();
|
||
this._signal("changeSelectionStyle", {data: style});
|
||
},
|
||
initialValue: "line"
|
||
},
|
||
highlightActiveLine: {
|
||
set: function() {this.$updateHighlightActiveLine();},
|
||
initialValue: true
|
||
},
|
||
highlightSelectedWord: {
|
||
set: function(shouldHighlight) {this.$onSelectionChange();},
|
||
initialValue: true
|
||
},
|
||
readOnly: {
|
||
set: function(readOnly) {
|
||
this.$resetCursorStyle();
|
||
},
|
||
initialValue: false
|
||
},
|
||
cursorStyle: {
|
||
set: function(val) { this.$resetCursorStyle(); },
|
||
values: ["ace", "slim", "smooth", "wide"],
|
||
initialValue: "ace"
|
||
},
|
||
mergeUndoDeltas: {
|
||
values: [false, true, "always"],
|
||
initialValue: true
|
||
},
|
||
behavioursEnabled: {initialValue: true},
|
||
wrapBehavioursEnabled: {initialValue: true},
|
||
autoScrollEditorIntoView: {
|
||
set: function(val) {this.setAutoScrollEditorIntoView(val)}
|
||
},
|
||
keyboardHandler: {
|
||
set: function(val) { this.setKeyboardHandler(val); },
|
||
get: function() { return this.keybindingId; },
|
||
handlesSet: true
|
||
},
|
||
|
||
hScrollBarAlwaysVisible: "renderer",
|
||
vScrollBarAlwaysVisible: "renderer",
|
||
highlightGutterLine: "renderer",
|
||
animatedScroll: "renderer",
|
||
showInvisibles: "renderer",
|
||
showPrintMargin: "renderer",
|
||
printMarginColumn: "renderer",
|
||
printMargin: "renderer",
|
||
fadeFoldWidgets: "renderer",
|
||
showFoldWidgets: "renderer",
|
||
showLineNumbers: "renderer",
|
||
showGutter: "renderer",
|
||
displayIndentGuides: "renderer",
|
||
fontSize: "renderer",
|
||
fontFamily: "renderer",
|
||
maxLines: "renderer",
|
||
minLines: "renderer",
|
||
scrollPastEnd: "renderer",
|
||
fixedWidthGutter: "renderer",
|
||
theme: "renderer",
|
||
|
||
scrollSpeed: "$mouseHandler",
|
||
dragDelay: "$mouseHandler",
|
||
dragEnabled: "$mouseHandler",
|
||
focusTimout: "$mouseHandler",
|
||
tooltipFollowsMouse: "$mouseHandler",
|
||
|
||
firstLineNumber: "session",
|
||
overwrite: "session",
|
||
newLineMode: "session",
|
||
useWorker: "session",
|
||
useSoftTabs: "session",
|
||
tabSize: "session",
|
||
wrap: "session",
|
||
indentedSoftWrap: "session",
|
||
foldStyle: "session",
|
||
mode: "session"
|
||
});
|
||
|
||
exports.Editor = Editor;
|
||
});
|
||
|
||
ace.define("ace/undomanager",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var UndoManager = function() {
|
||
this.reset();
|
||
};
|
||
|
||
(function() {
|
||
this.execute = function(options) {
|
||
var deltaSets = options.args[0];
|
||
this.$doc = options.args[1];
|
||
if (options.merge && this.hasUndo()){
|
||
this.dirtyCounter--;
|
||
deltaSets = this.$undoStack.pop().concat(deltaSets);
|
||
}
|
||
this.$undoStack.push(deltaSets);
|
||
this.$redoStack = [];
|
||
if (this.dirtyCounter < 0) {
|
||
this.dirtyCounter = NaN;
|
||
}
|
||
this.dirtyCounter++;
|
||
};
|
||
this.undo = function(dontSelect) {
|
||
var deltaSets = this.$undoStack.pop();
|
||
var undoSelectionRange = null;
|
||
if (deltaSets) {
|
||
undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);
|
||
this.$redoStack.push(deltaSets);
|
||
this.dirtyCounter--;
|
||
}
|
||
|
||
return undoSelectionRange;
|
||
};
|
||
this.redo = function(dontSelect) {
|
||
var deltaSets = this.$redoStack.pop();
|
||
var redoSelectionRange = null;
|
||
if (deltaSets) {
|
||
redoSelectionRange =
|
||
this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);
|
||
this.$undoStack.push(deltaSets);
|
||
this.dirtyCounter++;
|
||
}
|
||
return redoSelectionRange;
|
||
};
|
||
this.reset = function() {
|
||
this.$undoStack = [];
|
||
this.$redoStack = [];
|
||
this.dirtyCounter = 0;
|
||
};
|
||
this.hasUndo = function() {
|
||
return this.$undoStack.length > 0;
|
||
};
|
||
this.hasRedo = function() {
|
||
return this.$redoStack.length > 0;
|
||
};
|
||
this.markClean = function() {
|
||
this.dirtyCounter = 0;
|
||
};
|
||
this.isClean = function() {
|
||
return this.dirtyCounter === 0;
|
||
};
|
||
this.$serializeDeltas = function(deltaSets) {
|
||
return cloneDeltaSetsObj(deltaSets, $serializeDelta);
|
||
};
|
||
this.$deserializeDeltas = function(deltaSets) {
|
||
return cloneDeltaSetsObj(deltaSets, $deserializeDelta);
|
||
};
|
||
|
||
function $serializeDelta(delta){
|
||
return {
|
||
action: delta.action,
|
||
start: delta.start,
|
||
end: delta.end,
|
||
lines: delta.lines.length == 1 ? null : delta.lines,
|
||
text: delta.lines.length == 1 ? delta.lines[0] : null
|
||
};
|
||
}
|
||
|
||
function $deserializeDelta(delta) {
|
||
return {
|
||
action: delta.action,
|
||
start: delta.start,
|
||
end: delta.end,
|
||
lines: delta.lines || [delta.text]
|
||
};
|
||
}
|
||
|
||
function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {
|
||
var deltaSets_new = new Array(deltaSets_old.length);
|
||
for (var i = 0; i < deltaSets_old.length; i++) {
|
||
var deltaSet_old = deltaSets_old[i];
|
||
var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};
|
||
|
||
for (var j = 0; j < deltaSet_old.deltas.length; j++) {
|
||
var delta_old = deltaSet_old.deltas[j];
|
||
deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);
|
||
}
|
||
|
||
deltaSets_new[i] = deltaSet_new;
|
||
}
|
||
return deltaSets_new;
|
||
}
|
||
|
||
}).call(UndoManager.prototype);
|
||
|
||
exports.UndoManager = UndoManager;
|
||
});
|
||
|
||
ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
var oop = acequire("../lib/oop");
|
||
var lang = acequire("../lib/lang");
|
||
var EventEmitter = acequire("../lib/event_emitter").EventEmitter;
|
||
|
||
var Gutter = function(parentEl) {
|
||
this.element = dom.createElement("div");
|
||
this.element.className = "ace_layer ace_gutter-layer";
|
||
parentEl.appendChild(this.element);
|
||
this.setShowFoldWidgets(this.$showFoldWidgets);
|
||
|
||
this.gutterWidth = 0;
|
||
|
||
this.$annotations = [];
|
||
this.$updateAnnotations = this.$updateAnnotations.bind(this);
|
||
|
||
this.$cells = [];
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.setSession = function(session) {
|
||
if (this.session)
|
||
this.session.removeEventListener("change", this.$updateAnnotations);
|
||
this.session = session;
|
||
if (session)
|
||
session.on("change", this.$updateAnnotations);
|
||
};
|
||
|
||
this.addGutterDecoration = function(row, className){
|
||
if (window.console)
|
||
console.warn && console.warn("deprecated use session.addGutterDecoration");
|
||
this.session.addGutterDecoration(row, className);
|
||
};
|
||
|
||
this.removeGutterDecoration = function(row, className){
|
||
if (window.console)
|
||
console.warn && console.warn("deprecated use session.removeGutterDecoration");
|
||
this.session.removeGutterDecoration(row, className);
|
||
};
|
||
|
||
this.setAnnotations = function(annotations) {
|
||
this.$annotations = [];
|
||
for (var i = 0; i < annotations.length; i++) {
|
||
var annotation = annotations[i];
|
||
var row = annotation.row;
|
||
var rowInfo = this.$annotations[row];
|
||
if (!rowInfo)
|
||
rowInfo = this.$annotations[row] = {text: []};
|
||
|
||
var annoText = annotation.text;
|
||
annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || "";
|
||
|
||
if (rowInfo.text.indexOf(annoText) === -1)
|
||
rowInfo.text.push(annoText);
|
||
|
||
var type = annotation.type;
|
||
if (type == "error")
|
||
rowInfo.className = " ace_error";
|
||
else if (type == "warning" && rowInfo.className != " ace_error")
|
||
rowInfo.className = " ace_warning";
|
||
else if (type == "info" && (!rowInfo.className))
|
||
rowInfo.className = " ace_info";
|
||
}
|
||
};
|
||
|
||
this.$updateAnnotations = function (delta) {
|
||
if (!this.$annotations.length)
|
||
return;
|
||
var firstRow = delta.start.row;
|
||
var len = delta.end.row - firstRow;
|
||
if (len === 0) {
|
||
} else if (delta.action == 'remove') {
|
||
this.$annotations.splice(firstRow, len + 1, null);
|
||
} else {
|
||
var args = new Array(len + 1);
|
||
args.unshift(firstRow, 1);
|
||
this.$annotations.splice.apply(this.$annotations, args);
|
||
}
|
||
};
|
||
|
||
this.update = function(config) {
|
||
var session = this.session;
|
||
var firstRow = config.firstRow;
|
||
var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar
|
||
session.getLength() - 1);
|
||
var fold = session.getNextFoldLine(firstRow);
|
||
var foldStart = fold ? fold.start.row : Infinity;
|
||
var foldWidgets = this.$showFoldWidgets && session.foldWidgets;
|
||
var breakpoints = session.$breakpoints;
|
||
var decorations = session.$decorations;
|
||
var firstLineNumber = session.$firstLineNumber;
|
||
var lastLineNumber = 0;
|
||
|
||
var gutterRenderer = session.gutterRenderer || this.$renderer;
|
||
|
||
var cell = null;
|
||
var index = -1;
|
||
var row = firstRow;
|
||
while (true) {
|
||
if (row > foldStart) {
|
||
row = fold.end.row + 1;
|
||
fold = session.getNextFoldLine(row, fold);
|
||
foldStart = fold ? fold.start.row : Infinity;
|
||
}
|
||
if (row > lastRow) {
|
||
while (this.$cells.length > index + 1) {
|
||
cell = this.$cells.pop();
|
||
this.element.removeChild(cell.element);
|
||
}
|
||
break;
|
||
}
|
||
|
||
cell = this.$cells[++index];
|
||
if (!cell) {
|
||
cell = {element: null, textNode: null, foldWidget: null};
|
||
cell.element = dom.createElement("div");
|
||
cell.textNode = document.createTextNode('');
|
||
cell.element.appendChild(cell.textNode);
|
||
this.element.appendChild(cell.element);
|
||
this.$cells[index] = cell;
|
||
}
|
||
|
||
var className = "ace_gutter-cell ";
|
||
if (breakpoints[row])
|
||
className += breakpoints[row];
|
||
if (decorations[row])
|
||
className += decorations[row];
|
||
if (this.$annotations[row])
|
||
className += this.$annotations[row].className;
|
||
if (cell.element.className != className)
|
||
cell.element.className = className;
|
||
|
||
var height = session.getRowLength(row) * config.lineHeight + "px";
|
||
if (height != cell.element.style.height)
|
||
cell.element.style.height = height;
|
||
|
||
if (foldWidgets) {
|
||
var c = foldWidgets[row];
|
||
if (c == null)
|
||
c = foldWidgets[row] = session.getFoldWidget(row);
|
||
}
|
||
|
||
if (c) {
|
||
if (!cell.foldWidget) {
|
||
cell.foldWidget = dom.createElement("span");
|
||
cell.element.appendChild(cell.foldWidget);
|
||
}
|
||
var className = "ace_fold-widget ace_" + c;
|
||
if (c == "start" && row == foldStart && row < fold.end.row)
|
||
className += " ace_closed";
|
||
else
|
||
className += " ace_open";
|
||
if (cell.foldWidget.className != className)
|
||
cell.foldWidget.className = className;
|
||
|
||
var height = config.lineHeight + "px";
|
||
if (cell.foldWidget.style.height != height)
|
||
cell.foldWidget.style.height = height;
|
||
} else {
|
||
if (cell.foldWidget) {
|
||
cell.element.removeChild(cell.foldWidget);
|
||
cell.foldWidget = null;
|
||
}
|
||
}
|
||
|
||
var text = lastLineNumber = gutterRenderer
|
||
? gutterRenderer.getText(session, row)
|
||
: row + firstLineNumber;
|
||
if (text != cell.textNode.data)
|
||
cell.textNode.data = text;
|
||
|
||
row++;
|
||
}
|
||
|
||
this.element.style.height = config.minHeight + "px";
|
||
|
||
if (this.$fixedWidth || session.$useWrapMode)
|
||
lastLineNumber = session.getLength() + firstLineNumber;
|
||
|
||
var gutterWidth = gutterRenderer
|
||
? gutterRenderer.getWidth(session, lastLineNumber, config)
|
||
: lastLineNumber.toString().length * config.characterWidth;
|
||
|
||
var padding = this.$padding || this.$computePadding();
|
||
gutterWidth += padding.left + padding.right;
|
||
if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {
|
||
this.gutterWidth = gutterWidth;
|
||
this.element.style.width = Math.ceil(this.gutterWidth) + "px";
|
||
this._emit("changeGutterWidth", gutterWidth);
|
||
}
|
||
};
|
||
|
||
this.$fixedWidth = false;
|
||
|
||
this.$showLineNumbers = true;
|
||
this.$renderer = "";
|
||
this.setShowLineNumbers = function(show) {
|
||
this.$renderer = !show && {
|
||
getWidth: function() {return ""},
|
||
getText: function() {return ""}
|
||
};
|
||
};
|
||
|
||
this.getShowLineNumbers = function() {
|
||
return this.$showLineNumbers;
|
||
};
|
||
|
||
this.$showFoldWidgets = true;
|
||
this.setShowFoldWidgets = function(show) {
|
||
if (show)
|
||
dom.addCssClass(this.element, "ace_folding-enabled");
|
||
else
|
||
dom.removeCssClass(this.element, "ace_folding-enabled");
|
||
|
||
this.$showFoldWidgets = show;
|
||
this.$padding = null;
|
||
};
|
||
|
||
this.getShowFoldWidgets = function() {
|
||
return this.$showFoldWidgets;
|
||
};
|
||
|
||
this.$computePadding = function() {
|
||
if (!this.element.firstChild)
|
||
return {left: 0, right: 0};
|
||
var style = dom.computedStyle(this.element.firstChild);
|
||
this.$padding = {};
|
||
this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;
|
||
this.$padding.right = parseInt(style.paddingRight) || 0;
|
||
return this.$padding;
|
||
};
|
||
|
||
this.getRegion = function(point) {
|
||
var padding = this.$padding || this.$computePadding();
|
||
var rect = this.element.getBoundingClientRect();
|
||
if (point.x < padding.left + rect.left)
|
||
return "markers";
|
||
if (this.$showFoldWidgets && point.x > rect.right - padding.right)
|
||
return "foldWidgets";
|
||
};
|
||
|
||
}).call(Gutter.prototype);
|
||
|
||
exports.Gutter = Gutter;
|
||
|
||
});
|
||
|
||
ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../range").Range;
|
||
var dom = acequire("../lib/dom");
|
||
|
||
var Marker = function(parentEl) {
|
||
this.element = dom.createElement("div");
|
||
this.element.className = "ace_layer ace_marker-layer";
|
||
parentEl.appendChild(this.element);
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.$padding = 0;
|
||
|
||
this.setPadding = function(padding) {
|
||
this.$padding = padding;
|
||
};
|
||
this.setSession = function(session) {
|
||
this.session = session;
|
||
};
|
||
|
||
this.setMarkers = function(markers) {
|
||
this.markers = markers;
|
||
};
|
||
|
||
this.update = function(config) {
|
||
var config = config || this.config;
|
||
if (!config)
|
||
return;
|
||
|
||
this.config = config;
|
||
|
||
|
||
var html = [];
|
||
for (var key in this.markers) {
|
||
var marker = this.markers[key];
|
||
|
||
if (!marker.range) {
|
||
marker.update(html, this, this.session, config);
|
||
continue;
|
||
}
|
||
|
||
var range = marker.range.clipRows(config.firstRow, config.lastRow);
|
||
if (range.isEmpty()) continue;
|
||
|
||
range = range.toScreenRange(this.session);
|
||
if (marker.renderer) {
|
||
var top = this.$getTop(range.start.row, config);
|
||
var left = this.$padding + range.start.column * config.characterWidth;
|
||
marker.renderer(html, range, left, top, config);
|
||
} else if (marker.type == "fullLine") {
|
||
this.drawFullLineMarker(html, range, marker.clazz, config);
|
||
} else if (marker.type == "screenLine") {
|
||
this.drawScreenLineMarker(html, range, marker.clazz, config);
|
||
} else if (range.isMultiLine()) {
|
||
if (marker.type == "text")
|
||
this.drawTextMarker(html, range, marker.clazz, config);
|
||
else
|
||
this.drawMultiLineMarker(html, range, marker.clazz, config);
|
||
} else {
|
||
this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config);
|
||
}
|
||
}
|
||
this.element.innerHTML = html.join("");
|
||
};
|
||
|
||
this.$getTop = function(row, layerConfig) {
|
||
return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;
|
||
};
|
||
|
||
function getBorderClass(tl, tr, br, bl) {
|
||
return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);
|
||
}
|
||
this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {
|
||
var session = this.session;
|
||
var start = range.start.row;
|
||
var end = range.end.row;
|
||
var row = start;
|
||
var prev = 0;
|
||
var curr = 0;
|
||
var next = session.getScreenLastRowColumn(row);
|
||
var lineRange = new Range(row, range.start.column, row, curr);
|
||
for (; row <= end; row++) {
|
||
lineRange.start.row = lineRange.end.row = row;
|
||
lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);
|
||
lineRange.end.column = next;
|
||
prev = curr;
|
||
curr = next;
|
||
next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;
|
||
this.drawSingleLineMarker(stringBuilder, lineRange,
|
||
clazz + (row == start ? " ace_start" : "") + " ace_br"
|
||
+ getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end),
|
||
layerConfig, row == end ? 0 : 1, extraStyle);
|
||
}
|
||
};
|
||
this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
|
||
var padding = this.$padding;
|
||
var height = config.lineHeight;
|
||
var top = this.$getTop(range.start.row, config);
|
||
var left = padding + range.start.column * config.characterWidth;
|
||
extraStyle = extraStyle || "";
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, " ace_br1 ace_start' style='",
|
||
"height:", height, "px;",
|
||
"right:0;",
|
||
"top:", top, "px;",
|
||
"left:", left, "px;", extraStyle, "'></div>"
|
||
);
|
||
top = this.$getTop(range.end.row, config);
|
||
var width = range.end.column * config.characterWidth;
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, " ace_br12' style='",
|
||
"height:", height, "px;",
|
||
"width:", width, "px;",
|
||
"top:", top, "px;",
|
||
"left:", padding, "px;", extraStyle, "'></div>"
|
||
);
|
||
height = (range.end.row - range.start.row - 1) * config.lineHeight;
|
||
if (height <= 0)
|
||
return;
|
||
top = this.$getTop(range.start.row + 1, config);
|
||
|
||
var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, (radiusClass ? " ace_br" + radiusClass : ""), "' style='",
|
||
"height:", height, "px;",
|
||
"right:0;",
|
||
"top:", top, "px;",
|
||
"left:", padding, "px;", extraStyle, "'></div>"
|
||
);
|
||
};
|
||
this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {
|
||
var height = config.lineHeight;
|
||
var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;
|
||
|
||
var top = this.$getTop(range.start.row, config);
|
||
var left = this.$padding + range.start.column * config.characterWidth;
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, "' style='",
|
||
"height:", height, "px;",
|
||
"width:", width, "px;",
|
||
"top:", top, "px;",
|
||
"left:", left, "px;", extraStyle || "", "'></div>"
|
||
);
|
||
};
|
||
|
||
this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
|
||
var top = this.$getTop(range.start.row, config);
|
||
var height = config.lineHeight;
|
||
if (range.start.row != range.end.row)
|
||
height += this.$getTop(range.end.row, config) - top;
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, "' style='",
|
||
"height:", height, "px;",
|
||
"top:", top, "px;",
|
||
"left:0;right:0;", extraStyle || "", "'></div>"
|
||
);
|
||
};
|
||
|
||
this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {
|
||
var top = this.$getTop(range.start.row, config);
|
||
var height = config.lineHeight;
|
||
|
||
stringBuilder.push(
|
||
"<div class='", clazz, "' style='",
|
||
"height:", height, "px;",
|
||
"top:", top, "px;",
|
||
"left:0;right:0;", extraStyle || "", "'></div>"
|
||
);
|
||
};
|
||
|
||
}).call(Marker.prototype);
|
||
|
||
exports.Marker = Marker;
|
||
|
||
});
|
||
|
||
ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var dom = acequire("../lib/dom");
|
||
var lang = acequire("../lib/lang");
|
||
var useragent = acequire("../lib/useragent");
|
||
var EventEmitter = acequire("../lib/event_emitter").EventEmitter;
|
||
|
||
var Text = function(parentEl) {
|
||
this.element = dom.createElement("div");
|
||
this.element.className = "ace_layer ace_text-layer";
|
||
parentEl.appendChild(this.element);
|
||
this.$updateEolChar = this.$updateEolChar.bind(this);
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.EOF_CHAR = "\xB6";
|
||
this.EOL_CHAR_LF = "\xAC";
|
||
this.EOL_CHAR_CRLF = "\xa4";
|
||
this.EOL_CHAR = this.EOL_CHAR_LF;
|
||
this.TAB_CHAR = "\u2014"; //"\u21E5";
|
||
this.SPACE_CHAR = "\xB7";
|
||
this.$padding = 0;
|
||
|
||
this.$updateEolChar = function() {
|
||
var EOL_CHAR = this.session.doc.getNewLineCharacter() == "\n"
|
||
? this.EOL_CHAR_LF
|
||
: this.EOL_CHAR_CRLF;
|
||
if (this.EOL_CHAR != EOL_CHAR) {
|
||
this.EOL_CHAR = EOL_CHAR;
|
||
return true;
|
||
}
|
||
}
|
||
|
||
this.setPadding = function(padding) {
|
||
this.$padding = padding;
|
||
this.element.style.padding = "0 " + padding + "px";
|
||
};
|
||
|
||
this.getLineHeight = function() {
|
||
return this.$fontMetrics.$characterSize.height || 0;
|
||
};
|
||
|
||
this.getCharacterWidth = function() {
|
||
return this.$fontMetrics.$characterSize.width || 0;
|
||
};
|
||
|
||
this.$setFontMetrics = function(measure) {
|
||
this.$fontMetrics = measure;
|
||
this.$fontMetrics.on("changeCharacterSize", function(e) {
|
||
this._signal("changeCharacterSize", e);
|
||
}.bind(this));
|
||
this.$pollSizeChanges();
|
||
}
|
||
|
||
this.checkForSizeChanges = function() {
|
||
this.$fontMetrics.checkForSizeChanges();
|
||
};
|
||
this.$pollSizeChanges = function() {
|
||
return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();
|
||
};
|
||
this.setSession = function(session) {
|
||
this.session = session;
|
||
if (session)
|
||
this.$computeTabString();
|
||
};
|
||
|
||
this.showInvisibles = false;
|
||
this.setShowInvisibles = function(showInvisibles) {
|
||
if (this.showInvisibles == showInvisibles)
|
||
return false;
|
||
|
||
this.showInvisibles = showInvisibles;
|
||
this.$computeTabString();
|
||
return true;
|
||
};
|
||
|
||
this.displayIndentGuides = true;
|
||
this.setDisplayIndentGuides = function(display) {
|
||
if (this.displayIndentGuides == display)
|
||
return false;
|
||
|
||
this.displayIndentGuides = display;
|
||
this.$computeTabString();
|
||
return true;
|
||
};
|
||
|
||
this.$tabStrings = [];
|
||
this.onChangeTabSize =
|
||
this.$computeTabString = function() {
|
||
var tabSize = this.session.getTabSize();
|
||
this.tabSize = tabSize;
|
||
var tabStr = this.$tabStrings = [0];
|
||
for (var i = 1; i < tabSize + 1; i++) {
|
||
if (this.showInvisibles) {
|
||
tabStr.push("<span class='ace_invisible ace_invisible_tab'>"
|
||
+ lang.stringRepeat(this.TAB_CHAR, i)
|
||
+ "</span>");
|
||
} else {
|
||
tabStr.push(lang.stringRepeat(" ", i));
|
||
}
|
||
}
|
||
if (this.displayIndentGuides) {
|
||
this.$indentGuideRe = /\s\S| \t|\t |\s$/;
|
||
var className = "ace_indent-guide";
|
||
var spaceClass = "";
|
||
var tabClass = "";
|
||
if (this.showInvisibles) {
|
||
className += " ace_invisible";
|
||
spaceClass = " ace_invisible_space";
|
||
tabClass = " ace_invisible_tab";
|
||
var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);
|
||
var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);
|
||
} else{
|
||
var spaceContent = lang.stringRepeat(" ", this.tabSize);
|
||
var tabContent = spaceContent;
|
||
}
|
||
|
||
this.$tabStrings[" "] = "<span class='" + className + spaceClass + "'>" + spaceContent + "</span>";
|
||
this.$tabStrings["\t"] = "<span class='" + className + tabClass + "'>" + tabContent + "</span>";
|
||
}
|
||
};
|
||
|
||
this.updateLines = function(config, firstRow, lastRow) {
|
||
if (this.config.lastRow != config.lastRow ||
|
||
this.config.firstRow != config.firstRow) {
|
||
this.scrollLines(config);
|
||
}
|
||
this.config = config;
|
||
|
||
var first = Math.max(firstRow, config.firstRow);
|
||
var last = Math.min(lastRow, config.lastRow);
|
||
|
||
var lineElements = this.element.childNodes;
|
||
var lineElementsIdx = 0;
|
||
|
||
for (var row = config.firstRow; row < first; row++) {
|
||
var foldLine = this.session.getFoldLine(row);
|
||
if (foldLine) {
|
||
if (foldLine.containsRow(first)) {
|
||
first = foldLine.start.row;
|
||
break;
|
||
} else {
|
||
row = foldLine.end.row;
|
||
}
|
||
}
|
||
lineElementsIdx ++;
|
||
}
|
||
|
||
var row = first;
|
||
var foldLine = this.session.getNextFoldLine(row);
|
||
var foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
|
||
while (true) {
|
||
if (row > foldStart) {
|
||
row = foldLine.end.row+1;
|
||
foldLine = this.session.getNextFoldLine(row, foldLine);
|
||
foldStart = foldLine ? foldLine.start.row :Infinity;
|
||
}
|
||
if (row > last)
|
||
break;
|
||
|
||
var lineElement = lineElements[lineElementsIdx++];
|
||
if (lineElement) {
|
||
var html = [];
|
||
this.$renderLine(
|
||
html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false
|
||
);
|
||
lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + "px";
|
||
lineElement.innerHTML = html.join("");
|
||
}
|
||
row++;
|
||
}
|
||
};
|
||
|
||
this.scrollLines = function(config) {
|
||
var oldConfig = this.config;
|
||
this.config = config;
|
||
|
||
if (!oldConfig || oldConfig.lastRow < config.firstRow)
|
||
return this.update(config);
|
||
|
||
if (config.lastRow < oldConfig.firstRow)
|
||
return this.update(config);
|
||
|
||
var el = this.element;
|
||
if (oldConfig.firstRow < config.firstRow)
|
||
for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)
|
||
el.removeChild(el.firstChild);
|
||
|
||
if (oldConfig.lastRow > config.lastRow)
|
||
for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)
|
||
el.removeChild(el.lastChild);
|
||
|
||
if (config.firstRow < oldConfig.firstRow) {
|
||
var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);
|
||
if (el.firstChild)
|
||
el.insertBefore(fragment, el.firstChild);
|
||
else
|
||
el.appendChild(fragment);
|
||
}
|
||
|
||
if (config.lastRow > oldConfig.lastRow) {
|
||
var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);
|
||
el.appendChild(fragment);
|
||
}
|
||
};
|
||
|
||
this.$renderLinesFragment = function(config, firstRow, lastRow) {
|
||
var fragment = this.element.ownerDocument.createDocumentFragment();
|
||
var row = firstRow;
|
||
var foldLine = this.session.getNextFoldLine(row);
|
||
var foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
|
||
while (true) {
|
||
if (row > foldStart) {
|
||
row = foldLine.end.row+1;
|
||
foldLine = this.session.getNextFoldLine(row, foldLine);
|
||
foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
}
|
||
if (row > lastRow)
|
||
break;
|
||
|
||
var container = dom.createElement("div");
|
||
|
||
var html = [];
|
||
this.$renderLine(html, row, false, row == foldStart ? foldLine : false);
|
||
container.innerHTML = html.join("");
|
||
if (this.$useLineGroups()) {
|
||
container.className = 'ace_line_group';
|
||
fragment.appendChild(container);
|
||
container.style.height = config.lineHeight * this.session.getRowLength(row) + "px";
|
||
|
||
} else {
|
||
while(container.firstChild)
|
||
fragment.appendChild(container.firstChild);
|
||
}
|
||
|
||
row++;
|
||
}
|
||
return fragment;
|
||
};
|
||
|
||
this.update = function(config) {
|
||
this.config = config;
|
||
|
||
var html = [];
|
||
var firstRow = config.firstRow, lastRow = config.lastRow;
|
||
|
||
var row = firstRow;
|
||
var foldLine = this.session.getNextFoldLine(row);
|
||
var foldStart = foldLine ? foldLine.start.row : Infinity;
|
||
|
||
while (true) {
|
||
if (row > foldStart) {
|
||
row = foldLine.end.row+1;
|
||
foldLine = this.session.getNextFoldLine(row, foldLine);
|
||
foldStart = foldLine ? foldLine.start.row :Infinity;
|
||
}
|
||
if (row > lastRow)
|
||
break;
|
||
|
||
if (this.$useLineGroups())
|
||
html.push("<div class='ace_line_group' style='height:", config.lineHeight*this.session.getRowLength(row), "px'>")
|
||
|
||
this.$renderLine(html, row, false, row == foldStart ? foldLine : false);
|
||
|
||
if (this.$useLineGroups())
|
||
html.push("</div>"); // end the line group
|
||
|
||
row++;
|
||
}
|
||
this.element.innerHTML = html.join("");
|
||
};
|
||
|
||
this.$textToken = {
|
||
"text": true,
|
||
"rparen": true,
|
||
"lparen": true
|
||
};
|
||
|
||
this.$renderToken = function(stringBuilder, screenColumn, token, value) {
|
||
var self = this;
|
||
var replaceReg = /\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g;
|
||
var replaceFunc = function(c, a, b, tabIdx, idx4) {
|
||
if (a) {
|
||
return self.showInvisibles
|
||
? "<span class='ace_invisible ace_invisible_space'>" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "</span>"
|
||
: c;
|
||
} else if (c == "&") {
|
||
return "&";
|
||
} else if (c == "<") {
|
||
return "<";
|
||
} else if (c == ">") {
|
||
return ">";
|
||
} else if (c == "\t") {
|
||
var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);
|
||
screenColumn += tabSize - 1;
|
||
return self.$tabStrings[tabSize];
|
||
} else if (c == "\u3000") {
|
||
var classToUse = self.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk";
|
||
var space = self.showInvisibles ? self.SPACE_CHAR : "";
|
||
screenColumn += 1;
|
||
return "<span class='" + classToUse + "' style='width:" +
|
||
(self.config.characterWidth * 2) +
|
||
"px'>" + space + "</span>";
|
||
} else if (b) {
|
||
return "<span class='ace_invisible ace_invisible_space ace_invalid'>" + self.SPACE_CHAR + "</span>";
|
||
} else {
|
||
screenColumn += 1;
|
||
return "<span class='ace_cjk' style='width:" +
|
||
(self.config.characterWidth * 2) +
|
||
"px'>" + c + "</span>";
|
||
}
|
||
};
|
||
|
||
var output = value.replace(replaceReg, replaceFunc);
|
||
|
||
if (!this.$textToken[token.type]) {
|
||
var classes = "ace_" + token.type.replace(/\./g, " ace_");
|
||
var style = "";
|
||
if (token.type == "fold")
|
||
style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' ";
|
||
stringBuilder.push("<span class='", classes, "'", style, ">", output, "</span>");
|
||
}
|
||
else {
|
||
stringBuilder.push(output);
|
||
}
|
||
return screenColumn + value.length;
|
||
};
|
||
|
||
this.renderIndentGuide = function(stringBuilder, value, max) {
|
||
var cols = value.search(this.$indentGuideRe);
|
||
if (cols <= 0 || cols >= max)
|
||
return value;
|
||
if (value[0] == " ") {
|
||
cols -= cols % this.tabSize;
|
||
stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize));
|
||
return value.substr(cols);
|
||
} else if (value[0] == "\t") {
|
||
stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols));
|
||
return value.substr(cols);
|
||
}
|
||
return value;
|
||
};
|
||
|
||
this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {
|
||
var chars = 0;
|
||
var split = 0;
|
||
var splitChars = splits[0];
|
||
var screenColumn = 0;
|
||
|
||
for (var i = 0; i < tokens.length; i++) {
|
||
var token = tokens[i];
|
||
var value = token.value;
|
||
if (i == 0 && this.displayIndentGuides) {
|
||
chars = value.length;
|
||
value = this.renderIndentGuide(stringBuilder, value, splitChars);
|
||
if (!value)
|
||
continue;
|
||
chars -= value.length;
|
||
}
|
||
|
||
if (chars + value.length < splitChars) {
|
||
screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
|
||
chars += value.length;
|
||
} else {
|
||
while (chars + value.length >= splitChars) {
|
||
screenColumn = this.$renderToken(
|
||
stringBuilder, screenColumn,
|
||
token, value.substring(0, splitChars - chars)
|
||
);
|
||
value = value.substring(splitChars - chars);
|
||
chars = splitChars;
|
||
|
||
if (!onlyContents) {
|
||
stringBuilder.push("</div>",
|
||
"<div class='ace_line' style='height:",
|
||
this.config.lineHeight, "px'>"
|
||
);
|
||
}
|
||
|
||
stringBuilder.push(lang.stringRepeat("\xa0", splits.indent));
|
||
|
||
split ++;
|
||
screenColumn = 0;
|
||
splitChars = splits[split] || Number.MAX_VALUE;
|
||
}
|
||
if (value.length != 0) {
|
||
chars += value.length;
|
||
screenColumn = this.$renderToken(
|
||
stringBuilder, screenColumn, token, value
|
||
);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
this.$renderSimpleLine = function(stringBuilder, tokens) {
|
||
var screenColumn = 0;
|
||
var token = tokens[0];
|
||
var value = token.value;
|
||
if (this.displayIndentGuides)
|
||
value = this.renderIndentGuide(stringBuilder, value);
|
||
if (value)
|
||
screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
|
||
for (var i = 1; i < tokens.length; i++) {
|
||
token = tokens[i];
|
||
value = token.value;
|
||
screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);
|
||
}
|
||
};
|
||
this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {
|
||
if (!foldLine && foldLine != false)
|
||
foldLine = this.session.getFoldLine(row);
|
||
|
||
if (foldLine)
|
||
var tokens = this.$getFoldLineTokens(row, foldLine);
|
||
else
|
||
var tokens = this.session.getTokens(row);
|
||
|
||
|
||
if (!onlyContents) {
|
||
stringBuilder.push(
|
||
"<div class='ace_line' style='height:",
|
||
this.config.lineHeight * (
|
||
this.$useLineGroups() ? 1 :this.session.getRowLength(row)
|
||
), "px'>"
|
||
);
|
||
}
|
||
|
||
if (tokens.length) {
|
||
var splits = this.session.getRowSplitData(row);
|
||
if (splits && splits.length)
|
||
this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);
|
||
else
|
||
this.$renderSimpleLine(stringBuilder, tokens);
|
||
}
|
||
|
||
if (this.showInvisibles) {
|
||
if (foldLine)
|
||
row = foldLine.end.row
|
||
|
||
stringBuilder.push(
|
||
"<span class='ace_invisible ace_invisible_eol'>",
|
||
row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,
|
||
"</span>"
|
||
);
|
||
}
|
||
if (!onlyContents)
|
||
stringBuilder.push("</div>");
|
||
};
|
||
|
||
this.$getFoldLineTokens = function(row, foldLine) {
|
||
var session = this.session;
|
||
var renderTokens = [];
|
||
|
||
function addTokens(tokens, from, to) {
|
||
var idx = 0, col = 0;
|
||
while ((col + tokens[idx].value.length) < from) {
|
||
col += tokens[idx].value.length;
|
||
idx++;
|
||
|
||
if (idx == tokens.length)
|
||
return;
|
||
}
|
||
if (col != from) {
|
||
var value = tokens[idx].value.substring(from - col);
|
||
if (value.length > (to - from))
|
||
value = value.substring(0, to - from);
|
||
|
||
renderTokens.push({
|
||
type: tokens[idx].type,
|
||
value: value
|
||
});
|
||
|
||
col = from + value.length;
|
||
idx += 1;
|
||
}
|
||
|
||
while (col < to && idx < tokens.length) {
|
||
var value = tokens[idx].value;
|
||
if (value.length + col > to) {
|
||
renderTokens.push({
|
||
type: tokens[idx].type,
|
||
value: value.substring(0, to - col)
|
||
});
|
||
} else
|
||
renderTokens.push(tokens[idx]);
|
||
col += value.length;
|
||
idx += 1;
|
||
}
|
||
}
|
||
|
||
var tokens = session.getTokens(row);
|
||
foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {
|
||
if (placeholder != null) {
|
||
renderTokens.push({
|
||
type: "fold",
|
||
value: placeholder
|
||
});
|
||
} else {
|
||
if (isNewRow)
|
||
tokens = session.getTokens(row);
|
||
|
||
if (tokens.length)
|
||
addTokens(tokens, lastColumn, column);
|
||
}
|
||
}, foldLine.end.row, this.session.getLine(foldLine.end.row).length);
|
||
|
||
return renderTokens;
|
||
};
|
||
|
||
this.$useLineGroups = function() {
|
||
return this.session.getUseWrapMode();
|
||
};
|
||
|
||
this.destroy = function() {
|
||
clearInterval(this.$pollSizeChangesTimer);
|
||
if (this.$measureNode)
|
||
this.$measureNode.parentNode.removeChild(this.$measureNode);
|
||
delete this.$measureNode;
|
||
};
|
||
|
||
}).call(Text.prototype);
|
||
|
||
exports.Text = Text;
|
||
|
||
});
|
||
|
||
ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
var isIE8;
|
||
|
||
var Cursor = function(parentEl) {
|
||
this.element = dom.createElement("div");
|
||
this.element.className = "ace_layer ace_cursor-layer";
|
||
parentEl.appendChild(this.element);
|
||
|
||
if (isIE8 === undefined)
|
||
isIE8 = !("opacity" in this.element.style);
|
||
|
||
this.isVisible = false;
|
||
this.isBlinking = true;
|
||
this.blinkInterval = 1000;
|
||
this.smoothBlinking = false;
|
||
|
||
this.cursors = [];
|
||
this.cursor = this.addCursor();
|
||
dom.addCssClass(this.element, "ace_hidden-cursors");
|
||
this.$updateCursors = (isIE8
|
||
? this.$updateVisibility
|
||
: this.$updateOpacity).bind(this);
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.$updateVisibility = function(val) {
|
||
var cursors = this.cursors;
|
||
for (var i = cursors.length; i--; )
|
||
cursors[i].style.visibility = val ? "" : "hidden";
|
||
};
|
||
this.$updateOpacity = function(val) {
|
||
var cursors = this.cursors;
|
||
for (var i = cursors.length; i--; )
|
||
cursors[i].style.opacity = val ? "" : "0";
|
||
};
|
||
|
||
|
||
this.$padding = 0;
|
||
this.setPadding = function(padding) {
|
||
this.$padding = padding;
|
||
};
|
||
|
||
this.setSession = function(session) {
|
||
this.session = session;
|
||
};
|
||
|
||
this.setBlinking = function(blinking) {
|
||
if (blinking != this.isBlinking){
|
||
this.isBlinking = blinking;
|
||
this.restartTimer();
|
||
}
|
||
};
|
||
|
||
this.setBlinkInterval = function(blinkInterval) {
|
||
if (blinkInterval != this.blinkInterval){
|
||
this.blinkInterval = blinkInterval;
|
||
this.restartTimer();
|
||
}
|
||
};
|
||
|
||
this.setSmoothBlinking = function(smoothBlinking) {
|
||
if (smoothBlinking != this.smoothBlinking && !isIE8) {
|
||
this.smoothBlinking = smoothBlinking;
|
||
dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking);
|
||
this.$updateCursors(true);
|
||
this.$updateCursors = (this.$updateOpacity).bind(this);
|
||
this.restartTimer();
|
||
}
|
||
};
|
||
|
||
this.addCursor = function() {
|
||
var el = dom.createElement("div");
|
||
el.className = "ace_cursor";
|
||
this.element.appendChild(el);
|
||
this.cursors.push(el);
|
||
return el;
|
||
};
|
||
|
||
this.removeCursor = function() {
|
||
if (this.cursors.length > 1) {
|
||
var el = this.cursors.pop();
|
||
el.parentNode.removeChild(el);
|
||
return el;
|
||
}
|
||
};
|
||
|
||
this.hideCursor = function() {
|
||
this.isVisible = false;
|
||
dom.addCssClass(this.element, "ace_hidden-cursors");
|
||
this.restartTimer();
|
||
};
|
||
|
||
this.showCursor = function() {
|
||
this.isVisible = true;
|
||
dom.removeCssClass(this.element, "ace_hidden-cursors");
|
||
this.restartTimer();
|
||
};
|
||
|
||
this.restartTimer = function() {
|
||
var update = this.$updateCursors;
|
||
clearInterval(this.intervalId);
|
||
clearTimeout(this.timeoutId);
|
||
if (this.smoothBlinking) {
|
||
dom.removeCssClass(this.element, "ace_smooth-blinking");
|
||
}
|
||
|
||
update(true);
|
||
|
||
if (!this.isBlinking || !this.blinkInterval || !this.isVisible)
|
||
return;
|
||
|
||
if (this.smoothBlinking) {
|
||
setTimeout(function(){
|
||
dom.addCssClass(this.element, "ace_smooth-blinking");
|
||
}.bind(this));
|
||
}
|
||
|
||
var blink = function(){
|
||
this.timeoutId = setTimeout(function() {
|
||
update(false);
|
||
}, 0.6 * this.blinkInterval);
|
||
}.bind(this);
|
||
|
||
this.intervalId = setInterval(function() {
|
||
update(true);
|
||
blink();
|
||
}, this.blinkInterval);
|
||
|
||
blink();
|
||
};
|
||
|
||
this.getPixelPosition = function(position, onScreen) {
|
||
if (!this.config || !this.session)
|
||
return {left : 0, top : 0};
|
||
|
||
if (!position)
|
||
position = this.session.selection.getCursor();
|
||
var pos = this.session.documentToScreenPosition(position);
|
||
var cursorLeft = this.$padding + pos.column * this.config.characterWidth;
|
||
var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *
|
||
this.config.lineHeight;
|
||
|
||
return {left : cursorLeft, top : cursorTop};
|
||
};
|
||
|
||
this.update = function(config) {
|
||
this.config = config;
|
||
|
||
var selections = this.session.$selectionMarkers;
|
||
var i = 0, cursorIndex = 0;
|
||
|
||
if (selections === undefined || selections.length === 0){
|
||
selections = [{cursor: null}];
|
||
}
|
||
|
||
for (var i = 0, n = selections.length; i < n; i++) {
|
||
var pixelPos = this.getPixelPosition(selections[i].cursor, true);
|
||
if ((pixelPos.top > config.height + config.offset ||
|
||
pixelPos.top < 0) && i > 1) {
|
||
continue;
|
||
}
|
||
|
||
var style = (this.cursors[cursorIndex++] || this.addCursor()).style;
|
||
|
||
if (!this.drawCursor) {
|
||
style.left = pixelPos.left + "px";
|
||
style.top = pixelPos.top + "px";
|
||
style.width = config.characterWidth + "px";
|
||
style.height = config.lineHeight + "px";
|
||
} else {
|
||
this.drawCursor(style, pixelPos, config, selections[i], this.session);
|
||
}
|
||
}
|
||
while (this.cursors.length > cursorIndex)
|
||
this.removeCursor();
|
||
|
||
var overwrite = this.session.getOverwrite();
|
||
this.$setOverwrite(overwrite);
|
||
this.$pixelPos = pixelPos;
|
||
this.restartTimer();
|
||
};
|
||
|
||
this.drawCursor = null;
|
||
|
||
this.$setOverwrite = function(overwrite) {
|
||
if (overwrite != this.overwrite) {
|
||
this.overwrite = overwrite;
|
||
if (overwrite)
|
||
dom.addCssClass(this.element, "ace_overwrite-cursors");
|
||
else
|
||
dom.removeCssClass(this.element, "ace_overwrite-cursors");
|
||
}
|
||
};
|
||
|
||
this.destroy = function() {
|
||
clearInterval(this.intervalId);
|
||
clearTimeout(this.timeoutId);
|
||
};
|
||
|
||
}).call(Cursor.prototype);
|
||
|
||
exports.Cursor = Cursor;
|
||
|
||
});
|
||
|
||
ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var dom = acequire("./lib/dom");
|
||
var event = acequire("./lib/event");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var ScrollBar = function(parent) {
|
||
this.element = dom.createElement("div");
|
||
this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix;
|
||
|
||
this.inner = dom.createElement("div");
|
||
this.inner.className = "ace_scrollbar-inner";
|
||
this.element.appendChild(this.inner);
|
||
|
||
parent.appendChild(this.element);
|
||
|
||
this.setVisible(false);
|
||
this.skipEvent = false;
|
||
|
||
event.addListener(this.element, "scroll", this.onScroll.bind(this));
|
||
event.addListener(this.element, "mousedown", event.preventDefault);
|
||
};
|
||
|
||
(function() {
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.setVisible = function(isVisible) {
|
||
this.element.style.display = isVisible ? "" : "none";
|
||
this.isVisible = isVisible;
|
||
};
|
||
}).call(ScrollBar.prototype);
|
||
var VScrollBar = function(parent, renderer) {
|
||
ScrollBar.call(this, parent);
|
||
this.scrollTop = 0;
|
||
renderer.$scrollbarWidth =
|
||
this.width = dom.scrollbarWidth(parent.ownerDocument);
|
||
this.inner.style.width =
|
||
this.element.style.width = (this.width || 15) + 5 + "px";
|
||
};
|
||
|
||
oop.inherits(VScrollBar, ScrollBar);
|
||
|
||
(function() {
|
||
|
||
this.classSuffix = '-v';
|
||
this.onScroll = function() {
|
||
if (!this.skipEvent) {
|
||
this.scrollTop = this.element.scrollTop;
|
||
this._emit("scroll", {data: this.scrollTop});
|
||
}
|
||
this.skipEvent = false;
|
||
};
|
||
this.getWidth = function() {
|
||
return this.isVisible ? this.width : 0;
|
||
};
|
||
this.setHeight = function(height) {
|
||
this.element.style.height = height + "px";
|
||
};
|
||
this.setInnerHeight = function(height) {
|
||
this.inner.style.height = height + "px";
|
||
};
|
||
this.setScrollHeight = function(height) {
|
||
this.inner.style.height = height + "px";
|
||
};
|
||
this.setScrollTop = function(scrollTop) {
|
||
if (this.scrollTop != scrollTop) {
|
||
this.skipEvent = true;
|
||
this.scrollTop = this.element.scrollTop = scrollTop;
|
||
}
|
||
};
|
||
|
||
}).call(VScrollBar.prototype);
|
||
var HScrollBar = function(parent, renderer) {
|
||
ScrollBar.call(this, parent);
|
||
this.scrollLeft = 0;
|
||
this.height = renderer.$scrollbarWidth;
|
||
this.inner.style.height =
|
||
this.element.style.height = (this.height || 15) + 5 + "px";
|
||
};
|
||
|
||
oop.inherits(HScrollBar, ScrollBar);
|
||
|
||
(function() {
|
||
|
||
this.classSuffix = '-h';
|
||
this.onScroll = function() {
|
||
if (!this.skipEvent) {
|
||
this.scrollLeft = this.element.scrollLeft;
|
||
this._emit("scroll", {data: this.scrollLeft});
|
||
}
|
||
this.skipEvent = false;
|
||
};
|
||
this.getHeight = function() {
|
||
return this.isVisible ? this.height : 0;
|
||
};
|
||
this.setWidth = function(width) {
|
||
this.element.style.width = width + "px";
|
||
};
|
||
this.setInnerWidth = function(width) {
|
||
this.inner.style.width = width + "px";
|
||
};
|
||
this.setScrollWidth = function(width) {
|
||
this.inner.style.width = width + "px";
|
||
};
|
||
this.setScrollLeft = function(scrollLeft) {
|
||
if (this.scrollLeft != scrollLeft) {
|
||
this.skipEvent = true;
|
||
this.scrollLeft = this.element.scrollLeft = scrollLeft;
|
||
}
|
||
};
|
||
|
||
}).call(HScrollBar.prototype);
|
||
|
||
|
||
exports.ScrollBar = VScrollBar; // backward compatibility
|
||
exports.ScrollBarV = VScrollBar; // backward compatibility
|
||
exports.ScrollBarH = HScrollBar; // backward compatibility
|
||
|
||
exports.VScrollBar = VScrollBar;
|
||
exports.HScrollBar = HScrollBar;
|
||
});
|
||
|
||
ace.define("ace/renderloop",["require","exports","module","ace/lib/event"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var event = acequire("./lib/event");
|
||
|
||
|
||
var RenderLoop = function(onRender, win) {
|
||
this.onRender = onRender;
|
||
this.pending = false;
|
||
this.changes = 0;
|
||
this.window = win || window;
|
||
};
|
||
|
||
(function() {
|
||
|
||
|
||
this.schedule = function(change) {
|
||
this.changes = this.changes | change;
|
||
if (!this.pending && this.changes) {
|
||
this.pending = true;
|
||
var _self = this;
|
||
event.nextFrame(function() {
|
||
_self.pending = false;
|
||
var changes;
|
||
while (changes = _self.changes) {
|
||
_self.changes = 0;
|
||
_self.onRender(changes);
|
||
}
|
||
}, this.window);
|
||
}
|
||
};
|
||
|
||
}).call(RenderLoop.prototype);
|
||
|
||
exports.RenderLoop = RenderLoop;
|
||
});
|
||
|
||
ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var dom = acequire("../lib/dom");
|
||
var lang = acequire("../lib/lang");
|
||
var useragent = acequire("../lib/useragent");
|
||
var EventEmitter = acequire("../lib/event_emitter").EventEmitter;
|
||
|
||
var CHAR_COUNT = 0;
|
||
|
||
var FontMetrics = exports.FontMetrics = function(parentEl) {
|
||
this.el = dom.createElement("div");
|
||
this.$setMeasureNodeStyles(this.el.style, true);
|
||
|
||
this.$main = dom.createElement("div");
|
||
this.$setMeasureNodeStyles(this.$main.style);
|
||
|
||
this.$measureNode = dom.createElement("div");
|
||
this.$setMeasureNodeStyles(this.$measureNode.style);
|
||
|
||
|
||
this.el.appendChild(this.$main);
|
||
this.el.appendChild(this.$measureNode);
|
||
parentEl.appendChild(this.el);
|
||
|
||
if (!CHAR_COUNT)
|
||
this.$testFractionalRect();
|
||
this.$measureNode.innerHTML = lang.stringRepeat("X", CHAR_COUNT);
|
||
|
||
this.$characterSize = {width: 0, height: 0};
|
||
this.checkForSizeChanges();
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.$characterSize = {width: 0, height: 0};
|
||
|
||
this.$testFractionalRect = function() {
|
||
var el = dom.createElement("div");
|
||
this.$setMeasureNodeStyles(el.style);
|
||
el.style.width = "0.2px";
|
||
document.documentElement.appendChild(el);
|
||
var w = el.getBoundingClientRect().width;
|
||
if (w > 0 && w < 1)
|
||
CHAR_COUNT = 50;
|
||
else
|
||
CHAR_COUNT = 100;
|
||
el.parentNode.removeChild(el);
|
||
};
|
||
|
||
this.$setMeasureNodeStyles = function(style, isRoot) {
|
||
style.width = style.height = "auto";
|
||
style.left = style.top = "0px";
|
||
style.visibility = "hidden";
|
||
style.position = "absolute";
|
||
style.whiteSpace = "pre";
|
||
|
||
if (useragent.isIE < 8) {
|
||
style["font-family"] = "inherit";
|
||
} else {
|
||
style.font = "inherit";
|
||
}
|
||
style.overflow = isRoot ? "hidden" : "visible";
|
||
};
|
||
|
||
this.checkForSizeChanges = function() {
|
||
var size = this.$measureSizes();
|
||
if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {
|
||
this.$measureNode.style.fontWeight = "bold";
|
||
var boldSize = this.$measureSizes();
|
||
this.$measureNode.style.fontWeight = "";
|
||
this.$characterSize = size;
|
||
this.charSizes = Object.create(null);
|
||
this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;
|
||
this._emit("changeCharacterSize", {data: size});
|
||
}
|
||
};
|
||
|
||
this.$pollSizeChanges = function() {
|
||
if (this.$pollSizeChangesTimer)
|
||
return this.$pollSizeChangesTimer;
|
||
var self = this;
|
||
return this.$pollSizeChangesTimer = setInterval(function() {
|
||
self.checkForSizeChanges();
|
||
}, 500);
|
||
};
|
||
|
||
this.setPolling = function(val) {
|
||
if (val) {
|
||
this.$pollSizeChanges();
|
||
} else if (this.$pollSizeChangesTimer) {
|
||
clearInterval(this.$pollSizeChangesTimer);
|
||
this.$pollSizeChangesTimer = 0;
|
||
}
|
||
};
|
||
|
||
this.$measureSizes = function() {
|
||
if (CHAR_COUNT === 50) {
|
||
var rect = null;
|
||
try {
|
||
rect = this.$measureNode.getBoundingClientRect();
|
||
} catch(e) {
|
||
rect = {width: 0, height:0 };
|
||
}
|
||
var size = {
|
||
height: rect.height,
|
||
width: rect.width / CHAR_COUNT
|
||
};
|
||
} else {
|
||
var size = {
|
||
height: this.$measureNode.clientHeight,
|
||
width: this.$measureNode.clientWidth / CHAR_COUNT
|
||
};
|
||
}
|
||
if (size.width === 0 || size.height === 0)
|
||
return null;
|
||
return size;
|
||
};
|
||
|
||
this.$measureCharWidth = function(ch) {
|
||
this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);
|
||
var rect = this.$main.getBoundingClientRect();
|
||
return rect.width / CHAR_COUNT;
|
||
};
|
||
|
||
this.getCharacterWidth = function(ch) {
|
||
var w = this.charSizes[ch];
|
||
if (w === undefined) {
|
||
w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;
|
||
}
|
||
return w;
|
||
};
|
||
|
||
this.destroy = function() {
|
||
clearInterval(this.$pollSizeChangesTimer);
|
||
if (this.el && this.el.parentNode)
|
||
this.el.parentNode.removeChild(this.el);
|
||
};
|
||
|
||
}).call(FontMetrics.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var dom = acequire("./lib/dom");
|
||
var config = acequire("./config");
|
||
var useragent = acequire("./lib/useragent");
|
||
var GutterLayer = acequire("./layer/gutter").Gutter;
|
||
var MarkerLayer = acequire("./layer/marker").Marker;
|
||
var TextLayer = acequire("./layer/text").Text;
|
||
var CursorLayer = acequire("./layer/cursor").Cursor;
|
||
var HScrollBar = acequire("./scrollbar").HScrollBar;
|
||
var VScrollBar = acequire("./scrollbar").VScrollBar;
|
||
var RenderLoop = acequire("./renderloop").RenderLoop;
|
||
var FontMetrics = acequire("./layer/font_metrics").FontMetrics;
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var editorCss = ".ace_editor {\
|
||
position: relative;\
|
||
overflow: hidden;\
|
||
font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\
|
||
direction: ltr;\
|
||
}\
|
||
.ace_scroller {\
|
||
position: absolute;\
|
||
overflow: hidden;\
|
||
top: 0;\
|
||
bottom: 0;\
|
||
background-color: inherit;\
|
||
-ms-user-select: none;\
|
||
-moz-user-select: none;\
|
||
-webkit-user-select: none;\
|
||
user-select: none;\
|
||
cursor: text;\
|
||
}\
|
||
.ace_content {\
|
||
position: absolute;\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
min-width: 100%;\
|
||
}\
|
||
.ace_dragging .ace_scroller:before{\
|
||
position: absolute;\
|
||
top: 0;\
|
||
left: 0;\
|
||
right: 0;\
|
||
bottom: 0;\
|
||
content: '';\
|
||
background: rgba(250, 250, 250, 0.01);\
|
||
z-index: 1000;\
|
||
}\
|
||
.ace_dragging.ace_dark .ace_scroller:before{\
|
||
background: rgba(0, 0, 0, 0.01);\
|
||
}\
|
||
.ace_selecting, .ace_selecting * {\
|
||
cursor: text !important;\
|
||
}\
|
||
.ace_gutter {\
|
||
position: absolute;\
|
||
overflow : hidden;\
|
||
width: auto;\
|
||
top: 0;\
|
||
bottom: 0;\
|
||
left: 0;\
|
||
cursor: default;\
|
||
z-index: 4;\
|
||
-ms-user-select: none;\
|
||
-moz-user-select: none;\
|
||
-webkit-user-select: none;\
|
||
user-select: none;\
|
||
}\
|
||
.ace_gutter-active-line {\
|
||
position: absolute;\
|
||
left: 0;\
|
||
right: 0;\
|
||
}\
|
||
.ace_scroller.ace_scroll-left {\
|
||
box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\
|
||
}\
|
||
.ace_gutter-cell {\
|
||
padding-left: 19px;\
|
||
padding-right: 6px;\
|
||
background-repeat: no-repeat;\
|
||
}\
|
||
.ace_gutter-cell.ace_error {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\
|
||
background-repeat: no-repeat;\
|
||
background-position: 2px center;\
|
||
}\
|
||
.ace_gutter-cell.ace_warning {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\
|
||
background-position: 2px center;\
|
||
}\
|
||
.ace_gutter-cell.ace_info {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\
|
||
background-position: 2px center;\
|
||
}\
|
||
.ace_dark .ace_gutter-cell.ace_info {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\
|
||
}\
|
||
.ace_scrollbar {\
|
||
position: absolute;\
|
||
right: 0;\
|
||
bottom: 0;\
|
||
z-index: 6;\
|
||
}\
|
||
.ace_scrollbar-inner {\
|
||
position: absolute;\
|
||
cursor: text;\
|
||
left: 0;\
|
||
top: 0;\
|
||
}\
|
||
.ace_scrollbar-v{\
|
||
overflow-x: hidden;\
|
||
overflow-y: scroll;\
|
||
top: 0;\
|
||
}\
|
||
.ace_scrollbar-h {\
|
||
overflow-x: scroll;\
|
||
overflow-y: hidden;\
|
||
left: 0;\
|
||
}\
|
||
.ace_print-margin {\
|
||
position: absolute;\
|
||
height: 100%;\
|
||
}\
|
||
.ace_text-input {\
|
||
position: absolute;\
|
||
z-index: 0;\
|
||
width: 0.5em;\
|
||
height: 1em;\
|
||
opacity: 0;\
|
||
background: transparent;\
|
||
-moz-appearance: none;\
|
||
appearance: none;\
|
||
border: none;\
|
||
resize: none;\
|
||
outline: none;\
|
||
overflow: hidden;\
|
||
font: inherit;\
|
||
padding: 0 1px;\
|
||
margin: 0 -1px;\
|
||
text-indent: -1em;\
|
||
-ms-user-select: text;\
|
||
-moz-user-select: text;\
|
||
-webkit-user-select: text;\
|
||
user-select: text;\
|
||
white-space: pre!important;\
|
||
}\
|
||
.ace_text-input.ace_composition {\
|
||
background: inherit;\
|
||
color: inherit;\
|
||
z-index: 1000;\
|
||
opacity: 1;\
|
||
text-indent: 0;\
|
||
}\
|
||
.ace_layer {\
|
||
z-index: 1;\
|
||
position: absolute;\
|
||
overflow: hidden;\
|
||
word-wrap: normal;\
|
||
white-space: pre;\
|
||
height: 100%;\
|
||
width: 100%;\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
pointer-events: none;\
|
||
}\
|
||
.ace_gutter-layer {\
|
||
position: relative;\
|
||
width: auto;\
|
||
text-align: right;\
|
||
pointer-events: auto;\
|
||
}\
|
||
.ace_text-layer {\
|
||
font: inherit !important;\
|
||
}\
|
||
.ace_cjk {\
|
||
display: inline-block;\
|
||
text-align: center;\
|
||
}\
|
||
.ace_cursor-layer {\
|
||
z-index: 4;\
|
||
}\
|
||
.ace_cursor {\
|
||
z-index: 4;\
|
||
position: absolute;\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
border-left: 2px solid;\
|
||
transform: translatez(0);\
|
||
}\
|
||
.ace_slim-cursors .ace_cursor {\
|
||
border-left-width: 1px;\
|
||
}\
|
||
.ace_overwrite-cursors .ace_cursor {\
|
||
border-left-width: 0;\
|
||
border-bottom: 1px solid;\
|
||
}\
|
||
.ace_hidden-cursors .ace_cursor {\
|
||
opacity: 0.2;\
|
||
}\
|
||
.ace_smooth-blinking .ace_cursor {\
|
||
-webkit-transition: opacity 0.18s;\
|
||
transition: opacity 0.18s;\
|
||
}\
|
||
.ace_editor.ace_multiselect .ace_cursor {\
|
||
border-left-width: 1px;\
|
||
}\
|
||
.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\
|
||
position: absolute;\
|
||
z-index: 3;\
|
||
}\
|
||
.ace_marker-layer .ace_selection {\
|
||
position: absolute;\
|
||
z-index: 5;\
|
||
}\
|
||
.ace_marker-layer .ace_bracket {\
|
||
position: absolute;\
|
||
z-index: 6;\
|
||
}\
|
||
.ace_marker-layer .ace_active-line {\
|
||
position: absolute;\
|
||
z-index: 2;\
|
||
}\
|
||
.ace_marker-layer .ace_selected-word {\
|
||
position: absolute;\
|
||
z-index: 4;\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
}\
|
||
.ace_line .ace_fold {\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
display: inline-block;\
|
||
height: 11px;\
|
||
margin-top: -2px;\
|
||
vertical-align: middle;\
|
||
background-image:\
|
||
url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\
|
||
url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\
|
||
background-repeat: no-repeat, repeat-x;\
|
||
background-position: center center, top left;\
|
||
color: transparent;\
|
||
border: 1px solid black;\
|
||
border-radius: 2px;\
|
||
cursor: pointer;\
|
||
pointer-events: auto;\
|
||
}\
|
||
.ace_dark .ace_fold {\
|
||
}\
|
||
.ace_fold:hover{\
|
||
background-image:\
|
||
url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\
|
||
url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\
|
||
}\
|
||
.ace_tooltip {\
|
||
background-color: #FFF;\
|
||
background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\
|
||
background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\
|
||
border: 1px solid gray;\
|
||
border-radius: 1px;\
|
||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\
|
||
color: black;\
|
||
max-width: 100%;\
|
||
padding: 3px 4px;\
|
||
position: fixed;\
|
||
z-index: 999999;\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
cursor: default;\
|
||
white-space: pre;\
|
||
word-wrap: break-word;\
|
||
line-height: normal;\
|
||
font-style: normal;\
|
||
font-weight: normal;\
|
||
letter-spacing: normal;\
|
||
pointer-events: none;\
|
||
}\
|
||
.ace_folding-enabled > .ace_gutter-cell {\
|
||
padding-right: 13px;\
|
||
}\
|
||
.ace_fold-widget {\
|
||
-moz-box-sizing: border-box;\
|
||
-webkit-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
margin: 0 -12px 0 1px;\
|
||
display: none;\
|
||
width: 11px;\
|
||
vertical-align: top;\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\
|
||
background-repeat: no-repeat;\
|
||
background-position: center;\
|
||
border-radius: 3px;\
|
||
border: 1px solid transparent;\
|
||
cursor: pointer;\
|
||
}\
|
||
.ace_folding-enabled .ace_fold-widget {\
|
||
display: inline-block; \
|
||
}\
|
||
.ace_fold-widget.ace_end {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\
|
||
}\
|
||
.ace_fold-widget.ace_closed {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\
|
||
}\
|
||
.ace_fold-widget:hover {\
|
||
border: 1px solid rgba(0, 0, 0, 0.3);\
|
||
background-color: rgba(255, 255, 255, 0.2);\
|
||
box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\
|
||
}\
|
||
.ace_fold-widget:active {\
|
||
border: 1px solid rgba(0, 0, 0, 0.4);\
|
||
background-color: rgba(0, 0, 0, 0.05);\
|
||
box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\
|
||
}\
|
||
.ace_dark .ace_fold-widget {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\
|
||
}\
|
||
.ace_dark .ace_fold-widget.ace_end {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\
|
||
}\
|
||
.ace_dark .ace_fold-widget.ace_closed {\
|
||
background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\
|
||
}\
|
||
.ace_dark .ace_fold-widget:hover {\
|
||
box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\
|
||
background-color: rgba(255, 255, 255, 0.1);\
|
||
}\
|
||
.ace_dark .ace_fold-widget:active {\
|
||
box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\
|
||
}\
|
||
.ace_fold-widget.ace_invalid {\
|
||
background-color: #FFB4B4;\
|
||
border-color: #DE5555;\
|
||
}\
|
||
.ace_fade-fold-widgets .ace_fold-widget {\
|
||
-webkit-transition: opacity 0.4s ease 0.05s;\
|
||
transition: opacity 0.4s ease 0.05s;\
|
||
opacity: 0;\
|
||
}\
|
||
.ace_fade-fold-widgets:hover .ace_fold-widget {\
|
||
-webkit-transition: opacity 0.05s ease 0.05s;\
|
||
transition: opacity 0.05s ease 0.05s;\
|
||
opacity:1;\
|
||
}\
|
||
.ace_underline {\
|
||
text-decoration: underline;\
|
||
}\
|
||
.ace_bold {\
|
||
font-weight: bold;\
|
||
}\
|
||
.ace_nobold .ace_bold {\
|
||
font-weight: normal;\
|
||
}\
|
||
.ace_italic {\
|
||
font-style: italic;\
|
||
}\
|
||
.ace_error-marker {\
|
||
background-color: rgba(255, 0, 0,0.2);\
|
||
position: absolute;\
|
||
z-index: 9;\
|
||
}\
|
||
.ace_highlight-marker {\
|
||
background-color: rgba(255, 255, 0,0.2);\
|
||
position: absolute;\
|
||
z-index: 8;\
|
||
}\
|
||
.ace_br1 {border-top-left-radius : 3px;}\
|
||
.ace_br2 {border-top-right-radius : 3px;}\
|
||
.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\
|
||
.ace_br4 {border-bottom-right-radius: 3px;}\
|
||
.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\
|
||
.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\
|
||
.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\
|
||
.ace_br8 {border-bottom-left-radius : 3px;}\
|
||
.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\
|
||
.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\
|
||
";
|
||
|
||
dom.importCssString(editorCss, "ace_editor.css");
|
||
|
||
var VirtualRenderer = function(container, theme) {
|
||
var _self = this;
|
||
|
||
this.container = container || dom.createElement("div");
|
||
this.$keepTextAreaAtCursor = !useragent.isOldIE;
|
||
|
||
dom.addCssClass(this.container, "ace_editor");
|
||
|
||
this.setTheme(theme);
|
||
|
||
this.$gutter = dom.createElement("div");
|
||
this.$gutter.className = "ace_gutter";
|
||
this.container.appendChild(this.$gutter);
|
||
|
||
this.scroller = dom.createElement("div");
|
||
this.scroller.className = "ace_scroller";
|
||
this.container.appendChild(this.scroller);
|
||
|
||
this.content = dom.createElement("div");
|
||
this.content.className = "ace_content";
|
||
this.scroller.appendChild(this.content);
|
||
|
||
this.$gutterLayer = new GutterLayer(this.$gutter);
|
||
this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this));
|
||
|
||
this.$markerBack = new MarkerLayer(this.content);
|
||
|
||
var textLayer = this.$textLayer = new TextLayer(this.content);
|
||
this.canvas = textLayer.element;
|
||
|
||
this.$markerFront = new MarkerLayer(this.content);
|
||
|
||
this.$cursorLayer = new CursorLayer(this.content);
|
||
this.$horizScroll = false;
|
||
this.$vScroll = false;
|
||
|
||
this.scrollBar =
|
||
this.scrollBarV = new VScrollBar(this.container, this);
|
||
this.scrollBarH = new HScrollBar(this.container, this);
|
||
this.scrollBarV.addEventListener("scroll", function(e) {
|
||
if (!_self.$scrollAnimation)
|
||
_self.session.setScrollTop(e.data - _self.scrollMargin.top);
|
||
});
|
||
this.scrollBarH.addEventListener("scroll", function(e) {
|
||
if (!_self.$scrollAnimation)
|
||
_self.session.setScrollLeft(e.data - _self.scrollMargin.left);
|
||
});
|
||
|
||
this.scrollTop = 0;
|
||
this.scrollLeft = 0;
|
||
|
||
this.cursorPos = {
|
||
row : 0,
|
||
column : 0
|
||
};
|
||
|
||
this.$fontMetrics = new FontMetrics(this.container);
|
||
this.$textLayer.$setFontMetrics(this.$fontMetrics);
|
||
this.$textLayer.addEventListener("changeCharacterSize", function(e) {
|
||
_self.updateCharacterSize();
|
||
_self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);
|
||
_self._signal("changeCharacterSize", e);
|
||
});
|
||
|
||
this.$size = {
|
||
width: 0,
|
||
height: 0,
|
||
scrollerHeight: 0,
|
||
scrollerWidth: 0,
|
||
$dirty: true
|
||
};
|
||
|
||
this.layerConfig = {
|
||
width : 1,
|
||
padding : 0,
|
||
firstRow : 0,
|
||
firstRowScreen: 0,
|
||
lastRow : 0,
|
||
lineHeight : 0,
|
||
characterWidth : 0,
|
||
minHeight : 1,
|
||
maxHeight : 1,
|
||
offset : 0,
|
||
height : 1,
|
||
gutterOffset: 1
|
||
};
|
||
|
||
this.scrollMargin = {
|
||
left: 0,
|
||
right: 0,
|
||
top: 0,
|
||
bottom: 0,
|
||
v: 0,
|
||
h: 0
|
||
};
|
||
|
||
this.$loop = new RenderLoop(
|
||
this.$renderChanges.bind(this),
|
||
this.container.ownerDocument.defaultView
|
||
);
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
|
||
this.updateCharacterSize();
|
||
this.setPadding(4);
|
||
config.resetOptions(this);
|
||
config._emit("renderer", this);
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.CHANGE_CURSOR = 1;
|
||
this.CHANGE_MARKER = 2;
|
||
this.CHANGE_GUTTER = 4;
|
||
this.CHANGE_SCROLL = 8;
|
||
this.CHANGE_LINES = 16;
|
||
this.CHANGE_TEXT = 32;
|
||
this.CHANGE_SIZE = 64;
|
||
this.CHANGE_MARKER_BACK = 128;
|
||
this.CHANGE_MARKER_FRONT = 256;
|
||
this.CHANGE_FULL = 512;
|
||
this.CHANGE_H_SCROLL = 1024;
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.updateCharacterSize = function() {
|
||
if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {
|
||
this.$allowBoldFonts = this.$textLayer.allowBoldFonts;
|
||
this.setStyle("ace_nobold", !this.$allowBoldFonts);
|
||
}
|
||
|
||
this.layerConfig.characterWidth =
|
||
this.characterWidth = this.$textLayer.getCharacterWidth();
|
||
this.layerConfig.lineHeight =
|
||
this.lineHeight = this.$textLayer.getLineHeight();
|
||
this.$updatePrintMargin();
|
||
};
|
||
this.setSession = function(session) {
|
||
if (this.session)
|
||
this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode);
|
||
|
||
this.session = session;
|
||
if (session && this.scrollMargin.top && session.getScrollTop() <= 0)
|
||
session.setScrollTop(-this.scrollMargin.top);
|
||
|
||
this.$cursorLayer.setSession(session);
|
||
this.$markerBack.setSession(session);
|
||
this.$markerFront.setSession(session);
|
||
this.$gutterLayer.setSession(session);
|
||
this.$textLayer.setSession(session);
|
||
if (!session)
|
||
return;
|
||
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
this.session.$setFontMetrics(this.$fontMetrics);
|
||
|
||
this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);
|
||
this.onChangeNewLineMode()
|
||
this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode);
|
||
};
|
||
this.updateLines = function(firstRow, lastRow, force) {
|
||
if (lastRow === undefined)
|
||
lastRow = Infinity;
|
||
|
||
if (!this.$changedLines) {
|
||
this.$changedLines = {
|
||
firstRow: firstRow,
|
||
lastRow: lastRow
|
||
};
|
||
}
|
||
else {
|
||
if (this.$changedLines.firstRow > firstRow)
|
||
this.$changedLines.firstRow = firstRow;
|
||
|
||
if (this.$changedLines.lastRow < lastRow)
|
||
this.$changedLines.lastRow = lastRow;
|
||
}
|
||
if (this.$changedLines.lastRow < this.layerConfig.firstRow) {
|
||
if (force)
|
||
this.$changedLines.lastRow = this.layerConfig.lastRow;
|
||
else
|
||
return;
|
||
}
|
||
if (this.$changedLines.firstRow > this.layerConfig.lastRow)
|
||
return;
|
||
this.$loop.schedule(this.CHANGE_LINES);
|
||
};
|
||
|
||
this.onChangeNewLineMode = function() {
|
||
this.$loop.schedule(this.CHANGE_TEXT);
|
||
this.$textLayer.$updateEolChar();
|
||
};
|
||
|
||
this.onChangeTabSize = function() {
|
||
this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);
|
||
this.$textLayer.onChangeTabSize();
|
||
};
|
||
this.updateText = function() {
|
||
this.$loop.schedule(this.CHANGE_TEXT);
|
||
};
|
||
this.updateFull = function(force) {
|
||
if (force)
|
||
this.$renderChanges(this.CHANGE_FULL, true);
|
||
else
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
};
|
||
this.updateFontSize = function() {
|
||
this.$textLayer.checkForSizeChanges();
|
||
};
|
||
|
||
this.$changes = 0;
|
||
this.$updateSizeAsync = function() {
|
||
if (this.$loop.pending)
|
||
this.$size.$dirty = true;
|
||
else
|
||
this.onResize();
|
||
};
|
||
this.onResize = function(force, gutterWidth, width, height) {
|
||
if (this.resizing > 2)
|
||
return;
|
||
else if (this.resizing > 0)
|
||
this.resizing++;
|
||
else
|
||
this.resizing = force ? 1 : 0;
|
||
var el = this.container;
|
||
if (!height)
|
||
height = el.clientHeight || el.scrollHeight;
|
||
if (!width)
|
||
width = el.clientWidth || el.scrollWidth;
|
||
var changes = this.$updateCachedSize(force, gutterWidth, width, height);
|
||
|
||
|
||
if (!this.$size.scrollerHeight || (!width && !height))
|
||
return this.resizing = 0;
|
||
|
||
if (force)
|
||
this.$gutterLayer.$padding = null;
|
||
|
||
if (force)
|
||
this.$renderChanges(changes | this.$changes, true);
|
||
else
|
||
this.$loop.schedule(changes | this.$changes);
|
||
|
||
if (this.resizing)
|
||
this.resizing = 0;
|
||
this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;
|
||
};
|
||
|
||
this.$updateCachedSize = function(force, gutterWidth, width, height) {
|
||
height -= (this.$extraHeight || 0);
|
||
var changes = 0;
|
||
var size = this.$size;
|
||
var oldSize = {
|
||
width: size.width,
|
||
height: size.height,
|
||
scrollerHeight: size.scrollerHeight,
|
||
scrollerWidth: size.scrollerWidth
|
||
};
|
||
if (height && (force || size.height != height)) {
|
||
size.height = height;
|
||
changes |= this.CHANGE_SIZE;
|
||
|
||
size.scrollerHeight = size.height;
|
||
if (this.$horizScroll)
|
||
size.scrollerHeight -= this.scrollBarH.getHeight();
|
||
this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px";
|
||
|
||
changes = changes | this.CHANGE_SCROLL;
|
||
}
|
||
|
||
if (width && (force || size.width != width)) {
|
||
changes |= this.CHANGE_SIZE;
|
||
size.width = width;
|
||
|
||
if (gutterWidth == null)
|
||
gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;
|
||
|
||
this.gutterWidth = gutterWidth;
|
||
|
||
this.scrollBarH.element.style.left =
|
||
this.scroller.style.left = gutterWidth + "px";
|
||
size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());
|
||
|
||
this.scrollBarH.element.style.right =
|
||
this.scroller.style.right = this.scrollBarV.getWidth() + "px";
|
||
this.scroller.style.bottom = this.scrollBarH.getHeight() + "px";
|
||
|
||
if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)
|
||
changes |= this.CHANGE_FULL;
|
||
}
|
||
|
||
size.$dirty = !width || !height;
|
||
|
||
if (changes)
|
||
this._signal("resize", oldSize);
|
||
|
||
return changes;
|
||
};
|
||
|
||
this.onGutterResize = function() {
|
||
var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;
|
||
if (gutterWidth != this.gutterWidth)
|
||
this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);
|
||
|
||
if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
} else if (this.$size.$dirty) {
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
} else {
|
||
this.$computeLayerConfig();
|
||
this.$loop.schedule(this.CHANGE_MARKER);
|
||
}
|
||
};
|
||
this.adjustWrapLimit = function() {
|
||
var availableWidth = this.$size.scrollerWidth - this.$padding * 2;
|
||
var limit = Math.floor(availableWidth / this.characterWidth);
|
||
return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);
|
||
};
|
||
this.setAnimatedScroll = function(shouldAnimate){
|
||
this.setOption("animatedScroll", shouldAnimate);
|
||
};
|
||
this.getAnimatedScroll = function() {
|
||
return this.$animatedScroll;
|
||
};
|
||
this.setShowInvisibles = function(showInvisibles) {
|
||
this.setOption("showInvisibles", showInvisibles);
|
||
};
|
||
this.getShowInvisibles = function() {
|
||
return this.getOption("showInvisibles");
|
||
};
|
||
this.getDisplayIndentGuides = function() {
|
||
return this.getOption("displayIndentGuides");
|
||
};
|
||
|
||
this.setDisplayIndentGuides = function(display) {
|
||
this.setOption("displayIndentGuides", display);
|
||
};
|
||
this.setShowPrintMargin = function(showPrintMargin) {
|
||
this.setOption("showPrintMargin", showPrintMargin);
|
||
};
|
||
this.getShowPrintMargin = function() {
|
||
return this.getOption("showPrintMargin");
|
||
};
|
||
this.setPrintMarginColumn = function(showPrintMargin) {
|
||
this.setOption("printMarginColumn", showPrintMargin);
|
||
};
|
||
this.getPrintMarginColumn = function() {
|
||
return this.getOption("printMarginColumn");
|
||
};
|
||
this.getShowGutter = function(){
|
||
return this.getOption("showGutter");
|
||
};
|
||
this.setShowGutter = function(show){
|
||
return this.setOption("showGutter", show);
|
||
};
|
||
|
||
this.getFadeFoldWidgets = function(){
|
||
return this.getOption("fadeFoldWidgets")
|
||
};
|
||
|
||
this.setFadeFoldWidgets = function(show) {
|
||
this.setOption("fadeFoldWidgets", show);
|
||
};
|
||
|
||
this.setHighlightGutterLine = function(shouldHighlight) {
|
||
this.setOption("highlightGutterLine", shouldHighlight);
|
||
};
|
||
|
||
this.getHighlightGutterLine = function() {
|
||
return this.getOption("highlightGutterLine");
|
||
};
|
||
|
||
this.$updateGutterLineHighlight = function() {
|
||
var pos = this.$cursorLayer.$pixelPos;
|
||
var height = this.layerConfig.lineHeight;
|
||
if (this.session.getUseWrapMode()) {
|
||
var cursor = this.session.selection.getCursor();
|
||
cursor.column = 0;
|
||
pos = this.$cursorLayer.getPixelPosition(cursor, true);
|
||
height *= this.session.getRowLength(cursor.row);
|
||
}
|
||
this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px";
|
||
this.$gutterLineHighlight.style.height = height + "px";
|
||
};
|
||
|
||
this.$updatePrintMargin = function() {
|
||
if (!this.$showPrintMargin && !this.$printMarginEl)
|
||
return;
|
||
|
||
if (!this.$printMarginEl) {
|
||
var containerEl = dom.createElement("div");
|
||
containerEl.className = "ace_layer ace_print-margin-layer";
|
||
this.$printMarginEl = dom.createElement("div");
|
||
this.$printMarginEl.className = "ace_print-margin";
|
||
containerEl.appendChild(this.$printMarginEl);
|
||
this.content.insertBefore(containerEl, this.content.firstChild);
|
||
}
|
||
|
||
var style = this.$printMarginEl.style;
|
||
style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px";
|
||
style.visibility = this.$showPrintMargin ? "visible" : "hidden";
|
||
|
||
if (this.session && this.session.$wrap == -1)
|
||
this.adjustWrapLimit();
|
||
};
|
||
this.getContainerElement = function() {
|
||
return this.container;
|
||
};
|
||
this.getMouseEventTarget = function() {
|
||
return this.scroller;
|
||
};
|
||
this.getTextAreaContainer = function() {
|
||
return this.container;
|
||
};
|
||
this.$moveTextAreaToCursor = function() {
|
||
if (!this.$keepTextAreaAtCursor)
|
||
return;
|
||
var config = this.layerConfig;
|
||
var posTop = this.$cursorLayer.$pixelPos.top;
|
||
var posLeft = this.$cursorLayer.$pixelPos.left;
|
||
posTop -= config.offset;
|
||
|
||
var style = this.textarea.style;
|
||
var h = this.lineHeight;
|
||
if (posTop < 0 || posTop > config.height - h) {
|
||
style.top = style.left = "0";
|
||
return;
|
||
}
|
||
|
||
var w = this.characterWidth;
|
||
if (this.$composition) {
|
||
var val = this.textarea.value.replace(/^\x01+/, "");
|
||
w *= (this.session.$getStringScreenWidth(val)[0]+2);
|
||
h += 2;
|
||
}
|
||
posLeft -= this.scrollLeft;
|
||
if (posLeft > this.$size.scrollerWidth - w)
|
||
posLeft = this.$size.scrollerWidth - w;
|
||
|
||
posLeft += this.gutterWidth;
|
||
style.height = h + "px";
|
||
style.width = w + "px";
|
||
style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px";
|
||
style.top = Math.min(posTop, this.$size.height - h) + "px";
|
||
};
|
||
this.getFirstVisibleRow = function() {
|
||
return this.layerConfig.firstRow;
|
||
};
|
||
this.getFirstFullyVisibleRow = function() {
|
||
return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);
|
||
};
|
||
this.getLastFullyVisibleRow = function() {
|
||
var config = this.layerConfig;
|
||
var lastRow = config.lastRow
|
||
var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;
|
||
if (top - this.session.getScrollTop() > config.height - config.lineHeight)
|
||
return lastRow - 1;
|
||
return lastRow;
|
||
};
|
||
this.getLastVisibleRow = function() {
|
||
return this.layerConfig.lastRow;
|
||
};
|
||
|
||
this.$padding = null;
|
||
this.setPadding = function(padding) {
|
||
this.$padding = padding;
|
||
this.$textLayer.setPadding(padding);
|
||
this.$cursorLayer.setPadding(padding);
|
||
this.$markerFront.setPadding(padding);
|
||
this.$markerBack.setPadding(padding);
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
this.$updatePrintMargin();
|
||
};
|
||
|
||
this.setScrollMargin = function(top, bottom, left, right) {
|
||
var sm = this.scrollMargin;
|
||
sm.top = top|0;
|
||
sm.bottom = bottom|0;
|
||
sm.right = right|0;
|
||
sm.left = left|0;
|
||
sm.v = sm.top + sm.bottom;
|
||
sm.h = sm.left + sm.right;
|
||
if (sm.top && this.scrollTop <= 0 && this.session)
|
||
this.session.setScrollTop(-sm.top);
|
||
this.updateFull();
|
||
};
|
||
this.getHScrollBarAlwaysVisible = function() {
|
||
return this.$hScrollBarAlwaysVisible;
|
||
};
|
||
this.setHScrollBarAlwaysVisible = function(alwaysVisible) {
|
||
this.setOption("hScrollBarAlwaysVisible", alwaysVisible);
|
||
};
|
||
this.getVScrollBarAlwaysVisible = function() {
|
||
return this.$vScrollBarAlwaysVisible;
|
||
};
|
||
this.setVScrollBarAlwaysVisible = function(alwaysVisible) {
|
||
this.setOption("vScrollBarAlwaysVisible", alwaysVisible);
|
||
};
|
||
|
||
this.$updateScrollBarV = function() {
|
||
var scrollHeight = this.layerConfig.maxHeight;
|
||
var scrollerHeight = this.$size.scrollerHeight;
|
||
if (!this.$maxLines && this.$scrollPastEnd) {
|
||
scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;
|
||
if (this.scrollTop > scrollHeight - scrollerHeight) {
|
||
scrollHeight = this.scrollTop + scrollerHeight;
|
||
this.scrollBarV.scrollTop = null;
|
||
}
|
||
}
|
||
this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);
|
||
this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);
|
||
};
|
||
this.$updateScrollBarH = function() {
|
||
this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);
|
||
this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);
|
||
};
|
||
|
||
this.$frozen = false;
|
||
this.freeze = function() {
|
||
this.$frozen = true;
|
||
};
|
||
|
||
this.unfreeze = function() {
|
||
this.$frozen = false;
|
||
};
|
||
|
||
this.$renderChanges = function(changes, force) {
|
||
if (this.$changes) {
|
||
changes |= this.$changes;
|
||
this.$changes = 0;
|
||
}
|
||
if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {
|
||
this.$changes |= changes;
|
||
return;
|
||
}
|
||
if (this.$size.$dirty) {
|
||
this.$changes |= changes;
|
||
return this.onResize(true);
|
||
}
|
||
if (!this.lineHeight) {
|
||
this.$textLayer.checkForSizeChanges();
|
||
}
|
||
|
||
this._signal("beforeRender");
|
||
var config = this.layerConfig;
|
||
if (changes & this.CHANGE_FULL ||
|
||
changes & this.CHANGE_SIZE ||
|
||
changes & this.CHANGE_TEXT ||
|
||
changes & this.CHANGE_LINES ||
|
||
changes & this.CHANGE_SCROLL ||
|
||
changes & this.CHANGE_H_SCROLL
|
||
) {
|
||
changes |= this.$computeLayerConfig();
|
||
if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {
|
||
var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;
|
||
if (st > 0) {
|
||
this.scrollTop = st;
|
||
changes = changes | this.CHANGE_SCROLL;
|
||
changes |= this.$computeLayerConfig();
|
||
}
|
||
}
|
||
config = this.layerConfig;
|
||
this.$updateScrollBarV();
|
||
if (changes & this.CHANGE_H_SCROLL)
|
||
this.$updateScrollBarH();
|
||
this.$gutterLayer.element.style.marginTop = (-config.offset) + "px";
|
||
this.content.style.marginTop = (-config.offset) + "px";
|
||
this.content.style.width = config.width + 2 * this.$padding + "px";
|
||
this.content.style.height = config.minHeight + "px";
|
||
}
|
||
if (changes & this.CHANGE_H_SCROLL) {
|
||
this.content.style.marginLeft = -this.scrollLeft + "px";
|
||
this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left";
|
||
}
|
||
if (changes & this.CHANGE_FULL) {
|
||
this.$textLayer.update(config);
|
||
if (this.$showGutter)
|
||
this.$gutterLayer.update(config);
|
||
this.$markerBack.update(config);
|
||
this.$markerFront.update(config);
|
||
this.$cursorLayer.update(config);
|
||
this.$moveTextAreaToCursor();
|
||
this.$highlightGutterLine && this.$updateGutterLineHighlight();
|
||
this._signal("afterRender");
|
||
return;
|
||
}
|
||
if (changes & this.CHANGE_SCROLL) {
|
||
if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)
|
||
this.$textLayer.update(config);
|
||
else
|
||
this.$textLayer.scrollLines(config);
|
||
|
||
if (this.$showGutter)
|
||
this.$gutterLayer.update(config);
|
||
this.$markerBack.update(config);
|
||
this.$markerFront.update(config);
|
||
this.$cursorLayer.update(config);
|
||
this.$highlightGutterLine && this.$updateGutterLineHighlight();
|
||
this.$moveTextAreaToCursor();
|
||
this._signal("afterRender");
|
||
return;
|
||
}
|
||
|
||
if (changes & this.CHANGE_TEXT) {
|
||
this.$textLayer.update(config);
|
||
if (this.$showGutter)
|
||
this.$gutterLayer.update(config);
|
||
}
|
||
else if (changes & this.CHANGE_LINES) {
|
||
if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)
|
||
this.$gutterLayer.update(config);
|
||
}
|
||
else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {
|
||
if (this.$showGutter)
|
||
this.$gutterLayer.update(config);
|
||
}
|
||
|
||
if (changes & this.CHANGE_CURSOR) {
|
||
this.$cursorLayer.update(config);
|
||
this.$moveTextAreaToCursor();
|
||
this.$highlightGutterLine && this.$updateGutterLineHighlight();
|
||
}
|
||
|
||
if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {
|
||
this.$markerFront.update(config);
|
||
}
|
||
|
||
if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {
|
||
this.$markerBack.update(config);
|
||
}
|
||
|
||
this._signal("afterRender");
|
||
};
|
||
|
||
|
||
this.$autosize = function() {
|
||
var height = this.session.getScreenLength() * this.lineHeight;
|
||
var maxHeight = this.$maxLines * this.lineHeight;
|
||
var desiredHeight = Math.max(
|
||
(this.$minLines||1) * this.lineHeight,
|
||
Math.min(maxHeight, height)
|
||
) + this.scrollMargin.v + (this.$extraHeight || 0);
|
||
if (this.$horizScroll)
|
||
desiredHeight += this.scrollBarH.getHeight();
|
||
var vScroll = height > maxHeight;
|
||
|
||
if (desiredHeight != this.desiredHeight ||
|
||
this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {
|
||
if (vScroll != this.$vScroll) {
|
||
this.$vScroll = vScroll;
|
||
this.scrollBarV.setVisible(vScroll);
|
||
}
|
||
|
||
var w = this.container.clientWidth;
|
||
this.container.style.height = desiredHeight + "px";
|
||
this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);
|
||
this.desiredHeight = desiredHeight;
|
||
|
||
this._signal("autosize");
|
||
}
|
||
};
|
||
|
||
this.$computeLayerConfig = function() {
|
||
var session = this.session;
|
||
var size = this.$size;
|
||
|
||
var hideScrollbars = size.height <= 2 * this.lineHeight;
|
||
var screenLines = this.session.getScreenLength();
|
||
var maxHeight = screenLines * this.lineHeight;
|
||
|
||
var longestLine = this.$getLongestLine();
|
||
|
||
var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||
|
||
size.scrollerWidth - longestLine - 2 * this.$padding < 0);
|
||
|
||
var hScrollChanged = this.$horizScroll !== horizScroll;
|
||
if (hScrollChanged) {
|
||
this.$horizScroll = horizScroll;
|
||
this.scrollBarH.setVisible(horizScroll);
|
||
}
|
||
var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine
|
||
if (this.$maxLines && this.lineHeight > 1)
|
||
this.$autosize();
|
||
|
||
var offset = this.scrollTop % this.lineHeight;
|
||
var minHeight = size.scrollerHeight + this.lineHeight;
|
||
|
||
var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd
|
||
? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd
|
||
: 0;
|
||
maxHeight += scrollPastEnd;
|
||
|
||
var sm = this.scrollMargin;
|
||
this.session.setScrollTop(Math.max(-sm.top,
|
||
Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));
|
||
|
||
this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft,
|
||
longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));
|
||
|
||
var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||
|
||
size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);
|
||
var vScrollChanged = vScrollBefore !== vScroll;
|
||
if (vScrollChanged) {
|
||
this.$vScroll = vScroll;
|
||
this.scrollBarV.setVisible(vScroll);
|
||
}
|
||
|
||
var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;
|
||
var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));
|
||
var lastRow = firstRow + lineCount;
|
||
var firstRowScreen, firstRowHeight;
|
||
var lineHeight = this.lineHeight;
|
||
firstRow = session.screenToDocumentRow(firstRow, 0);
|
||
var foldLine = session.getFoldLine(firstRow);
|
||
if (foldLine) {
|
||
firstRow = foldLine.start.row;
|
||
}
|
||
|
||
firstRowScreen = session.documentToScreenRow(firstRow, 0);
|
||
firstRowHeight = session.getRowLength(firstRow) * lineHeight;
|
||
|
||
lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);
|
||
minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +
|
||
firstRowHeight;
|
||
|
||
offset = this.scrollTop - firstRowScreen * lineHeight;
|
||
|
||
var changes = 0;
|
||
if (this.layerConfig.width != longestLine)
|
||
changes = this.CHANGE_H_SCROLL;
|
||
if (hScrollChanged || vScrollChanged) {
|
||
changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);
|
||
this._signal("scrollbarVisibilityChanged");
|
||
if (vScrollChanged)
|
||
longestLine = this.$getLongestLine();
|
||
}
|
||
|
||
this.layerConfig = {
|
||
width : longestLine,
|
||
padding : this.$padding,
|
||
firstRow : firstRow,
|
||
firstRowScreen: firstRowScreen,
|
||
lastRow : lastRow,
|
||
lineHeight : lineHeight,
|
||
characterWidth : this.characterWidth,
|
||
minHeight : minHeight,
|
||
maxHeight : maxHeight,
|
||
offset : offset,
|
||
gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)),
|
||
height : this.$size.scrollerHeight
|
||
};
|
||
|
||
return changes;
|
||
};
|
||
|
||
this.$updateLines = function() {
|
||
var firstRow = this.$changedLines.firstRow;
|
||
var lastRow = this.$changedLines.lastRow;
|
||
this.$changedLines = null;
|
||
|
||
var layerConfig = this.layerConfig;
|
||
|
||
if (firstRow > layerConfig.lastRow + 1) { return; }
|
||
if (lastRow < layerConfig.firstRow) { return; }
|
||
if (lastRow === Infinity) {
|
||
if (this.$showGutter)
|
||
this.$gutterLayer.update(layerConfig);
|
||
this.$textLayer.update(layerConfig);
|
||
return;
|
||
}
|
||
this.$textLayer.updateLines(layerConfig, firstRow, lastRow);
|
||
return true;
|
||
};
|
||
|
||
this.$getLongestLine = function() {
|
||
var charCount = this.session.getScreenWidth();
|
||
if (this.showInvisibles && !this.session.$useWrapMode)
|
||
charCount += 1;
|
||
|
||
return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));
|
||
};
|
||
this.updateFrontMarkers = function() {
|
||
this.$markerFront.setMarkers(this.session.getMarkers(true));
|
||
this.$loop.schedule(this.CHANGE_MARKER_FRONT);
|
||
};
|
||
this.updateBackMarkers = function() {
|
||
this.$markerBack.setMarkers(this.session.getMarkers());
|
||
this.$loop.schedule(this.CHANGE_MARKER_BACK);
|
||
};
|
||
this.addGutterDecoration = function(row, className){
|
||
this.$gutterLayer.addGutterDecoration(row, className);
|
||
};
|
||
this.removeGutterDecoration = function(row, className){
|
||
this.$gutterLayer.removeGutterDecoration(row, className);
|
||
};
|
||
this.updateBreakpoints = function(rows) {
|
||
this.$loop.schedule(this.CHANGE_GUTTER);
|
||
};
|
||
this.setAnnotations = function(annotations) {
|
||
this.$gutterLayer.setAnnotations(annotations);
|
||
this.$loop.schedule(this.CHANGE_GUTTER);
|
||
};
|
||
this.updateCursor = function() {
|
||
this.$loop.schedule(this.CHANGE_CURSOR);
|
||
};
|
||
this.hideCursor = function() {
|
||
this.$cursorLayer.hideCursor();
|
||
};
|
||
this.showCursor = function() {
|
||
this.$cursorLayer.showCursor();
|
||
};
|
||
|
||
this.scrollSelectionIntoView = function(anchor, lead, offset) {
|
||
this.scrollCursorIntoView(anchor, offset);
|
||
this.scrollCursorIntoView(lead, offset);
|
||
};
|
||
this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {
|
||
if (this.$size.scrollerHeight === 0)
|
||
return;
|
||
|
||
var pos = this.$cursorLayer.getPixelPosition(cursor);
|
||
|
||
var left = pos.left;
|
||
var top = pos.top;
|
||
|
||
var topMargin = $viewMargin && $viewMargin.top || 0;
|
||
var bottomMargin = $viewMargin && $viewMargin.bottom || 0;
|
||
|
||
var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;
|
||
|
||
if (scrollTop + topMargin > top) {
|
||
if (offset && scrollTop + topMargin > top + this.lineHeight)
|
||
top -= offset * this.$size.scrollerHeight;
|
||
if (top === 0)
|
||
top = -this.scrollMargin.top;
|
||
this.session.setScrollTop(top);
|
||
} else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {
|
||
if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)
|
||
top += offset * this.$size.scrollerHeight;
|
||
this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);
|
||
}
|
||
|
||
var scrollLeft = this.scrollLeft;
|
||
|
||
if (scrollLeft > left) {
|
||
if (left < this.$padding + 2 * this.layerConfig.characterWidth)
|
||
left = -this.scrollMargin.left;
|
||
this.session.setScrollLeft(left);
|
||
} else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {
|
||
this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));
|
||
} else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {
|
||
this.session.setScrollLeft(0);
|
||
}
|
||
};
|
||
this.getScrollTop = function() {
|
||
return this.session.getScrollTop();
|
||
};
|
||
this.getScrollLeft = function() {
|
||
return this.session.getScrollLeft();
|
||
};
|
||
this.getScrollTopRow = function() {
|
||
return this.scrollTop / this.lineHeight;
|
||
};
|
||
this.getScrollBottomRow = function() {
|
||
return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);
|
||
};
|
||
this.scrollToRow = function(row) {
|
||
this.session.setScrollTop(row * this.lineHeight);
|
||
};
|
||
|
||
this.alignCursor = function(cursor, alignment) {
|
||
if (typeof cursor == "number")
|
||
cursor = {row: cursor, column: 0};
|
||
|
||
var pos = this.$cursorLayer.getPixelPosition(cursor);
|
||
var h = this.$size.scrollerHeight - this.lineHeight;
|
||
var offset = pos.top - h * (alignment || 0);
|
||
|
||
this.session.setScrollTop(offset);
|
||
return offset;
|
||
};
|
||
|
||
this.STEPS = 8;
|
||
this.$calcSteps = function(fromValue, toValue){
|
||
var i = 0;
|
||
var l = this.STEPS;
|
||
var steps = [];
|
||
|
||
var func = function(t, x_min, dx) {
|
||
return dx * (Math.pow(t - 1, 3) + 1) + x_min;
|
||
};
|
||
|
||
for (i = 0; i < l; ++i)
|
||
steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));
|
||
|
||
return steps;
|
||
};
|
||
this.scrollToLine = function(line, center, animate, callback) {
|
||
var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});
|
||
var offset = pos.top;
|
||
if (center)
|
||
offset -= this.$size.scrollerHeight / 2;
|
||
|
||
var initialScroll = this.scrollTop;
|
||
this.session.setScrollTop(offset);
|
||
if (animate !== false)
|
||
this.animateScrolling(initialScroll, callback);
|
||
};
|
||
|
||
this.animateScrolling = function(fromValue, callback) {
|
||
var toValue = this.scrollTop;
|
||
if (!this.$animatedScroll)
|
||
return;
|
||
var _self = this;
|
||
|
||
if (fromValue == toValue)
|
||
return;
|
||
|
||
if (this.$scrollAnimation) {
|
||
var oldSteps = this.$scrollAnimation.steps;
|
||
if (oldSteps.length) {
|
||
fromValue = oldSteps[0];
|
||
if (fromValue == toValue)
|
||
return;
|
||
}
|
||
}
|
||
|
||
var steps = _self.$calcSteps(fromValue, toValue);
|
||
this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};
|
||
|
||
clearInterval(this.$timer);
|
||
|
||
_self.session.setScrollTop(steps.shift());
|
||
_self.session.$scrollTop = toValue;
|
||
this.$timer = setInterval(function() {
|
||
if (steps.length) {
|
||
_self.session.setScrollTop(steps.shift());
|
||
_self.session.$scrollTop = toValue;
|
||
} else if (toValue != null) {
|
||
_self.session.$scrollTop = -1;
|
||
_self.session.setScrollTop(toValue);
|
||
toValue = null;
|
||
} else {
|
||
_self.$timer = clearInterval(_self.$timer);
|
||
_self.$scrollAnimation = null;
|
||
callback && callback();
|
||
}
|
||
}, 10);
|
||
};
|
||
this.scrollToY = function(scrollTop) {
|
||
if (this.scrollTop !== scrollTop) {
|
||
this.$loop.schedule(this.CHANGE_SCROLL);
|
||
this.scrollTop = scrollTop;
|
||
}
|
||
};
|
||
this.scrollToX = function(scrollLeft) {
|
||
if (this.scrollLeft !== scrollLeft)
|
||
this.scrollLeft = scrollLeft;
|
||
this.$loop.schedule(this.CHANGE_H_SCROLL);
|
||
};
|
||
this.scrollTo = function(x, y) {
|
||
this.session.setScrollTop(y);
|
||
this.session.setScrollLeft(y);
|
||
};
|
||
this.scrollBy = function(deltaX, deltaY) {
|
||
deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);
|
||
deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);
|
||
};
|
||
this.isScrollableBy = function(deltaX, deltaY) {
|
||
if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)
|
||
return true;
|
||
if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight
|
||
- this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)
|
||
return true;
|
||
if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)
|
||
return true;
|
||
if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth
|
||
- this.layerConfig.width < -1 + this.scrollMargin.right)
|
||
return true;
|
||
};
|
||
|
||
this.pixelToScreenCoordinates = function(x, y) {
|
||
var canvasPos = this.scroller.getBoundingClientRect();
|
||
|
||
var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;
|
||
var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);
|
||
var col = Math.round(offset);
|
||
|
||
return {row: row, column: col, side: offset - col > 0 ? 1 : -1};
|
||
};
|
||
|
||
this.screenToTextCoordinates = function(x, y) {
|
||
var canvasPos = this.scroller.getBoundingClientRect();
|
||
|
||
var col = Math.round(
|
||
(x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth
|
||
);
|
||
|
||
var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;
|
||
|
||
return this.session.screenToDocumentPosition(row, Math.max(col, 0));
|
||
};
|
||
this.textToScreenCoordinates = function(row, column) {
|
||
var canvasPos = this.scroller.getBoundingClientRect();
|
||
var pos = this.session.documentToScreenPosition(row, column);
|
||
|
||
var x = this.$padding + Math.round(pos.column * this.characterWidth);
|
||
var y = pos.row * this.lineHeight;
|
||
|
||
return {
|
||
pageX: canvasPos.left + x - this.scrollLeft,
|
||
pageY: canvasPos.top + y - this.scrollTop
|
||
};
|
||
};
|
||
this.visualizeFocus = function() {
|
||
dom.addCssClass(this.container, "ace_focus");
|
||
};
|
||
this.visualizeBlur = function() {
|
||
dom.removeCssClass(this.container, "ace_focus");
|
||
};
|
||
this.showComposition = function(position) {
|
||
if (!this.$composition)
|
||
this.$composition = {
|
||
keepTextAreaAtCursor: this.$keepTextAreaAtCursor,
|
||
cssText: this.textarea.style.cssText
|
||
};
|
||
|
||
this.$keepTextAreaAtCursor = true;
|
||
dom.addCssClass(this.textarea, "ace_composition");
|
||
this.textarea.style.cssText = "";
|
||
this.$moveTextAreaToCursor();
|
||
};
|
||
this.setCompositionText = function(text) {
|
||
this.$moveTextAreaToCursor();
|
||
};
|
||
this.hideComposition = function() {
|
||
if (!this.$composition)
|
||
return;
|
||
|
||
dom.removeCssClass(this.textarea, "ace_composition");
|
||
this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;
|
||
this.textarea.style.cssText = this.$composition.cssText;
|
||
this.$composition = null;
|
||
};
|
||
this.setTheme = function(theme, cb) {
|
||
var _self = this;
|
||
this.$themeId = theme;
|
||
_self._dispatchEvent('themeChange',{theme:theme});
|
||
|
||
if (!theme || typeof theme == "string") {
|
||
var moduleName = theme || this.$options.theme.initialValue;
|
||
config.loadModule(["theme", moduleName], afterLoad);
|
||
} else {
|
||
afterLoad(theme);
|
||
}
|
||
|
||
function afterLoad(module) {
|
||
if (_self.$themeId != theme)
|
||
return cb && cb();
|
||
if (!module.cssClass)
|
||
return;
|
||
dom.importCssString(
|
||
module.cssText,
|
||
module.cssClass,
|
||
_self.container.ownerDocument
|
||
);
|
||
|
||
if (_self.theme)
|
||
dom.removeCssClass(_self.container, _self.theme.cssClass);
|
||
|
||
var padding = "padding" in module ? module.padding
|
||
: "padding" in (_self.theme || {}) ? 4 : _self.$padding;
|
||
if (_self.$padding && padding != _self.$padding)
|
||
_self.setPadding(padding);
|
||
_self.$theme = module.cssClass;
|
||
|
||
_self.theme = module;
|
||
dom.addCssClass(_self.container, module.cssClass);
|
||
dom.setCssClass(_self.container, "ace_dark", module.isDark);
|
||
if (_self.$size) {
|
||
_self.$size.width = 0;
|
||
_self.$updateSizeAsync();
|
||
}
|
||
|
||
_self._dispatchEvent('themeLoaded', {theme:module});
|
||
cb && cb();
|
||
}
|
||
};
|
||
this.getTheme = function() {
|
||
return this.$themeId;
|
||
};
|
||
this.setStyle = function(style, include) {
|
||
dom.setCssClass(this.container, style, include !== false);
|
||
};
|
||
this.unsetStyle = function(style) {
|
||
dom.removeCssClass(this.container, style);
|
||
};
|
||
|
||
this.setCursorStyle = function(style) {
|
||
if (this.scroller.style.cursor != style)
|
||
this.scroller.style.cursor = style;
|
||
};
|
||
this.setMouseCursor = function(cursorStyle) {
|
||
this.scroller.style.cursor = cursorStyle;
|
||
};
|
||
this.destroy = function() {
|
||
this.$textLayer.destroy();
|
||
this.$cursorLayer.destroy();
|
||
};
|
||
|
||
}).call(VirtualRenderer.prototype);
|
||
|
||
|
||
config.defineOptions(VirtualRenderer.prototype, "renderer", {
|
||
animatedScroll: {initialValue: false},
|
||
showInvisibles: {
|
||
set: function(value) {
|
||
if (this.$textLayer.setShowInvisibles(value))
|
||
this.$loop.schedule(this.CHANGE_TEXT);
|
||
},
|
||
initialValue: false
|
||
},
|
||
showPrintMargin: {
|
||
set: function() { this.$updatePrintMargin(); },
|
||
initialValue: true
|
||
},
|
||
printMarginColumn: {
|
||
set: function() { this.$updatePrintMargin(); },
|
||
initialValue: 80
|
||
},
|
||
printMargin: {
|
||
set: function(val) {
|
||
if (typeof val == "number")
|
||
this.$printMarginColumn = val;
|
||
this.$showPrintMargin = !!val;
|
||
this.$updatePrintMargin();
|
||
},
|
||
get: function() {
|
||
return this.$showPrintMargin && this.$printMarginColumn;
|
||
}
|
||
},
|
||
showGutter: {
|
||
set: function(show){
|
||
this.$gutter.style.display = show ? "block" : "none";
|
||
this.$loop.schedule(this.CHANGE_FULL);
|
||
this.onGutterResize();
|
||
},
|
||
initialValue: true
|
||
},
|
||
fadeFoldWidgets: {
|
||
set: function(show) {
|
||
dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show);
|
||
},
|
||
initialValue: false
|
||
},
|
||
showFoldWidgets: {
|
||
set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},
|
||
initialValue: true
|
||
},
|
||
showLineNumbers: {
|
||
set: function(show) {
|
||
this.$gutterLayer.setShowLineNumbers(show);
|
||
this.$loop.schedule(this.CHANGE_GUTTER);
|
||
},
|
||
initialValue: true
|
||
},
|
||
displayIndentGuides: {
|
||
set: function(show) {
|
||
if (this.$textLayer.setDisplayIndentGuides(show))
|
||
this.$loop.schedule(this.CHANGE_TEXT);
|
||
},
|
||
initialValue: true
|
||
},
|
||
highlightGutterLine: {
|
||
set: function(shouldHighlight) {
|
||
if (!this.$gutterLineHighlight) {
|
||
this.$gutterLineHighlight = dom.createElement("div");
|
||
this.$gutterLineHighlight.className = "ace_gutter-active-line";
|
||
this.$gutter.appendChild(this.$gutterLineHighlight);
|
||
return;
|
||
}
|
||
|
||
this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none";
|
||
if (this.$cursorLayer.$pixelPos)
|
||
this.$updateGutterLineHighlight();
|
||
},
|
||
initialValue: false,
|
||
value: true
|
||
},
|
||
hScrollBarAlwaysVisible: {
|
||
set: function(val) {
|
||
if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)
|
||
this.$loop.schedule(this.CHANGE_SCROLL);
|
||
},
|
||
initialValue: false
|
||
},
|
||
vScrollBarAlwaysVisible: {
|
||
set: function(val) {
|
||
if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)
|
||
this.$loop.schedule(this.CHANGE_SCROLL);
|
||
},
|
||
initialValue: false
|
||
},
|
||
fontSize: {
|
||
set: function(size) {
|
||
if (typeof size == "number")
|
||
size = size + "px";
|
||
this.container.style.fontSize = size;
|
||
this.updateFontSize();
|
||
},
|
||
initialValue: 12
|
||
},
|
||
fontFamily: {
|
||
set: function(name) {
|
||
this.container.style.fontFamily = name;
|
||
this.updateFontSize();
|
||
}
|
||
},
|
||
maxLines: {
|
||
set: function(val) {
|
||
this.updateFull();
|
||
}
|
||
},
|
||
minLines: {
|
||
set: function(val) {
|
||
this.updateFull();
|
||
}
|
||
},
|
||
scrollPastEnd: {
|
||
set: function(val) {
|
||
val = +val || 0;
|
||
if (this.$scrollPastEnd == val)
|
||
return;
|
||
this.$scrollPastEnd = val;
|
||
this.$loop.schedule(this.CHANGE_SCROLL);
|
||
},
|
||
initialValue: 0,
|
||
handlesSet: true
|
||
},
|
||
fixedWidthGutter: {
|
||
set: function(val) {
|
||
this.$gutterLayer.$fixedWidth = !!val;
|
||
this.$loop.schedule(this.CHANGE_GUTTER);
|
||
}
|
||
},
|
||
theme: {
|
||
set: function(val) { this.setTheme(val) },
|
||
get: function() { return this.$themeId || this.theme; },
|
||
initialValue: "./theme/textmate",
|
||
handlesSet: true
|
||
}
|
||
});
|
||
|
||
exports.VirtualRenderer = VirtualRenderer;
|
||
});
|
||
|
||
ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var net = acequire("../lib/net");
|
||
var EventEmitter = acequire("../lib/event_emitter").EventEmitter;
|
||
var config = acequire("../config");
|
||
|
||
var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {
|
||
this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);
|
||
this.changeListener = this.changeListener.bind(this);
|
||
this.onMessage = this.onMessage.bind(this);
|
||
if (acequire.nameToUrl && !acequire.toUrl)
|
||
acequire.toUrl = acequire.nameToUrl;
|
||
|
||
if (config.get("packaged") || !acequire.toUrl) {
|
||
workerUrl = workerUrl || config.moduleUrl(mod.id, "worker")
|
||
} else {
|
||
var normalizePath = this.$normalizePath;
|
||
workerUrl = workerUrl || normalizePath(acequire.toUrl("ace/worker/worker.js", null, "_"));
|
||
|
||
var tlns = {};
|
||
topLevelNamespaces.forEach(function(ns) {
|
||
tlns[ns] = normalizePath(acequire.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, ""));
|
||
});
|
||
}
|
||
|
||
try {
|
||
var workerSrc = mod.src;
|
||
var Blob = __webpack_require__(14);
|
||
var blob = new Blob([ workerSrc ], { type: 'application/javascript' });
|
||
var blobUrl = (window.URL || window.webkitURL).createObjectURL(blob);
|
||
|
||
this.$worker = new Worker(blobUrl);
|
||
|
||
} catch(e) {
|
||
if (e instanceof window.DOMException) {
|
||
var blob = this.$workerBlob(workerUrl);
|
||
var URL = window.URL || window.webkitURL;
|
||
var blobURL = URL.createObjectURL(blob);
|
||
|
||
this.$worker = new Worker(blobURL);
|
||
URL.revokeObjectURL(blobURL);
|
||
} else {
|
||
throw e;
|
||
}
|
||
}
|
||
this.$worker.postMessage({
|
||
init : true,
|
||
tlns : tlns,
|
||
module : mod.id,
|
||
classname : classname
|
||
});
|
||
|
||
this.callbackId = 1;
|
||
this.callbacks = {};
|
||
|
||
this.$worker.onmessage = this.onMessage;
|
||
};
|
||
|
||
(function(){
|
||
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.onMessage = function(e) {
|
||
var msg = e.data;
|
||
switch(msg.type) {
|
||
case "event":
|
||
this._signal(msg.name, {data: msg.data});
|
||
break;
|
||
case "call":
|
||
var callback = this.callbacks[msg.id];
|
||
if (callback) {
|
||
callback(msg.data);
|
||
delete this.callbacks[msg.id];
|
||
}
|
||
break;
|
||
case "error":
|
||
this.reportError(msg.data);
|
||
break;
|
||
case "log":
|
||
window.console && console.log && console.log.apply(console, msg.data);
|
||
break;
|
||
}
|
||
};
|
||
|
||
this.reportError = function(err) {
|
||
window.console && console.error && console.error(err);
|
||
};
|
||
|
||
this.$normalizePath = function(path) {
|
||
return net.qualifyURL(path);
|
||
};
|
||
|
||
this.terminate = function() {
|
||
this._signal("terminate", {});
|
||
this.deltaQueue = null;
|
||
this.$worker.terminate();
|
||
this.$worker = null;
|
||
if (this.$doc)
|
||
this.$doc.off("change", this.changeListener);
|
||
this.$doc = null;
|
||
};
|
||
|
||
this.send = function(cmd, args) {
|
||
this.$worker.postMessage({command: cmd, args: args});
|
||
};
|
||
|
||
this.call = function(cmd, args, callback) {
|
||
if (callback) {
|
||
var id = this.callbackId++;
|
||
this.callbacks[id] = callback;
|
||
args.push(id);
|
||
}
|
||
this.send(cmd, args);
|
||
};
|
||
|
||
this.emit = function(event, data) {
|
||
try {
|
||
this.$worker.postMessage({event: event, data: {data: data.data}});
|
||
}
|
||
catch(ex) {
|
||
console.error(ex.stack);
|
||
}
|
||
};
|
||
|
||
this.attachToDocument = function(doc) {
|
||
if(this.$doc)
|
||
this.terminate();
|
||
|
||
this.$doc = doc;
|
||
this.call("setValue", [doc.getValue()]);
|
||
doc.on("change", this.changeListener);
|
||
};
|
||
|
||
this.changeListener = function(delta) {
|
||
if (!this.deltaQueue) {
|
||
this.deltaQueue = [];
|
||
setTimeout(this.$sendDeltaQueue, 0);
|
||
}
|
||
if (delta.action == "insert")
|
||
this.deltaQueue.push(delta.start, delta.lines);
|
||
else
|
||
this.deltaQueue.push(delta.start, delta.end);
|
||
};
|
||
|
||
this.$sendDeltaQueue = function() {
|
||
var q = this.deltaQueue;
|
||
if (!q) return;
|
||
this.deltaQueue = null;
|
||
if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {
|
||
this.call("setValue", [this.$doc.getValue()]);
|
||
} else
|
||
this.emit("change", {data: q});
|
||
};
|
||
|
||
this.$workerBlob = function(workerUrl) {
|
||
var script = "importScripts('" + net.qualifyURL(workerUrl) + "');";
|
||
try {
|
||
return new Blob([script], {"type": "application/javascript"});
|
||
} catch (e) { // Backwards-compatibility
|
||
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
|
||
var blobBuilder = new BlobBuilder();
|
||
blobBuilder.append(script);
|
||
return blobBuilder.getBlob("application/javascript");
|
||
}
|
||
};
|
||
|
||
}).call(WorkerClient.prototype);
|
||
|
||
|
||
var UIWorkerClient = function(topLevelNamespaces, mod, classname) {
|
||
this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);
|
||
this.changeListener = this.changeListener.bind(this);
|
||
this.callbackId = 1;
|
||
this.callbacks = {};
|
||
this.messageBuffer = [];
|
||
|
||
var main = null;
|
||
var emitSync = false;
|
||
var sender = Object.create(EventEmitter);
|
||
var _self = this;
|
||
|
||
this.$worker = {};
|
||
this.$worker.terminate = function() {};
|
||
this.$worker.postMessage = function(e) {
|
||
_self.messageBuffer.push(e);
|
||
if (main) {
|
||
if (emitSync)
|
||
setTimeout(processNext);
|
||
else
|
||
processNext();
|
||
}
|
||
};
|
||
this.setEmitSync = function(val) { emitSync = val };
|
||
|
||
var processNext = function() {
|
||
var msg = _self.messageBuffer.shift();
|
||
if (msg.command)
|
||
main[msg.command].apply(main, msg.args);
|
||
else if (msg.event)
|
||
sender._signal(msg.event, msg.data);
|
||
};
|
||
|
||
sender.postMessage = function(msg) {
|
||
_self.onMessage({data: msg});
|
||
};
|
||
sender.callback = function(data, callbackId) {
|
||
this.postMessage({type: "call", id: callbackId, data: data});
|
||
};
|
||
sender.emit = function(name, data) {
|
||
this.postMessage({type: "event", name: name, data: data});
|
||
};
|
||
|
||
config.loadModule(["worker", mod], function(Main) {
|
||
main = new Main[classname](sender);
|
||
while (_self.messageBuffer.length)
|
||
processNext();
|
||
});
|
||
};
|
||
|
||
UIWorkerClient.prototype = WorkerClient.prototype;
|
||
|
||
exports.UIWorkerClient = UIWorkerClient;
|
||
exports.WorkerClient = WorkerClient;
|
||
|
||
});
|
||
|
||
ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("./range").Range;
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var oop = acequire("./lib/oop");
|
||
|
||
var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {
|
||
var _self = this;
|
||
this.length = length;
|
||
this.session = session;
|
||
this.doc = session.getDocument();
|
||
this.mainClass = mainClass;
|
||
this.othersClass = othersClass;
|
||
this.$onUpdate = this.onUpdate.bind(this);
|
||
this.doc.on("change", this.$onUpdate);
|
||
this.$others = others;
|
||
|
||
this.$onCursorChange = function() {
|
||
setTimeout(function() {
|
||
_self.onCursorChange();
|
||
});
|
||
};
|
||
|
||
this.$pos = pos;
|
||
var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};
|
||
this.$undoStackDepth = undoStack.length;
|
||
this.setup();
|
||
|
||
session.selection.on("changeCursor", this.$onCursorChange);
|
||
};
|
||
|
||
(function() {
|
||
|
||
oop.implement(this, EventEmitter);
|
||
this.setup = function() {
|
||
var _self = this;
|
||
var doc = this.doc;
|
||
var session = this.session;
|
||
|
||
this.selectionBefore = session.selection.toJSON();
|
||
if (session.selection.inMultiSelectMode)
|
||
session.selection.toSingleRange();
|
||
|
||
this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);
|
||
var pos = this.pos;
|
||
pos.$insertRight = true;
|
||
pos.detach();
|
||
pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);
|
||
this.others = [];
|
||
this.$others.forEach(function(other) {
|
||
var anchor = doc.createAnchor(other.row, other.column);
|
||
anchor.$insertRight = true;
|
||
anchor.detach();
|
||
_self.others.push(anchor);
|
||
});
|
||
session.setUndoSelect(false);
|
||
};
|
||
this.showOtherMarkers = function() {
|
||
if (this.othersActive) return;
|
||
var session = this.session;
|
||
var _self = this;
|
||
this.othersActive = true;
|
||
this.others.forEach(function(anchor) {
|
||
anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);
|
||
});
|
||
};
|
||
this.hideOtherMarkers = function() {
|
||
if (!this.othersActive) return;
|
||
this.othersActive = false;
|
||
for (var i = 0; i < this.others.length; i++) {
|
||
this.session.removeMarker(this.others[i].markerId);
|
||
}
|
||
};
|
||
this.onUpdate = function(delta) {
|
||
if (this.$updating)
|
||
return this.updateAnchors(delta);
|
||
|
||
var range = delta;
|
||
if (range.start.row !== range.end.row) return;
|
||
if (range.start.row !== this.pos.row) return;
|
||
this.$updating = true;
|
||
var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column;
|
||
var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;
|
||
var distanceFromStart = range.start.column - this.pos.column;
|
||
|
||
this.updateAnchors(delta);
|
||
|
||
if (inMainRange)
|
||
this.length += lengthDiff;
|
||
|
||
if (inMainRange && !this.session.$fromUndo) {
|
||
if (delta.action === 'insert') {
|
||
for (var i = this.others.length - 1; i >= 0; i--) {
|
||
var otherPos = this.others[i];
|
||
var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};
|
||
this.doc.insertMergedLines(newPos, delta.lines);
|
||
}
|
||
} else if (delta.action === 'remove') {
|
||
for (var i = this.others.length - 1; i >= 0; i--) {
|
||
var otherPos = this.others[i];
|
||
var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};
|
||
this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));
|
||
}
|
||
}
|
||
}
|
||
|
||
this.$updating = false;
|
||
this.updateMarkers();
|
||
};
|
||
|
||
this.updateAnchors = function(delta) {
|
||
this.pos.onChange(delta);
|
||
for (var i = this.others.length; i--;)
|
||
this.others[i].onChange(delta);
|
||
this.updateMarkers();
|
||
};
|
||
|
||
this.updateMarkers = function() {
|
||
if (this.$updating)
|
||
return;
|
||
var _self = this;
|
||
var session = this.session;
|
||
var updateMarker = function(pos, className) {
|
||
session.removeMarker(pos.markerId);
|
||
pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);
|
||
};
|
||
updateMarker(this.pos, this.mainClass);
|
||
for (var i = this.others.length; i--;)
|
||
updateMarker(this.others[i], this.othersClass);
|
||
};
|
||
|
||
this.onCursorChange = function(event) {
|
||
if (this.$updating || !this.session) return;
|
||
var pos = this.session.selection.getCursor();
|
||
if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {
|
||
this.showOtherMarkers();
|
||
this._emit("cursorEnter", event);
|
||
} else {
|
||
this.hideOtherMarkers();
|
||
this._emit("cursorLeave", event);
|
||
}
|
||
};
|
||
this.detach = function() {
|
||
this.session.removeMarker(this.pos && this.pos.markerId);
|
||
this.hideOtherMarkers();
|
||
this.doc.removeEventListener("change", this.$onUpdate);
|
||
this.session.selection.removeEventListener("changeCursor", this.$onCursorChange);
|
||
this.session.setUndoSelect(true);
|
||
this.session = null;
|
||
};
|
||
this.cancel = function() {
|
||
if (this.$undoStackDepth === -1)
|
||
return;
|
||
var undoManager = this.session.getUndoManager();
|
||
var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;
|
||
for (var i = 0; i < undosRequired; i++) {
|
||
undoManager.undo(true);
|
||
}
|
||
if (this.selectionBefore)
|
||
this.session.selection.fromJSON(this.selectionBefore);
|
||
};
|
||
}).call(PlaceHolder.prototype);
|
||
|
||
|
||
exports.PlaceHolder = PlaceHolder;
|
||
});
|
||
|
||
ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(acequire, exports, module) {
|
||
|
||
var event = acequire("../lib/event");
|
||
var useragent = acequire("../lib/useragent");
|
||
function isSamePoint(p1, p2) {
|
||
return p1.row == p2.row && p1.column == p2.column;
|
||
}
|
||
|
||
function onMouseDown(e) {
|
||
var ev = e.domEvent;
|
||
var alt = ev.altKey;
|
||
var shift = ev.shiftKey;
|
||
var ctrl = ev.ctrlKey;
|
||
var accel = e.getAccelKey();
|
||
var button = e.getButton();
|
||
|
||
if (ctrl && useragent.isMac)
|
||
button = ev.button;
|
||
|
||
if (e.editor.inMultiSelectMode && button == 2) {
|
||
e.editor.textInput.onContextMenu(e.domEvent);
|
||
return;
|
||
}
|
||
|
||
if (!ctrl && !alt && !accel) {
|
||
if (button === 0 && e.editor.inMultiSelectMode)
|
||
e.editor.exitMultiSelectMode();
|
||
return;
|
||
}
|
||
|
||
if (button !== 0)
|
||
return;
|
||
|
||
var editor = e.editor;
|
||
var selection = editor.selection;
|
||
var isMultiSelect = editor.inMultiSelectMode;
|
||
var pos = e.getDocumentPosition();
|
||
var cursor = selection.getCursor();
|
||
var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));
|
||
|
||
var mouseX = e.x, mouseY = e.y;
|
||
var onMouseSelection = function(e) {
|
||
mouseX = e.clientX;
|
||
mouseY = e.clientY;
|
||
};
|
||
|
||
var session = editor.session;
|
||
var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);
|
||
var screenCursor = screenAnchor;
|
||
|
||
var selectionMode;
|
||
if (editor.$mouseHandler.$enableJumpToDef) {
|
||
if (ctrl && alt || accel && alt)
|
||
selectionMode = shift ? "block" : "add";
|
||
else if (alt && editor.$blockSelectEnabled)
|
||
selectionMode = "block";
|
||
} else {
|
||
if (accel && !alt) {
|
||
selectionMode = "add";
|
||
if (!isMultiSelect && shift)
|
||
return;
|
||
} else if (alt && editor.$blockSelectEnabled) {
|
||
selectionMode = "block";
|
||
}
|
||
}
|
||
|
||
if (selectionMode && useragent.isMac && ev.ctrlKey) {
|
||
editor.$mouseHandler.cancelContextMenu();
|
||
}
|
||
|
||
if (selectionMode == "add") {
|
||
if (!isMultiSelect && inSelection)
|
||
return; // dragging
|
||
|
||
if (!isMultiSelect) {
|
||
var range = selection.toOrientedRange();
|
||
editor.addSelectionMarker(range);
|
||
}
|
||
|
||
var oldRange = selection.rangeList.rangeAtPoint(pos);
|
||
|
||
|
||
editor.$blockScrolling++;
|
||
editor.inVirtualSelectionMode = true;
|
||
|
||
if (shift) {
|
||
oldRange = null;
|
||
range = selection.ranges[0] || range;
|
||
editor.removeSelectionMarker(range);
|
||
}
|
||
editor.once("mouseup", function() {
|
||
var tmpSel = selection.toOrientedRange();
|
||
|
||
if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))
|
||
selection.substractPoint(tmpSel.cursor);
|
||
else {
|
||
if (shift) {
|
||
selection.substractPoint(range.cursor);
|
||
} else if (range) {
|
||
editor.removeSelectionMarker(range);
|
||
selection.addRange(range);
|
||
}
|
||
selection.addRange(tmpSel);
|
||
}
|
||
editor.$blockScrolling--;
|
||
editor.inVirtualSelectionMode = false;
|
||
});
|
||
|
||
} else if (selectionMode == "block") {
|
||
e.stop();
|
||
editor.inVirtualSelectionMode = true;
|
||
var initialRange;
|
||
var rectSel = [];
|
||
var blockSelect = function() {
|
||
var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);
|
||
var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);
|
||
|
||
if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))
|
||
return;
|
||
screenCursor = newCursor;
|
||
|
||
editor.$blockScrolling++;
|
||
editor.selection.moveToPosition(cursor);
|
||
editor.renderer.scrollCursorIntoView();
|
||
|
||
editor.removeSelectionMarkers(rectSel);
|
||
rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);
|
||
if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())
|
||
rectSel[0] = editor.$mouseHandler.$clickSelection.clone();
|
||
rectSel.forEach(editor.addSelectionMarker, editor);
|
||
editor.updateSelectionMarkers();
|
||
editor.$blockScrolling--;
|
||
};
|
||
editor.$blockScrolling++;
|
||
if (isMultiSelect && !accel) {
|
||
selection.toSingleRange();
|
||
} else if (!isMultiSelect && accel) {
|
||
initialRange = selection.toOrientedRange();
|
||
editor.addSelectionMarker(initialRange);
|
||
}
|
||
|
||
if (shift)
|
||
screenAnchor = session.documentToScreenPosition(selection.lead);
|
||
else
|
||
selection.moveToPosition(pos);
|
||
editor.$blockScrolling--;
|
||
|
||
screenCursor = {row: -1, column: -1};
|
||
|
||
var onMouseSelectionEnd = function(e) {
|
||
clearInterval(timerId);
|
||
editor.removeSelectionMarkers(rectSel);
|
||
if (!rectSel.length)
|
||
rectSel = [selection.toOrientedRange()];
|
||
editor.$blockScrolling++;
|
||
if (initialRange) {
|
||
editor.removeSelectionMarker(initialRange);
|
||
selection.toSingleRange(initialRange);
|
||
}
|
||
for (var i = 0; i < rectSel.length; i++)
|
||
selection.addRange(rectSel[i]);
|
||
editor.inVirtualSelectionMode = false;
|
||
editor.$mouseHandler.$clickSelection = null;
|
||
editor.$blockScrolling--;
|
||
};
|
||
|
||
var onSelectionInterval = blockSelect;
|
||
|
||
event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);
|
||
var timerId = setInterval(function() {onSelectionInterval();}, 20);
|
||
|
||
return e.preventDefault();
|
||
}
|
||
}
|
||
|
||
|
||
exports.onMouseDown = onMouseDown;
|
||
|
||
});
|
||
|
||
ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(acequire, exports, module) {
|
||
exports.defaultCommands = [{
|
||
name: "addCursorAbove",
|
||
exec: function(editor) { editor.selectMoreLines(-1); },
|
||
bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "addCursorBelow",
|
||
exec: function(editor) { editor.selectMoreLines(1); },
|
||
bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "addCursorAboveSkipCurrent",
|
||
exec: function(editor) { editor.selectMoreLines(-1, true); },
|
||
bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "addCursorBelowSkipCurrent",
|
||
exec: function(editor) { editor.selectMoreLines(1, true); },
|
||
bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectMoreBefore",
|
||
exec: function(editor) { editor.selectMore(-1); },
|
||
bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectMoreAfter",
|
||
exec: function(editor) { editor.selectMore(1); },
|
||
bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectNextBefore",
|
||
exec: function(editor) { editor.selectMore(-1, true); },
|
||
bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "selectNextAfter",
|
||
exec: function(editor) { editor.selectMore(1, true); },
|
||
bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}, {
|
||
name: "splitIntoLines",
|
||
exec: function(editor) { editor.multiSelect.splitIntoLines(); },
|
||
bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"},
|
||
readOnly: true
|
||
}, {
|
||
name: "alignCursors",
|
||
exec: function(editor) { editor.alignCursors(); },
|
||
bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"},
|
||
scrollIntoView: "cursor"
|
||
}, {
|
||
name: "findAll",
|
||
exec: function(editor) { editor.findAll(); },
|
||
bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"},
|
||
scrollIntoView: "cursor",
|
||
readOnly: true
|
||
}];
|
||
exports.multiSelectCommands = [{
|
||
name: "singleSelection",
|
||
bindKey: "esc",
|
||
exec: function(editor) { editor.exitMultiSelectMode(); },
|
||
scrollIntoView: "cursor",
|
||
readOnly: true,
|
||
isAvailable: function(editor) {return editor && editor.inMultiSelectMode}
|
||
}];
|
||
|
||
var HashHandler = acequire("../keyboard/hash_handler").HashHandler;
|
||
exports.keyboardHandler = new HashHandler(exports.multiSelectCommands);
|
||
|
||
});
|
||
|
||
ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(acequire, exports, module) {
|
||
|
||
var RangeList = acequire("./range_list").RangeList;
|
||
var Range = acequire("./range").Range;
|
||
var Selection = acequire("./selection").Selection;
|
||
var onMouseDown = acequire("./mouse/multi_select_handler").onMouseDown;
|
||
var event = acequire("./lib/event");
|
||
var lang = acequire("./lib/lang");
|
||
var commands = acequire("./commands/multi_select_commands");
|
||
exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);
|
||
var Search = acequire("./search").Search;
|
||
var search = new Search();
|
||
|
||
function find(session, needle, dir) {
|
||
search.$options.wrap = true;
|
||
search.$options.needle = needle;
|
||
search.$options.backwards = dir == -1;
|
||
return search.find(session);
|
||
}
|
||
var EditSession = acequire("./edit_session").EditSession;
|
||
(function() {
|
||
this.getSelectionMarkers = function() {
|
||
return this.$selectionMarkers;
|
||
};
|
||
}).call(EditSession.prototype);
|
||
(function() {
|
||
this.ranges = null;
|
||
this.rangeList = null;
|
||
this.addRange = function(range, $blockChangeEvents) {
|
||
if (!range)
|
||
return;
|
||
|
||
if (!this.inMultiSelectMode && this.rangeCount === 0) {
|
||
var oldRange = this.toOrientedRange();
|
||
this.rangeList.add(oldRange);
|
||
this.rangeList.add(range);
|
||
if (this.rangeList.ranges.length != 2) {
|
||
this.rangeList.removeAll();
|
||
return $blockChangeEvents || this.fromOrientedRange(range);
|
||
}
|
||
this.rangeList.removeAll();
|
||
this.rangeList.add(oldRange);
|
||
this.$onAddRange(oldRange);
|
||
}
|
||
|
||
if (!range.cursor)
|
||
range.cursor = range.end;
|
||
|
||
var removed = this.rangeList.add(range);
|
||
|
||
this.$onAddRange(range);
|
||
|
||
if (removed.length)
|
||
this.$onRemoveRange(removed);
|
||
|
||
if (this.rangeCount > 1 && !this.inMultiSelectMode) {
|
||
this._signal("multiSelect");
|
||
this.inMultiSelectMode = true;
|
||
this.session.$undoSelect = false;
|
||
this.rangeList.attach(this.session);
|
||
}
|
||
|
||
return $blockChangeEvents || this.fromOrientedRange(range);
|
||
};
|
||
|
||
this.toSingleRange = function(range) {
|
||
range = range || this.ranges[0];
|
||
var removed = this.rangeList.removeAll();
|
||
if (removed.length)
|
||
this.$onRemoveRange(removed);
|
||
|
||
range && this.fromOrientedRange(range);
|
||
};
|
||
this.substractPoint = function(pos) {
|
||
var removed = this.rangeList.substractPoint(pos);
|
||
if (removed) {
|
||
this.$onRemoveRange(removed);
|
||
return removed[0];
|
||
}
|
||
};
|
||
this.mergeOverlappingRanges = function() {
|
||
var removed = this.rangeList.merge();
|
||
if (removed.length)
|
||
this.$onRemoveRange(removed);
|
||
else if(this.ranges[0])
|
||
this.fromOrientedRange(this.ranges[0]);
|
||
};
|
||
|
||
this.$onAddRange = function(range) {
|
||
this.rangeCount = this.rangeList.ranges.length;
|
||
this.ranges.unshift(range);
|
||
this._signal("addRange", {range: range});
|
||
};
|
||
|
||
this.$onRemoveRange = function(removed) {
|
||
this.rangeCount = this.rangeList.ranges.length;
|
||
if (this.rangeCount == 1 && this.inMultiSelectMode) {
|
||
var lastRange = this.rangeList.ranges.pop();
|
||
removed.push(lastRange);
|
||
this.rangeCount = 0;
|
||
}
|
||
|
||
for (var i = removed.length; i--; ) {
|
||
var index = this.ranges.indexOf(removed[i]);
|
||
this.ranges.splice(index, 1);
|
||
}
|
||
|
||
this._signal("removeRange", {ranges: removed});
|
||
|
||
if (this.rangeCount === 0 && this.inMultiSelectMode) {
|
||
this.inMultiSelectMode = false;
|
||
this._signal("singleSelect");
|
||
this.session.$undoSelect = true;
|
||
this.rangeList.detach(this.session);
|
||
}
|
||
|
||
lastRange = lastRange || this.ranges[0];
|
||
if (lastRange && !lastRange.isEqual(this.getRange()))
|
||
this.fromOrientedRange(lastRange);
|
||
};
|
||
this.$initRangeList = function() {
|
||
if (this.rangeList)
|
||
return;
|
||
|
||
this.rangeList = new RangeList();
|
||
this.ranges = [];
|
||
this.rangeCount = 0;
|
||
};
|
||
this.getAllRanges = function() {
|
||
return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];
|
||
};
|
||
|
||
this.splitIntoLines = function () {
|
||
if (this.rangeCount > 1) {
|
||
var ranges = this.rangeList.ranges;
|
||
var lastRange = ranges[ranges.length - 1];
|
||
var range = Range.fromPoints(ranges[0].start, lastRange.end);
|
||
|
||
this.toSingleRange();
|
||
this.setSelectionRange(range, lastRange.cursor == lastRange.start);
|
||
} else {
|
||
var range = this.getRange();
|
||
var isBackwards = this.isBackwards();
|
||
var startRow = range.start.row;
|
||
var endRow = range.end.row;
|
||
if (startRow == endRow) {
|
||
if (isBackwards)
|
||
var start = range.end, end = range.start;
|
||
else
|
||
var start = range.start, end = range.end;
|
||
|
||
this.addRange(Range.fromPoints(end, end));
|
||
this.addRange(Range.fromPoints(start, start));
|
||
return;
|
||
}
|
||
|
||
var rectSel = [];
|
||
var r = this.getLineRange(startRow, true);
|
||
r.start.column = range.start.column;
|
||
rectSel.push(r);
|
||
|
||
for (var i = startRow + 1; i < endRow; i++)
|
||
rectSel.push(this.getLineRange(i, true));
|
||
|
||
r = this.getLineRange(endRow, true);
|
||
r.end.column = range.end.column;
|
||
rectSel.push(r);
|
||
|
||
rectSel.forEach(this.addRange, this);
|
||
}
|
||
};
|
||
this.toggleBlockSelection = function () {
|
||
if (this.rangeCount > 1) {
|
||
var ranges = this.rangeList.ranges;
|
||
var lastRange = ranges[ranges.length - 1];
|
||
var range = Range.fromPoints(ranges[0].start, lastRange.end);
|
||
|
||
this.toSingleRange();
|
||
this.setSelectionRange(range, lastRange.cursor == lastRange.start);
|
||
} else {
|
||
var cursor = this.session.documentToScreenPosition(this.selectionLead);
|
||
var anchor = this.session.documentToScreenPosition(this.selectionAnchor);
|
||
|
||
var rectSel = this.rectangularRangeBlock(cursor, anchor);
|
||
rectSel.forEach(this.addRange, this);
|
||
}
|
||
};
|
||
this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {
|
||
var rectSel = [];
|
||
|
||
var xBackwards = screenCursor.column < screenAnchor.column;
|
||
if (xBackwards) {
|
||
var startColumn = screenCursor.column;
|
||
var endColumn = screenAnchor.column;
|
||
} else {
|
||
var startColumn = screenAnchor.column;
|
||
var endColumn = screenCursor.column;
|
||
}
|
||
|
||
var yBackwards = screenCursor.row < screenAnchor.row;
|
||
if (yBackwards) {
|
||
var startRow = screenCursor.row;
|
||
var endRow = screenAnchor.row;
|
||
} else {
|
||
var startRow = screenAnchor.row;
|
||
var endRow = screenCursor.row;
|
||
}
|
||
|
||
if (startColumn < 0)
|
||
startColumn = 0;
|
||
if (startRow < 0)
|
||
startRow = 0;
|
||
|
||
if (startRow == endRow)
|
||
includeEmptyLines = true;
|
||
|
||
for (var row = startRow; row <= endRow; row++) {
|
||
var range = Range.fromPoints(
|
||
this.session.screenToDocumentPosition(row, startColumn),
|
||
this.session.screenToDocumentPosition(row, endColumn)
|
||
);
|
||
if (range.isEmpty()) {
|
||
if (docEnd && isSamePoint(range.end, docEnd))
|
||
break;
|
||
var docEnd = range.end;
|
||
}
|
||
range.cursor = xBackwards ? range.start : range.end;
|
||
rectSel.push(range);
|
||
}
|
||
|
||
if (yBackwards)
|
||
rectSel.reverse();
|
||
|
||
if (!includeEmptyLines) {
|
||
var end = rectSel.length - 1;
|
||
while (rectSel[end].isEmpty() && end > 0)
|
||
end--;
|
||
if (end > 0) {
|
||
var start = 0;
|
||
while (rectSel[start].isEmpty())
|
||
start++;
|
||
}
|
||
for (var i = end; i >= start; i--) {
|
||
if (rectSel[i].isEmpty())
|
||
rectSel.splice(i, 1);
|
||
}
|
||
}
|
||
|
||
return rectSel;
|
||
};
|
||
}).call(Selection.prototype);
|
||
var Editor = acequire("./editor").Editor;
|
||
(function() {
|
||
this.updateSelectionMarkers = function() {
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
};
|
||
this.addSelectionMarker = function(orientedRange) {
|
||
if (!orientedRange.cursor)
|
||
orientedRange.cursor = orientedRange.end;
|
||
|
||
var style = this.getSelectionStyle();
|
||
orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style);
|
||
|
||
this.session.$selectionMarkers.push(orientedRange);
|
||
this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
|
||
return orientedRange;
|
||
};
|
||
this.removeSelectionMarker = function(range) {
|
||
if (!range.marker)
|
||
return;
|
||
this.session.removeMarker(range.marker);
|
||
var index = this.session.$selectionMarkers.indexOf(range);
|
||
if (index != -1)
|
||
this.session.$selectionMarkers.splice(index, 1);
|
||
this.session.selectionMarkerCount = this.session.$selectionMarkers.length;
|
||
};
|
||
|
||
this.removeSelectionMarkers = function(ranges) {
|
||
var markerList = this.session.$selectionMarkers;
|
||
for (var i = ranges.length; i--; ) {
|
||
var range = ranges[i];
|
||
if (!range.marker)
|
||
continue;
|
||
this.session.removeMarker(range.marker);
|
||
var index = markerList.indexOf(range);
|
||
if (index != -1)
|
||
markerList.splice(index, 1);
|
||
}
|
||
this.session.selectionMarkerCount = markerList.length;
|
||
};
|
||
|
||
this.$onAddRange = function(e) {
|
||
this.addSelectionMarker(e.range);
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
};
|
||
|
||
this.$onRemoveRange = function(e) {
|
||
this.removeSelectionMarkers(e.ranges);
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
};
|
||
|
||
this.$onMultiSelect = function(e) {
|
||
if (this.inMultiSelectMode)
|
||
return;
|
||
this.inMultiSelectMode = true;
|
||
|
||
this.setStyle("ace_multiselect");
|
||
this.keyBinding.addKeyboardHandler(commands.keyboardHandler);
|
||
this.commands.setDefaultHandler("exec", this.$onMultiSelectExec);
|
||
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
};
|
||
|
||
this.$onSingleSelect = function(e) {
|
||
if (this.session.multiSelect.inVirtualMode)
|
||
return;
|
||
this.inMultiSelectMode = false;
|
||
|
||
this.unsetStyle("ace_multiselect");
|
||
this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);
|
||
|
||
this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec);
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
this._emit("changeSelection");
|
||
};
|
||
|
||
this.$onMultiSelectExec = function(e) {
|
||
var command = e.command;
|
||
var editor = e.editor;
|
||
if (!editor.multiSelect)
|
||
return;
|
||
if (!command.multiSelectAction) {
|
||
var result = command.exec(editor, e.args || {});
|
||
editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());
|
||
editor.multiSelect.mergeOverlappingRanges();
|
||
} else if (command.multiSelectAction == "forEach") {
|
||
result = editor.forEachSelection(command, e.args);
|
||
} else if (command.multiSelectAction == "forEachLine") {
|
||
result = editor.forEachSelection(command, e.args, true);
|
||
} else if (command.multiSelectAction == "single") {
|
||
editor.exitMultiSelectMode();
|
||
result = command.exec(editor, e.args || {});
|
||
} else {
|
||
result = command.multiSelectAction(editor, e.args || {});
|
||
}
|
||
return result;
|
||
};
|
||
this.forEachSelection = function(cmd, args, options) {
|
||
if (this.inVirtualSelectionMode)
|
||
return;
|
||
var keepOrder = options && options.keepOrder;
|
||
var $byLines = options == true || options && options.$byLines
|
||
var session = this.session;
|
||
var selection = this.selection;
|
||
var rangeList = selection.rangeList;
|
||
var ranges = (keepOrder ? selection : rangeList).ranges;
|
||
var result;
|
||
|
||
if (!ranges.length)
|
||
return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});
|
||
|
||
var reg = selection._eventRegistry;
|
||
selection._eventRegistry = {};
|
||
|
||
var tmpSel = new Selection(session);
|
||
this.inVirtualSelectionMode = true;
|
||
for (var i = ranges.length; i--;) {
|
||
if ($byLines) {
|
||
while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)
|
||
i--;
|
||
}
|
||
tmpSel.fromOrientedRange(ranges[i]);
|
||
tmpSel.index = i;
|
||
this.selection = session.selection = tmpSel;
|
||
var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});
|
||
if (!result && cmdResult !== undefined)
|
||
result = cmdResult;
|
||
tmpSel.toOrientedRange(ranges[i]);
|
||
}
|
||
tmpSel.detach();
|
||
|
||
this.selection = session.selection = selection;
|
||
this.inVirtualSelectionMode = false;
|
||
selection._eventRegistry = reg;
|
||
selection.mergeOverlappingRanges();
|
||
|
||
var anim = this.renderer.$scrollAnimation;
|
||
this.onCursorChange();
|
||
this.onSelectionChange();
|
||
if (anim && anim.from == anim.to)
|
||
this.renderer.animateScrolling(anim.from);
|
||
|
||
return result;
|
||
};
|
||
this.exitMultiSelectMode = function() {
|
||
if (!this.inMultiSelectMode || this.inVirtualSelectionMode)
|
||
return;
|
||
this.multiSelect.toSingleRange();
|
||
};
|
||
|
||
this.getSelectedText = function() {
|
||
var text = "";
|
||
if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
|
||
var ranges = this.multiSelect.rangeList.ranges;
|
||
var buf = [];
|
||
for (var i = 0; i < ranges.length; i++) {
|
||
buf.push(this.session.getTextRange(ranges[i]));
|
||
}
|
||
var nl = this.session.getDocument().getNewLineCharacter();
|
||
text = buf.join(nl);
|
||
if (text.length == (buf.length - 1) * nl.length)
|
||
text = "";
|
||
} else if (!this.selection.isEmpty()) {
|
||
text = this.session.getTextRange(this.getSelectionRange());
|
||
}
|
||
return text;
|
||
};
|
||
|
||
this.$checkMultiselectChange = function(e, anchor) {
|
||
if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {
|
||
var range = this.multiSelect.ranges[0];
|
||
if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)
|
||
return;
|
||
var pos = anchor == this.multiSelect.anchor
|
||
? range.cursor == range.start ? range.end : range.start
|
||
: range.cursor;
|
||
if (pos.row != anchor.row
|
||
|| this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)
|
||
this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());
|
||
}
|
||
};
|
||
this.findAll = function(needle, options, additive) {
|
||
options = options || {};
|
||
options.needle = needle || options.needle;
|
||
if (options.needle == undefined) {
|
||
var range = this.selection.isEmpty()
|
||
? this.selection.getWordRange()
|
||
: this.selection.getRange();
|
||
options.needle = this.session.getTextRange(range);
|
||
}
|
||
this.$search.set(options);
|
||
|
||
var ranges = this.$search.findAll(this.session);
|
||
if (!ranges.length)
|
||
return 0;
|
||
|
||
this.$blockScrolling += 1;
|
||
var selection = this.multiSelect;
|
||
|
||
if (!additive)
|
||
selection.toSingleRange(ranges[0]);
|
||
|
||
for (var i = ranges.length; i--; )
|
||
selection.addRange(ranges[i], true);
|
||
if (range && selection.rangeList.rangeAtPoint(range.start))
|
||
selection.addRange(range, true);
|
||
|
||
this.$blockScrolling -= 1;
|
||
|
||
return ranges.length;
|
||
};
|
||
this.selectMoreLines = function(dir, skip) {
|
||
var range = this.selection.toOrientedRange();
|
||
var isBackwards = range.cursor == range.end;
|
||
|
||
var screenLead = this.session.documentToScreenPosition(range.cursor);
|
||
if (this.selection.$desiredColumn)
|
||
screenLead.column = this.selection.$desiredColumn;
|
||
|
||
var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);
|
||
|
||
if (!range.isEmpty()) {
|
||
var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);
|
||
var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);
|
||
} else {
|
||
var anchor = lead;
|
||
}
|
||
|
||
if (isBackwards) {
|
||
var newRange = Range.fromPoints(lead, anchor);
|
||
newRange.cursor = newRange.start;
|
||
} else {
|
||
var newRange = Range.fromPoints(anchor, lead);
|
||
newRange.cursor = newRange.end;
|
||
}
|
||
|
||
newRange.desiredColumn = screenLead.column;
|
||
if (!this.selection.inMultiSelectMode) {
|
||
this.selection.addRange(range);
|
||
} else {
|
||
if (skip)
|
||
var toRemove = range.cursor;
|
||
}
|
||
|
||
this.selection.addRange(newRange);
|
||
if (toRemove)
|
||
this.selection.substractPoint(toRemove);
|
||
};
|
||
this.transposeSelections = function(dir) {
|
||
var session = this.session;
|
||
var sel = session.multiSelect;
|
||
var all = sel.ranges;
|
||
|
||
for (var i = all.length; i--; ) {
|
||
var range = all[i];
|
||
if (range.isEmpty()) {
|
||
var tmp = session.getWordRange(range.start.row, range.start.column);
|
||
range.start.row = tmp.start.row;
|
||
range.start.column = tmp.start.column;
|
||
range.end.row = tmp.end.row;
|
||
range.end.column = tmp.end.column;
|
||
}
|
||
}
|
||
sel.mergeOverlappingRanges();
|
||
|
||
var words = [];
|
||
for (var i = all.length; i--; ) {
|
||
var range = all[i];
|
||
words.unshift(session.getTextRange(range));
|
||
}
|
||
|
||
if (dir < 0)
|
||
words.unshift(words.pop());
|
||
else
|
||
words.push(words.shift());
|
||
|
||
for (var i = all.length; i--; ) {
|
||
var range = all[i];
|
||
var tmp = range.clone();
|
||
session.replace(range, words[i]);
|
||
range.start.row = tmp.start.row;
|
||
range.start.column = tmp.start.column;
|
||
}
|
||
};
|
||
this.selectMore = function(dir, skip, stopAtFirst) {
|
||
var session = this.session;
|
||
var sel = session.multiSelect;
|
||
|
||
var range = sel.toOrientedRange();
|
||
if (range.isEmpty()) {
|
||
range = session.getWordRange(range.start.row, range.start.column);
|
||
range.cursor = dir == -1 ? range.start : range.end;
|
||
this.multiSelect.addRange(range);
|
||
if (stopAtFirst)
|
||
return;
|
||
}
|
||
var needle = session.getTextRange(range);
|
||
|
||
var newRange = find(session, needle, dir);
|
||
if (newRange) {
|
||
newRange.cursor = dir == -1 ? newRange.start : newRange.end;
|
||
this.$blockScrolling += 1;
|
||
this.session.unfold(newRange);
|
||
this.multiSelect.addRange(newRange);
|
||
this.$blockScrolling -= 1;
|
||
this.renderer.scrollCursorIntoView(null, 0.5);
|
||
}
|
||
if (skip)
|
||
this.multiSelect.substractPoint(range.cursor);
|
||
};
|
||
this.alignCursors = function() {
|
||
var session = this.session;
|
||
var sel = session.multiSelect;
|
||
var ranges = sel.ranges;
|
||
var row = -1;
|
||
var sameRowRanges = ranges.filter(function(r) {
|
||
if (r.cursor.row == row)
|
||
return true;
|
||
row = r.cursor.row;
|
||
});
|
||
|
||
if (!ranges.length || sameRowRanges.length == ranges.length - 1) {
|
||
var range = this.selection.getRange();
|
||
var fr = range.start.row, lr = range.end.row;
|
||
var guessRange = fr == lr;
|
||
if (guessRange) {
|
||
var max = this.session.getLength();
|
||
var line;
|
||
do {
|
||
line = this.session.getLine(lr);
|
||
} while (/[=:]/.test(line) && ++lr < max);
|
||
do {
|
||
line = this.session.getLine(fr);
|
||
} while (/[=:]/.test(line) && --fr > 0);
|
||
|
||
if (fr < 0) fr = 0;
|
||
if (lr >= max) lr = max - 1;
|
||
}
|
||
var lines = this.session.removeFullLines(fr, lr);
|
||
lines = this.$reAlignText(lines, guessRange);
|
||
this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n");
|
||
if (!guessRange) {
|
||
range.start.column = 0;
|
||
range.end.column = lines[lines.length - 1].length;
|
||
}
|
||
this.selection.setRange(range);
|
||
} else {
|
||
sameRowRanges.forEach(function(r) {
|
||
sel.substractPoint(r.cursor);
|
||
});
|
||
|
||
var maxCol = 0;
|
||
var minSpace = Infinity;
|
||
var spaceOffsets = ranges.map(function(r) {
|
||
var p = r.cursor;
|
||
var line = session.getLine(p.row);
|
||
var spaceOffset = line.substr(p.column).search(/\S/g);
|
||
if (spaceOffset == -1)
|
||
spaceOffset = 0;
|
||
|
||
if (p.column > maxCol)
|
||
maxCol = p.column;
|
||
if (spaceOffset < minSpace)
|
||
minSpace = spaceOffset;
|
||
return spaceOffset;
|
||
});
|
||
ranges.forEach(function(r, i) {
|
||
var p = r.cursor;
|
||
var l = maxCol - p.column;
|
||
var d = spaceOffsets[i] - minSpace;
|
||
if (l > d)
|
||
session.insert(p, lang.stringRepeat(" ", l - d));
|
||
else
|
||
session.remove(new Range(p.row, p.column, p.row, p.column - l + d));
|
||
|
||
r.start.column = r.end.column = maxCol;
|
||
r.start.row = r.end.row = p.row;
|
||
r.cursor = r.end;
|
||
});
|
||
sel.fromOrientedRange(ranges[0]);
|
||
this.renderer.updateCursor();
|
||
this.renderer.updateBackMarkers();
|
||
}
|
||
};
|
||
|
||
this.$reAlignText = function(lines, forceLeft) {
|
||
var isLeftAligned = true, isRightAligned = true;
|
||
var startW, textW, endW;
|
||
|
||
return lines.map(function(line) {
|
||
var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/);
|
||
if (!m)
|
||
return [line];
|
||
|
||
if (startW == null) {
|
||
startW = m[1].length;
|
||
textW = m[2].length;
|
||
endW = m[3].length;
|
||
return m;
|
||
}
|
||
|
||
if (startW + textW + endW != m[1].length + m[2].length + m[3].length)
|
||
isRightAligned = false;
|
||
if (startW != m[1].length)
|
||
isLeftAligned = false;
|
||
|
||
if (startW > m[1].length)
|
||
startW = m[1].length;
|
||
if (textW < m[2].length)
|
||
textW = m[2].length;
|
||
if (endW > m[3].length)
|
||
endW = m[3].length;
|
||
|
||
return m;
|
||
}).map(forceLeft ? alignLeft :
|
||
isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);
|
||
|
||
function spaces(n) {
|
||
return lang.stringRepeat(" ", n);
|
||
}
|
||
|
||
function alignLeft(m) {
|
||
return !m[2] ? m[0] : spaces(startW) + m[2]
|
||
+ spaces(textW - m[2].length + endW)
|
||
+ m[4].replace(/^([=:])\s+/, "$1 ");
|
||
}
|
||
function alignRight(m) {
|
||
return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]
|
||
+ spaces(endW, " ")
|
||
+ m[4].replace(/^([=:])\s+/, "$1 ");
|
||
}
|
||
function unAlign(m) {
|
||
return !m[2] ? m[0] : spaces(startW) + m[2]
|
||
+ spaces(endW)
|
||
+ m[4].replace(/^([=:])\s+/, "$1 ");
|
||
}
|
||
};
|
||
}).call(Editor.prototype);
|
||
|
||
|
||
function isSamePoint(p1, p2) {
|
||
return p1.row == p2.row && p1.column == p2.column;
|
||
}
|
||
exports.onSessionChange = function(e) {
|
||
var session = e.session;
|
||
if (session && !session.multiSelect) {
|
||
session.$selectionMarkers = [];
|
||
session.selection.$initRangeList();
|
||
session.multiSelect = session.selection;
|
||
}
|
||
this.multiSelect = session && session.multiSelect;
|
||
|
||
var oldSession = e.oldSession;
|
||
if (oldSession) {
|
||
oldSession.multiSelect.off("addRange", this.$onAddRange);
|
||
oldSession.multiSelect.off("removeRange", this.$onRemoveRange);
|
||
oldSession.multiSelect.off("multiSelect", this.$onMultiSelect);
|
||
oldSession.multiSelect.off("singleSelect", this.$onSingleSelect);
|
||
oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange);
|
||
oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange);
|
||
}
|
||
|
||
if (session) {
|
||
session.multiSelect.on("addRange", this.$onAddRange);
|
||
session.multiSelect.on("removeRange", this.$onRemoveRange);
|
||
session.multiSelect.on("multiSelect", this.$onMultiSelect);
|
||
session.multiSelect.on("singleSelect", this.$onSingleSelect);
|
||
session.multiSelect.lead.on("change", this.$checkMultiselectChange);
|
||
session.multiSelect.anchor.on("change", this.$checkMultiselectChange);
|
||
}
|
||
|
||
if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {
|
||
if (session.selection.inMultiSelectMode)
|
||
this.$onMultiSelect();
|
||
else
|
||
this.$onSingleSelect();
|
||
}
|
||
};
|
||
function MultiSelect(editor) {
|
||
if (editor.$multiselectOnSessionChange)
|
||
return;
|
||
editor.$onAddRange = editor.$onAddRange.bind(editor);
|
||
editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);
|
||
editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);
|
||
editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);
|
||
editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);
|
||
editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);
|
||
|
||
editor.$multiselectOnSessionChange(editor);
|
||
editor.on("changeSession", editor.$multiselectOnSessionChange);
|
||
|
||
editor.on("mousedown", onMouseDown);
|
||
editor.commands.addCommands(commands.defaultCommands);
|
||
|
||
addAltCursorListeners(editor);
|
||
}
|
||
|
||
function addAltCursorListeners(editor){
|
||
var el = editor.textInput.getElement();
|
||
var altCursor = false;
|
||
event.addListener(el, "keydown", function(e) {
|
||
var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);
|
||
if (editor.$blockSelectEnabled && altDown) {
|
||
if (!altCursor) {
|
||
editor.renderer.setMouseCursor("crosshair");
|
||
altCursor = true;
|
||
}
|
||
} else if (altCursor) {
|
||
reset();
|
||
}
|
||
});
|
||
|
||
event.addListener(el, "keyup", reset);
|
||
event.addListener(el, "blur", reset);
|
||
function reset(e) {
|
||
if (altCursor) {
|
||
editor.renderer.setMouseCursor("");
|
||
altCursor = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
exports.MultiSelect = MultiSelect;
|
||
|
||
|
||
acequire("./config").defineOptions(Editor.prototype, "editor", {
|
||
enableMultiselect: {
|
||
set: function(val) {
|
||
MultiSelect(this);
|
||
if (val) {
|
||
this.on("changeSession", this.$multiselectOnSessionChange);
|
||
this.on("mousedown", onMouseDown);
|
||
} else {
|
||
this.off("changeSession", this.$multiselectOnSessionChange);
|
||
this.off("mousedown", onMouseDown);
|
||
}
|
||
},
|
||
value: true
|
||
},
|
||
enableBlockSelect: {
|
||
set: function(val) {
|
||
this.$blockSelectEnabled = val;
|
||
},
|
||
value: true
|
||
}
|
||
});
|
||
|
||
|
||
|
||
});
|
||
|
||
ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../../range").Range;
|
||
|
||
var FoldMode = exports.FoldMode = function() {};
|
||
|
||
(function() {
|
||
|
||
this.foldingStartMarker = null;
|
||
this.foldingStopMarker = null;
|
||
this.getFoldWidget = function(session, foldStyle, row) {
|
||
var line = session.getLine(row);
|
||
if (this.foldingStartMarker.test(line))
|
||
return "start";
|
||
if (foldStyle == "markbeginend"
|
||
&& this.foldingStopMarker
|
||
&& this.foldingStopMarker.test(line))
|
||
return "end";
|
||
return "";
|
||
};
|
||
|
||
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||
return null;
|
||
};
|
||
|
||
this.indentationBlock = function(session, row, column) {
|
||
var re = /\S/;
|
||
var line = session.getLine(row);
|
||
var startLevel = line.search(re);
|
||
if (startLevel == -1)
|
||
return;
|
||
|
||
var startColumn = column || line.length;
|
||
var maxRow = session.getLength();
|
||
var startRow = row;
|
||
var endRow = row;
|
||
|
||
while (++row < maxRow) {
|
||
var level = session.getLine(row).search(re);
|
||
|
||
if (level == -1)
|
||
continue;
|
||
|
||
if (level <= startLevel)
|
||
break;
|
||
|
||
endRow = row;
|
||
}
|
||
|
||
if (endRow > startRow) {
|
||
var endColumn = session.getLine(endRow).length;
|
||
return new Range(startRow, startColumn, endRow, endColumn);
|
||
}
|
||
};
|
||
|
||
this.openingBracketBlock = function(session, bracket, row, column, typeRe) {
|
||
var start = {row: row, column: column + 1};
|
||
var end = session.$findClosingBracket(bracket, start, typeRe);
|
||
if (!end)
|
||
return;
|
||
|
||
var fw = session.foldWidgets[end.row];
|
||
if (fw == null)
|
||
fw = session.getFoldWidget(end.row);
|
||
|
||
if (fw == "start" && end.row > start.row) {
|
||
end.row --;
|
||
end.column = session.getLine(end.row).length;
|
||
}
|
||
return Range.fromPoints(start, end);
|
||
};
|
||
|
||
this.closingBracketBlock = function(session, bracket, row, column, typeRe) {
|
||
var end = {row: row, column: column};
|
||
var start = session.$findOpeningBracket(bracket, end);
|
||
|
||
if (!start)
|
||
return;
|
||
|
||
start.column++;
|
||
end.column--;
|
||
|
||
return Range.fromPoints(start, end);
|
||
};
|
||
}).call(FoldMode.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
exports.isDark = false;
|
||
exports.cssClass = "ace-tm";
|
||
exports.cssText = ".ace-tm .ace_gutter {\
|
||
background: #f0f0f0;\
|
||
color: #333;\
|
||
}\
|
||
.ace-tm .ace_print-margin {\
|
||
width: 1px;\
|
||
background: #e8e8e8;\
|
||
}\
|
||
.ace-tm .ace_fold {\
|
||
background-color: #6B72E6;\
|
||
}\
|
||
.ace-tm {\
|
||
background-color: #FFFFFF;\
|
||
color: black;\
|
||
}\
|
||
.ace-tm .ace_cursor {\
|
||
color: black;\
|
||
}\
|
||
.ace-tm .ace_invisible {\
|
||
color: rgb(191, 191, 191);\
|
||
}\
|
||
.ace-tm .ace_storage,\
|
||
.ace-tm .ace_keyword {\
|
||
color: blue;\
|
||
}\
|
||
.ace-tm .ace_constant {\
|
||
color: rgb(197, 6, 11);\
|
||
}\
|
||
.ace-tm .ace_constant.ace_buildin {\
|
||
color: rgb(88, 72, 246);\
|
||
}\
|
||
.ace-tm .ace_constant.ace_language {\
|
||
color: rgb(88, 92, 246);\
|
||
}\
|
||
.ace-tm .ace_constant.ace_library {\
|
||
color: rgb(6, 150, 14);\
|
||
}\
|
||
.ace-tm .ace_invalid {\
|
||
background-color: rgba(255, 0, 0, 0.1);\
|
||
color: red;\
|
||
}\
|
||
.ace-tm .ace_support.ace_function {\
|
||
color: rgb(60, 76, 114);\
|
||
}\
|
||
.ace-tm .ace_support.ace_constant {\
|
||
color: rgb(6, 150, 14);\
|
||
}\
|
||
.ace-tm .ace_support.ace_type,\
|
||
.ace-tm .ace_support.ace_class {\
|
||
color: rgb(109, 121, 222);\
|
||
}\
|
||
.ace-tm .ace_keyword.ace_operator {\
|
||
color: rgb(104, 118, 135);\
|
||
}\
|
||
.ace-tm .ace_string {\
|
||
color: rgb(3, 106, 7);\
|
||
}\
|
||
.ace-tm .ace_comment {\
|
||
color: rgb(76, 136, 107);\
|
||
}\
|
||
.ace-tm .ace_comment.ace_doc {\
|
||
color: rgb(0, 102, 255);\
|
||
}\
|
||
.ace-tm .ace_comment.ace_doc.ace_tag {\
|
||
color: rgb(128, 159, 191);\
|
||
}\
|
||
.ace-tm .ace_constant.ace_numeric {\
|
||
color: rgb(0, 0, 205);\
|
||
}\
|
||
.ace-tm .ace_variable {\
|
||
color: rgb(49, 132, 149);\
|
||
}\
|
||
.ace-tm .ace_xml-pe {\
|
||
color: rgb(104, 104, 91);\
|
||
}\
|
||
.ace-tm .ace_entity.ace_name.ace_function {\
|
||
color: #0000A2;\
|
||
}\
|
||
.ace-tm .ace_heading {\
|
||
color: rgb(12, 7, 255);\
|
||
}\
|
||
.ace-tm .ace_list {\
|
||
color:rgb(185, 6, 144);\
|
||
}\
|
||
.ace-tm .ace_meta.ace_tag {\
|
||
color:rgb(0, 22, 142);\
|
||
}\
|
||
.ace-tm .ace_string.ace_regex {\
|
||
color: rgb(255, 0, 0)\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_selection {\
|
||
background: rgb(181, 213, 255);\
|
||
}\
|
||
.ace-tm.ace_multiselect .ace_selection.ace_start {\
|
||
box-shadow: 0 0 3px 0px white;\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_step {\
|
||
background: rgb(252, 255, 0);\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_stack {\
|
||
background: rgb(164, 229, 101);\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_bracket {\
|
||
margin: -1px 0 0 -1px;\
|
||
border: 1px solid rgb(192, 192, 192);\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_active-line {\
|
||
background: rgba(0, 0, 0, 0.07);\
|
||
}\
|
||
.ace-tm .ace_gutter-active-line {\
|
||
background-color : #dcdcdc;\
|
||
}\
|
||
.ace-tm .ace_marker-layer .ace_selected-word {\
|
||
background: rgb(250, 250, 255);\
|
||
border: 1px solid rgb(200, 200, 250);\
|
||
}\
|
||
.ace-tm .ace_indent-guide {\
|
||
background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
|
||
}\
|
||
";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
dom.importCssString(exports.cssText, exports.cssClass);
|
||
});
|
||
|
||
ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("./lib/oop");
|
||
var dom = acequire("./lib/dom");
|
||
var Range = acequire("./range").Range;
|
||
|
||
|
||
function LineWidgets(session) {
|
||
this.session = session;
|
||
this.session.widgetManager = this;
|
||
this.session.getRowLength = this.getRowLength;
|
||
this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;
|
||
this.updateOnChange = this.updateOnChange.bind(this);
|
||
this.renderWidgets = this.renderWidgets.bind(this);
|
||
this.measureWidgets = this.measureWidgets.bind(this);
|
||
this.session._changedWidgets = [];
|
||
this.$onChangeEditor = this.$onChangeEditor.bind(this);
|
||
|
||
this.session.on("change", this.updateOnChange);
|
||
this.session.on("changeFold", this.updateOnFold);
|
||
this.session.on("changeEditor", this.$onChangeEditor);
|
||
}
|
||
|
||
(function() {
|
||
this.getRowLength = function(row) {
|
||
var h;
|
||
if (this.lineWidgets)
|
||
h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;
|
||
else
|
||
h = 0;
|
||
if (!this.$useWrapMode || !this.$wrapData[row]) {
|
||
return 1 + h;
|
||
} else {
|
||
return this.$wrapData[row].length + 1 + h;
|
||
}
|
||
};
|
||
|
||
this.$getWidgetScreenLength = function() {
|
||
var screenRows = 0;
|
||
this.lineWidgets.forEach(function(w){
|
||
if (w && w.rowCount && !w.hidden)
|
||
screenRows += w.rowCount;
|
||
});
|
||
return screenRows;
|
||
};
|
||
|
||
this.$onChangeEditor = function(e) {
|
||
this.attach(e.editor);
|
||
};
|
||
|
||
this.attach = function(editor) {
|
||
if (editor && editor.widgetManager && editor.widgetManager != this)
|
||
editor.widgetManager.detach();
|
||
|
||
if (this.editor == editor)
|
||
return;
|
||
|
||
this.detach();
|
||
this.editor = editor;
|
||
|
||
if (editor) {
|
||
editor.widgetManager = this;
|
||
editor.renderer.on("beforeRender", this.measureWidgets);
|
||
editor.renderer.on("afterRender", this.renderWidgets);
|
||
}
|
||
};
|
||
this.detach = function(e) {
|
||
var editor = this.editor;
|
||
if (!editor)
|
||
return;
|
||
|
||
this.editor = null;
|
||
editor.widgetManager = null;
|
||
|
||
editor.renderer.off("beforeRender", this.measureWidgets);
|
||
editor.renderer.off("afterRender", this.renderWidgets);
|
||
var lineWidgets = this.session.lineWidgets;
|
||
lineWidgets && lineWidgets.forEach(function(w) {
|
||
if (w && w.el && w.el.parentNode) {
|
||
w._inDocument = false;
|
||
w.el.parentNode.removeChild(w.el);
|
||
}
|
||
});
|
||
};
|
||
|
||
this.updateOnFold = function(e, session) {
|
||
var lineWidgets = session.lineWidgets;
|
||
if (!lineWidgets || !e.action)
|
||
return;
|
||
var fold = e.data;
|
||
var start = fold.start.row;
|
||
var end = fold.end.row;
|
||
var hide = e.action == "add";
|
||
for (var i = start + 1; i < end; i++) {
|
||
if (lineWidgets[i])
|
||
lineWidgets[i].hidden = hide;
|
||
}
|
||
if (lineWidgets[end]) {
|
||
if (hide) {
|
||
if (!lineWidgets[start])
|
||
lineWidgets[start] = lineWidgets[end];
|
||
else
|
||
lineWidgets[end].hidden = hide;
|
||
} else {
|
||
if (lineWidgets[start] == lineWidgets[end])
|
||
lineWidgets[start] = undefined;
|
||
lineWidgets[end].hidden = hide;
|
||
}
|
||
}
|
||
};
|
||
|
||
this.updateOnChange = function(delta) {
|
||
var lineWidgets = this.session.lineWidgets;
|
||
if (!lineWidgets) return;
|
||
|
||
var startRow = delta.start.row;
|
||
var len = delta.end.row - startRow;
|
||
|
||
if (len === 0) {
|
||
} else if (delta.action == 'remove') {
|
||
var removed = lineWidgets.splice(startRow + 1, len);
|
||
removed.forEach(function(w) {
|
||
w && this.removeLineWidget(w);
|
||
}, this);
|
||
this.$updateRows();
|
||
} else {
|
||
var args = new Array(len);
|
||
args.unshift(startRow, 0);
|
||
lineWidgets.splice.apply(lineWidgets, args);
|
||
this.$updateRows();
|
||
}
|
||
};
|
||
|
||
this.$updateRows = function() {
|
||
var lineWidgets = this.session.lineWidgets;
|
||
if (!lineWidgets) return;
|
||
var noWidgets = true;
|
||
lineWidgets.forEach(function(w, i) {
|
||
if (w) {
|
||
noWidgets = false;
|
||
w.row = i;
|
||
while (w.$oldWidget) {
|
||
w.$oldWidget.row = i;
|
||
w = w.$oldWidget;
|
||
}
|
||
}
|
||
});
|
||
if (noWidgets)
|
||
this.session.lineWidgets = null;
|
||
};
|
||
|
||
this.addLineWidget = function(w) {
|
||
if (!this.session.lineWidgets)
|
||
this.session.lineWidgets = new Array(this.session.getLength());
|
||
|
||
var old = this.session.lineWidgets[w.row];
|
||
if (old) {
|
||
w.$oldWidget = old;
|
||
if (old.el && old.el.parentNode) {
|
||
old.el.parentNode.removeChild(old.el);
|
||
old._inDocument = false;
|
||
}
|
||
}
|
||
|
||
this.session.lineWidgets[w.row] = w;
|
||
|
||
w.session = this.session;
|
||
|
||
var renderer = this.editor.renderer;
|
||
if (w.html && !w.el) {
|
||
w.el = dom.createElement("div");
|
||
w.el.innerHTML = w.html;
|
||
}
|
||
if (w.el) {
|
||
dom.addCssClass(w.el, "ace_lineWidgetContainer");
|
||
w.el.style.position = "absolute";
|
||
w.el.style.zIndex = 5;
|
||
renderer.container.appendChild(w.el);
|
||
w._inDocument = true;
|
||
}
|
||
|
||
if (!w.coverGutter) {
|
||
w.el.style.zIndex = 3;
|
||
}
|
||
if (!w.pixelHeight) {
|
||
w.pixelHeight = w.el.offsetHeight;
|
||
}
|
||
if (w.rowCount == null) {
|
||
w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;
|
||
}
|
||
|
||
var fold = this.session.getFoldAt(w.row, 0);
|
||
w.$fold = fold;
|
||
if (fold) {
|
||
var lineWidgets = this.session.lineWidgets;
|
||
if (w.row == fold.end.row && !lineWidgets[fold.start.row])
|
||
lineWidgets[fold.start.row] = w;
|
||
else
|
||
w.hidden = true;
|
||
}
|
||
|
||
this.session._emit("changeFold", {data:{start:{row: w.row}}});
|
||
|
||
this.$updateRows();
|
||
this.renderWidgets(null, renderer);
|
||
this.onWidgetChanged(w);
|
||
return w;
|
||
};
|
||
|
||
this.removeLineWidget = function(w) {
|
||
w._inDocument = false;
|
||
w.session = null;
|
||
if (w.el && w.el.parentNode)
|
||
w.el.parentNode.removeChild(w.el);
|
||
if (w.editor && w.editor.destroy) try {
|
||
w.editor.destroy();
|
||
} catch(e){}
|
||
if (this.session.lineWidgets) {
|
||
var w1 = this.session.lineWidgets[w.row]
|
||
if (w1 == w) {
|
||
this.session.lineWidgets[w.row] = w.$oldWidget;
|
||
if (w.$oldWidget)
|
||
this.onWidgetChanged(w.$oldWidget);
|
||
} else {
|
||
while (w1) {
|
||
if (w1.$oldWidget == w) {
|
||
w1.$oldWidget = w.$oldWidget;
|
||
break;
|
||
}
|
||
w1 = w1.$oldWidget;
|
||
}
|
||
}
|
||
}
|
||
this.session._emit("changeFold", {data:{start:{row: w.row}}});
|
||
this.$updateRows();
|
||
};
|
||
|
||
this.getWidgetsAtRow = function(row) {
|
||
var lineWidgets = this.session.lineWidgets;
|
||
var w = lineWidgets && lineWidgets[row];
|
||
var list = [];
|
||
while (w) {
|
||
list.push(w);
|
||
w = w.$oldWidget;
|
||
}
|
||
return list;
|
||
};
|
||
|
||
this.onWidgetChanged = function(w) {
|
||
this.session._changedWidgets.push(w);
|
||
this.editor && this.editor.renderer.updateFull();
|
||
};
|
||
|
||
this.measureWidgets = function(e, renderer) {
|
||
var changedWidgets = this.session._changedWidgets;
|
||
var config = renderer.layerConfig;
|
||
|
||
if (!changedWidgets || !changedWidgets.length) return;
|
||
var min = Infinity;
|
||
for (var i = 0; i < changedWidgets.length; i++) {
|
||
var w = changedWidgets[i];
|
||
if (!w || !w.el) continue;
|
||
if (w.session != this.session) continue;
|
||
if (!w._inDocument) {
|
||
if (this.session.lineWidgets[w.row] != w)
|
||
continue;
|
||
w._inDocument = true;
|
||
renderer.container.appendChild(w.el);
|
||
}
|
||
|
||
w.h = w.el.offsetHeight;
|
||
|
||
if (!w.fixedWidth) {
|
||
w.w = w.el.offsetWidth;
|
||
w.screenWidth = Math.ceil(w.w / config.characterWidth);
|
||
}
|
||
|
||
var rowCount = w.h / config.lineHeight;
|
||
if (w.coverLine) {
|
||
rowCount -= this.session.getRowLineCount(w.row);
|
||
if (rowCount < 0)
|
||
rowCount = 0;
|
||
}
|
||
if (w.rowCount != rowCount) {
|
||
w.rowCount = rowCount;
|
||
if (w.row < min)
|
||
min = w.row;
|
||
}
|
||
}
|
||
if (min != Infinity) {
|
||
this.session._emit("changeFold", {data:{start:{row: min}}});
|
||
this.session.lineWidgetWidth = null;
|
||
}
|
||
this.session._changedWidgets = [];
|
||
};
|
||
|
||
this.renderWidgets = function(e, renderer) {
|
||
var config = renderer.layerConfig;
|
||
var lineWidgets = this.session.lineWidgets;
|
||
if (!lineWidgets)
|
||
return;
|
||
var first = Math.min(this.firstRow, config.firstRow);
|
||
var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);
|
||
|
||
while (first > 0 && !lineWidgets[first])
|
||
first--;
|
||
|
||
this.firstRow = config.firstRow;
|
||
this.lastRow = config.lastRow;
|
||
|
||
renderer.$cursorLayer.config = config;
|
||
for (var i = first; i <= last; i++) {
|
||
var w = lineWidgets[i];
|
||
if (!w || !w.el) continue;
|
||
if (w.hidden) {
|
||
w.el.style.top = -100 - (w.pixelHeight || 0) + "px";
|
||
continue;
|
||
}
|
||
if (!w._inDocument) {
|
||
w._inDocument = true;
|
||
renderer.container.appendChild(w.el);
|
||
}
|
||
var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;
|
||
if (!w.coverLine)
|
||
top += config.lineHeight * this.session.getRowLineCount(w.row);
|
||
w.el.style.top = top - config.offset + "px";
|
||
|
||
var left = w.coverGutter ? 0 : renderer.gutterWidth;
|
||
if (!w.fixedWidth)
|
||
left -= renderer.scrollLeft;
|
||
w.el.style.left = left + "px";
|
||
|
||
if (w.fullWidth && w.screenWidth) {
|
||
w.el.style.minWidth = config.width + 2 * config.padding + "px";
|
||
}
|
||
|
||
if (w.fixedWidth) {
|
||
w.el.style.right = renderer.scrollBar.getWidth() + "px";
|
||
} else {
|
||
w.el.style.right = "";
|
||
}
|
||
}
|
||
};
|
||
|
||
}).call(LineWidgets.prototype);
|
||
|
||
|
||
exports.LineWidgets = LineWidgets;
|
||
|
||
});
|
||
|
||
ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var LineWidgets = acequire("../line_widgets").LineWidgets;
|
||
var dom = acequire("../lib/dom");
|
||
var Range = acequire("../range").Range;
|
||
|
||
function binarySearch(array, needle, comparator) {
|
||
var first = 0;
|
||
var last = array.length - 1;
|
||
|
||
while (first <= last) {
|
||
var mid = (first + last) >> 1;
|
||
var c = comparator(needle, array[mid]);
|
||
if (c > 0)
|
||
first = mid + 1;
|
||
else if (c < 0)
|
||
last = mid - 1;
|
||
else
|
||
return mid;
|
||
}
|
||
return -(first + 1);
|
||
}
|
||
|
||
function findAnnotations(session, row, dir) {
|
||
var annotations = session.getAnnotations().sort(Range.comparePoints);
|
||
if (!annotations.length)
|
||
return;
|
||
|
||
var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);
|
||
if (i < 0)
|
||
i = -i - 1;
|
||
|
||
if (i >= annotations.length)
|
||
i = dir > 0 ? 0 : annotations.length - 1;
|
||
else if (i === 0 && dir < 0)
|
||
i = annotations.length - 1;
|
||
|
||
var annotation = annotations[i];
|
||
if (!annotation || !dir)
|
||
return;
|
||
|
||
if (annotation.row === row) {
|
||
do {
|
||
annotation = annotations[i += dir];
|
||
} while (annotation && annotation.row === row);
|
||
if (!annotation)
|
||
return annotations.slice();
|
||
}
|
||
|
||
|
||
var matched = [];
|
||
row = annotation.row;
|
||
do {
|
||
matched[dir < 0 ? "unshift" : "push"](annotation);
|
||
annotation = annotations[i += dir];
|
||
} while (annotation && annotation.row == row);
|
||
return matched.length && matched;
|
||
}
|
||
|
||
exports.showErrorMarker = function(editor, dir) {
|
||
var session = editor.session;
|
||
if (!session.widgetManager) {
|
||
session.widgetManager = new LineWidgets(session);
|
||
session.widgetManager.attach(editor);
|
||
}
|
||
|
||
var pos = editor.getCursorPosition();
|
||
var row = pos.row;
|
||
var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {
|
||
return w.type == "errorMarker";
|
||
})[0];
|
||
if (oldWidget) {
|
||
oldWidget.destroy();
|
||
} else {
|
||
row -= dir;
|
||
}
|
||
var annotations = findAnnotations(session, row, dir);
|
||
var gutterAnno;
|
||
if (annotations) {
|
||
var annotation = annotations[0];
|
||
pos.column = (annotation.pos && typeof annotation.column != "number"
|
||
? annotation.pos.sc
|
||
: annotation.column) || 0;
|
||
pos.row = annotation.row;
|
||
gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];
|
||
} else if (oldWidget) {
|
||
return;
|
||
} else {
|
||
gutterAnno = {
|
||
text: ["Looks good!"],
|
||
className: "ace_ok"
|
||
};
|
||
}
|
||
editor.session.unfold(pos.row);
|
||
editor.selection.moveToPosition(pos);
|
||
|
||
var w = {
|
||
row: pos.row,
|
||
fixedWidth: true,
|
||
coverGutter: true,
|
||
el: dom.createElement("div"),
|
||
type: "errorMarker"
|
||
};
|
||
var el = w.el.appendChild(dom.createElement("div"));
|
||
var arrow = w.el.appendChild(dom.createElement("div"));
|
||
arrow.className = "error_widget_arrow " + gutterAnno.className;
|
||
|
||
var left = editor.renderer.$cursorLayer
|
||
.getPixelPosition(pos).left;
|
||
arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px";
|
||
|
||
w.el.className = "error_widget_wrapper";
|
||
el.className = "error_widget " + gutterAnno.className;
|
||
el.innerHTML = gutterAnno.text.join("<br>");
|
||
|
||
el.appendChild(dom.createElement("div"));
|
||
|
||
var kb = function(_, hashId, keyString) {
|
||
if (hashId === 0 && (keyString === "esc" || keyString === "return")) {
|
||
w.destroy();
|
||
return {command: "null"};
|
||
}
|
||
};
|
||
|
||
w.destroy = function() {
|
||
if (editor.$mouseHandler.isMousePressed)
|
||
return;
|
||
editor.keyBinding.removeKeyboardHandler(kb);
|
||
session.widgetManager.removeLineWidget(w);
|
||
editor.off("changeSelection", w.destroy);
|
||
editor.off("changeSession", w.destroy);
|
||
editor.off("mouseup", w.destroy);
|
||
editor.off("change", w.destroy);
|
||
};
|
||
|
||
editor.keyBinding.addKeyboardHandler(kb);
|
||
editor.on("changeSelection", w.destroy);
|
||
editor.on("changeSession", w.destroy);
|
||
editor.on("mouseup", w.destroy);
|
||
editor.on("change", w.destroy);
|
||
|
||
editor.session.widgetManager.addLineWidget(w);
|
||
|
||
w.el.onmousedown = editor.focus.bind(editor);
|
||
|
||
editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});
|
||
};
|
||
|
||
|
||
dom.importCssString("\
|
||
.error_widget_wrapper {\
|
||
background: inherit;\
|
||
color: inherit;\
|
||
border:none\
|
||
}\
|
||
.error_widget {\
|
||
border-top: solid 2px;\
|
||
border-bottom: solid 2px;\
|
||
margin: 5px 0;\
|
||
padding: 10px 40px;\
|
||
white-space: pre-wrap;\
|
||
}\
|
||
.error_widget.ace_error, .error_widget_arrow.ace_error{\
|
||
border-color: #ff5a5a\
|
||
}\
|
||
.error_widget.ace_warning, .error_widget_arrow.ace_warning{\
|
||
border-color: #F1D817\
|
||
}\
|
||
.error_widget.ace_info, .error_widget_arrow.ace_info{\
|
||
border-color: #5a5a5a\
|
||
}\
|
||
.error_widget.ace_ok, .error_widget_arrow.ace_ok{\
|
||
border-color: #5aaa5a\
|
||
}\
|
||
.error_widget_arrow {\
|
||
position: absolute;\
|
||
border: solid 5px;\
|
||
border-top-color: transparent!important;\
|
||
border-right-color: transparent!important;\
|
||
border-left-color: transparent!important;\
|
||
top: -5px;\
|
||
}\
|
||
", "");
|
||
|
||
});
|
||
|
||
ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
acequire("./lib/fixoldbrowsers");
|
||
|
||
var dom = acequire("./lib/dom");
|
||
var event = acequire("./lib/event");
|
||
|
||
var Editor = acequire("./editor").Editor;
|
||
var EditSession = acequire("./edit_session").EditSession;
|
||
var UndoManager = acequire("./undomanager").UndoManager;
|
||
var Renderer = acequire("./virtual_renderer").VirtualRenderer;
|
||
acequire("./worker/worker_client");
|
||
acequire("./keyboard/hash_handler");
|
||
acequire("./placeholder");
|
||
acequire("./multi_select");
|
||
acequire("./mode/folding/fold_mode");
|
||
acequire("./theme/textmate");
|
||
acequire("./ext/error_marker");
|
||
|
||
exports.config = acequire("./config");
|
||
exports.acequire = acequire;
|
||
exports.edit = function(el) {
|
||
if (typeof el == "string") {
|
||
var _id = el;
|
||
el = document.getElementById(_id);
|
||
if (!el)
|
||
throw new Error("ace.edit can't find div #" + _id);
|
||
}
|
||
|
||
if (el && el.env && el.env.editor instanceof Editor)
|
||
return el.env.editor;
|
||
|
||
var value = "";
|
||
if (el && /input|textarea/i.test(el.tagName)) {
|
||
var oldNode = el;
|
||
value = oldNode.value;
|
||
el = dom.createElement("pre");
|
||
oldNode.parentNode.replaceChild(el, oldNode);
|
||
} else if (el) {
|
||
value = dom.getInnerText(el);
|
||
el.innerHTML = "";
|
||
}
|
||
|
||
var doc = exports.createEditSession(value);
|
||
|
||
var editor = new Editor(new Renderer(el));
|
||
editor.setSession(doc);
|
||
|
||
var env = {
|
||
document: doc,
|
||
editor: editor,
|
||
onResize: editor.resize.bind(editor, null)
|
||
};
|
||
if (oldNode) env.textarea = oldNode;
|
||
event.addListener(window, "resize", env.onResize);
|
||
editor.on("destroy", function() {
|
||
event.removeListener(window, "resize", env.onResize);
|
||
env.editor.container.env = null; // prevent memory leak on old ie
|
||
});
|
||
editor.container.env = editor.env = env;
|
||
return editor;
|
||
};
|
||
exports.createEditSession = function(text, mode) {
|
||
var doc = new EditSession(text, mode);
|
||
doc.setUndoManager(new UndoManager());
|
||
return doc;
|
||
}
|
||
exports.EditSession = EditSession;
|
||
exports.UndoManager = UndoManager;
|
||
exports.version = "1.2.3";
|
||
});
|
||
(function() {
|
||
ace.acequire(["ace/ace"], function(a) {
|
||
a && a.config.init(true);
|
||
if (!window.ace)
|
||
window.ace = a;
|
||
for (var key in a) if (a.hasOwnProperty(key))
|
||
window.ace[key] = a[key];
|
||
});
|
||
})();
|
||
|
||
module.exports = window.ace.acequire("ace/ace");
|
||
|
||
/***/ },
|
||
/* 13 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function() { throw new Error("define cannot be used indirect"); };
|
||
|
||
|
||
/***/ },
|
||
/* 14 */
|
||
/***/ function(module, exports) {
|
||
|
||
/* WEBPACK VAR INJECTION */(function(global) {module.exports = get_blob()
|
||
|
||
function get_blob() {
|
||
if(global.Blob) {
|
||
try {
|
||
new Blob(['asdf'], {type: 'text/plain'})
|
||
return Blob
|
||
} catch(err) {}
|
||
}
|
||
|
||
var Builder = global.WebKitBlobBuilder ||
|
||
global.MozBlobBuilder ||
|
||
global.MSBlobBuilder
|
||
|
||
return function(parts, bag) {
|
||
var builder = new Builder
|
||
, endings = bag.endings
|
||
, type = bag.type
|
||
|
||
if(endings) for(var i = 0, len = parts.length; i < len; ++i) {
|
||
builder.append(parts[i], endings)
|
||
} else for(var i = 0, len = parts.length; i < len; ++i) {
|
||
builder.append(parts[i])
|
||
}
|
||
|
||
return type ? builder.getBlob(type) : builder.getBlob()
|
||
}
|
||
}
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
|
||
|
||
/***/ },
|
||
/* 15 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var TextHighlightRules = acequire("./text_highlight_rules").TextHighlightRules;
|
||
|
||
var DocCommentHighlightRules = function() {
|
||
this.$rules = {
|
||
"start" : [ {
|
||
token : "comment.doc.tag",
|
||
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||
},
|
||
DocCommentHighlightRules.getTagRule(),
|
||
{
|
||
defaultToken : "comment.doc",
|
||
caseInsensitive: true
|
||
}]
|
||
};
|
||
};
|
||
|
||
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||
|
||
DocCommentHighlightRules.getTagRule = function(start) {
|
||
return {
|
||
token : "comment.doc.tag.storage.type",
|
||
regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
|
||
};
|
||
}
|
||
|
||
DocCommentHighlightRules.getStartRule = function(start) {
|
||
return {
|
||
token : "comment.doc", // doc comment
|
||
regex : "\\/\\*(?=\\*)",
|
||
next : start
|
||
};
|
||
};
|
||
|
||
DocCommentHighlightRules.getEndRule = function (start) {
|
||
return {
|
||
token : "comment.doc", // closing comment
|
||
regex : "\\*\\/",
|
||
next : start
|
||
};
|
||
};
|
||
|
||
|
||
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||
|
||
});
|
||
|
||
ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var DocCommentHighlightRules = acequire("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||
var TextHighlightRules = acequire("./text_highlight_rules").TextHighlightRules;
|
||
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b";
|
||
|
||
var JavaScriptHighlightRules = function(options) {
|
||
var keywordMapper = this.createKeywordMapper({
|
||
"variable.language":
|
||
"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors
|
||
"Namespace|QName|XML|XMLList|" + // E4X
|
||
"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
|
||
"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
|
||
"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors
|
||
"SyntaxError|TypeError|URIError|" +
|
||
"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
|
||
"isNaN|parseFloat|parseInt|" +
|
||
"JSON|Math|" + // Other
|
||
"this|arguments|prototype|window|document" , // Pseudo
|
||
"keyword":
|
||
"const|yield|import|get|set|" +
|
||
"break|case|catch|continue|default|delete|do|else|finally|for|function|" +
|
||
"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
|
||
"__parent__|__count__|escape|unescape|with|__proto__|" +
|
||
"class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
|
||
"storage.type":
|
||
"const|let|var|function",
|
||
"constant.language":
|
||
"null|Infinity|NaN|undefined",
|
||
"support.function":
|
||
"alert",
|
||
"constant.language.boolean": "true|false"
|
||
}, "identifier");
|
||
var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
|
||
|
||
var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
|
||
"u[0-9a-fA-F]{4}|" + // unicode
|
||
"u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
|
||
"[0-2][0-7]{0,2}|" + // oct
|
||
"3[0-7][0-7]?|" + // oct
|
||
"[4-7][0-7]?|" + //oct
|
||
".)";
|
||
|
||
this.$rules = {
|
||
"no_regex" : [
|
||
DocCommentHighlightRules.getStartRule("doc-start"),
|
||
comments("no_regex"),
|
||
{
|
||
token : "string",
|
||
regex : "'(?=.)",
|
||
next : "qstring"
|
||
}, {
|
||
token : "string",
|
||
regex : '"(?=.)',
|
||
next : "qqstring"
|
||
}, {
|
||
token : "constant.numeric", // hex
|
||
regex : /0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/
|
||
}, {
|
||
token : "constant.numeric", // float
|
||
regex : /[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/
|
||
}, {
|
||
token : [
|
||
"storage.type", "punctuation.operator", "support.function",
|
||
"punctuation.operator", "entity.name.function", "text","keyword.operator"
|
||
],
|
||
regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||
"keyword.operator", "text", "storage.type", "text", "paren.lparen"
|
||
],
|
||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"entity.name.function", "text", "keyword.operator", "text", "storage.type",
|
||
"text", "paren.lparen"
|
||
],
|
||
regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||
"keyword.operator", "text",
|
||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||
],
|
||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||
],
|
||
regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"entity.name.function", "text", "punctuation.operator",
|
||
"text", "storage.type", "text", "paren.lparen"
|
||
],
|
||
regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : [
|
||
"text", "text", "storage.type", "text", "paren.lparen"
|
||
],
|
||
regex : "(:)(\\s*)(function)(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : "keyword",
|
||
regex : "(?:" + kwBeforeRe + ")\\b",
|
||
next : "start"
|
||
}, {
|
||
token : ["support.constant"],
|
||
regex : /that\b/
|
||
}, {
|
||
token : ["storage.type", "punctuation.operator", "support.function.firebug"],
|
||
regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
|
||
}, {
|
||
token : keywordMapper,
|
||
regex : identifierRe
|
||
}, {
|
||
token : "punctuation.operator",
|
||
regex : /[.](?![.])/,
|
||
next : "property"
|
||
}, {
|
||
token : "keyword.operator",
|
||
regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,
|
||
next : "start"
|
||
}, {
|
||
token : "punctuation.operator",
|
||
regex : /[?:,;.]/,
|
||
next : "start"
|
||
}, {
|
||
token : "paren.lparen",
|
||
regex : /[\[({]/,
|
||
next : "start"
|
||
}, {
|
||
token : "paren.rparen",
|
||
regex : /[\])}]/
|
||
}, {
|
||
token: "comment",
|
||
regex: /^#!.*$/
|
||
}
|
||
],
|
||
property: [{
|
||
token : "text",
|
||
regex : "\\s+"
|
||
}, {
|
||
token : [
|
||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||
"keyword.operator", "text",
|
||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||
],
|
||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",
|
||
next: "function_arguments"
|
||
}, {
|
||
token : "punctuation.operator",
|
||
regex : /[.](?![.])/
|
||
}, {
|
||
token : "support.function",
|
||
regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
|
||
}, {
|
||
token : "support.function.dom",
|
||
regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
|
||
}, {
|
||
token : "support.constant",
|
||
regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
|
||
}, {
|
||
token : "identifier",
|
||
regex : identifierRe
|
||
}, {
|
||
regex: "",
|
||
token: "empty",
|
||
next: "no_regex"
|
||
}
|
||
],
|
||
"start": [
|
||
DocCommentHighlightRules.getStartRule("doc-start"),
|
||
comments("start"),
|
||
{
|
||
token: "string.regexp",
|
||
regex: "\\/",
|
||
next: "regex"
|
||
}, {
|
||
token : "text",
|
||
regex : "\\s+|^$",
|
||
next : "start"
|
||
}, {
|
||
token: "empty",
|
||
regex: "",
|
||
next: "no_regex"
|
||
}
|
||
],
|
||
"regex": [
|
||
{
|
||
token: "regexp.keyword.operator",
|
||
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
|
||
}, {
|
||
token: "string.regexp",
|
||
regex: "/[sxngimy]*",
|
||
next: "no_regex"
|
||
}, {
|
||
token : "invalid",
|
||
regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
|
||
}, {
|
||
token : "constant.language.escape",
|
||
regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
|
||
}, {
|
||
token : "constant.language.delimiter",
|
||
regex: /\|/
|
||
}, {
|
||
token: "constant.language.escape",
|
||
regex: /\[\^?/,
|
||
next: "regex_character_class"
|
||
}, {
|
||
token: "empty",
|
||
regex: "$",
|
||
next: "no_regex"
|
||
}, {
|
||
defaultToken: "string.regexp"
|
||
}
|
||
],
|
||
"regex_character_class": [
|
||
{
|
||
token: "regexp.charclass.keyword.operator",
|
||
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
|
||
}, {
|
||
token: "constant.language.escape",
|
||
regex: "]",
|
||
next: "regex"
|
||
}, {
|
||
token: "constant.language.escape",
|
||
regex: "-"
|
||
}, {
|
||
token: "empty",
|
||
regex: "$",
|
||
next: "no_regex"
|
||
}, {
|
||
defaultToken: "string.regexp.charachterclass"
|
||
}
|
||
],
|
||
"function_arguments": [
|
||
{
|
||
token: "variable.parameter",
|
||
regex: identifierRe
|
||
}, {
|
||
token: "punctuation.operator",
|
||
regex: "[, ]+"
|
||
}, {
|
||
token: "punctuation.operator",
|
||
regex: "$"
|
||
}, {
|
||
token: "empty",
|
||
regex: "",
|
||
next: "no_regex"
|
||
}
|
||
],
|
||
"qqstring" : [
|
||
{
|
||
token : "constant.language.escape",
|
||
regex : escapedRe
|
||
}, {
|
||
token : "string",
|
||
regex : "\\\\$",
|
||
next : "qqstring"
|
||
}, {
|
||
token : "string",
|
||
regex : '"|$',
|
||
next : "no_regex"
|
||
}, {
|
||
defaultToken: "string"
|
||
}
|
||
],
|
||
"qstring" : [
|
||
{
|
||
token : "constant.language.escape",
|
||
regex : escapedRe
|
||
}, {
|
||
token : "string",
|
||
regex : "\\\\$",
|
||
next : "qstring"
|
||
}, {
|
||
token : "string",
|
||
regex : "'|$",
|
||
next : "no_regex"
|
||
}, {
|
||
defaultToken: "string"
|
||
}
|
||
]
|
||
};
|
||
|
||
|
||
if (!options || !options.noES6) {
|
||
this.$rules.no_regex.unshift({
|
||
regex: "[{}]", onMatch: function(val, state, stack) {
|
||
this.next = val == "{" ? this.nextState : "";
|
||
if (val == "{" && stack.length) {
|
||
stack.unshift("start", state);
|
||
}
|
||
else if (val == "}" && stack.length) {
|
||
stack.shift();
|
||
this.next = stack.shift();
|
||
if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1)
|
||
return "paren.quasi.end";
|
||
}
|
||
return val == "{" ? "paren.lparen" : "paren.rparen";
|
||
},
|
||
nextState: "start"
|
||
}, {
|
||
token : "string.quasi.start",
|
||
regex : /`/,
|
||
push : [{
|
||
token : "constant.language.escape",
|
||
regex : escapedRe
|
||
}, {
|
||
token : "paren.quasi.start",
|
||
regex : /\${/,
|
||
push : "start"
|
||
}, {
|
||
token : "string.quasi.end",
|
||
regex : /`/,
|
||
next : "pop"
|
||
}, {
|
||
defaultToken: "string.quasi"
|
||
}]
|
||
});
|
||
|
||
if (!options || !options.noJSX)
|
||
JSX.call(this);
|
||
}
|
||
|
||
this.embedRules(DocCommentHighlightRules, "doc-",
|
||
[ DocCommentHighlightRules.getEndRule("no_regex") ]);
|
||
|
||
this.normalizeRules();
|
||
};
|
||
|
||
oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
|
||
|
||
function JSX() {
|
||
var tagRegex = identifierRe.replace("\\d", "\\d\\-");
|
||
var jsxTag = {
|
||
onMatch : function(val, state, stack) {
|
||
var offset = val.charAt(1) == "/" ? 2 : 1;
|
||
if (offset == 1) {
|
||
if (state != this.nextState)
|
||
stack.unshift(this.next, this.nextState, 0);
|
||
else
|
||
stack.unshift(this.next);
|
||
stack[2]++;
|
||
} else if (offset == 2) {
|
||
if (state == this.nextState) {
|
||
stack[1]--;
|
||
if (!stack[1] || stack[1] < 0) {
|
||
stack.shift();
|
||
stack.shift();
|
||
}
|
||
}
|
||
}
|
||
return [{
|
||
type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
|
||
value: val.slice(0, offset)
|
||
}, {
|
||
type: "meta.tag.tag-name.xml",
|
||
value: val.substr(offset)
|
||
}];
|
||
},
|
||
regex : "</?" + tagRegex + "",
|
||
next: "jsxAttributes",
|
||
nextState: "jsx"
|
||
};
|
||
this.$rules.start.unshift(jsxTag);
|
||
var jsxJsRule = {
|
||
regex: "{",
|
||
token: "paren.quasi.start",
|
||
push: "start"
|
||
};
|
||
this.$rules.jsx = [
|
||
jsxJsRule,
|
||
jsxTag,
|
||
{include : "reference"},
|
||
{defaultToken: "string"}
|
||
];
|
||
this.$rules.jsxAttributes = [{
|
||
token : "meta.tag.punctuation.tag-close.xml",
|
||
regex : "/?>",
|
||
onMatch : function(value, currentState, stack) {
|
||
if (currentState == stack[0])
|
||
stack.shift();
|
||
if (value.length == 2) {
|
||
if (stack[0] == this.nextState)
|
||
stack[1]--;
|
||
if (!stack[1] || stack[1] < 0) {
|
||
stack.splice(0, 2);
|
||
}
|
||
}
|
||
this.next = stack[0] || "start";
|
||
return [{type: this.token, value: value}];
|
||
},
|
||
nextState: "jsx"
|
||
},
|
||
jsxJsRule,
|
||
comments("jsxAttributes"),
|
||
{
|
||
token : "entity.other.attribute-name.xml",
|
||
regex : tagRegex
|
||
}, {
|
||
token : "keyword.operator.attribute-equals.xml",
|
||
regex : "="
|
||
}, {
|
||
token : "text.tag-whitespace.xml",
|
||
regex : "\\s+"
|
||
}, {
|
||
token : "string.attribute-value.xml",
|
||
regex : "'",
|
||
stateName : "jsx_attr_q",
|
||
push : [
|
||
{token : "string.attribute-value.xml", regex: "'", next: "pop"},
|
||
{include : "reference"},
|
||
{defaultToken : "string.attribute-value.xml"}
|
||
]
|
||
}, {
|
||
token : "string.attribute-value.xml",
|
||
regex : '"',
|
||
stateName : "jsx_attr_qq",
|
||
push : [
|
||
{token : "string.attribute-value.xml", regex: '"', next: "pop"},
|
||
{include : "reference"},
|
||
{defaultToken : "string.attribute-value.xml"}
|
||
]
|
||
},
|
||
jsxTag
|
||
];
|
||
this.$rules.reference = [{
|
||
token : "constant.language.escape.reference.xml",
|
||
regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
|
||
}];
|
||
}
|
||
|
||
function comments(next) {
|
||
return [
|
||
{
|
||
token : "comment", // multi line comment
|
||
regex : /\/\*/,
|
||
next: [
|
||
DocCommentHighlightRules.getTagRule(),
|
||
{token : "comment", regex : "\\*\\/", next : next || "pop"},
|
||
{defaultToken : "comment", caseInsensitive: true}
|
||
]
|
||
}, {
|
||
token : "comment",
|
||
regex : "\\/\\/",
|
||
next: [
|
||
DocCommentHighlightRules.getTagRule(),
|
||
{token : "comment", regex : "$|^", next : next || "pop"},
|
||
{defaultToken : "comment", caseInsensitive: true}
|
||
]
|
||
}
|
||
];
|
||
}
|
||
exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
|
||
});
|
||
|
||
ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Range = acequire("../range").Range;
|
||
|
||
var MatchingBraceOutdent = function() {};
|
||
|
||
(function() {
|
||
|
||
this.checkOutdent = function(line, input) {
|
||
if (! /^\s+$/.test(line))
|
||
return false;
|
||
|
||
return /^\s*\}/.test(input);
|
||
};
|
||
|
||
this.autoOutdent = function(doc, row) {
|
||
var line = doc.getLine(row);
|
||
var match = line.match(/^(\s*\})/);
|
||
|
||
if (!match) return 0;
|
||
|
||
var column = match[1].length;
|
||
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||
|
||
if (!openBracePos || openBracePos.row == row) return 0;
|
||
|
||
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||
doc.replace(new Range(row, 0, row, column-1), indent);
|
||
};
|
||
|
||
this.$getIndent = function(line) {
|
||
return line.match(/^\s*/)[0];
|
||
};
|
||
|
||
}).call(MatchingBraceOutdent.prototype);
|
||
|
||
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||
});
|
||
|
||
ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../../lib/oop");
|
||
var Behaviour = acequire("../behaviour").Behaviour;
|
||
var TokenIterator = acequire("../../token_iterator").TokenIterator;
|
||
var lang = acequire("../../lib/lang");
|
||
|
||
var SAFE_INSERT_IN_TOKENS =
|
||
["text", "paren.rparen", "punctuation.operator"];
|
||
var SAFE_INSERT_BEFORE_TOKENS =
|
||
["text", "paren.rparen", "punctuation.operator", "comment"];
|
||
|
||
var context;
|
||
var contextCache = {};
|
||
var initContext = function(editor) {
|
||
var id = -1;
|
||
if (editor.multiSelect) {
|
||
id = editor.selection.index;
|
||
if (contextCache.rangeCount != editor.multiSelect.rangeCount)
|
||
contextCache = {rangeCount: editor.multiSelect.rangeCount};
|
||
}
|
||
if (contextCache[id])
|
||
return context = contextCache[id];
|
||
context = contextCache[id] = {
|
||
autoInsertedBrackets: 0,
|
||
autoInsertedRow: -1,
|
||
autoInsertedLineEnd: "",
|
||
maybeInsertedBrackets: 0,
|
||
maybeInsertedRow: -1,
|
||
maybeInsertedLineStart: "",
|
||
maybeInsertedLineEnd: ""
|
||
};
|
||
};
|
||
|
||
var getWrapped = function(selection, selected, opening, closing) {
|
||
var rowDiff = selection.end.row - selection.start.row;
|
||
return {
|
||
text: opening + selected + closing,
|
||
selection: [
|
||
0,
|
||
selection.start.column + 1,
|
||
rowDiff,
|
||
selection.end.column + (rowDiff ? 0 : 1)
|
||
]
|
||
};
|
||
};
|
||
|
||
var CstyleBehaviour = function() {
|
||
this.add("braces", "insertion", function(state, action, editor, session, text) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
if (text == '{') {
|
||
initContext(editor);
|
||
var selection = editor.getSelectionRange();
|
||
var selected = session.doc.getTextRange(selection);
|
||
if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {
|
||
return getWrapped(selection, selected, '{', '}');
|
||
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||
if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {
|
||
CstyleBehaviour.recordAutoInsert(editor, session, "}");
|
||
return {
|
||
text: '{}',
|
||
selection: [1, 1]
|
||
};
|
||
} else {
|
||
CstyleBehaviour.recordMaybeInsert(editor, session, "{");
|
||
return {
|
||
text: '{',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
}
|
||
} else if (text == '}') {
|
||
initContext(editor);
|
||
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||
if (rightChar == '}') {
|
||
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
|
||
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||
CstyleBehaviour.popAutoInsertedClosing();
|
||
return {
|
||
text: '',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
}
|
||
} else if (text == "\n" || text == "\r\n") {
|
||
initContext(editor);
|
||
var closing = "";
|
||
if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {
|
||
closing = lang.stringRepeat("}", context.maybeInsertedBrackets);
|
||
CstyleBehaviour.clearMaybeInsertedClosing();
|
||
}
|
||
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||
if (rightChar === '}') {
|
||
var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');
|
||
if (!openBracePos)
|
||
return null;
|
||
var next_indent = this.$getIndent(session.getLine(openBracePos.row));
|
||
} else if (closing) {
|
||
var next_indent = this.$getIndent(line);
|
||
} else {
|
||
CstyleBehaviour.clearMaybeInsertedClosing();
|
||
return;
|
||
}
|
||
var indent = next_indent + session.getTabString();
|
||
|
||
return {
|
||
text: '\n' + indent + '\n' + next_indent + closing,
|
||
selection: [1, indent.length, 1, indent.length]
|
||
};
|
||
} else {
|
||
CstyleBehaviour.clearMaybeInsertedClosing();
|
||
}
|
||
});
|
||
|
||
this.add("braces", "deletion", function(state, action, editor, session, range) {
|
||
var selected = session.doc.getTextRange(range);
|
||
if (!range.isMultiLine() && selected == '{') {
|
||
initContext(editor);
|
||
var line = session.doc.getLine(range.start.row);
|
||
var rightChar = line.substring(range.end.column, range.end.column + 1);
|
||
if (rightChar == '}') {
|
||
range.end.column++;
|
||
return range;
|
||
} else {
|
||
context.maybeInsertedBrackets--;
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("parens", "insertion", function(state, action, editor, session, text) {
|
||
if (text == '(') {
|
||
initContext(editor);
|
||
var selection = editor.getSelectionRange();
|
||
var selected = session.doc.getTextRange(selection);
|
||
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||
return getWrapped(selection, selected, '(', ')');
|
||
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||
CstyleBehaviour.recordAutoInsert(editor, session, ")");
|
||
return {
|
||
text: '()',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
} else if (text == ')') {
|
||
initContext(editor);
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||
if (rightChar == ')') {
|
||
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
|
||
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||
CstyleBehaviour.popAutoInsertedClosing();
|
||
return {
|
||
text: '',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("parens", "deletion", function(state, action, editor, session, range) {
|
||
var selected = session.doc.getTextRange(range);
|
||
if (!range.isMultiLine() && selected == '(') {
|
||
initContext(editor);
|
||
var line = session.doc.getLine(range.start.row);
|
||
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||
if (rightChar == ')') {
|
||
range.end.column++;
|
||
return range;
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("brackets", "insertion", function(state, action, editor, session, text) {
|
||
if (text == '[') {
|
||
initContext(editor);
|
||
var selection = editor.getSelectionRange();
|
||
var selected = session.doc.getTextRange(selection);
|
||
if (selected !== "" && editor.getWrapBehavioursEnabled()) {
|
||
return getWrapped(selection, selected, '[', ']');
|
||
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
|
||
CstyleBehaviour.recordAutoInsert(editor, session, "]");
|
||
return {
|
||
text: '[]',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
} else if (text == ']') {
|
||
initContext(editor);
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||
if (rightChar == ']') {
|
||
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
|
||
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
|
||
CstyleBehaviour.popAutoInsertedClosing();
|
||
return {
|
||
text: '',
|
||
selection: [1, 1]
|
||
};
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("brackets", "deletion", function(state, action, editor, session, range) {
|
||
var selected = session.doc.getTextRange(range);
|
||
if (!range.isMultiLine() && selected == '[') {
|
||
initContext(editor);
|
||
var line = session.doc.getLine(range.start.row);
|
||
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||
if (rightChar == ']') {
|
||
range.end.column++;
|
||
return range;
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("string_dquotes", "insertion", function(state, action, editor, session, text) {
|
||
if (text == '"' || text == "'") {
|
||
initContext(editor);
|
||
var quote = text;
|
||
var selection = editor.getSelectionRange();
|
||
var selected = session.doc.getTextRange(selection);
|
||
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||
return getWrapped(selection, selected, quote, quote);
|
||
} else if (!selected) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
var leftChar = line.substring(cursor.column-1, cursor.column);
|
||
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||
|
||
var token = session.getTokenAt(cursor.row, cursor.column);
|
||
var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);
|
||
if (leftChar == "\\" && token && /escape/.test(token.type))
|
||
return null;
|
||
|
||
var stringBefore = token && /string|escape/.test(token.type);
|
||
var stringAfter = !rightToken || /string|escape/.test(rightToken.type);
|
||
|
||
var pair;
|
||
if (rightChar == quote) {
|
||
pair = stringBefore !== stringAfter;
|
||
} else {
|
||
if (stringBefore && !stringAfter)
|
||
return null; // wrap string with different quote
|
||
if (stringBefore && stringAfter)
|
||
return null; // do not pair quotes inside strings
|
||
var wordRe = session.$mode.tokenRe;
|
||
wordRe.lastIndex = 0;
|
||
var isWordBefore = wordRe.test(leftChar);
|
||
wordRe.lastIndex = 0;
|
||
var isWordAfter = wordRe.test(leftChar);
|
||
if (isWordBefore || isWordAfter)
|
||
return null; // before or after alphanumeric
|
||
if (rightChar && !/[\s;,.})\]\\]/.test(rightChar))
|
||
return null; // there is rightChar and it isn't closing
|
||
pair = true;
|
||
}
|
||
return {
|
||
text: pair ? quote + quote : "",
|
||
selection: [1,1]
|
||
};
|
||
}
|
||
}
|
||
});
|
||
|
||
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||
var selected = session.doc.getTextRange(range);
|
||
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||
initContext(editor);
|
||
var line = session.doc.getLine(range.start.row);
|
||
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||
if (rightChar == selected) {
|
||
range.end.column++;
|
||
return range;
|
||
}
|
||
}
|
||
});
|
||
|
||
};
|
||
|
||
|
||
CstyleBehaviour.isSaneInsertion = function(editor, session) {
|
||
var cursor = editor.getCursorPosition();
|
||
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {
|
||
var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);
|
||
if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))
|
||
return false;
|
||
}
|
||
iterator.stepForward();
|
||
return iterator.getCurrentTokenRow() !== cursor.row ||
|
||
this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);
|
||
};
|
||
|
||
CstyleBehaviour.$matchTokenType = function(token, types) {
|
||
return types.indexOf(token.type || token) > -1;
|
||
};
|
||
|
||
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))
|
||
context.autoInsertedBrackets = 0;
|
||
context.autoInsertedRow = cursor.row;
|
||
context.autoInsertedLineEnd = bracket + line.substr(cursor.column);
|
||
context.autoInsertedBrackets++;
|
||
};
|
||
|
||
CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = session.doc.getLine(cursor.row);
|
||
if (!this.isMaybeInsertedClosing(cursor, line))
|
||
context.maybeInsertedBrackets = 0;
|
||
context.maybeInsertedRow = cursor.row;
|
||
context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;
|
||
context.maybeInsertedLineEnd = line.substr(cursor.column);
|
||
context.maybeInsertedBrackets++;
|
||
};
|
||
|
||
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
|
||
return context.autoInsertedBrackets > 0 &&
|
||
cursor.row === context.autoInsertedRow &&
|
||
bracket === context.autoInsertedLineEnd[0] &&
|
||
line.substr(cursor.column) === context.autoInsertedLineEnd;
|
||
};
|
||
|
||
CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {
|
||
return context.maybeInsertedBrackets > 0 &&
|
||
cursor.row === context.maybeInsertedRow &&
|
||
line.substr(cursor.column) === context.maybeInsertedLineEnd &&
|
||
line.substr(0, cursor.column) == context.maybeInsertedLineStart;
|
||
};
|
||
|
||
CstyleBehaviour.popAutoInsertedClosing = function() {
|
||
context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);
|
||
context.autoInsertedBrackets--;
|
||
};
|
||
|
||
CstyleBehaviour.clearMaybeInsertedClosing = function() {
|
||
if (context) {
|
||
context.maybeInsertedBrackets = 0;
|
||
context.maybeInsertedRow = -1;
|
||
}
|
||
};
|
||
|
||
|
||
|
||
oop.inherits(CstyleBehaviour, Behaviour);
|
||
|
||
exports.CstyleBehaviour = CstyleBehaviour;
|
||
});
|
||
|
||
ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../../lib/oop");
|
||
var Range = acequire("../../range").Range;
|
||
var BaseFoldMode = acequire("./fold_mode").FoldMode;
|
||
|
||
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||
if (commentRegex) {
|
||
this.foldingStartMarker = new RegExp(
|
||
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||
);
|
||
this.foldingStopMarker = new RegExp(
|
||
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||
);
|
||
}
|
||
};
|
||
oop.inherits(FoldMode, BaseFoldMode);
|
||
|
||
(function() {
|
||
|
||
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||
this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/;
|
||
this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
|
||
this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
|
||
this._getFoldWidgetBase = this.getFoldWidget;
|
||
this.getFoldWidget = function(session, foldStyle, row) {
|
||
var line = session.getLine(row);
|
||
|
||
if (this.singleLineBlockCommentRe.test(line)) {
|
||
if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
|
||
return "";
|
||
}
|
||
|
||
var fw = this._getFoldWidgetBase(session, foldStyle, row);
|
||
|
||
if (!fw && this.startRegionRe.test(line))
|
||
return "start"; // lineCommentRegionStart
|
||
|
||
return fw;
|
||
};
|
||
|
||
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||
var line = session.getLine(row);
|
||
|
||
if (this.startRegionRe.test(line))
|
||
return this.getCommentRegionBlock(session, line, row);
|
||
|
||
var match = line.match(this.foldingStartMarker);
|
||
if (match) {
|
||
var i = match.index;
|
||
|
||
if (match[1])
|
||
return this.openingBracketBlock(session, match[1], row, i);
|
||
|
||
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||
|
||
if (range && !range.isMultiLine()) {
|
||
if (forceMultiline) {
|
||
range = this.getSectionRange(session, row);
|
||
} else if (foldStyle != "all")
|
||
range = null;
|
||
}
|
||
|
||
return range;
|
||
}
|
||
|
||
if (foldStyle === "markbegin")
|
||
return;
|
||
|
||
var match = line.match(this.foldingStopMarker);
|
||
if (match) {
|
||
var i = match.index + match[0].length;
|
||
|
||
if (match[1])
|
||
return this.closingBracketBlock(session, match[1], row, i);
|
||
|
||
return session.getCommentFoldRange(row, i, -1);
|
||
}
|
||
};
|
||
|
||
this.getSectionRange = function(session, row) {
|
||
var line = session.getLine(row);
|
||
var startIndent = line.search(/\S/);
|
||
var startRow = row;
|
||
var startColumn = line.length;
|
||
row = row + 1;
|
||
var endRow = row;
|
||
var maxRow = session.getLength();
|
||
while (++row < maxRow) {
|
||
line = session.getLine(row);
|
||
var indent = line.search(/\S/);
|
||
if (indent === -1)
|
||
continue;
|
||
if (startIndent > indent)
|
||
break;
|
||
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||
|
||
if (subRange) {
|
||
if (subRange.start.row <= startRow) {
|
||
break;
|
||
} else if (subRange.isMultiLine()) {
|
||
row = subRange.end.row;
|
||
} else if (startIndent == indent) {
|
||
break;
|
||
}
|
||
}
|
||
endRow = row;
|
||
}
|
||
|
||
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||
};
|
||
this.getCommentRegionBlock = function(session, line, row) {
|
||
var startColumn = line.search(/\s*$/);
|
||
var maxRow = session.getLength();
|
||
var startRow = row;
|
||
|
||
var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
|
||
var depth = 1;
|
||
while (++row < maxRow) {
|
||
line = session.getLine(row);
|
||
var m = re.exec(line);
|
||
if (!m) continue;
|
||
if (m[1]) depth--;
|
||
else depth++;
|
||
|
||
if (!depth) break;
|
||
}
|
||
|
||
var endRow = row;
|
||
if (endRow > startRow) {
|
||
return new Range(startRow, startColumn, endRow, line.length);
|
||
}
|
||
};
|
||
|
||
}).call(FoldMode.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var oop = acequire("../lib/oop");
|
||
var TextMode = acequire("./text").Mode;
|
||
var JavaScriptHighlightRules = acequire("./javascript_highlight_rules").JavaScriptHighlightRules;
|
||
var MatchingBraceOutdent = acequire("./matching_brace_outdent").MatchingBraceOutdent;
|
||
var Range = acequire("../range").Range;
|
||
var WorkerClient = acequire("../worker/worker_client").WorkerClient;
|
||
var CstyleBehaviour = acequire("./behaviour/cstyle").CstyleBehaviour;
|
||
var CStyleFoldMode = acequire("./folding/cstyle").FoldMode;
|
||
|
||
var Mode = function() {
|
||
this.HighlightRules = JavaScriptHighlightRules;
|
||
|
||
this.$outdent = new MatchingBraceOutdent();
|
||
this.$behaviour = new CstyleBehaviour();
|
||
this.foldingRules = new CStyleFoldMode();
|
||
};
|
||
oop.inherits(Mode, TextMode);
|
||
|
||
(function() {
|
||
|
||
this.lineCommentStart = "//";
|
||
this.blockComment = {start: "/*", end: "*/"};
|
||
|
||
this.getNextLineIndent = function(state, line, tab) {
|
||
var indent = this.$getIndent(line);
|
||
|
||
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||
var tokens = tokenizedLine.tokens;
|
||
var endState = tokenizedLine.state;
|
||
|
||
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||
return indent;
|
||
}
|
||
|
||
if (state == "start" || state == "no_regex") {
|
||
var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);
|
||
if (match) {
|
||
indent += tab;
|
||
}
|
||
} else if (state == "doc-start") {
|
||
if (endState == "start" || endState == "no_regex") {
|
||
return "";
|
||
}
|
||
var match = line.match(/^\s*(\/?)\*/);
|
||
if (match) {
|
||
if (match[1]) {
|
||
indent += " ";
|
||
}
|
||
indent += "* ";
|
||
}
|
||
}
|
||
|
||
return indent;
|
||
};
|
||
|
||
this.checkOutdent = function(state, line, input) {
|
||
return this.$outdent.checkOutdent(line, input);
|
||
};
|
||
|
||
this.autoOutdent = function(state, doc, row) {
|
||
this.$outdent.autoOutdent(doc, row);
|
||
};
|
||
|
||
this.createWorker = function(session) {
|
||
var worker = new WorkerClient(["ace"], __webpack_require__(16), "JavaScriptWorker");
|
||
worker.attachToDocument(session.getDocument());
|
||
|
||
worker.on("annotate", function(results) {
|
||
session.setAnnotations(results.data);
|
||
});
|
||
|
||
worker.on("terminate", function() {
|
||
session.clearAnnotations();
|
||
});
|
||
|
||
return worker;
|
||
};
|
||
|
||
this.$id = "ace/mode/javascript";
|
||
}).call(Mode.prototype);
|
||
|
||
exports.Mode = Mode;
|
||
});
|
||
|
||
|
||
/***/ },
|
||
/* 16 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports.id = 'ace/mode/javascript_worker';
|
||
module.exports.src = "\"no use strict\";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail=\"\";testPath;){var alias=paths[testPath];if(\"string\"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\/*$/,\"/\")+(tail||alias.main||alias.name);if(alias===!1)return\"\";var i=testPath.lastIndexOf(\"/\");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:\"log\",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:\"error\",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf(\"!\")){var chunks=moduleName.split(\"!\");return window.normalizeModule(parentId,chunks[0])+\"!\"+window.normalizeModule(parentId,chunks[1])}if(\".\"==moduleName.charAt(0)){var base=parentId.split(\"/\").slice(0,-1).join(\"/\");for(moduleName=(base?base+\"/\":\"\")+moduleName;-1!==moduleName.indexOf(\".\")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\.\\//,\"\").replace(/\\/\\.\\//,\"/\").replace(/[^\\/]+\\/\\.\\.\\//,\"\")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error(\"worker.js acequire() accepts only (parentId, id) as arguments\");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log(\"unable to load \"+id);var path=resolveModuleId(id,window.acequire.tlns);return\".js\"!=path.slice(-3)&&(path+=\".js\"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,\"string\"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),\"function\"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=[\"require\",\"exports\",\"module\"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case\"require\":return req;case\"exports\":return module.exports;case\"module\":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire(\"ace/lib/event_emitter\").EventEmitter,oop=window.acequire(\"ace/lib/oop\"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:\"call\",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:\"event\",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error(\"Unknown command:\"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire(\"ace/lib/es5-shim\"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"],function(acequire,exports){\"use strict\";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define(\"ace/range\",[\"require\",\"exports\",\"module\"],function(acequire,exports){\"use strict\";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return\"Range: [\"+this.start.row+\"/\"+this.start.column+\"] -> [\"+this.end.row+\"/\"+this.end.column+\"]\"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){\"object\"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){\"object\"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"],function(acequire,exports){\"use strict\";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||\"\";switch(delta.action){case\"insert\":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case\"remove\":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"],function(acequire,exports){\"use strict\";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){\"object\"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?\"unshift\":\"push\"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"],function(acequire,exports){\"use strict\";var oop=acequire(\"./lib/oop\"),EventEmitter=acequire(\"./lib/event_emitter\").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.column<point2.column;return point1.row<point2.row||point1.row==point2.row&&bColIsAfter}function $getTransformedPoint(delta,point,moveIfEqual){var deltaIsInsert=\"insert\"==delta.action,deltaRowShift=(deltaIsInsert?1:-1)*(delta.end.row-delta.start.row),deltaColShift=(deltaIsInsert?1:-1)*(delta.end.column-delta.start.column),deltaStart=delta.start,deltaEnd=deltaIsInsert?deltaStart:delta.end;return $pointsInOrder(point,deltaStart,moveIfEqual)?{row:point.row,column:point.column}:$pointsInOrder(deltaEnd,point,!moveIfEqual)?{row:point.row+deltaRowShift,column:point.column+(point.row==deltaEnd.row?deltaColShift:0)}:{row:deltaStart.row,column:deltaStart.column}}oop.implement(this,EventEmitter),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.$insertRight=!1,this.onChange=function(delta){if(!(delta.start.row==delta.end.row&&delta.start.row!=this.row||delta.start.row>this.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal(\"change\",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener(\"change\",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on(\"change\",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"],function(acequire,exports){\"use strict\";var oop=acequire(\"./lib/oop\"),applyDelta=acequire(\"./apply_delta\").applyDelta,EventEmitter=acequire(\"./lib/event_emitter\").EventEmitter,Range=acequire(\"./range\").Range,Anchor=acequire(\"./anchor\").Anchor,Document=function(textOrLines){this.$lines=[\"\"],0===textOrLines.length?this.$lines=[\"\"]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0===\"aaa\".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,\"\\n\").split(\"\\n\")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:\"\\n\",this._signal(\"changeNewLineMode\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\"windows\":return\"\\r\\n\";case\"unix\":return\"\\n\";default:return this.$autoNewLine||\"\\n\"}},this.$autoNewLine=\"\",this.$newLineMode=\"auto\",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal(\"changeNewLineMode\"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return\"\\r\\n\"==text||\"\\r\"==text||\"\\n\"==text},this.getLine=function(row){return this.$lines[row]||\"\"},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||\"\").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\"),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\"),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\"),this.insertMergedLines(position,[\"\",\"\"])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:\"insert\",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([\"\"]),column=0):(lines=[\"\"].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:\"insert\",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:\"remove\",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:\"remove\",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:\"remove\",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:\"remove\",lines:[\"\",\"\"]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert=\"insert\"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal(\"change\",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(\"\"),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:\"insert\"==delta.action?\"remove\":\"insert\",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"],function(acequire,exports){\"use strict\";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split(\"\").reverse().join(\"\")},exports.stringRepeat=function(string,count){for(var result=\"\";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,\"\")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,\"\")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&\"object\"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if(\"object\"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}var cons=obj.constructor;if(cons===RegExp)return obj;copy=cons();for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,\"\\\\$1\")},exports.escapeHTML=function(str){return str.replace(/&/g,\"&\").replace(/\"/g,\""\").replace(/'/g,\"'\").replace(/</g,\"<\")},exports.getMatchOffsets=function(string,regExp){var matches=[];return string.replace(regExp,function(str){matches.push({offset:arguments[arguments.length-2],length:str.length})}),matches},exports.deferredCall=function(fcn){var timer=null,callback=function(){timer=null,fcn()},deferred=function(timeout){return deferred.cancel(),timer=setTimeout(callback,timeout||0),deferred};return deferred.schedule=deferred,deferred.call=function(){return this.cancel(),fcn(),deferred},deferred.cancel=function(){return clearTimeout(timer),timer=null,deferred},deferred.isPending=function(){return timer},deferred},exports.delayedCall=function(fcn,defaultTimeout){var timer=null,callback=function(){timer=null,fcn()},_self=function(timeout){null==timer&&(timer=setTimeout(callback,timeout||defaultTimeout))};return _self.delay=function(timeout){timer&&clearTimeout(timer),timer=setTimeout(callback,timeout||defaultTimeout)},_self.schedule=_self,_self.call=function(){this.cancel(),fcn()},_self.cancel=function(){timer&&clearTimeout(timer),timer=null},_self.isPending=function(){return timer},_self}}),ace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/document\",\"ace/lib/lang\"],function(acequire,exports){\"use strict\";acequire(\"../range\").Range;var Document=acequire(\"../document\").Document,lang=acequire(\"../lib/lang\"),Mirror=exports.Mirror=function(sender){this.sender=sender;var doc=this.doc=new Document(\"\"),deferredUpdate=this.deferredUpdate=lang.delayedCall(this.onUpdate.bind(this)),_self=this;sender.on(\"change\",function(e){var data=e.data;if(data[0].start)doc.applyDeltas(data);else for(var i=0;data.length>i;i+=2){if(Array.isArray(data[i+1]))var d={action:\"insert\",start:data[i],lines:data[i+1]};else var d={action:\"remove\",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define(\"ace/mode/javascript/jshint\",[\"require\",\"exports\",\"module\"],function(acequire,exports,module){module.exports=function outer(modules,cache,entry){function newRequire(name,jumped){if(!cache[name]){if(!modules[name]){var currentRequire=\"function\"==typeof acequire&&acequire;if(!jumped&¤tRequire)return currentRequire(name,!0);if(previousRequire)return previousRequire(name,!0);var err=Error(\"Cannot find module '\"+name+\"'\");throw err.code=\"MODULE_NOT_FOUND\",err}var m=cache[name]={exports:{}};modules[name][0].call(m.exports,function(x){var id=modules[name][1][x];return newRequire(id?id:x)},m,m.exports,outer,modules,cache,entry)}return cache[name].exports}for(var previousRequire=\"function\"==typeof acequire&&acequire,i=0;entry.length>i;i++)newRequire(entry[i]);return newRequire(entry[0])}({\"/node_modules/browserify/node_modules/events/events.js\":[function(_dereq_,module){function EventEmitter(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function isFunction(arg){return\"function\"==typeof arg}function isNumber(arg){return\"number\"==typeof arg}function isObject(arg){return\"object\"==typeof arg&&null!==arg}function isUndefined(arg){return void 0===arg}module.exports=EventEmitter,EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||0>n||isNaN(n))throw TypeError(\"n must be a positive number\");return this._maxListeners=n,this},EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(this._events||(this._events={}),\"error\"===type&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(er=arguments[1],er instanceof Error)throw er;throw TypeError('Uncaught, unspecified \"error\" event.')}if(handler=this._events[type],isUndefined(handler))return!1;if(isFunction(handler))switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];handler.apply(this,args)}else if(isObject(handler)){for(len=arguments.length,args=Array(len-1),i=1;len>i;i++)args[i-1]=arguments[i];for(listeners=handler.slice(),len=listeners.length,i=0;len>i;i++)listeners[i].apply(this,args)}return!0},EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",type,isFunction(listener.listener)?listener.listener:listener),this._events[type]?isObject(this._events[type])?this._events[type].push(listener):this._events[type]=[this._events[type],listener]:this._events[type]=listener,isObject(this._events[type])&&!this._events[type].warned){var m;m=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,m&&m>0&&this._events[type].length>m&&(this._events[type].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[type].length),\"function\"==typeof console.trace&&console.trace())}return this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(type,listener){function g(){this.removeListener(type,g),fired||(fired=!0,listener.apply(this,arguments))}if(!isFunction(listener))throw TypeError(\"listener must be a function\");var fired=!1;return g.listener=listener,this.on(type,g),this},EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[type])return this;if(list=this._events[type],length=list.length,position=-1,list===listener||isFunction(list.listener)&&list.listener===listener)delete this._events[type],this._events.removeListener&&this.emit(\"removeListener\",type,listener);else if(isObject(list)){for(i=length;i-->0;)if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}if(0>position)return this;1===list.length?(list.length=0,delete this._events[type]):list.splice(position,1),this._events.removeListener&&this.emit(\"removeListener\",type,listener)}return this},EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[type]&&delete this._events[type],this;if(0===arguments.length){for(key in this._events)\"removeListener\"!==key&&this.removeAllListeners(key);return this.removeAllListeners(\"removeListener\"),this._events={},this\n}if(listeners=this._events[type],isFunction(listeners))this.removeListener(type,listeners);else for(;listeners.length;)this.removeListener(type,listeners[listeners.length-1]);return delete this._events[type],this},EventEmitter.prototype.listeners=function(type){var ret;return ret=this._events&&this._events[type]?isFunction(this._events[type])?[this._events[type]]:this._events[type].slice():[]},EventEmitter.listenerCount=function(emitter,type){var ret;return ret=emitter._events&&emitter._events[type]?isFunction(emitter._events[type])?1:emitter._events[type].length:0}},{}],\"/node_modules/jshint/data/ascii-identifier-data.js\":[function(_dereq_,module){for(var identifierStartTable=[],i=0;128>i;i++)identifierStartTable[i]=36===i||i>=65&&90>=i||95===i||i>=97&&122>=i;for(var identifierPartTable=[],i=0;128>i;i++)identifierPartTable[i]=identifierStartTable[i]||i>=48&&57>=i;module.exports={asciiIdentifierStartTable:identifierStartTable,asciiIdentifierPartTable:identifierPartTable}},{}],\"/node_modules/jshint/lodash.js\":[function(_dereq_,module,exports){(function(global){(function(){function baseFindIndex(array,predicate,fromRight){for(var length=array.length,index=fromRight?length:-1;fromRight?index--:length>++index;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){if(value!==value)return indexOfNaN(array,fromIndex);for(var index=fromIndex-1,length=array.length;length>++index;)if(array[index]===value)return index;return-1}function baseIsFunction(value){return\"function\"==typeof value||!1}function baseToString(value){return\"string\"==typeof value?value:null==value?\"\":value+\"\"}function indexOfNaN(array,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?0:-1);fromRight?index--:length>++index;){var other=array[index];if(other!==other)return index}return-1}function isObjectLike(value){return!!value&&\"object\"==typeof value}function lodash(){}function arrayCopy(source,array){var index=-1,length=source.length;for(array||(array=Array(length));length>++index;)array[index]=source[index];return array}function arrayEach(array,iteratee){for(var index=-1,length=array.length;length>++index&&iteratee(array[index],index,array)!==!1;);return array}function arrayFilter(array,predicate){for(var index=-1,length=array.length,resIndex=-1,result=[];length>++index;){var value=array[index];predicate(value,index,array)&&(result[++resIndex]=value)}return result}function arrayMap(array,iteratee){for(var index=-1,length=array.length,result=Array(length);length>++index;)result[index]=iteratee(array[index],index,array);return result}function arrayMax(array){for(var index=-1,length=array.length,result=NEGATIVE_INFINITY;length>++index;){var value=array[index];value>result&&(result=value)}return result}function arraySome(array,predicate){for(var index=-1,length=array.length;length>++index;)if(predicate(array[index],index,array))return!0;return!1}function assignWith(object,source,customizer){var props=keys(source);push.apply(props,getSymbols(source));for(var index=-1,length=props.length;length>++index;){var key=props[index],value=object[key],result=customizer(value,source[key],key,object,source);(result===result?result===value:value!==value)&&(value!==undefined||key in object)||(object[key]=result)}return object}function baseCopy(source,props,object){object||(object={});for(var index=-1,length=props.length;length>++index;){var key=props[index];object[key]=source[key]}return object}function baseCallback(func,thisArg,argCount){var type=typeof func;return\"function\"==type?thisArg===undefined?func:bindCallback(func,thisArg,argCount):null==func?identity:\"object\"==type?baseMatches(func):thisArg===undefined?property(func):baseMatchesProperty(func,thisArg)}function baseClone(value,isDeep,customizer,key,object,stackA,stackB){var result;if(customizer&&(result=object?customizer(value,key,object):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=initCloneArray(value),!isDeep)return arrayCopy(value,result)}else{var tag=objToString.call(value),isFunc=tag==funcTag;if(tag!=objectTag&&tag!=argsTag&&(!isFunc||object))return cloneableTags[tag]?initCloneByTag(value,tag,isDeep):object?value:{};if(result=initCloneObject(isFunc?{}:value),!isDeep)return baseAssign(result,value)}stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==value)return stackB[length];return stackA.push(value),stackB.push(result),(isArr?arrayEach:baseForOwn)(value,function(subValue,key){result[key]=baseClone(subValue,isDeep,customizer,key,value,stackA,stackB)}),result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseForIn(object,iteratee){return baseFor(object,iteratee,keysIn)}function baseForOwn(object,iteratee){return baseFor(object,iteratee,keys)}function baseGet(object,path,pathKey){if(null!=object){pathKey!==undefined&&pathKey in toObject(object)&&(path=[pathKey]);for(var index=-1,length=path.length;null!=object&&length>++index;)var result=object=object[path[index]];return result}}function baseIsEqual(value,other,customizer,isLoose,stackA,stackB){if(value===other)return 0!==value||1/value==1/other;var valType=typeof value,othType=typeof other;return\"function\"!=valType&&\"object\"!=valType&&\"function\"!=othType&&\"object\"!=othType||null==value||null==other?value!==value&&other!==other:baseIsEqualDeep(value,other,baseIsEqual,customizer,isLoose,stackA,stackB)}function baseIsEqualDeep(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=arrayTag,othTag=arrayTag;objIsArr||(objTag=objToString.call(object),objTag==argsTag?objTag=objectTag:objTag!=objectTag&&(objIsArr=isTypedArray(object))),othIsArr||(othTag=objToString.call(other),othTag==argsTag?othTag=objectTag:othTag!=objectTag&&(othIsArr=isTypedArray(other)));var objIsObj=objTag==objectTag,othIsObj=othTag==objectTag,isSameTag=objTag==othTag;if(isSameTag&&!objIsArr&&!objIsObj)return equalByTag(object,other,objTag);if(!isLoose){var valWrapped=objIsObj&&hasOwnProperty.call(object,\"__wrapped__\"),othWrapped=othIsObj&&hasOwnProperty.call(other,\"__wrapped__\");if(valWrapped||othWrapped)return equalFunc(valWrapped?object.value():object,othWrapped?other.value():other,customizer,isLoose,stackA,stackB)}if(!isSameTag)return!1;stackA||(stackA=[]),stackB||(stackB=[]);for(var length=stackA.length;length--;)if(stackA[length]==object)return stackB[length]==other;stackA.push(object),stackB.push(other);var result=(objIsArr?equalArrays:equalObjects)(object,other,equalFunc,customizer,isLoose,stackA,stackB);return stackA.pop(),stackB.pop(),result}function baseIsMatch(object,props,values,strictCompareFlags,customizer){for(var index=-1,length=props.length,noCustomizer=!customizer;length>++index;)if(noCustomizer&&strictCompareFlags[index]?values[index]!==object[props[index]]:!(props[index]in object))return!1;for(index=-1;length>++index;){var key=props[index],objValue=object[key],srcValue=values[index];if(noCustomizer&&strictCompareFlags[index])var result=objValue!==undefined||key in object;else result=customizer?customizer(objValue,srcValue,key):undefined,result===undefined&&(result=baseIsEqual(srcValue,objValue,customizer,!0));if(!result)return!1}return!0}function baseMatches(source){var props=keys(source),length=props.length;if(!length)return constant(!0);if(1==length){var key=props[0],value=source[key];if(isStrictComparable(value))return function(object){return null==object?!1:object[key]===value&&(value!==undefined||key in toObject(object))}}for(var values=Array(length),strictCompareFlags=Array(length);length--;)value=source[props[length]],values[length]=value,strictCompareFlags[length]=isStrictComparable(value);return function(object){return null!=object&&baseIsMatch(toObject(object),props,values,strictCompareFlags)}}function baseMatchesProperty(path,value){var isArr=isArray(path),isCommon=isKey(path)&&isStrictComparable(value),pathKey=path+\"\";return path=toPath(path),function(object){if(null==object)return!1;var key=pathKey;if(object=toObject(object),!(!isArr&&isCommon||key in object)){if(object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),null==object)return!1;key=last(path),object=toObject(object)}return object[key]===value?value!==undefined||key in object:baseIsEqual(value,object[key],null,!0)}}function baseMerge(object,source,customizer,stackA,stackB){if(!isObject(object))return object;var isSrcArr=isLength(source.length)&&(isArray(source)||isTypedArray(source));if(!isSrcArr){var props=keys(source);push.apply(props,getSymbols(source))}return arrayEach(props||source,function(srcValue,key){if(props&&(key=srcValue,srcValue=source[key]),isObjectLike(srcValue))stackA||(stackA=[]),stackB||(stackB=[]),baseMergeDeep(object,source,key,baseMerge,customizer,stackA,stackB);else{var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue),!isSrcArr&&result===undefined||!isCommon&&(result===result?result===value:value!==value)||(object[key]=result)}}),object}function baseMergeDeep(object,source,key,mergeFunc,customizer,stackA,stackB){for(var length=stackA.length,srcValue=source[key];length--;)if(stackA[length]==srcValue)return object[key]=stackB[length],undefined;var value=object[key],result=customizer?customizer(value,srcValue,key,object,source):undefined,isCommon=result===undefined;isCommon&&(result=srcValue,isLength(srcValue.length)&&(isArray(srcValue)||isTypedArray(srcValue))?result=isArray(value)?value:getLength(value)?arrayCopy(value):[]:isPlainObject(srcValue)||isArguments(srcValue)?result=isArguments(value)?toPlainObject(value):isPlainObject(value)?value:{}:isCommon=!1),stackA.push(srcValue),stackB.push(result),isCommon?object[key]=mergeFunc(result,srcValue,customizer,stackA,stackB):(result===result?result!==value:value===value)&&(object[key]=result)}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyDeep(path){var pathKey=path+\"\";return path=toPath(path),function(object){return baseGet(object,path,pathKey)}}function baseSlice(array,start,end){var index=-1,length=array.length;start=null==start?0:+start||0,0>start&&(start=-start>length?0:length+start),end=end===undefined||end>length?length:+end||0,0>end&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);length>++index;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return result=predicate(value,index,collection),!result}),!!result}function baseValues(object,props){for(var index=-1,length=props.length,result=Array(length);length>++index;)result[index]=object[props[index]];return result}function binaryIndex(array,value,retHighest){var low=0,high=array?array.length:low;if(\"number\"==typeof value&&value===value&&HALF_MAX_ARRAY_LENGTH>=high){for(;high>low;){var mid=low+high>>>1,computed=array[mid];(retHighest?value>=computed:value>computed)?low=mid+1:high=mid}return high}return binaryIndexBy(array,value,identity,retHighest)}function binaryIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=array?array.length:0,valIsNaN=value!==value,valIsUndef=value===undefined;high>low;){var mid=floor((low+high)/2),computed=iteratee(array[mid]),isReflexive=computed===computed;if(valIsNaN)var setLow=isReflexive||retHighest;else setLow=valIsUndef?isReflexive&&(retHighest||computed!==undefined):retHighest?value>=computed:value>computed;setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function bindCallback(func,thisArg,argCount){if(\"function\"!=typeof func)return identity;if(thisArg===undefined)return func;switch(argCount){case 1:return function(value){return func.call(thisArg,value)};case 3:return function(value,index,collection){return func.call(thisArg,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(thisArg,accumulator,value,index,collection)};case 5:return function(value,other,key,object,source){return func.call(thisArg,value,other,key,object,source)}}return function(){return func.apply(thisArg,arguments)}}function bufferClone(buffer){return bufferSlice.call(buffer,0)}function createAssigner(assigner){return restParam(function(object,sources){var index=-1,length=null==object?0:sources.length,customizer=length>2&&sources[length-2],guard=length>2&&sources[2],thisArg=length>1&&sources[length-1];for(\"function\"==typeof customizer?(customizer=bindCallback(customizer,thisArg,5),length-=2):(customizer=\"function\"==typeof thisArg?thisArg:null,length-=customizer?1:0),guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=3>length?null:customizer,length=1);length>++index;){var source=sources[index];source&&assigner(object,source,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){var length=collection?getLength(collection):0;if(!isLength(length))return eachFunc(collection,iteratee);for(var index=fromRight?length:-1,iterable=toObject(collection);(fromRight?index--:length>++index)&&iteratee(iterable[index],index,iterable)!==!1;);return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var iterable=toObject(object),props=keysFunc(object),length=props.length,index=fromRight?length:-1;fromRight?index--:length>++index;){var key=props[index];if(iteratee(iterable[key],key,iterable)===!1)break}return object}}function createFindIndex(fromRight){return function(array,predicate,thisArg){return array&&array.length?(predicate=getCallback(predicate,thisArg,3),baseFindIndex(array,predicate,fromRight)):-1}}function createForEach(arrayFunc,eachFunc){return function(collection,iteratee,thisArg){return\"function\"==typeof iteratee&&thisArg===undefined&&isArray(collection)?arrayFunc(collection,iteratee):eachFunc(collection,bindCallback(iteratee,thisArg,3))}}function equalArrays(array,other,equalFunc,customizer,isLoose,stackA,stackB){var index=-1,arrLength=array.length,othLength=other.length,result=!0;if(arrLength!=othLength&&!(isLoose&&othLength>arrLength))return!1;for(;result&&arrLength>++index;){var arrValue=array[index],othValue=other[index];if(result=undefined,customizer&&(result=isLoose?customizer(othValue,arrValue,index):customizer(arrValue,othValue,index)),result===undefined)if(isLoose)for(var othIndex=othLength;othIndex--&&(othValue=other[othIndex],!(result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB))););else result=arrValue&&arrValue===othValue||equalFunc(arrValue,othValue,customizer,isLoose,stackA,stackB)}return!!result}function equalByTag(object,other,tag){switch(tag){case boolTag:case dateTag:return+object==+other;case errorTag:return object.name==other.name&&object.message==other.message;case numberTag:return object!=+object?other!=+other:0==object?1/object==1/other:object==+other;case regexpTag:case stringTag:return object==other+\"\"}return!1}function equalObjects(object,other,equalFunc,customizer,isLoose,stackA,stackB){var objProps=keys(object),objLength=objProps.length,othProps=keys(other),othLength=othProps.length;if(objLength!=othLength&&!isLoose)return!1;for(var skipCtor=isLoose,index=-1;objLength>++index;){var key=objProps[index],result=isLoose?key in other:hasOwnProperty.call(other,key);if(result){var objValue=object[key],othValue=other[key];result=undefined,customizer&&(result=isLoose?customizer(othValue,objValue,key):customizer(objValue,othValue,key)),result===undefined&&(result=objValue&&objValue===othValue||equalFunc(objValue,othValue,customizer,isLoose,stackA,stackB))}if(!result)return!1;skipCtor||(skipCtor=\"constructor\"==key)}if(!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;if(objCtor!=othCtor&&\"constructor\"in object&&\"constructor\"in other&&!(\"function\"==typeof objCtor&&objCtor instanceof objCtor&&\"function\"==typeof othCtor&&othCtor instanceof othCtor))return!1}return!0}function getCallback(func,thisArg,argCount){var result=lodash.callback||callback;return result=result===callback?baseCallback:result,argCount?result(func,thisArg,argCount):result}function getIndexOf(collection,target,fromIndex){var result=lodash.indexOf||indexOf;return result=result===indexOf?baseIndexOf:result,collection?result(collection,target,fromIndex):result}function initCloneArray(array){var length=array.length,result=new array.constructor(length);return length&&\"string\"==typeof array[0]&&hasOwnProperty.call(array,\"index\")&&(result.index=array.index,result.input=array.input),result}function initCloneObject(object){var Ctor=object.constructor;return\"function\"==typeof Ctor&&Ctor instanceof Ctor||(Ctor=Object),new Ctor}function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return bufferClone(object);case boolTag:case dateTag:return new Ctor(+object);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:var buffer=object.buffer;return new Ctor(isDeep?bufferClone(buffer):buffer,object.byteOffset,object.length);case numberTag:case stringTag:return new Ctor(object);case regexpTag:var result=new Ctor(object.source,reFlags.exec(object));result.lastIndex=object.lastIndex}return result}function isIndex(value,length){return value=+value,length=null==length?MAX_SAFE_INTEGER:length,value>-1&&0==value%1&&length>value}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;if(\"number\"==type)var length=getLength(object),prereq=isLength(length)&&isIndex(index,length);else prereq=\"string\"==type&&index in object;if(prereq){var other=object[index];return value===value?value===other:other!==other}return!1}function isKey(value,object){var type=typeof value;if(\"string\"==type&&reIsPlainProp.test(value)||\"number\"==type)return!0;if(isArray(value))return!1;var result=!reIsDeepProp.test(value);return result||null!=object&&value in toObject(object)}function isLength(value){return\"number\"==typeof value&&value>-1&&0==value%1&&MAX_SAFE_INTEGER>=value}function isStrictComparable(value){return value===value&&(0===value?1/value>0:!isObject(value))}function shimIsPlainObject(value){var Ctor;if(lodash.support,!isObjectLike(value)||objToString.call(value)!=objectTag||!hasOwnProperty.call(value,\"constructor\")&&(Ctor=value.constructor,\"function\"==typeof Ctor&&!(Ctor instanceof Ctor)))return!1;var result;return baseForIn(value,function(subValue,key){result=key}),result===undefined||hasOwnProperty.call(value,result)}function shimKeys(object){for(var props=keysIn(object),propsLength=props.length,length=propsLength&&object.length,support=lodash.support,allowIndexes=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object)),index=-1,result=[];propsLength>++index;){var key=props[index];(allowIndexes&&isIndex(key,length)||hasOwnProperty.call(object,key))&&result.push(key)}return result}function toObject(value){return isObject(value)?value:Object(value)}function toPath(value){if(isArray(value))return value;var result=[];return baseToString(value).replace(rePropName,function(match,number,quote,string){result.push(quote?string.replace(reEscapeChar,\"$1\"):number||match)}),result}function indexOf(array,value,fromIndex){var length=array?array.length:0;if(!length)return-1;if(\"number\"==typeof fromIndex)fromIndex=0>fromIndex?nativeMax(length+fromIndex,0):fromIndex;else if(fromIndex){var index=binaryIndex(array,value),other=array[index];return(value===value?value===other:other!==other)?index:-1}return baseIndexOf(array,value,fromIndex||0)}function last(array){var length=array?array.length:0;return length?array[length-1]:undefined}function slice(array,start,end){var length=array?array.length:0;return length?(end&&\"number\"!=typeof end&&isIterateeCall(array,start,end)&&(start=0,end=length),baseSlice(array,start,end)):[]}function unzip(array){for(var index=-1,length=(array&&array.length&&arrayMax(arrayMap(array,getLength)))>>>0,result=Array(length);length>++index;)result[index]=arrayMap(array,baseProperty(index));return result}function includes(collection,target,fromIndex,guard){var length=collection?getLength(collection):0;return isLength(length)||(collection=values(collection),length=collection.length),length?(fromIndex=\"number\"!=typeof fromIndex||guard&&isIterateeCall(target,fromIndex,guard)?0:0>fromIndex?nativeMax(length+fromIndex,0):fromIndex||0,\"string\"==typeof collection||!isArray(collection)&&isString(collection)?length>fromIndex&&collection.indexOf(target,fromIndex)>-1:getIndexOf(collection,target,fromIndex)>-1):!1}function reject(collection,predicate,thisArg){var func=isArray(collection)?arrayFilter:baseFilter;return predicate=getCallback(predicate,thisArg,3),func(collection,function(value,index,collection){return!predicate(value,index,collection)})}function some(collection,predicate,thisArg){var func=isArray(collection)?arraySome:baseSome;return thisArg&&isIterateeCall(collection,predicate,thisArg)&&(predicate=null),(\"function\"!=typeof predicate||thisArg!==undefined)&&(predicate=getCallback(predicate,thisArg,3)),func(collection,predicate)}function restParam(func,start){if(\"function\"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=nativeMax(start===undefined?func.length-1:+start||0,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),rest=Array(length);length>++index;)rest[index]=args[start+index];switch(start){case 0:return func.call(this,rest);case 1:return func.call(this,args[0],rest);case 2:return func.call(this,args[0],args[1],rest)}var otherArgs=Array(start+1);for(index=-1;start>++index;)otherArgs[index]=args[index];return otherArgs[start]=rest,func.apply(this,otherArgs)}}function clone(value,isDeep,customizer,thisArg){return isDeep&&\"boolean\"!=typeof isDeep&&isIterateeCall(value,isDeep,customizer)?isDeep=!1:\"function\"==typeof isDeep&&(thisArg=customizer,customizer=isDeep,isDeep=!1),customizer=\"function\"==typeof customizer&&bindCallback(customizer,thisArg,1),baseClone(value,isDeep,customizer)}function isArguments(value){var length=isObjectLike(value)?value.length:undefined;return isLength(length)&&objToString.call(value)==argsTag}function isEmpty(value){if(null==value)return!0;var length=getLength(value);return isLength(length)&&(isArray(value)||isString(value)||isArguments(value)||isObjectLike(value)&&isFunction(value.splice))?!length:!keys(value).length}function isObject(value){var type=typeof value;return\"function\"==type||!!value&&\"object\"==type}function isNative(value){return null==value?!1:objToString.call(value)==funcTag?reIsNative.test(fnToString.call(value)):isObjectLike(value)&&reIsHostCtor.test(value)}function isNumber(value){return\"number\"==typeof value||isObjectLike(value)&&objToString.call(value)==numberTag}function isString(value){return\"string\"==typeof value||isObjectLike(value)&&objToString.call(value)==stringTag}function isTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[objToString.call(value)]}function toPlainObject(value){return baseCopy(value,keysIn(value))}function has(object,path){if(null==object)return!1;var result=hasOwnProperty.call(object,path);return result||isKey(path)||(path=toPath(path),object=1==path.length?object:baseGet(object,baseSlice(path,0,-1)),path=last(path),result=null!=object&&hasOwnProperty.call(object,path)),result}function keysIn(object){if(null==object)return[];isObject(object)||(object=Object(object));var length=object.length;length=length&&isLength(length)&&(isArray(object)||support.nonEnumArgs&&isArguments(object))&&length||0;for(var Ctor=object.constructor,index=-1,isProto=\"function\"==typeof Ctor&&Ctor.prototype===object,result=Array(length),skipIndexes=length>0;length>++index;)result[index]=index+\"\";for(var key in object)skipIndexes&&isIndex(key,length)||\"constructor\"==key&&(isProto||!hasOwnProperty.call(object,key))||result.push(key);return result}function values(object){return baseValues(object,keys(object))}function escapeRegExp(string){return string=baseToString(string),string&&reHasRegExpChars.test(string)?string.replace(reRegExpChars,\"\\\\$&\"):string}function callback(func,thisArg,guard){return guard&&isIterateeCall(func,thisArg,guard)&&(thisArg=null),baseCallback(func,thisArg)}function constant(value){return function(){return value}}function identity(value){return value}function property(path){return isKey(path)?baseProperty(path):basePropertyDeep(path)}var undefined,VERSION=\"3.7.0\",FUNC_ERROR_TEXT=\"Expected a function\",argsTag=\"[object Arguments]\",arrayTag=\"[object Array]\",boolTag=\"[object Boolean]\",dateTag=\"[object Date]\",errorTag=\"[object Error]\",funcTag=\"[object Function]\",mapTag=\"[object Map]\",numberTag=\"[object Number]\",objectTag=\"[object Object]\",regexpTag=\"[object RegExp]\",setTag=\"[object Set]\",stringTag=\"[object String]\",weakMapTag=\"[object WeakMap]\",arrayBufferTag=\"[object ArrayBuffer]\",float32Tag=\"[object Float32Array]\",float64Tag=\"[object Float64Array]\",int8Tag=\"[object Int8Array]\",int16Tag=\"[object Int16Array]\",int32Tag=\"[object Int32Array]\",uint8Tag=\"[object Uint8Array]\",uint8ClampedTag=\"[object Uint8ClampedArray]\",uint16Tag=\"[object Uint16Array]\",uint32Tag=\"[object Uint32Array]\",reIsDeepProp=/\\.|\\[(?:[^[\\]]+|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?)\\1\\]/,reIsPlainProp=/^\\w*$/,rePropName=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g,reRegExpChars=/[.*+?^${}()|[\\]\\/\\\\]/g,reHasRegExpChars=RegExp(reRegExpChars.source),reEscapeChar=/\\\\(\\\\)?/g,reFlags=/\\w*$/,reIsHostCtor=/^\\[object .+?Constructor\\]$/,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[stringTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[mapTag]=cloneableTags[setTag]=cloneableTags[weakMapTag]=!1;var objectTypes={\"function\":!0,object:!0},freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,freeGlobal=freeExports&&freeModule&&\"object\"==typeof global&&global&&global.Object&&global,freeSelf=objectTypes[typeof self]&&self&&self.Object&&self,freeWindow=objectTypes[typeof window]&&window&&window.Object&&window,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,root=freeGlobal||freeWindow!==(this&&this.window)&&freeWindow||freeSelf||this,arrayProto=Array.prototype,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp(\"^\"+escapeRegExp(objToString).replace(/toString|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),ArrayBuffer=isNative(ArrayBuffer=root.ArrayBuffer)&&ArrayBuffer,bufferSlice=isNative(bufferSlice=ArrayBuffer&&new ArrayBuffer(0).slice)&&bufferSlice,floor=Math.floor,getOwnPropertySymbols=isNative(getOwnPropertySymbols=Object.getOwnPropertySymbols)&&getOwnPropertySymbols,getPrototypeOf=isNative(getPrototypeOf=Object.getPrototypeOf)&&getPrototypeOf,push=arrayProto.push,preventExtensions=isNative(Object.preventExtensions=Object.preventExtensions)&&preventExtensions,propertyIsEnumerable=objectProto.propertyIsEnumerable,Uint8Array=isNative(Uint8Array=root.Uint8Array)&&Uint8Array,Float64Array=function(){try{var func=isNative(func=root.Float64Array)&&func,result=new func(new ArrayBuffer(10),0,1)&&func}catch(e){}return result}(),nativeAssign=function(){var object={1:0},func=preventExtensions&&isNative(func=Object.assign)&&func;try{func(preventExtensions(object),\"xo\")}catch(e){}return!object[1]&&func}(),nativeIsArray=isNative(nativeIsArray=Array.isArray)&&nativeIsArray,nativeKeys=isNative(nativeKeys=Object.keys)&&nativeKeys,nativeMax=Math.max,nativeMin=Math.min,NEGATIVE_INFINITY=Number.NEGATIVE_INFINITY,MAX_ARRAY_LENGTH=Math.pow(2,32)-1,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,FLOAT64_BYTES_PER_ELEMENT=Float64Array?Float64Array.BYTES_PER_ELEMENT:0,MAX_SAFE_INTEGER=Math.pow(2,53)-1,support=lodash.support={};(function(x){var Ctor=function(){this.x=x},props=[];Ctor.prototype={valueOf:x,y:x};for(var key in new Ctor)props.push(key);support.funcDecomp=/\\bthis\\b/.test(function(){return this}),support.funcNames=\"string\"==typeof Function.name;try{support.nonEnumArgs=!propertyIsEnumerable.call(arguments,1)}catch(e){support.nonEnumArgs=!0}})(1,0);var baseAssign=nativeAssign||function(object,source){return null==source?object:baseCopy(source,getSymbols(source),baseCopy(source,keys(source),object))},baseEach=createBaseEach(baseForOwn),baseFor=createBaseFor();bufferSlice||(bufferClone=ArrayBuffer&&Uint8Array?function(buffer){var byteLength=buffer.byteLength,floatLength=Float64Array?floor(byteLength/FLOAT64_BYTES_PER_ELEMENT):0,offset=floatLength*FLOAT64_BYTES_PER_ELEMENT,result=new ArrayBuffer(byteLength);if(floatLength){var view=new Float64Array(result,0,floatLength);view.set(new Float64Array(buffer,0,floatLength))}return byteLength!=offset&&(view=new Uint8Array(result,offset),view.set(new Uint8Array(buffer,offset))),result}:constant(null));var getLength=baseProperty(\"length\"),getSymbols=getOwnPropertySymbols?function(object){return getOwnPropertySymbols(toObject(object))}:constant([]),findLastIndex=createFindIndex(!0),zip=restParam(unzip),forEach=createForEach(arrayEach,baseEach),isArray=nativeIsArray||function(value){return isObjectLike(value)&&isLength(value.length)&&objToString.call(value)==arrayTag},isFunction=baseIsFunction(/x/)||Uint8Array&&!baseIsFunction(Uint8Array)?function(value){return objToString.call(value)==funcTag}:baseIsFunction,isPlainObject=getPrototypeOf?function(value){if(!value||objToString.call(value)!=objectTag)return!1;var valueOf=value.valueOf,objProto=isNative(valueOf)&&(objProto=getPrototypeOf(valueOf))&&getPrototypeOf(objProto);return objProto?value==objProto||getPrototypeOf(value)==objProto:shimIsPlainObject(value)}:shimIsPlainObject,assign=createAssigner(function(object,source,customizer){return customizer?assignWith(object,source,customizer):baseAssign(object,source)}),keys=nativeKeys?function(object){if(object)var Ctor=object.constructor,length=object.length;return\"function\"==typeof Ctor&&Ctor.prototype===object||\"function\"!=typeof object&&isLength(length)?shimKeys(object):isObject(object)?nativeKeys(object):[]}:shimKeys,merge=createAssigner(baseMerge);lodash.assign=assign,lodash.callback=callback,lodash.constant=constant,lodash.forEach=forEach,lodash.keys=keys,lodash.keysIn=keysIn,lodash.merge=merge,lodash.property=property,lodash.reject=reject,lodash.restParam=restParam,lodash.slice=slice,lodash.toPlainObject=toPlainObject,lodash.unzip=unzip,lodash.values=values,lodash.zip=zip,lodash.each=forEach,lodash.extend=assign,lodash.iteratee=callback,lodash.clone=clone,lodash.escapeRegExp=escapeRegExp,lodash.findLastIndex=findLastIndex,lodash.has=has,lodash.identity=identity,lodash.includes=includes,lodash.indexOf=indexOf,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isEmpty=isEmpty,lodash.isFunction=isFunction,lodash.isNative=isNative,lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isPlainObject=isPlainObject,lodash.isString=isString,lodash.isTypedArray=isTypedArray,lodash.last=last,lodash.some=some,lodash.any=some,lodash.contains=includes,lodash.include=includes,lodash.VERSION=VERSION,freeExports&&freeModule?moduleExports?(freeModule.exports=lodash)._=lodash:freeExports._=lodash:root._=lodash\n}).call(this)}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],\"/node_modules/jshint/src/jshint.js\":[function(_dereq_,module,exports){var _=_dereq_(\"../lodash\"),events=_dereq_(\"events\"),vars=_dereq_(\"./vars.js\"),messages=_dereq_(\"./messages.js\"),Lexer=_dereq_(\"./lex.js\").Lexer,reg=_dereq_(\"./reg.js\"),state=_dereq_(\"./state.js\").state,style=_dereq_(\"./style.js\"),options=_dereq_(\"./options.js\"),scopeManager=_dereq_(\"./scope-manager.js\"),JSHINT=function(){\"use strict\";function checkOption(name,t){return name=name.trim(),/^[+-]W\\d{3}$/g.test(name)?!0:-1!==options.validNames.indexOf(name)||\"jslint\"===t.type||_.has(options.removed,name)?!0:(error(\"E001\",t,name),!1)}function isString(obj){return\"[object String]\"===Object.prototype.toString.call(obj)}function isIdentifier(tkn,value){return tkn?tkn.identifier&&tkn.value===value?!0:!1:!1}function isReserved(token){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(token.isProperty)return!1}return!0}function supplant(str,data){return str.replace(/\\{([^{}]*)\\}/g,function(a,b){var r=data[b];return\"string\"==typeof r||\"number\"==typeof r?r:a})}function combine(dest,src){Object.keys(src).forEach(function(name){_.has(JSHINT.blacklist,name)||(dest[name]=src[name])})}function processenforceall(){if(state.option.enforceall){for(var enforceopt in options.bool.enforcing)void 0!==state.option[enforceopt]||options.noenforceall[enforceopt]||(state.option[enforceopt]=!0);for(var relaxopt in options.bool.relaxing)void 0===state.option[relaxopt]&&(state.option[relaxopt]=!1)}}function assume(){processenforceall(),state.option.esversion||state.option.moz||(state.option.esversion=state.option.es3?3:state.option.esnext?6:5),state.inES5()&&combine(predefined,vars.ecmaIdentifiers[5]),state.inES6()&&combine(predefined,vars.ecmaIdentifiers[6]),state.option.module&&(state.option.strict===!0&&(state.option.strict=\"global\"),state.inES6()||warning(\"W134\",state.tokens.next,\"module\",6)),state.option.couch&&combine(predefined,vars.couch),state.option.qunit&&combine(predefined,vars.qunit),state.option.rhino&&combine(predefined,vars.rhino),state.option.shelljs&&(combine(predefined,vars.shelljs),combine(predefined,vars.node)),state.option.typed&&combine(predefined,vars.typed),state.option.phantom&&(combine(predefined,vars.phantom),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.prototypejs&&combine(predefined,vars.prototypejs),state.option.node&&(combine(predefined,vars.node),combine(predefined,vars.typed),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.devel&&combine(predefined,vars.devel),state.option.dojo&&combine(predefined,vars.dojo),state.option.browser&&(combine(predefined,vars.browser),combine(predefined,vars.typed)),state.option.browserify&&(combine(predefined,vars.browser),combine(predefined,vars.typed),combine(predefined,vars.browserify),state.option.strict===!0&&(state.option.strict=\"global\")),state.option.nonstandard&&combine(predefined,vars.nonstandard),state.option.jasmine&&combine(predefined,vars.jasmine),state.option.jquery&&combine(predefined,vars.jquery),state.option.mootools&&combine(predefined,vars.mootools),state.option.worker&&combine(predefined,vars.worker),state.option.wsh&&combine(predefined,vars.wsh),state.option.globalstrict&&state.option.strict!==!1&&(state.option.strict=\"global\"),state.option.yui&&combine(predefined,vars.yui),state.option.mocha&&combine(predefined,vars.mocha)}function quit(code,line,chr){var percentage=Math.floor(100*(line/state.lines.length)),message=messages.errors[code].desc;throw{name:\"JSHintError\",line:line,character:chr,message:message+\" (\"+percentage+\"% scanned).\",raw:message,code:code}}function removeIgnoredMessages(){var ignored=state.ignoredLines;_.isEmpty(ignored)||(JSHINT.errors=_.reject(JSHINT.errors,function(err){return ignored[err.line]}))}function warning(code,t,a,b,c,d){var ch,l,w,msg;if(/^W\\d{3}$/.test(code)){if(state.ignored[code])return;msg=messages.warnings[code]}else/E\\d{3}/.test(code)?msg=messages.errors[code]:/I\\d{3}/.test(code)&&(msg=messages.info[code]);return t=t||state.tokens.next||{},\"(end)\"===t.id&&(t=state.tokens.curr),l=t.line||0,ch=t.from||0,w={id:\"(error)\",raw:msg.desc,code:msg.code,evidence:state.lines[l-1]||\"\",line:l,character:ch,scope:JSHINT.scope,a:a,b:b,c:c,d:d},w.reason=supplant(msg.desc,w),JSHINT.errors.push(w),removeIgnoredMessages(),JSHINT.errors.length>=state.option.maxerr&&quit(\"E043\",l,ch),w}function warningAt(m,l,ch,a,b,c,d){return warning(m,{line:l,from:ch},a,b,c,d)}function error(m,t,a,b,c,d){warning(m,t,a,b,c,d)}function errorAt(m,l,ch,a,b,c,d){return error(m,{line:l,from:ch},a,b,c,d)}function addInternalSrc(elem,src){var i;return i={id:\"(internal)\",elem:elem,value:src},JSHINT.internals.push(i),i}function doOption(){var nt=state.tokens.next,body=nt.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g)||[],predef={};if(\"globals\"===nt.type){body.forEach(function(g,idx){g=g.split(\":\");var key=(g[0]||\"\").trim(),val=(g[1]||\"\").trim();if(\"-\"===key||!key.length){if(idx>0&&idx===body.length-1)return;return error(\"E002\",nt),void 0}\"-\"===key.charAt(0)?(key=key.slice(1),val=!1,JSHINT.blacklist[key]=key,delete predefined[key]):predef[key]=\"true\"===val}),combine(predefined,predef);for(var key in predef)_.has(predef,key)&&(declared[key]=nt)}\"exported\"===nt.type&&body.forEach(function(e,idx){if(!e.length){if(idx>0&&idx===body.length-1)return;return error(\"E002\",nt),void 0}state.funct[\"(scope)\"].addExported(e)}),\"members\"===nt.type&&(membersOnly=membersOnly||{},body.forEach(function(m){var ch1=m.charAt(0),ch2=m.charAt(m.length-1);ch1!==ch2||'\"'!==ch1&&\"'\"!==ch1||(m=m.substr(1,m.length-2).replace('\\\\\"','\"')),membersOnly[m]=!1}));var numvals=[\"maxstatements\",\"maxparams\",\"maxdepth\",\"maxcomplexity\",\"maxerr\",\"maxlen\",\"indent\"];(\"jshint\"===nt.type||\"jslint\"===nt.type)&&(body.forEach(function(g){g=g.split(\":\");var key=(g[0]||\"\").trim(),val=(g[1]||\"\").trim();if(checkOption(key,nt))if(numvals.indexOf(key)>=0)if(\"false\"!==val){if(val=+val,\"number\"!=typeof val||!isFinite(val)||0>=val||Math.floor(val)!==val)return error(\"E032\",nt,g[1].trim()),void 0;state.option[key]=val}else state.option[key]=\"indent\"===key?4:!1;else{if(\"validthis\"===key)return state.funct[\"(global)\"]?void error(\"E009\"):\"true\"!==val&&\"false\"!==val?void error(\"E002\",nt):(state.option.validthis=\"true\"===val,void 0);if(\"quotmark\"!==key)if(\"shadow\"!==key)if(\"unused\"!==key)if(\"latedef\"!==key)if(\"ignore\"!==key)if(\"strict\"!==key){\"module\"===key&&(hasParsedCode(state.funct)||error(\"E055\",state.tokens.next,\"module\"));var esversions={es3:3,es5:5,esnext:6};if(!_.has(esversions,key)){if(\"esversion\"===key){switch(val){case\"5\":state.inES5(!0)&&warning(\"I003\");case\"3\":case\"6\":state.option.moz=!1,state.option.esversion=+val;break;case\"2015\":state.option.moz=!1,state.option.esversion=6;break;default:error(\"E002\",nt)}return hasParsedCode(state.funct)||error(\"E055\",state.tokens.next,\"esversion\"),void 0}var match=/^([+-])(W\\d{3})$/g.exec(key);if(match)return state.ignored[match[2]]=\"-\"===match[1],void 0;var tn;return\"true\"===val||\"false\"===val?(\"jslint\"===nt.type?(tn=options.renamed[key]||key,state.option[tn]=\"true\"===val,void 0!==options.inverted[tn]&&(state.option[tn]=!state.option[tn])):state.option[key]=\"true\"===val,\"newcap\"===key&&(state.option[\"(explicitNewcap)\"]=!0),void 0):(error(\"E002\",nt),void 0)}switch(val){case\"true\":state.option.moz=!1,state.option.esversion=esversions[key];break;case\"false\":state.option.moz||(state.option.esversion=5);break;default:error(\"E002\",nt)}}else switch(val){case\"true\":state.option.strict=!0;break;case\"false\":state.option.strict=!1;break;case\"func\":case\"global\":case\"implied\":state.option.strict=val;break;default:error(\"E002\",nt)}else switch(val){case\"line\":state.ignoredLines[nt.line]=!0,removeIgnoredMessages();break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.latedef=!0;break;case\"false\":state.option.latedef=!1;break;case\"nofunc\":state.option.latedef=\"nofunc\";break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.unused=!0;break;case\"false\":state.option.unused=!1;break;case\"vars\":case\"strict\":state.option.unused=val;break;default:error(\"E002\",nt)}else switch(val){case\"true\":state.option.shadow=!0;break;case\"outer\":state.option.shadow=\"outer\";break;case\"false\":case\"inner\":state.option.shadow=\"inner\";break;default:error(\"E002\",nt)}else switch(val){case\"true\":case\"false\":state.option.quotmark=\"true\"===val;break;case\"double\":case\"single\":state.option.quotmark=val;break;default:error(\"E002\",nt)}}}),assume())}function peek(p){var t,i=p||0,j=lookahead.length;if(j>i)return lookahead[i];for(;i>=j;)t=lookahead[j],t||(t=lookahead[j]=lex.token()),j+=1;return t||\"(end)\"!==state.tokens.next.id?t:state.tokens.next}function peekIgnoreEOL(){var t,i=0;do t=peek(i++);while(\"(endline)\"===t.id);return t}function advance(id,t){switch(state.tokens.curr.id){case\"(number)\":\".\"===state.tokens.next.id&&warning(\"W005\",state.tokens.curr);break;case\"-\":(\"-\"===state.tokens.next.id||\"--\"===state.tokens.next.id)&&warning(\"W006\");break;case\"+\":(\"+\"===state.tokens.next.id||\"++\"===state.tokens.next.id)&&warning(\"W007\")}for(id&&state.tokens.next.id!==id&&(t?\"(end)\"===state.tokens.next.id?error(\"E019\",t,t.id):error(\"E020\",state.tokens.next,id,t.id,t.line,state.tokens.next.value):(\"(identifier)\"!==state.tokens.next.type||state.tokens.next.value!==id)&&warning(\"W116\",state.tokens.next,id,state.tokens.next.value)),state.tokens.prev=state.tokens.curr,state.tokens.curr=state.tokens.next;;){if(state.tokens.next=lookahead.shift()||lex.token(),state.tokens.next||quit(\"E041\",state.tokens.curr.line),\"(end)\"===state.tokens.next.id||\"(error)\"===state.tokens.next.id)return;if(state.tokens.next.check&&state.tokens.next.check(),state.tokens.next.isSpecial)\"falls through\"===state.tokens.next.type?state.tokens.curr.caseFallsThrough=!0:doOption();else if(\"(endline)\"!==state.tokens.next.id)break}}function isInfix(token){return token.infix||!token.identifier&&!token.template&&!!token.led}function isEndOfExpr(){var curr=state.tokens.curr,next=state.tokens.next;return\";\"===next.id||\"}\"===next.id||\":\"===next.id?!0:isInfix(next)===isInfix(curr)||\"yield\"===curr.id&&state.inMoz()?curr.line!==startLine(next):!1}function isBeginOfExpr(prev){return!prev.left&&\"unary\"!==prev.arity}function expression(rbp,initial){var left,isArray=!1,isObject=!1,isLetExpr=!1;state.nameStack.push(),initial||\"let\"!==state.tokens.next.value||\"(\"!==peek(0).value||(state.inMoz()||warning(\"W118\",state.tokens.next,\"let expressions\"),isLetExpr=!0,state.funct[\"(scope)\"].stack(),advance(\"let\"),advance(\"(\"),state.tokens.prev.fud(),advance(\")\")),\"(end)\"===state.tokens.next.id&&error(\"E006\",state.tokens.curr);var isDangerous=state.option.asi&&state.tokens.prev.line!==startLine(state.tokens.curr)&&_.contains([\"]\",\")\"],state.tokens.prev.id)&&_.contains([\"[\",\"(\"],state.tokens.curr.id);if(isDangerous&&warning(\"W014\",state.tokens.curr,state.tokens.curr.id),advance(),initial&&(state.funct[\"(verb)\"]=state.tokens.curr.value,state.tokens.curr.beginsStmt=!0),initial===!0&&state.tokens.curr.fud)left=state.tokens.curr.fud();else for(state.tokens.curr.nud?left=state.tokens.curr.nud():error(\"E030\",state.tokens.curr,state.tokens.curr.id);(state.tokens.next.lbp>rbp||\"(template)\"===state.tokens.next.type)&&!isEndOfExpr();)isArray=\"Array\"===state.tokens.curr.value,isObject=\"Object\"===state.tokens.curr.value,left&&(left.value||left.first&&left.first.value)&&(\"new\"!==left.value||left.first&&left.first.value&&\".\"===left.first.value)&&(isArray=!1,left.value!==state.tokens.curr.value&&(isObject=!1)),advance(),isArray&&\"(\"===state.tokens.curr.id&&\")\"===state.tokens.next.id&&warning(\"W009\",state.tokens.curr),isObject&&\"(\"===state.tokens.curr.id&&\")\"===state.tokens.next.id&&warning(\"W010\",state.tokens.curr),left&&state.tokens.curr.led?left=state.tokens.curr.led(left):error(\"E033\",state.tokens.curr,state.tokens.curr.id);return isLetExpr&&state.funct[\"(scope)\"].unstack(),state.nameStack.pop(),left}function startLine(token){return token.startLine||token.line}function nobreaknonadjacent(left,right){left=left||state.tokens.curr,right=right||state.tokens.next,state.option.laxbreak||left.line===startLine(right)||warning(\"W014\",right,right.value)}function nolinebreak(t){t=t||state.tokens.curr,t.line!==startLine(state.tokens.next)&&warning(\"E022\",t,t.value)}function nobreakcomma(left,right){left.line!==startLine(right)&&(state.option.laxcomma||(comma.first&&(warning(\"I001\"),comma.first=!1),warning(\"W014\",left,right.value)))}function comma(opts){if(opts=opts||{},opts.peek?nobreakcomma(state.tokens.prev,state.tokens.curr):(nobreakcomma(state.tokens.curr,state.tokens.next),advance(\",\")),state.tokens.next.identifier&&(!opts.property||!state.inES5()))switch(state.tokens.next.value){case\"break\":case\"case\":case\"catch\":case\"continue\":case\"default\":case\"do\":case\"else\":case\"finally\":case\"for\":case\"if\":case\"in\":case\"instanceof\":case\"return\":case\"switch\":case\"throw\":case\"try\":case\"var\":case\"let\":case\"while\":case\"with\":return error(\"E024\",state.tokens.next,state.tokens.next.value),!1}if(\"(punctuator)\"===state.tokens.next.type)switch(state.tokens.next.value){case\"}\":case\"]\":case\",\":if(opts.allowTrailing)return!0;case\")\":return error(\"E024\",state.tokens.next,state.tokens.next.value),!1}return!0}function symbol(s,p){var x=state.syntax[s];return x&&\"object\"==typeof x||(state.syntax[s]=x={id:s,lbp:p,value:s}),x}function delim(s){var x=symbol(s,0);return x.delim=!0,x}function stmt(s,f){var x=delim(s);return x.identifier=x.reserved=!0,x.fud=f,x}function blockstmt(s,f){var x=stmt(s,f);return x.block=!0,x}function reserveName(x){var c=x.id.charAt(0);return(c>=\"a\"&&\"z\">=c||c>=\"A\"&&\"Z\">=c)&&(x.identifier=x.reserved=!0),x}function prefix(s,f){var x=symbol(s,150);return reserveName(x),x.nud=\"function\"==typeof f?f:function(){return this.arity=\"unary\",this.right=expression(150),(\"++\"===this.id||\"--\"===this.id)&&(state.option.plusplus?warning(\"W016\",this,this.id):!this.right||this.right.identifier&&!isReserved(this.right)||\".\"===this.right.id||\"[\"===this.right.id||warning(\"W017\",this),this.right&&this.right.isMetaProperty?error(\"E031\",this):this.right&&this.right.identifier&&state.funct[\"(scope)\"].block.modify(this.right.value,this)),this},x}function type(s,f){var x=delim(s);return x.type=s,x.nud=f,x}function reserve(name,func){var x=type(name,func);return x.identifier=!0,x.reserved=!0,x}function FutureReservedWord(name,meta){var x=type(name,meta&&meta.nud||function(){return this});return meta=meta||{},meta.isFutureReservedWord=!0,x.value=name,x.identifier=!0,x.reserved=!0,x.meta=meta,x}function reservevar(s,v){return reserve(s,function(){return\"function\"==typeof v&&v(this),this})}function infix(s,f,p,w){var x=symbol(s,p);return reserveName(x),x.infix=!0,x.led=function(left){return w||nobreaknonadjacent(state.tokens.prev,state.tokens.curr),\"in\"!==s&&\"instanceof\"!==s||\"!\"!==left.id||warning(\"W018\",left,\"!\"),\"function\"==typeof f?f(left,this):(this.left=left,this.right=expression(p),this)},x}function application(s){var x=symbol(s,42);return x.led=function(left){return nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left,this.right=doFunction({type:\"arrow\",loneArg:left}),this},x}function relation(s,f){var x=symbol(s,100);return x.led=function(left){nobreaknonadjacent(state.tokens.prev,state.tokens.curr),this.left=left;var right=this.right=expression(100);return isIdentifier(left,\"NaN\")||isIdentifier(right,\"NaN\")?warning(\"W019\",this):f&&f.apply(this,[left,right]),left&&right||quit(\"E041\",state.tokens.curr.line),\"!\"===left.id&&warning(\"W018\",left,\"!\"),\"!\"===right.id&&warning(\"W018\",right,\"!\"),this},x}function isPoorRelation(node){return node&&(\"(number)\"===node.type&&0===+node.value||\"(string)\"===node.type&&\"\"===node.value||\"null\"===node.type&&!state.option.eqnull||\"true\"===node.type||\"false\"===node.type||\"undefined\"===node.type)}function isTypoTypeof(left,right,state){var values;return state.option.notypeof?!1:left&&right?(values=state.inES6()?typeofValues.es6:typeofValues.es3,\"(identifier)\"===right.type&&\"typeof\"===right.value&&\"(string)\"===left.type?!_.contains(values,left.value):!1):!1}function isGlobalEval(left,state){var isGlobal=!1;return\"this\"===left.type&&null===state.funct[\"(context)\"]?isGlobal=!0:\"(identifier)\"===left.type&&(state.option.node&&\"global\"===left.value?isGlobal=!0:!state.option.browser||\"window\"!==left.value&&\"document\"!==left.value||(isGlobal=!0)),isGlobal}function findNativePrototype(left){function walkPrototype(obj){return\"object\"==typeof obj?\"prototype\"===obj.right?obj:walkPrototype(obj.left):void 0}function walkNative(obj){for(;!obj.identifier&&\"object\"==typeof obj.left;)obj=obj.left;return obj.identifier&&natives.indexOf(obj.value)>=0?obj.value:void 0}var natives=[\"Array\",\"ArrayBuffer\",\"Boolean\",\"Collator\",\"DataView\",\"Date\",\"DateTimeFormat\",\"Error\",\"EvalError\",\"Float32Array\",\"Float64Array\",\"Function\",\"Infinity\",\"Intl\",\"Int16Array\",\"Int32Array\",\"Int8Array\",\"Iterator\",\"Number\",\"NumberFormat\",\"Object\",\"RangeError\",\"ReferenceError\",\"RegExp\",\"StopIteration\",\"String\",\"SyntaxError\",\"TypeError\",\"Uint16Array\",\"Uint32Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"URIError\"],prototype=walkPrototype(left);return prototype?walkNative(prototype):void 0}function checkLeftSideAssign(left,assignToken,options){var allowDestructuring=options&&options.allowDestructuring;if(assignToken=assignToken||left,state.option.freeze){var nativeObject=findNativePrototype(left);nativeObject&&warning(\"W121\",left,nativeObject)}return left.identifier&&!left.isMetaProperty&&state.funct[\"(scope)\"].block.reassign(left.value,left),\".\"===left.id?((!left.left||\"arguments\"===left.left.value&&!state.isStrict())&&warning(\"E031\",assignToken),state.nameStack.set(state.tokens.prev),!0):\"{\"===left.id||\"[\"===left.id?(allowDestructuring&&state.tokens.curr.left.destructAssign?state.tokens.curr.left.destructAssign.forEach(function(t){t.id&&state.funct[\"(scope)\"].block.modify(t.id,t.token)}):\"{\"!==left.id&&left.left?\"arguments\"!==left.left.value||state.isStrict()||warning(\"E031\",assignToken):warning(\"E031\",assignToken),\"[\"===left.id&&state.nameStack.set(left.right),!0):left.isMetaProperty?(error(\"E031\",assignToken),!0):left.identifier&&!isReserved(left)?(\"exception\"===state.funct[\"(scope)\"].labeltype(left.value)&&warning(\"W022\",left),state.nameStack.set(left),!0):(left===state.syntax[\"function\"]&&warning(\"W023\",state.tokens.curr),!1)}function assignop(s,f,p){var x=infix(s,\"function\"==typeof f?f:function(left,that){return that.left=left,left&&checkLeftSideAssign(left,that,{allowDestructuring:!0})?(that.right=expression(10),that):(error(\"E031\",that),void 0)},p);return x.exps=!0,x.assign=!0,x}function bitwise(s,f,p){var x=symbol(s,p);return reserveName(x),x.led=\"function\"==typeof f?f:function(left){return state.option.bitwise&&warning(\"W016\",this,this.id),this.left=left,this.right=expression(p),this},x}function bitwiseassignop(s){return assignop(s,function(left,that){return state.option.bitwise&&warning(\"W016\",that,that.id),left&&checkLeftSideAssign(left,that)?(that.right=expression(10),that):(error(\"E031\",that),void 0)},20)}function suffix(s){var x=symbol(s,150);return x.led=function(left){return state.option.plusplus?warning(\"W016\",this,this.id):left.identifier&&!isReserved(left)||\".\"===left.id||\"[\"===left.id||warning(\"W017\",this),left.isMetaProperty?error(\"E031\",this):left&&left.identifier&&state.funct[\"(scope)\"].block.modify(left.value,left),this.left=left,this},x}function optionalidentifier(fnparam,prop,preserve){if(state.tokens.next.identifier){preserve||advance();var curr=state.tokens.curr,val=state.tokens.curr.value;return isReserved(curr)?prop&&state.inES5()?val:fnparam&&\"undefined\"===val?val:(warning(\"W024\",state.tokens.curr,state.tokens.curr.id),val):val}}function identifier(fnparam,prop){var i=optionalidentifier(fnparam,prop,!1);if(i)return i;if(\"...\"===state.tokens.next.value){if(state.inES6(!0)||warning(\"W119\",state.tokens.next,\"spread/rest operator\",\"6\"),advance(),checkPunctuator(state.tokens.next,\"...\"))for(warning(\"E024\",state.tokens.next,\"...\");checkPunctuator(state.tokens.next,\"...\");)advance();return state.tokens.next.identifier?identifier(fnparam,prop):(warning(\"E024\",state.tokens.curr,\"...\"),void 0)}error(\"E030\",state.tokens.next,state.tokens.next.value),\";\"!==state.tokens.next.id&&advance()}function reachable(controlToken){var t,i=0;if(\";\"===state.tokens.next.id&&!controlToken.inBracelessBlock)for(;;){do t=peek(i),i+=1;while(\"(end)\"!==t.id&&\"(comment)\"===t.id);if(t.reach)return;if(\"(endline)\"!==t.id){if(\"function\"===t.id){state.option.latedef===!0&&warning(\"W026\",t);break}warning(\"W027\",t,t.value,controlToken.value);break}}}function parseFinalSemicolon(){if(\";\"!==state.tokens.next.id){if(state.tokens.next.isUnclosed)return advance();var sameLine=startLine(state.tokens.next)===state.tokens.curr.line&&\"(end)\"!==state.tokens.next.id,blockEnd=checkPunctuator(state.tokens.next,\"}\");sameLine&&!blockEnd?errorAt(\"E058\",state.tokens.curr.line,state.tokens.curr.character):state.option.asi||(blockEnd&&!state.option.lastsemic||!sameLine)&&warningAt(\"W033\",state.tokens.curr.line,state.tokens.curr.character)}else advance(\";\")}function statement(){var r,i=indent,t=state.tokens.next,hasOwnScope=!1;if(\";\"===t.id)return advance(\";\"),void 0;var res=isReserved(t);if(res&&t.meta&&t.meta.isFutureReservedWord&&\":\"===peek().id&&(warning(\"W024\",t,t.id),res=!1),t.identifier&&!res&&\":\"===peek().id&&(advance(),advance(\":\"),hasOwnScope=!0,state.funct[\"(scope)\"].stack(),state.funct[\"(scope)\"].block.addBreakLabel(t.value,{token:state.tokens.curr}),state.tokens.next.labelled||\"{\"===state.tokens.next.value||warning(\"W028\",state.tokens.next,t.value,state.tokens.next.value),state.tokens.next.label=t.value,t=state.tokens.next),\"{\"===t.id){var iscase=\"case\"===state.funct[\"(verb)\"]&&\":\"===state.tokens.curr.value;return block(!0,!0,!1,!1,iscase),void 0}return r=expression(0,!0),!r||r.identifier&&\"function\"===r.value||\"(punctuator)\"===r.type&&r.left&&r.left.identifier&&\"function\"===r.left.value||state.isStrict()||\"global\"!==state.option.strict||warning(\"E007\"),t.block||(state.option.expr||r&&r.exps?state.option.nonew&&r&&r.left&&\"(\"===r.id&&\"new\"===r.left.id&&warning(\"W031\",t):warning(\"W030\",state.tokens.curr),parseFinalSemicolon()),indent=i,hasOwnScope&&state.funct[\"(scope)\"].unstack(),r}function statements(){for(var p,a=[];!state.tokens.next.reach&&\"(end)\"!==state.tokens.next.id;)\";\"===state.tokens.next.id?(p=peek(),(!p||\"(\"!==p.id&&\"[\"!==p.id)&&warning(\"W032\"),advance(\";\")):a.push(statement());return a}function directives(){for(var i,p,pn;\"(string)\"===state.tokens.next.id;){if(p=peek(0),\"(endline)\"===p.id){i=1;do pn=peek(i++);while(\"(endline)\"===pn.id);if(\";\"===pn.id)p=pn;else{if(\"[\"===pn.value||\".\"===pn.value)break;state.option.asi&&\"(\"!==pn.value||warning(\"W033\",state.tokens.next)}}else{if(\".\"===p.id||\"[\"===p.id)break;\";\"!==p.id&&warning(\"W033\",p)}advance();var directive=state.tokens.curr.value;(state.directive[directive]||\"use strict\"===directive&&\"implied\"===state.option.strict)&&warning(\"W034\",state.tokens.curr,directive),state.directive[directive]=!0,\";\"===p.id&&advance(\";\")}state.isStrict()&&(state.option[\"(explicitNewcap)\"]||(state.option.newcap=!0),state.option.undef=!0)}function block(ordinary,stmt,isfunc,isfatarrow,iscase){var a,m,t,line,d,b=inblock,old_indent=indent;inblock=ordinary,t=state.tokens.next;var metrics=state.funct[\"(metrics)\"];if(metrics.nestedBlockDepth+=1,metrics.verifyMaxNestedBlockDepthPerFunction(),\"{\"===state.tokens.next.id){if(advance(\"{\"),state.funct[\"(scope)\"].stack(),line=state.tokens.curr.line,\"}\"!==state.tokens.next.id){for(indent+=state.option.indent;!ordinary&&state.tokens.next.from>indent;)indent+=state.option.indent;if(isfunc){m={};for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);directives(),state.option.strict&&state.funct[\"(context)\"][\"(global)\"]&&(m[\"use strict\"]||state.isStrict()||warning(\"E007\"))}a=statements(),metrics.statementCount+=a.length,indent-=state.option.indent}advance(\"}\",t),isfunc&&(state.funct[\"(scope)\"].validateParams(),m&&(state.directive=m)),state.funct[\"(scope)\"].unstack(),indent=old_indent}else if(ordinary)state.funct[\"(noblockscopedvar)\"]=\"for\"!==state.tokens.next.id,state.funct[\"(scope)\"].stack(),(!stmt||state.option.curly)&&warning(\"W116\",state.tokens.next,\"{\",state.tokens.next.value),state.tokens.next.inBracelessBlock=!0,indent+=state.option.indent,a=[statement()],indent-=state.option.indent,state.funct[\"(scope)\"].unstack(),delete state.funct[\"(noblockscopedvar)\"];else if(isfunc){if(state.funct[\"(scope)\"].stack(),m={},!stmt||isfatarrow||state.inMoz()||error(\"W118\",state.tokens.curr,\"function closure expressions\"),!stmt)for(d in state.directive)_.has(state.directive,d)&&(m[d]=state.directive[d]);expression(10),state.option.strict&&state.funct[\"(context)\"][\"(global)\"]&&(m[\"use strict\"]||state.isStrict()||warning(\"E007\")),state.funct[\"(scope)\"].unstack()}else error(\"E021\",state.tokens.next,\"{\",state.tokens.next.value);switch(state.funct[\"(verb)\"]){case\"break\":case\"continue\":case\"return\":case\"throw\":if(iscase)break;default:state.funct[\"(verb)\"]=null}return inblock=b,!ordinary||!state.option.noempty||a&&0!==a.length||warning(\"W035\",state.tokens.prev),metrics.nestedBlockDepth-=1,a}function countMember(m){membersOnly&&\"boolean\"!=typeof membersOnly[m]&&warning(\"W036\",state.tokens.curr,m),\"number\"==typeof member[m]?member[m]+=1:member[m]=1}function comprehensiveArrayExpression(){var res={};res.exps=!0,state.funct[\"(comparray)\"].stack();var reversed=!1;return\"for\"!==state.tokens.next.value&&(reversed=!0,state.inMoz()||warning(\"W116\",state.tokens.next,\"for\",state.tokens.next.value),state.funct[\"(comparray)\"].setState(\"use\"),res.right=expression(10)),advance(\"for\"),\"each\"===state.tokens.next.value&&(advance(\"each\"),state.inMoz()||warning(\"W118\",state.tokens.curr,\"for each\")),advance(\"(\"),state.funct[\"(comparray)\"].setState(\"define\"),res.left=expression(130),_.contains([\"in\",\"of\"],state.tokens.next.value)?advance():error(\"E045\",state.tokens.curr),state.funct[\"(comparray)\"].setState(\"generate\"),expression(10),advance(\")\"),\"if\"===state.tokens.next.value&&(advance(\"if\"),advance(\"(\"),state.funct[\"(comparray)\"].setState(\"filter\"),res.filter=expression(10),advance(\")\")),reversed||(state.funct[\"(comparray)\"].setState(\"use\"),res.right=expression(10)),advance(\"]\"),state.funct[\"(comparray)\"].unstack(),res}function isMethod(){return state.funct[\"(statement)\"]&&\"class\"===state.funct[\"(statement)\"].type||state.funct[\"(context)\"]&&\"class\"===state.funct[\"(context)\"][\"(verb)\"]}function isPropertyName(token){return token.identifier||\"(string)\"===token.id||\"(number)\"===token.id}function propertyName(preserveOrToken){var id,preserve=!0;return\"object\"==typeof preserveOrToken?id=preserveOrToken:(preserve=preserveOrToken,id=optionalidentifier(!1,!0,preserve)),id?\"object\"==typeof id&&(\"(string)\"===id.id||\"(identifier)\"===id.id?id=id.value:\"(number)\"===id.id&&(id=\"\"+id.value)):\"(string)\"===state.tokens.next.id?(id=state.tokens.next.value,preserve||advance()):\"(number)\"===state.tokens.next.id&&(id=\"\"+state.tokens.next.value,preserve||advance()),\"hasOwnProperty\"===id&&warning(\"W001\"),id}function functionparams(options){function addParam(addParamArgs){state.funct[\"(scope)\"].addParam.apply(state.funct[\"(scope)\"],addParamArgs)}var next,ident,t,paramsIds=[],tokens=[],pastDefault=!1,pastRest=!1,arity=0,loneArg=options&&options.loneArg;if(loneArg&&loneArg.identifier===!0)return state.funct[\"(scope)\"].addParam(loneArg.value,loneArg),{arity:1,params:[loneArg.value]};if(next=state.tokens.next,options&&options.parsedOpening||advance(\"(\"),\")\"===state.tokens.next.id)return advance(\")\"),void 0;for(;;){arity++;var currentParams=[];if(_.contains([\"{\",\"[\"],state.tokens.next.id)){tokens=destructuringPattern();for(t in tokens)t=tokens[t],t.id&&(paramsIds.push(t.id),currentParams.push([t.id,t.token]))}else if(checkPunctuator(state.tokens.next,\"...\")&&(pastRest=!0),ident=identifier(!0))paramsIds.push(ident),currentParams.push([ident,state.tokens.curr]);else for(;!checkPunctuators(state.tokens.next,[\",\",\")\"]);)advance();if(pastDefault&&\"=\"!==state.tokens.next.id&&error(\"W138\",state.tokens.current),\"=\"===state.tokens.next.id&&(state.inES6()||warning(\"W119\",state.tokens.next,\"default parameters\",\"6\"),advance(\"=\"),pastDefault=!0,expression(10)),currentParams.forEach(addParam),\",\"!==state.tokens.next.id)return advance(\")\",next),{arity:arity,params:paramsIds};pastRest&&warning(\"W131\",state.tokens.next),comma()}}function functor(name,token,overwrites){var funct={\"(name)\":name,\"(breakage)\":0,\"(loopage)\":0,\"(tokens)\":{},\"(properties)\":{},\"(catch)\":!1,\"(global)\":!1,\"(line)\":null,\"(character)\":null,\"(metrics)\":null,\"(statement)\":null,\"(context)\":null,\"(scope)\":null,\"(comparray)\":null,\"(generator)\":null,\"(arrow)\":null,\"(params)\":null};return token&&_.extend(funct,{\"(line)\":token.line,\"(character)\":token.character,\"(metrics)\":createMetrics(token)}),_.extend(funct,overwrites),funct[\"(context)\"]&&(funct[\"(scope)\"]=funct[\"(context)\"][\"(scope)\"],funct[\"(comparray)\"]=funct[\"(context)\"][\"(comparray)\"]),funct}function isFunctor(token){return\"(scope)\"in token}function hasParsedCode(funct){return funct[\"(global)\"]&&!funct[\"(verb)\"]}function doTemplateLiteral(left){function end(){if(state.tokens.curr.template&&state.tokens.curr.tail&&state.tokens.curr.context===ctx)return!0;var complete=state.tokens.next.template&&state.tokens.next.tail&&state.tokens.next.context===ctx;return complete&&advance(),complete||state.tokens.next.isUnclosed}var ctx=this.context,noSubst=this.noSubst,depth=this.depth;if(!noSubst)for(;!end();)!state.tokens.next.template||state.tokens.next.depth>depth?expression(0):advance();return{id:\"(template)\",type:\"(template)\",tag:left}}function doFunction(options){var f,token,name,statement,classExprBinding,isGenerator,isArrow,ignoreLoopFunc,oldOption=state.option,oldIgnored=state.ignored;options&&(name=options.name,statement=options.statement,classExprBinding=options.classExprBinding,isGenerator=\"generator\"===options.type,isArrow=\"arrow\"===options.type,ignoreLoopFunc=options.ignoreLoopFunc),state.option=Object.create(state.option),state.ignored=Object.create(state.ignored),state.funct=functor(name||state.nameStack.infer(),state.tokens.next,{\"(statement)\":statement,\"(context)\":state.funct,\"(arrow)\":isArrow,\"(generator)\":isGenerator}),f=state.funct,token=state.tokens.curr,token.funct=state.funct,functions.push(state.funct),state.funct[\"(scope)\"].stack(\"functionouter\");var internallyAccessibleName=name||classExprBinding;internallyAccessibleName&&state.funct[\"(scope)\"].block.add(internallyAccessibleName,classExprBinding?\"class\":\"function\",state.tokens.curr,!1),state.funct[\"(scope)\"].stack(\"functionparams\");var paramsInfo=functionparams(options);return paramsInfo?(state.funct[\"(params)\"]=paramsInfo.params,state.funct[\"(metrics)\"].arity=paramsInfo.arity,state.funct[\"(metrics)\"].verifyMaxParametersPerFunction()):state.funct[\"(metrics)\"].arity=0,isArrow&&(state.inES6(!0)||warning(\"W119\",state.tokens.curr,\"arrow function syntax (=>)\",\"6\"),options.loneArg||advance(\"=>\")),block(!1,!0,!0,isArrow),!state.option.noyield&&isGenerator&&\"yielded\"!==state.funct[\"(generator)\"]&&warning(\"W124\",state.tokens.curr),state.funct[\"(metrics)\"].verifyMaxStatementsPerFunction(),state.funct[\"(metrics)\"].verifyMaxComplexityPerFunction(),state.funct[\"(unusedOption)\"]=state.option.unused,state.option=oldOption,state.ignored=oldIgnored,state.funct[\"(last)\"]=state.tokens.curr.line,state.funct[\"(lastcharacter)\"]=state.tokens.curr.character,state.funct[\"(scope)\"].unstack(),state.funct[\"(scope)\"].unstack(),state.funct=state.funct[\"(context)\"],ignoreLoopFunc||state.option.loopfunc||!state.funct[\"(loopage)\"]||f[\"(isCapturing)\"]&&warning(\"W083\",token),f}function createMetrics(functionStartToken){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){state.option.maxstatements&&this.statementCount>state.option.maxstatements&&warning(\"W071\",functionStartToken,this.statementCount)\n},verifyMaxParametersPerFunction:function(){_.isNumber(state.option.maxparams)&&this.arity>state.option.maxparams&&warning(\"W072\",functionStartToken,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){state.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===state.option.maxdepth+1&&warning(\"W073\",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var max=state.option.maxcomplexity,cc=this.ComplexityCount;max&&cc>max&&warning(\"W074\",functionStartToken,cc)}}}function increaseComplexityCount(){state.funct[\"(metrics)\"].ComplexityCount+=1}function checkCondAssignment(expr){var id,paren;switch(expr&&(id=expr.id,paren=expr.paren,\",\"===id&&(expr=expr.exprs[expr.exprs.length-1])&&(id=expr.id,paren=paren||expr.paren)),id){case\"=\":case\"+=\":case\"-=\":case\"*=\":case\"%=\":case\"&=\":case\"|=\":case\"^=\":case\"/=\":paren||state.option.boss||warning(\"W084\")}}function checkProperties(props){if(state.inES5())for(var name in props)props[name]&&props[name].setterToken&&!props[name].getterToken&&warning(\"W078\",props[name].setterToken)}function metaProperty(name,c){if(checkPunctuator(state.tokens.next,\".\")){var left=state.tokens.curr.id;advance(\".\");var id=identifier();return state.tokens.curr.isMetaProperty=!0,name!==id?error(\"E057\",state.tokens.prev,left,id):c(),state.tokens.curr}}function destructuringPattern(options){var isAssignment=options&&options.assignment;return state.inES6()||warning(\"W104\",state.tokens.curr,isAssignment?\"destructuring assignment\":\"destructuring binding\",\"6\"),destructuringPatternRecursive(options)}function destructuringPatternRecursive(options){var ids,identifiers=[],openingParsed=options&&options.openingParsed,isAssignment=options&&options.assignment,recursiveOptions=isAssignment?{assignment:isAssignment}:null,firstToken=openingParsed?state.tokens.curr:state.tokens.next,nextInnerDE=function(){var ident;if(checkPunctuators(state.tokens.next,[\"[\",\"{\"])){ids=destructuringPatternRecursive(recursiveOptions);for(var id in ids)id=ids[id],identifiers.push({id:id.id,token:id.token})}else if(checkPunctuator(state.tokens.next,\",\"))identifiers.push({id:null,token:state.tokens.curr});else{if(!checkPunctuator(state.tokens.next,\"(\")){var is_rest=checkPunctuator(state.tokens.next,\"...\");if(isAssignment){var identifierToken=is_rest?peek(0):state.tokens.next;identifierToken.identifier||warning(\"E030\",identifierToken,identifierToken.value);var assignTarget=expression(155);assignTarget&&(checkLeftSideAssign(assignTarget),assignTarget.identifier&&(ident=assignTarget.value))}else ident=identifier();return ident&&identifiers.push({id:ident,token:state.tokens.curr}),is_rest}advance(\"(\"),nextInnerDE(),advance(\")\")}return!1},assignmentProperty=function(){var id;checkPunctuator(state.tokens.next,\"[\")?(advance(\"[\"),expression(10),advance(\"]\"),advance(\":\"),nextInnerDE()):\"(string)\"===state.tokens.next.id||\"(number)\"===state.tokens.next.id?(advance(),advance(\":\"),nextInnerDE()):(id=identifier(),checkPunctuator(state.tokens.next,\":\")?(advance(\":\"),nextInnerDE()):id&&(isAssignment&&checkLeftSideAssign(state.tokens.curr),identifiers.push({id:id,token:state.tokens.curr})))};if(checkPunctuator(firstToken,\"[\")){openingParsed||advance(\"[\"),checkPunctuator(state.tokens.next,\"]\")&&warning(\"W137\",state.tokens.curr);for(var element_after_rest=!1;!checkPunctuator(state.tokens.next,\"]\");)nextInnerDE()&&!element_after_rest&&checkPunctuator(state.tokens.next,\",\")&&(warning(\"W130\",state.tokens.next),element_after_rest=!0),checkPunctuator(state.tokens.next,\"=\")&&(checkPunctuator(state.tokens.prev,\"...\")?advance(\"]\"):advance(\"=\"),\"undefined\"===state.tokens.next.id&&warning(\"W080\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\"]\")||advance(\",\");advance(\"]\")}else if(checkPunctuator(firstToken,\"{\")){for(openingParsed||advance(\"{\"),checkPunctuator(state.tokens.next,\"}\")&&warning(\"W137\",state.tokens.curr);!checkPunctuator(state.tokens.next,\"}\")&&(assignmentProperty(),checkPunctuator(state.tokens.next,\"=\")&&(advance(\"=\"),\"undefined\"===state.tokens.next.id&&warning(\"W080\",state.tokens.prev,state.tokens.prev.value),expression(10)),checkPunctuator(state.tokens.next,\"}\")||(advance(\",\"),!checkPunctuator(state.tokens.next,\"}\"))););advance(\"}\")}return identifiers}function destructuringPatternMatch(tokens,value){var first=value.first;first&&_.zip(tokens,Array.isArray(first)?first:[first]).forEach(function(val){var token=val[0],value=val[1];token&&value?token.first=value:token&&token.first&&!value&&warning(\"W080\",token.first,token.first.value)})}function blockVariableStatement(type,statement,context){var tokens,lone,value,letblock,prefix=context&&context.prefix,inexport=context&&context.inexport,isLet=\"let\"===type,isConst=\"const\"===type;for(state.inES6()||warning(\"W104\",state.tokens.curr,type,\"6\"),isLet&&\"(\"===state.tokens.next.value?(state.inMoz()||warning(\"W118\",state.tokens.next,\"let block\"),advance(\"(\"),state.funct[\"(scope)\"].stack(),letblock=!0):state.funct[\"(noblockscopedvar)\"]&&error(\"E048\",state.tokens.curr,isConst?\"Const\":\"Let\"),statement.first=[];;){var names=[];_.contains([\"{\",\"[\"],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),!prefix&&isConst&&\"=\"!==state.tokens.next.id&&warning(\"E012\",state.tokens.curr,state.tokens.curr.value);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],state.funct[\"(scope)\"].block.isGlobal()&&predefined[t.id]===!1&&warning(\"W079\",t.token,t.id),t.id&&!state.funct[\"(noblockscopedvar)\"]&&(state.funct[\"(scope)\"].addlabel(t.id,{type:type,token:t.token}),names.push(t.token),lone&&inexport&&state.funct[\"(scope)\"].setExported(t.token.value,t.token)));if(\"=\"===state.tokens.next.id&&(advance(\"=\"),prefix||\"undefined\"!==state.tokens.next.id||warning(\"W080\",state.tokens.prev,state.tokens.prev.value),!prefix&&\"=\"===peek(0).id&&state.tokens.next.identifier&&warning(\"W120\",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),statement.first=statement.first.concat(names),\",\"!==state.tokens.next.id)break;comma()}return letblock&&(advance(\")\"),block(!0,!0),statement.block=!0,state.funct[\"(scope)\"].unstack()),statement}function classdef(isStatement){return state.inES6()||warning(\"W104\",state.tokens.curr,\"class\",\"6\"),isStatement?(this.name=identifier(),state.funct[\"(scope)\"].addlabel(this.name,{type:\"class\",token:state.tokens.curr})):state.tokens.next.identifier&&\"extends\"!==state.tokens.next.value?(this.name=identifier(),this.namedExpr=!0):this.name=state.nameStack.infer(),classtail(this),this}function classtail(c){var wasInClassBody=state.inClassBody;\"extends\"===state.tokens.next.value&&(advance(\"extends\"),c.heritage=expression(10)),state.inClassBody=!0,advance(\"{\"),c.body=classbody(c),advance(\"}\"),state.inClassBody=wasInClassBody}function classbody(c){for(var name,isStatic,isGenerator,getset,computed,props=Object.create(null),staticProps=Object.create(null),i=0;\"}\"!==state.tokens.next.id;++i)if(name=state.tokens.next,isStatic=!1,isGenerator=!1,getset=null,\";\"!==name.id){if(\"*\"===name.id&&(isGenerator=!0,advance(\"*\"),name=state.tokens.next),\"[\"===name.id)name=computedPropertyName(),computed=!0;else{if(!isPropertyName(name)){warning(\"W052\",state.tokens.next,state.tokens.next.value||state.tokens.next.type),advance();continue}advance(),computed=!1,name.identifier&&\"static\"===name.value&&(checkPunctuator(state.tokens.next,\"*\")&&(isGenerator=!0,advance(\"*\")),(isPropertyName(state.tokens.next)||\"[\"===state.tokens.next.id)&&(computed=\"[\"===state.tokens.next.id,isStatic=!0,name=state.tokens.next,\"[\"===state.tokens.next.id?name=computedPropertyName():advance())),!name.identifier||\"get\"!==name.value&&\"set\"!==name.value||(isPropertyName(state.tokens.next)||\"[\"===state.tokens.next.id)&&(computed=\"[\"===state.tokens.next.id,getset=name,name=state.tokens.next,\"[\"===state.tokens.next.id?name=computedPropertyName():advance())}if(!checkPunctuator(state.tokens.next,\"(\")){for(error(\"E054\",state.tokens.next,state.tokens.next.value);\"}\"!==state.tokens.next.id&&!checkPunctuator(state.tokens.next,\"(\");)advance();\"(\"!==state.tokens.next.value&&doFunction({statement:c})}if(computed||(getset?saveAccessor(getset.value,isStatic?staticProps:props,name.value,name,!0,isStatic):(\"constructor\"===name.value?state.nameStack.set(c):state.nameStack.set(name),saveProperty(isStatic?staticProps:props,name.value,name,!0,isStatic))),getset&&\"constructor\"===name.value){var propDesc=\"get\"===getset.value?\"class getter method\":\"class setter method\";error(\"E049\",name,propDesc,\"constructor\")}else\"prototype\"===name.value&&error(\"E049\",name,\"class method\",\"prototype\");propertyName(name),doFunction({statement:c,type:isGenerator?\"generator\":null,classExprBinding:c.namedExpr?c.name:null})}else warning(\"W032\"),advance(\";\");checkProperties(props)}function saveProperty(props,name,tkn,isClass,isStatic){var msg=[\"key\",\"class method\",\"static class method\"];msg=msg[(isClass||!1)+(isStatic||!1)],tkn.identifier&&(name=tkn.value),props[name]&&\"__proto__\"!==name?warning(\"W075\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name].basic=!0,props[name].basictkn=tkn}function saveAccessor(accessorType,props,name,tkn,isClass,isStatic){var flagName=\"get\"===accessorType?\"getterToken\":\"setterToken\",msg=\"\";isClass?(isStatic&&(msg+=\"static \"),msg+=accessorType+\"ter method\"):msg=\"key\",state.tokens.curr.accessorType=accessorType,state.nameStack.set(tkn),props[name]?(props[name].basic||props[name][flagName])&&\"__proto__\"!==name&&warning(\"W075\",state.tokens.next,msg,name):props[name]=Object.create(null),props[name][flagName]=tkn}function computedPropertyName(){advance(\"[\"),state.inES6()||warning(\"W119\",state.tokens.curr,\"computed property names\",\"6\");var value=expression(10);return advance(\"]\"),value}function checkPunctuators(token,values){return\"(punctuator)\"===token.type?_.contains(values,token.value):!1}function checkPunctuator(token,value){return\"(punctuator)\"===token.type&&token.value===value}function destructuringAssignOrJsonValue(){var block=lookupBlockType();block.notJson?(!state.inES6()&&block.isDestAssign&&warning(\"W104\",state.tokens.curr,\"destructuring assignment\",\"6\"),statements()):(state.option.laxbreak=!0,state.jsonMode=!0,jsonValue())}function jsonValue(){function jsonObject(){var o={},t=state.tokens.next;if(advance(\"{\"),\"}\"!==state.tokens.next.id)for(;;){if(\"(end)\"===state.tokens.next.id)error(\"E026\",state.tokens.next,t.line);else{if(\"}\"===state.tokens.next.id){warning(\"W094\",state.tokens.curr);break}\",\"===state.tokens.next.id?error(\"E028\",state.tokens.next):\"(string)\"!==state.tokens.next.id&&warning(\"W095\",state.tokens.next,state.tokens.next.value)}if(o[state.tokens.next.value]===!0?warning(\"W075\",state.tokens.next,\"key\",state.tokens.next.value):\"__proto__\"===state.tokens.next.value&&!state.option.proto||\"__iterator__\"===state.tokens.next.value&&!state.option.iterator?warning(\"W096\",state.tokens.next,state.tokens.next.value):o[state.tokens.next.value]=!0,advance(),advance(\":\"),jsonValue(),\",\"!==state.tokens.next.id)break;advance(\",\")}advance(\"}\")}function jsonArray(){var t=state.tokens.next;if(advance(\"[\"),\"]\"!==state.tokens.next.id)for(;;){if(\"(end)\"===state.tokens.next.id)error(\"E027\",state.tokens.next,t.line);else{if(\"]\"===state.tokens.next.id){warning(\"W094\",state.tokens.curr);break}\",\"===state.tokens.next.id&&error(\"E028\",state.tokens.next)}if(jsonValue(),\",\"!==state.tokens.next.id)break;advance(\",\")}advance(\"]\")}switch(state.tokens.next.id){case\"{\":jsonObject();break;case\"[\":jsonArray();break;case\"true\":case\"false\":case\"null\":case\"(number)\":case\"(string)\":advance();break;case\"-\":advance(\"-\"),advance(\"(number)\");break;default:error(\"E003\",state.tokens.next)}}var api,declared,functions,inblock,indent,lookahead,lex,member,membersOnly,predefined,stack,urls,bang={\"<\":!0,\"<=\":!0,\"==\":!0,\"===\":!0,\"!==\":!0,\"!=\":!0,\">\":!0,\">=\":!0,\"+\":!0,\"-\":!0,\"*\":!0,\"/\":!0,\"%\":!0},functionicity=[\"closure\",\"exception\",\"global\",\"label\",\"outer\",\"unused\",\"var\"],extraModules=[],emitter=new events.EventEmitter,typeofValues={};typeofValues.legacy=[\"xml\",\"unknown\"],typeofValues.es3=[\"undefined\",\"boolean\",\"number\",\"string\",\"function\",\"object\"],typeofValues.es3=typeofValues.es3.concat(typeofValues.legacy),typeofValues.es6=typeofValues.es3.concat(\"symbol\"),type(\"(number)\",function(){return this}),type(\"(string)\",function(){return this}),state.syntax[\"(identifier)\"]={type:\"(identifier)\",lbp:0,identifier:!0,nud:function(){var v=this.value;return\"=>\"===state.tokens.next.id?this:(state.funct[\"(comparray)\"].check(v)||state.funct[\"(scope)\"].block.use(v,state.tokens.curr),this)},led:function(){error(\"E033\",state.tokens.next,state.tokens.next.value)}};var baseTemplateSyntax={lbp:0,identifier:!1,template:!0};state.syntax[\"(template)\"]=_.extend({type:\"(template)\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!1},baseTemplateSyntax),state.syntax[\"(template middle)\"]=_.extend({type:\"(template middle)\",middle:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\"(template tail)\"]=_.extend({type:\"(template tail)\",tail:!0,noSubst:!1},baseTemplateSyntax),state.syntax[\"(no subst template)\"]=_.extend({type:\"(template)\",nud:doTemplateLiteral,led:doTemplateLiteral,noSubst:!0,tail:!0},baseTemplateSyntax),type(\"(regexp)\",function(){return this}),delim(\"(endline)\"),delim(\"(begin)\"),delim(\"(end)\").reach=!0,delim(\"(error)\").reach=!0,delim(\"}\").reach=!0,delim(\")\"),delim(\"]\"),delim('\"').reach=!0,delim(\"'\").reach=!0,delim(\";\"),delim(\":\").reach=!0,delim(\"#\"),reserve(\"else\"),reserve(\"case\").reach=!0,reserve(\"catch\"),reserve(\"default\").reach=!0,reserve(\"finally\"),reservevar(\"arguments\",function(x){state.isStrict()&&state.funct[\"(global)\"]&&warning(\"E008\",x)}),reservevar(\"eval\"),reservevar(\"false\"),reservevar(\"Infinity\"),reservevar(\"null\"),reservevar(\"this\",function(x){state.isStrict()&&!isMethod()&&!state.option.validthis&&(state.funct[\"(statement)\"]&&state.funct[\"(name)\"].charAt(0)>\"Z\"||state.funct[\"(global)\"])&&warning(\"W040\",x)}),reservevar(\"true\"),reservevar(\"undefined\"),assignop(\"=\",\"assign\",20),assignop(\"+=\",\"assignadd\",20),assignop(\"-=\",\"assignsub\",20),assignop(\"*=\",\"assignmult\",20),assignop(\"/=\",\"assigndiv\",20).nud=function(){error(\"E014\")},assignop(\"%=\",\"assignmod\",20),bitwiseassignop(\"&=\"),bitwiseassignop(\"|=\"),bitwiseassignop(\"^=\"),bitwiseassignop(\"<<=\"),bitwiseassignop(\">>=\"),bitwiseassignop(\">>>=\"),infix(\",\",function(left,that){var expr;if(that.exprs=[left],state.option.nocomma&&warning(\"W127\"),!comma({peek:!0}))return that;for(;;){if(!(expr=expression(10)))break;if(that.exprs.push(expr),\",\"!==state.tokens.next.value||!comma())break}return that},10,!0),infix(\"?\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(10),advance(\":\"),that[\"else\"]=expression(10),that},30);var orPrecendence=40;infix(\"||\",function(left,that){return increaseComplexityCount(),that.left=left,that.right=expression(orPrecendence),that},orPrecendence),infix(\"&&\",\"and\",50),bitwise(\"|\",\"bitor\",70),bitwise(\"^\",\"bitxor\",80),bitwise(\"&\",\"bitand\",90),relation(\"==\",function(left,right){var eqnull=state.option.eqnull&&(\"null\"===(left&&left.value)||\"null\"===(right&&right.value));switch(!0){case!eqnull&&state.option.eqeqeq:this.from=this.character,warning(\"W116\",this,\"===\",\"==\");break;case isPoorRelation(left):warning(\"W041\",this,\"===\",left.value);break;case isPoorRelation(right):warning(\"W041\",this,\"===\",right.value);break;case isTypoTypeof(right,left,state):warning(\"W122\",this,right.value);break;case isTypoTypeof(left,right,state):warning(\"W122\",this,left.value)}return this}),relation(\"===\",function(left,right){return isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"!=\",function(left,right){var eqnull=state.option.eqnull&&(\"null\"===(left&&left.value)||\"null\"===(right&&right.value));return!eqnull&&state.option.eqeqeq?(this.from=this.character,warning(\"W116\",this,\"!==\",\"!=\")):isPoorRelation(left)?warning(\"W041\",this,\"!==\",left.value):isPoorRelation(right)?warning(\"W041\",this,\"!==\",right.value):isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"!==\",function(left,right){return isTypoTypeof(right,left,state)?warning(\"W122\",this,right.value):isTypoTypeof(left,right,state)&&warning(\"W122\",this,left.value),this}),relation(\"<\"),relation(\">\"),relation(\"<=\"),relation(\">=\"),bitwise(\"<<\",\"shiftleft\",120),bitwise(\">>\",\"shiftright\",120),bitwise(\">>>\",\"shiftrightunsigned\",120),infix(\"in\",\"in\",120),infix(\"instanceof\",\"instanceof\",120),infix(\"+\",function(left,that){var right;return that.left=left,that.right=right=expression(130),left&&right&&\"(string)\"===left.id&&\"(string)\"===right.id?(left.value+=right.value,left.character=right.character,!state.option.scripturl&®.javascriptURL.test(left.value)&&warning(\"W050\",left),left):that},130),prefix(\"+\",\"num\"),prefix(\"+++\",function(){return warning(\"W007\"),this.arity=\"unary\",this.right=expression(150),this}),infix(\"+++\",function(left){return warning(\"W007\"),this.left=left,this.right=expression(130),this},130),infix(\"-\",\"sub\",130),prefix(\"-\",\"neg\"),prefix(\"---\",function(){return warning(\"W006\"),this.arity=\"unary\",this.right=expression(150),this}),infix(\"---\",function(left){return warning(\"W006\"),this.left=left,this.right=expression(130),this},130),infix(\"*\",\"mult\",140),infix(\"/\",\"div\",140),infix(\"%\",\"mod\",140),suffix(\"++\"),prefix(\"++\",\"preinc\"),state.syntax[\"++\"].exps=!0,suffix(\"--\"),prefix(\"--\",\"predec\"),state.syntax[\"--\"].exps=!0,prefix(\"delete\",function(){var p=expression(10);return p?(\".\"!==p.id&&\"[\"!==p.id&&warning(\"W051\"),this.first=p,p.identifier&&!state.isStrict()&&(p.forgiveUndef=!0),this):this}).exps=!0,prefix(\"~\",function(){return state.option.bitwise&&warning(\"W016\",this,\"~\"),this.arity=\"unary\",this.right=expression(150),this}),prefix(\"...\",function(){return state.inES6(!0)||warning(\"W119\",this,\"spread/rest operator\",\"6\"),state.tokens.next.identifier||\"(string)\"===state.tokens.next.type||checkPunctuators(state.tokens.next,[\"[\",\"(\"])||error(\"E030\",state.tokens.next,state.tokens.next.value),expression(150),this}),prefix(\"!\",function(){return this.arity=\"unary\",this.right=expression(150),this.right||quit(\"E041\",this.line||0),bang[this.right.id]===!0&&warning(\"W018\",this,\"!\"),this}),prefix(\"typeof\",function(){var p=expression(150);return this.first=this.right=p,p||quit(\"E041\",this.line||0,this.character||0),p.identifier&&(p.forgiveUndef=!0),this}),prefix(\"new\",function(){var mp=metaProperty(\"target\",function(){state.inES6(!0)||warning(\"W119\",state.tokens.prev,\"new.target\",\"6\");for(var inFunction,c=state.funct;c&&(inFunction=!c[\"(global)\"],c[\"(arrow)\"]);)c=c[\"(context)\"];inFunction||warning(\"W136\",state.tokens.prev,\"new.target\")});if(mp)return mp;var i,c=expression(155);if(c&&\"function\"!==c.id)if(c.identifier)switch(c[\"new\"]=!0,c.value){case\"Number\":case\"String\":case\"Boolean\":case\"Math\":case\"JSON\":warning(\"W053\",state.tokens.prev,c.value);break;case\"Symbol\":state.inES6()&&warning(\"W053\",state.tokens.prev,c.value);break;case\"Function\":state.option.evil||warning(\"W054\");break;case\"Date\":case\"RegExp\":case\"this\":break;default:\"function\"!==c.id&&(i=c.value.substr(0,1),state.option.newcap&&(\"A\">i||i>\"Z\")&&!state.funct[\"(scope)\"].isPredefined(c.value)&&warning(\"W055\",state.tokens.curr))}else\".\"!==c.id&&\"[\"!==c.id&&\"(\"!==c.id&&warning(\"W056\",state.tokens.curr);else state.option.supernew||warning(\"W057\",this);return\"(\"===state.tokens.next.id||state.option.supernew||warning(\"W058\",state.tokens.curr,state.tokens.curr.value),this.first=this.right=c,this}),state.syntax[\"new\"].exps=!0,prefix(\"void\").exps=!0,infix(\".\",function(left,that){var m=identifier(!1,!0);return\"string\"==typeof m&&countMember(m),that.left=left,that.right=m,m&&\"hasOwnProperty\"===m&&\"=\"===state.tokens.next.value&&warning(\"W001\"),!left||\"arguments\"!==left.value||\"callee\"!==m&&\"caller\"!==m?state.option.evil||!left||\"document\"!==left.value||\"write\"!==m&&\"writeln\"!==m||warning(\"W060\",left):state.option.noarg?warning(\"W059\",left,m):state.isStrict()&&error(\"E008\"),state.option.evil||\"eval\"!==m&&\"execScript\"!==m||isGlobalEval(left,state)&&warning(\"W061\"),that},160,!0),infix(\"(\",function(left,that){state.option.immed&&left&&!left.immed&&\"function\"===left.id&&warning(\"W062\");var n=0,p=[];if(left&&\"(identifier)\"===left.type&&left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&-1===\"Array Number String Boolean Date Object Error Symbol\".indexOf(left.value)&&(\"Math\"===left.value?warning(\"W063\",left):state.option.newcap&&warning(\"W064\",left)),\")\"!==state.tokens.next.id)for(;p[p.length]=expression(10),n+=1,\",\"===state.tokens.next.id;)comma();return advance(\")\"),\"object\"==typeof left&&(state.inES5()||\"parseInt\"!==left.value||1!==n||warning(\"W065\",state.tokens.curr),state.option.evil||(\"eval\"===left.value||\"Function\"===left.value||\"execScript\"===left.value?(warning(\"W061\",left),p[0]&&\"(string)\"===[0].id&&addInternalSrc(left,p[0].value)):!p[0]||\"(string)\"!==p[0].id||\"setTimeout\"!==left.value&&\"setInterval\"!==left.value?!p[0]||\"(string)\"!==p[0].id||\".\"!==left.value||\"window\"!==left.left.value||\"setTimeout\"!==left.right&&\"setInterval\"!==left.right||(warning(\"W066\",left),addInternalSrc(left,p[0].value)):(warning(\"W066\",left),addInternalSrc(left,p[0].value))),left.identifier||\".\"===left.id||\"[\"===left.id||\"=>\"===left.id||\"(\"===left.id||\"&&\"===left.id||\"||\"===left.id||\"?\"===left.id||state.inES6()&&left[\"(name)\"]||warning(\"W067\",that)),that.left=left,that},155,!0).exps=!0,prefix(\"(\",function(){var pn1,ret,triggerFnExpr,first,last,pn=state.tokens.next,i=-1,parens=1,opening=state.tokens.curr,preceeding=state.tokens.prev,isNecessary=!state.option.singleGroups;do\"(\"===pn.value?parens+=1:\")\"===pn.value&&(parens-=1),i+=1,pn1=pn,pn=peek(i);while((0!==parens||\")\"!==pn1.value)&&\";\"!==pn.value&&\"(end)\"!==pn.type);if(\"function\"===state.tokens.next.id&&(triggerFnExpr=state.tokens.next.immed=!0),\"=>\"===pn.value)return doFunction({type:\"arrow\",parsedOpening:!0});var exprs=[];if(\")\"!==state.tokens.next.id)for(;exprs.push(expression(10)),\",\"===state.tokens.next.id;)state.option.nocomma&&warning(\"W127\"),comma();return advance(\")\",this),state.option.immed&&exprs[0]&&\"function\"===exprs[0].id&&\"(\"!==state.tokens.next.id&&\".\"!==state.tokens.next.id&&\"[\"!==state.tokens.next.id&&warning(\"W068\",this),exprs.length?(exprs.length>1?(ret=Object.create(state.syntax[\",\"]),ret.exprs=exprs,first=exprs[0],last=exprs[exprs.length-1],isNecessary||(isNecessary=preceeding.assign||preceeding.delim)):(ret=first=last=exprs[0],isNecessary||(isNecessary=opening.beginsStmt&&(\"{\"===ret.id||triggerFnExpr||isFunctor(ret))||triggerFnExpr&&(!isEndOfExpr()||\"}\"!==state.tokens.prev.id)||isFunctor(ret)&&!isEndOfExpr()||\"{\"===ret.id&&\"=>\"===preceeding.id||\"(number)\"===ret.type&&checkPunctuator(pn,\".\")&&/^\\d+$/.test(ret.value))),ret&&(!isNecessary&&(first.left||first.right||ret.exprs)&&(isNecessary=!isBeginOfExpr(preceeding)&&first.lbp<=preceeding.lbp||!isEndOfExpr()&&last.lbp<state.tokens.next.lbp),isNecessary||warning(\"W126\",opening),ret.paren=!0),ret):void 0}),application(\"=>\"),infix(\"[\",function(left,that){var s,e=expression(10);return e&&\"(string)\"===e.type&&(state.option.evil||\"eval\"!==e.value&&\"execScript\"!==e.value||isGlobalEval(left,state)&&warning(\"W061\"),countMember(e.value),!state.option.sub&®.identifier.test(e.value)&&(s=state.syntax[e.value],s&&isReserved(s)||warning(\"W069\",state.tokens.prev,e.value))),advance(\"]\",that),e&&\"hasOwnProperty\"===e.value&&\"=\"===state.tokens.next.value&&warning(\"W001\"),that.left=left,that.right=e,that},160,!0),prefix(\"[\",function(){var blocktype=lookupBlockType();if(blocktype.isCompArray)return state.option.esnext||state.inMoz()||warning(\"W118\",state.tokens.curr,\"array comprehension\"),comprehensiveArrayExpression();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;var b=state.tokens.curr.line!==startLine(state.tokens.next);for(this.first=[],b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));\"(end)\"!==state.tokens.next.id;){for(;\",\"===state.tokens.next.id;){if(!state.option.elision){if(state.inES5()){warning(\"W128\");do advance(\",\");while(\",\"===state.tokens.next.id);continue}warning(\"W070\")}advance(\",\")}if(\"]\"===state.tokens.next.id)break;if(this.first.push(expression(10)),\",\"!==state.tokens.next.id)break;if(comma({allowTrailing:!0}),\"]\"===state.tokens.next.id&&!state.inES5()){warning(\"W070\",state.tokens.curr);break}}return b&&(indent-=state.option.indent),advance(\"]\",this),this}),function(x){x.nud=function(){var b,f,i,p,t,nextVal,isGeneratorMethod=!1,props=Object.create(null);b=state.tokens.curr.line!==startLine(state.tokens.next),b&&(indent+=state.option.indent,state.tokens.next.from===indent+state.option.indent&&(indent+=state.option.indent));var blocktype=lookupBlockType();if(blocktype.isDestAssign)return this.destructAssign=destructuringPattern({openingParsed:!0,assignment:!0}),this;for(;\"}\"!==state.tokens.next.id;){if(nextVal=state.tokens.next.value,!state.tokens.next.identifier||\",\"!==peekIgnoreEOL().id&&\"}\"!==peekIgnoreEOL().id)if(\":\"===peek().id||\"get\"!==nextVal&&\"set\"!==nextVal){if(\"*\"===state.tokens.next.value&&\"(punctuator)\"===state.tokens.next.type?(state.inES6()||warning(\"W104\",state.tokens.next,\"generator functions\",\"6\"),advance(\"*\"),isGeneratorMethod=!0):isGeneratorMethod=!1,\"[\"===state.tokens.next.id)i=computedPropertyName(),state.nameStack.set(i);else if(state.nameStack.set(state.tokens.next),i=propertyName(),saveProperty(props,i,state.tokens.next),\"string\"!=typeof i)break;\"(\"===state.tokens.next.value?(state.inES6()||warning(\"W104\",state.tokens.curr,\"concise methods\",\"6\"),doFunction({type:isGeneratorMethod?\"generator\":null})):(advance(\":\"),expression(10))}else advance(nextVal),state.inES5()||error(\"E034\"),i=propertyName(),i||state.inES6()||error(\"E035\"),i&&saveAccessor(nextVal,props,i,state.tokens.curr),t=state.tokens.next,f=doFunction(),p=f[\"(params)\"],\"get\"===nextVal&&i&&p?warning(\"W076\",t,p[0],i):\"set\"!==nextVal||!i||p&&1===p.length||warning(\"W077\",t,i);else state.inES6()||warning(\"W104\",state.tokens.next,\"object short notation\",\"6\"),i=propertyName(!0),saveProperty(props,i,state.tokens.next),expression(10);if(countMember(i),\",\"!==state.tokens.next.id)break;comma({allowTrailing:!0,property:!0}),\",\"===state.tokens.next.id?warning(\"W070\",state.tokens.curr):\"}\"!==state.tokens.next.id||state.inES5()||warning(\"W070\",state.tokens.curr)}return b&&(indent-=state.option.indent),advance(\"}\",this),checkProperties(props),this},x.fud=function(){error(\"E036\",state.tokens.curr)}}(delim(\"{\"));var conststatement=stmt(\"const\",function(context){return blockVariableStatement(\"const\",this,context)});conststatement.exps=!0;var letstatement=stmt(\"let\",function(context){return blockVariableStatement(\"let\",this,context)});letstatement.exps=!0;var varstatement=stmt(\"var\",function(context){var tokens,lone,value,prefix=context&&context.prefix,inexport=context&&context.inexport,implied=context&&context.implied,report=!(context&&context.ignore);for(this.first=[];;){var names=[];_.contains([\"{\",\"[\"],state.tokens.next.value)?(tokens=destructuringPattern(),lone=!1):(tokens=[{id:identifier(),token:state.tokens.curr}],lone=!0),prefix&&implied||!report||!state.option.varstmt||warning(\"W132\",this),this.first=this.first.concat(names);for(var t in tokens)tokens.hasOwnProperty(t)&&(t=tokens[t],!implied&&state.funct[\"(global)\"]&&(predefined[t.id]===!1?warning(\"W079\",t.token,t.id):state.option.futurehostile===!1&&(!state.inES5()&&vars.ecmaIdentifiers[5][t.id]===!1||!state.inES6()&&vars.ecmaIdentifiers[6][t.id]===!1)&&warning(\"W129\",t.token,t.id)),t.id&&(\"for\"===implied?(state.funct[\"(scope)\"].has(t.id)||report&&warning(\"W088\",t.token,t.id),state.funct[\"(scope)\"].block.use(t.id,t.token)):(state.funct[\"(scope)\"].addlabel(t.id,{type:\"var\",token:t.token}),lone&&inexport&&state.funct[\"(scope)\"].setExported(t.id,t.token)),names.push(t.token)));if(\"=\"===state.tokens.next.id&&(state.nameStack.set(state.tokens.curr),advance(\"=\"),prefix||!report||state.funct[\"(loopage)\"]||\"undefined\"!==state.tokens.next.id||warning(\"W080\",state.tokens.prev,state.tokens.prev.value),\"=\"===peek(0).id&&state.tokens.next.identifier&&(!prefix&&report&&!state.funct[\"(params)\"]||-1===state.funct[\"(params)\"].indexOf(state.tokens.next.value))&&warning(\"W120\",state.tokens.next,state.tokens.next.value),value=expression(prefix?120:10),lone?tokens[0].first=value:destructuringPatternMatch(names,value)),\",\"!==state.tokens.next.id)break;comma()}return this});varstatement.exps=!0,blockstmt(\"class\",function(){return classdef.call(this,!0)}),blockstmt(\"function\",function(context){var inexport=context&&context.inexport,generator=!1;\"*\"===state.tokens.next.value&&(advance(\"*\"),state.inES6({strict:!0})?generator=!0:warning(\"W119\",state.tokens.curr,\"function*\",\"6\")),inblock&&warning(\"W082\",state.tokens.curr);var i=optionalidentifier();return state.funct[\"(scope)\"].addlabel(i,{type:\"function\",token:state.tokens.curr}),void 0===i?warning(\"W025\"):inexport&&state.funct[\"(scope)\"].setExported(i,state.tokens.prev),doFunction({name:i,statement:this,type:generator?\"generator\":null,ignoreLoopFunc:inblock}),\"(\"===state.tokens.next.id&&state.tokens.next.line===state.tokens.curr.line&&error(\"E039\"),this}),prefix(\"function\",function(){var generator=!1;\"*\"===state.tokens.next.value&&(state.inES6()||warning(\"W119\",state.tokens.curr,\"function*\",\"6\"),advance(\"*\"),generator=!0);var i=optionalidentifier();return doFunction({name:i,type:generator?\"generator\":null}),this}),blockstmt(\"if\",function(){var t=state.tokens.next;increaseComplexityCount(),state.condition=!0,advance(\"(\");var expr=expression(0);checkCondAssignment(expr);var forinifcheck=null;state.option.forin&&state.forinifcheckneeded&&(state.forinifcheckneeded=!1,forinifcheck=state.forinifchecks[state.forinifchecks.length-1],forinifcheck.type=\"(punctuator)\"===expr.type&&\"!\"===expr.value?\"(negative)\":\"(positive)\"),advance(\")\",t),state.condition=!1;var s=block(!0,!0);return forinifcheck&&\"(negative)\"===forinifcheck.type&&s&&s[0]&&\"(identifier)\"===s[0].type&&\"continue\"===s[0].value&&(forinifcheck.type=\"(negative-with-continue)\"),\"else\"===state.tokens.next.id&&(advance(\"else\"),\"if\"===state.tokens.next.id||\"switch\"===state.tokens.next.id?statement():block(!0,!0)),this}),blockstmt(\"try\",function(){function doCatch(){if(advance(\"catch\"),advance(\"(\"),state.funct[\"(scope)\"].stack(\"catchparams\"),checkPunctuators(state.tokens.next,[\"[\",\"{\"])){var tokens=destructuringPattern();_.each(tokens,function(token){token.id&&state.funct[\"(scope)\"].addParam(token.id,token,\"exception\")})}else\"(identifier)\"!==state.tokens.next.type?warning(\"E030\",state.tokens.next,state.tokens.next.value):state.funct[\"(scope)\"].addParam(identifier(),state.tokens.curr,\"exception\");\"if\"===state.tokens.next.value&&(state.inMoz()||warning(\"W118\",state.tokens.curr,\"catch filter\"),advance(\"if\"),expression(0)),advance(\")\"),block(!1),state.funct[\"(scope)\"].unstack()}var b;for(block(!0);\"catch\"===state.tokens.next.id;)increaseComplexityCount(),b&&!state.inMoz()&&warning(\"W118\",state.tokens.next,\"multiple catch blocks\"),doCatch(),b=!0;return\"finally\"===state.tokens.next.id?(advance(\"finally\"),block(!0),void 0):(b||error(\"E021\",state.tokens.next,\"catch\",state.tokens.next.value),this)}),blockstmt(\"while\",function(){var t=state.tokens.next;return state.funct[\"(breakage)\"]+=1,state.funct[\"(loopage)\"]+=1,increaseComplexityCount(),advance(\"(\"),checkCondAssignment(expression(0)),advance(\")\",t),block(!0,!0),state.funct[\"(breakage)\"]-=1,state.funct[\"(loopage)\"]-=1,this}).labelled=!0,blockstmt(\"with\",function(){var t=state.tokens.next;return state.isStrict()?error(\"E010\",state.tokens.curr):state.option.withstmt||warning(\"W085\",state.tokens.curr),advance(\"(\"),expression(0),advance(\")\",t),block(!0,!0),this}),blockstmt(\"switch\",function(){var t=state.tokens.next,g=!1,noindent=!1;\nfor(state.funct[\"(breakage)\"]+=1,advance(\"(\"),checkCondAssignment(expression(0)),advance(\")\",t),t=state.tokens.next,advance(\"{\"),state.tokens.next.from===indent&&(noindent=!0),noindent||(indent+=state.option.indent),this.cases=[];;)switch(state.tokens.next.id){case\"case\":switch(state.funct[\"(verb)\"]){case\"yield\":case\"break\":case\"case\":case\"continue\":case\"return\":case\"switch\":case\"throw\":break;default:state.tokens.curr.caseFallsThrough||warning(\"W086\",state.tokens.curr,\"case\")}advance(\"case\"),this.cases.push(expression(0)),increaseComplexityCount(),g=!0,advance(\":\"),state.funct[\"(verb)\"]=\"case\";break;case\"default\":switch(state.funct[\"(verb)\"]){case\"yield\":case\"break\":case\"continue\":case\"return\":case\"throw\":break;default:this.cases.length&&(state.tokens.curr.caseFallsThrough||warning(\"W086\",state.tokens.curr,\"default\"))}advance(\"default\"),g=!0,advance(\":\");break;case\"}\":return noindent||(indent-=state.option.indent),advance(\"}\",t),state.funct[\"(breakage)\"]-=1,state.funct[\"(verb)\"]=void 0,void 0;case\"(end)\":return error(\"E023\",state.tokens.next,\"}\"),void 0;default:if(indent+=state.option.indent,g)switch(state.tokens.curr.id){case\",\":return error(\"E040\"),void 0;case\":\":g=!1,statements();break;default:return error(\"E025\",state.tokens.curr),void 0}else{if(\":\"!==state.tokens.curr.id)return error(\"E021\",state.tokens.next,\"case\",state.tokens.next.value),void 0;advance(\":\"),error(\"E024\",state.tokens.curr,\":\"),statements()}indent-=state.option.indent}return this}).labelled=!0,stmt(\"debugger\",function(){return state.option.debug||warning(\"W087\",this),this}).exps=!0,function(){var x=stmt(\"do\",function(){state.funct[\"(breakage)\"]+=1,state.funct[\"(loopage)\"]+=1,increaseComplexityCount(),this.first=block(!0,!0),advance(\"while\");var t=state.tokens.next;return advance(\"(\"),checkCondAssignment(expression(0)),advance(\")\",t),state.funct[\"(breakage)\"]-=1,state.funct[\"(loopage)\"]-=1,this});x.labelled=!0,x.exps=!0}(),blockstmt(\"for\",function(){var s,t=state.tokens.next,letscope=!1,foreachtok=null;\"each\"===t.value&&(foreachtok=t,advance(\"each\"),state.inMoz()||warning(\"W118\",state.tokens.curr,\"for each\")),increaseComplexityCount(),advance(\"(\");var nextop,comma,initializer,i=0,inof=[\"in\",\"of\"],level=0;checkPunctuators(state.tokens.next,[\"{\",\"[\"])&&++level;do{if(nextop=peek(i),++i,checkPunctuators(nextop,[\"{\",\"[\"])?++level:checkPunctuators(nextop,[\"}\",\"]\"])&&--level,0>level)break;0===level&&(!comma&&checkPunctuator(nextop,\",\")?comma=nextop:!initializer&&checkPunctuator(nextop,\"=\")&&(initializer=nextop))}while(level>0||!_.contains(inof,nextop.value)&&\";\"!==nextop.value&&\"(end)\"!==nextop.type);if(_.contains(inof,nextop.value)){state.inES6()||\"of\"!==nextop.value||warning(\"W104\",nextop,\"for of\",\"6\");var ok=!(initializer||comma);if(initializer&&error(\"W133\",comma,nextop.value,\"initializer is forbidden\"),comma&&error(\"W133\",comma,nextop.value,\"more than one ForBinding\"),\"var\"===state.tokens.next.id?(advance(\"var\"),state.tokens.curr.fud({prefix:!0})):\"let\"===state.tokens.next.id||\"const\"===state.tokens.next.id?(advance(state.tokens.next.id),letscope=!0,state.funct[\"(scope)\"].stack(),state.tokens.curr.fud({prefix:!0})):Object.create(varstatement).fud({prefix:!0,implied:\"for\",ignore:!ok}),advance(nextop.value),expression(20),advance(\")\",t),\"in\"===nextop.value&&state.option.forin&&(state.forinifcheckneeded=!0,void 0===state.forinifchecks&&(state.forinifchecks=[]),state.forinifchecks.push({type:\"(none)\"})),state.funct[\"(breakage)\"]+=1,state.funct[\"(loopage)\"]+=1,s=block(!0,!0),\"in\"===nextop.value&&state.option.forin){if(state.forinifchecks&&state.forinifchecks.length>0){var check=state.forinifchecks.pop();(s&&s.length>0&&(\"object\"!=typeof s[0]||\"if\"!==s[0].value)||\"(positive)\"===check.type&&s.length>1||\"(negative)\"===check.type)&&warning(\"W089\",this)}state.forinifcheckneeded=!1}state.funct[\"(breakage)\"]-=1,state.funct[\"(loopage)\"]-=1}else{if(foreachtok&&error(\"E045\",foreachtok),\";\"!==state.tokens.next.id)if(\"var\"===state.tokens.next.id)advance(\"var\"),state.tokens.curr.fud();else if(\"let\"===state.tokens.next.id)advance(\"let\"),letscope=!0,state.funct[\"(scope)\"].stack(),state.tokens.curr.fud();else for(;expression(0,\"for\"),\",\"===state.tokens.next.id;)comma();if(nolinebreak(state.tokens.curr),advance(\";\"),state.funct[\"(loopage)\"]+=1,\";\"!==state.tokens.next.id&&checkCondAssignment(expression(0)),nolinebreak(state.tokens.curr),advance(\";\"),\";\"===state.tokens.next.id&&error(\"E021\",state.tokens.next,\")\",\";\"),\")\"!==state.tokens.next.id)for(;expression(0,\"for\"),\",\"===state.tokens.next.id;)comma();advance(\")\",t),state.funct[\"(breakage)\"]+=1,block(!0,!0),state.funct[\"(breakage)\"]-=1,state.funct[\"(loopage)\"]-=1}return letscope&&state.funct[\"(scope)\"].unstack(),this}).labelled=!0,stmt(\"break\",function(){var v=state.tokens.next.value;return state.option.asi||nolinebreak(this),\";\"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line!==startLine(state.tokens.next)?0===state.funct[\"(breakage)\"]&&warning(\"W052\",state.tokens.next,this.value):(state.funct[\"(scope)\"].funct.hasBreakLabel(v)||warning(\"W090\",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt(\"continue\",function(){var v=state.tokens.next.value;return 0===state.funct[\"(breakage)\"]&&warning(\"W052\",state.tokens.next,this.value),state.funct[\"(loopage)\"]||warning(\"W052\",state.tokens.next,this.value),state.option.asi||nolinebreak(this),\";\"===state.tokens.next.id||state.tokens.next.reach||state.tokens.curr.line===startLine(state.tokens.next)&&(state.funct[\"(scope)\"].funct.hasBreakLabel(v)||warning(\"W090\",state.tokens.next,v),this.first=state.tokens.next,advance()),reachable(this),this}).exps=!0,stmt(\"return\",function(){return this.line===startLine(state.tokens.next)?\";\"===state.tokens.next.id||state.tokens.next.reach||(this.first=expression(0),!this.first||\"(punctuator)\"!==this.first.type||\"=\"!==this.first.value||this.first.paren||state.option.boss||warningAt(\"W093\",this.first.line,this.first.character)):\"(punctuator)\"===state.tokens.next.type&&[\"[\",\"{\",\"+\",\"-\"].indexOf(state.tokens.next.value)>-1&&nolinebreak(this),reachable(this),this}).exps=!0,function(x){x.exps=!0,x.lbp=25}(prefix(\"yield\",function(){var prev=state.tokens.prev;state.inES6(!0)&&!state.funct[\"(generator)\"]?\"(catch)\"===state.funct[\"(name)\"]&&state.funct[\"(context)\"][\"(generator)\"]||error(\"E046\",state.tokens.curr,\"yield\"):state.inES6()||warning(\"W104\",state.tokens.curr,\"yield\",\"6\"),state.funct[\"(generator)\"]=\"yielded\";var delegatingYield=!1;return\"*\"===state.tokens.next.value&&(delegatingYield=!0,advance(\"*\")),this.line!==startLine(state.tokens.next)&&state.inMoz()?state.option.asi||nolinebreak(this):((delegatingYield||\";\"!==state.tokens.next.id&&!state.option.asi&&!state.tokens.next.reach&&state.tokens.next.nud)&&(nobreaknonadjacent(state.tokens.curr,state.tokens.next),this.first=expression(10),\"(punctuator)\"!==this.first.type||\"=\"!==this.first.value||this.first.paren||state.option.boss||warningAt(\"W093\",this.first.line,this.first.character)),state.inMoz()&&\")\"!==state.tokens.next.id&&(prev.lbp>30||!prev.assign&&!isEndOfExpr()||\"yield\"===prev.id)&&error(\"E050\",this)),this})),stmt(\"throw\",function(){return nolinebreak(this),this.first=expression(20),reachable(this),this}).exps=!0,stmt(\"import\",function(){if(state.inES6()||warning(\"W119\",state.tokens.curr,\"import\",\"6\"),\"(string)\"===state.tokens.next.type)return advance(\"(string)\"),this;if(state.tokens.next.identifier){if(this.name=identifier(),state.funct[\"(scope)\"].addlabel(this.name,{type:\"const\",token:state.tokens.curr}),\",\"!==state.tokens.next.value)return advance(\"from\"),advance(\"(string)\"),this;advance(\",\")}if(\"*\"===state.tokens.next.id)advance(\"*\"),advance(\"as\"),state.tokens.next.identifier&&(this.name=identifier(),state.funct[\"(scope)\"].addlabel(this.name,{type:\"const\",token:state.tokens.curr}));else for(advance(\"{\");;){if(\"}\"===state.tokens.next.value){advance(\"}\");break}var importName;if(\"default\"===state.tokens.next.type?(importName=\"default\",advance(\"default\")):importName=identifier(),\"as\"===state.tokens.next.value&&(advance(\"as\"),importName=identifier()),state.funct[\"(scope)\"].addlabel(importName,{type:\"const\",token:state.tokens.curr}),\",\"!==state.tokens.next.value){if(\"}\"===state.tokens.next.value){advance(\"}\");break}error(\"E024\",state.tokens.next,state.tokens.next.value);break}advance(\",\")}return advance(\"from\"),advance(\"(string)\"),this}).exps=!0,stmt(\"export\",function(){var token,identifier,ok=!0;if(state.inES6()||(warning(\"W119\",state.tokens.curr,\"export\",\"6\"),ok=!1),state.funct[\"(scope)\"].block.isGlobal()||(error(\"E053\",state.tokens.curr),ok=!1),\"*\"===state.tokens.next.value)return advance(\"*\"),advance(\"from\"),advance(\"(string)\"),this;if(\"default\"===state.tokens.next.type){state.nameStack.set(state.tokens.next),advance(\"default\");var exportType=state.tokens.next.id;return(\"function\"===exportType||\"class\"===exportType)&&(this.block=!0),token=peek(),expression(10),identifier=token.value,this.block&&(state.funct[\"(scope)\"].addlabel(identifier,{type:exportType,token:token}),state.funct[\"(scope)\"].setExported(identifier,token)),this}if(\"{\"===state.tokens.next.value){advance(\"{\");for(var exportedTokens=[];;){if(state.tokens.next.identifier||error(\"E030\",state.tokens.next,state.tokens.next.value),advance(),exportedTokens.push(state.tokens.curr),\"as\"===state.tokens.next.value&&(advance(\"as\"),state.tokens.next.identifier||error(\"E030\",state.tokens.next,state.tokens.next.value),advance()),\",\"!==state.tokens.next.value){if(\"}\"===state.tokens.next.value){advance(\"}\");break}error(\"E024\",state.tokens.next,state.tokens.next.value);break}advance(\",\")}return\"from\"===state.tokens.next.value?(advance(\"from\"),advance(\"(string)\")):ok&&exportedTokens.forEach(function(token){state.funct[\"(scope)\"].setExported(token.value,token)}),this}if(\"var\"===state.tokens.next.id)advance(\"var\"),state.tokens.curr.fud({inexport:!0});else if(\"let\"===state.tokens.next.id)advance(\"let\"),state.tokens.curr.fud({inexport:!0});else if(\"const\"===state.tokens.next.id)advance(\"const\"),state.tokens.curr.fud({inexport:!0});else if(\"function\"===state.tokens.next.id)this.block=!0,advance(\"function\"),state.syntax[\"function\"].fud({inexport:!0});else if(\"class\"===state.tokens.next.id){this.block=!0,advance(\"class\");var classNameToken=state.tokens.next;state.syntax[\"class\"].fud(),state.funct[\"(scope)\"].setExported(classNameToken.value,classNameToken)}else error(\"E024\",state.tokens.next,state.tokens.next.value);return this}).exps=!0,FutureReservedWord(\"abstract\"),FutureReservedWord(\"boolean\"),FutureReservedWord(\"byte\"),FutureReservedWord(\"char\"),FutureReservedWord(\"class\",{es5:!0,nud:classdef}),FutureReservedWord(\"double\"),FutureReservedWord(\"enum\",{es5:!0}),FutureReservedWord(\"export\",{es5:!0}),FutureReservedWord(\"extends\",{es5:!0}),FutureReservedWord(\"final\"),FutureReservedWord(\"float\"),FutureReservedWord(\"goto\"),FutureReservedWord(\"implements\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"import\",{es5:!0}),FutureReservedWord(\"int\"),FutureReservedWord(\"interface\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"long\"),FutureReservedWord(\"native\"),FutureReservedWord(\"package\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"private\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"protected\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"public\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"short\"),FutureReservedWord(\"static\",{es5:!0,strictOnly:!0}),FutureReservedWord(\"super\",{es5:!0}),FutureReservedWord(\"synchronized\"),FutureReservedWord(\"transient\"),FutureReservedWord(\"volatile\");var lookupBlockType=function(){var pn,pn1,prev,i=-1,bracketStack=0,ret={};checkPunctuators(state.tokens.curr,[\"[\",\"{\"])&&(bracketStack+=1);do{if(prev=-1===i?state.tokens.curr:pn,pn=-1===i?state.tokens.next:peek(i),pn1=peek(i+1),i+=1,checkPunctuators(pn,[\"[\",\"{\"])?bracketStack+=1:checkPunctuators(pn,[\"]\",\"}\"])&&(bracketStack-=1),1===bracketStack&&pn.identifier&&\"for\"===pn.value&&!checkPunctuator(prev,\".\")){ret.isCompArray=!0,ret.notJson=!0;break}if(0===bracketStack&&checkPunctuators(pn,[\"}\",\"]\"])){if(\"=\"===pn1.value){ret.isDestAssign=!0,ret.notJson=!0;break}if(\".\"===pn1.value){ret.notJson=!0;break}}checkPunctuator(pn,\";\")&&(ret.isBlock=!0,ret.notJson=!0)}while(bracketStack>0&&\"(end)\"!==pn.id);return ret},arrayComprehension=function(){function declare(v){var l=_current.variables.filter(function(elt){return elt.value===v?(elt.undef=!1,v):void 0}).length;return 0!==l}function use(v){var l=_current.variables.filter(function(elt){return elt.value!==v||elt.undef?void 0:(elt.unused===!0&&(elt.unused=!1),v)}).length;return 0===l}var _current,CompArray=function(){this.mode=\"use\",this.variables=[]},_carrays=[];return{stack:function(){_current=new CompArray,_carrays.push(_current)},unstack:function(){_current.variables.filter(function(v){v.unused&&warning(\"W098\",v.token,v.raw_text||v.value),v.undef&&state.funct[\"(scope)\"].block.use(v.value,v.token)}),_carrays.splice(-1,1),_current=_carrays[_carrays.length-1]},setState:function(s){_.contains([\"use\",\"define\",\"generate\",\"filter\"],s)&&(_current.mode=s)},check:function(v){return _current?_current&&\"use\"===_current.mode?(use(v)&&_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!0,unused:!1}),!0):_current&&\"define\"===_current.mode?(declare(v)||_current.variables.push({funct:state.funct,token:state.tokens.curr,value:v,undef:!1,unused:!0}),!0):_current&&\"generate\"===_current.mode?(state.funct[\"(scope)\"].block.use(v,state.tokens.curr),!0):_current&&\"filter\"===_current.mode?(use(v)&&state.funct[\"(scope)\"].block.use(v,state.tokens.curr),!0):!1:void 0}}},escapeRegex=function(str){return str.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")},itself=function(s,o,g){function each(obj,cb){obj&&(Array.isArray(obj)||\"object\"!=typeof obj||(obj=Object.keys(obj)),obj.forEach(cb))}var i,k,x,reIgnoreStr,reIgnore,optionKeys,newOptionObj={},newIgnoredObj={};o=_.clone(o),state.reset(),o&&o.scope?JSHINT.scope=o.scope:(JSHINT.errors=[],JSHINT.undefs=[],JSHINT.internals=[],JSHINT.blacklist={},JSHINT.scope=\"(main)\"),predefined=Object.create(null),combine(predefined,vars.ecmaIdentifiers[3]),combine(predefined,vars.reservedVars),combine(predefined,g||{}),declared=Object.create(null);var exported=Object.create(null);if(o)for(each(o.predef||null,function(item){var slice,prop;\"-\"===item[0]?(slice=item.slice(1),JSHINT.blacklist[slice]=slice,delete predefined[slice]):(prop=Object.getOwnPropertyDescriptor(o.predef,item),predefined[item]=prop?prop.value:!1)}),each(o.exported||null,function(item){exported[item]=!0}),delete o.predef,delete o.exported,optionKeys=Object.keys(o),x=0;optionKeys.length>x;x++)if(/^-W\\d{3}$/g.test(optionKeys[x]))newIgnoredObj[optionKeys[x].slice(1)]=!0;else{var optionKey=optionKeys[x];newOptionObj[optionKey]=o[optionKey],(\"esversion\"===optionKey&&5===o[optionKey]||\"es5\"===optionKey&&o[optionKey])&&warning(\"I003\"),\"newcap\"===optionKeys[x]&&o[optionKey]===!1&&(newOptionObj[\"(explicitNewcap)\"]=!0)}state.option=newOptionObj,state.ignored=newIgnoredObj,state.option.indent=state.option.indent||4,state.option.maxerr=state.option.maxerr||50,indent=1;var scopeManagerInst=scopeManager(state,predefined,exported,declared);if(scopeManagerInst.on(\"warning\",function(ev){warning.apply(null,[ev.code,ev.token].concat(ev.data))}),scopeManagerInst.on(\"error\",function(ev){error.apply(null,[ev.code,ev.token].concat(ev.data))}),state.funct=functor(\"(global)\",null,{\"(global)\":!0,\"(scope)\":scopeManagerInst,\"(comparray)\":arrayComprehension(),\"(metrics)\":createMetrics(state.tokens.next)}),functions=[state.funct],urls=[],stack=null,member={},membersOnly=null,inblock=!1,lookahead=[],!isString(s)&&!Array.isArray(s))return errorAt(\"E004\",0),!1;api={get isJSON(){return state.jsonMode},getOption:function(name){return state.option[name]||null},getCache:function(name){return state.cache[name]},setCache:function(name,value){state.cache[name]=value},warn:function(code,data){warningAt.apply(null,[code,data.line,data.char].concat(data.data))},on:function(names,listener){names.split(\" \").forEach(function(name){emitter.on(name,listener)}.bind(this))}},emitter.removeAllListeners(),(extraModules||[]).forEach(function(func){func(api)}),state.tokens.prev=state.tokens.curr=state.tokens.next=state.syntax[\"(begin)\"],o&&o.ignoreDelimiters&&(Array.isArray(o.ignoreDelimiters)||(o.ignoreDelimiters=[o.ignoreDelimiters]),o.ignoreDelimiters.forEach(function(delimiterPair){delimiterPair.start&&delimiterPair.end&&(reIgnoreStr=escapeRegex(delimiterPair.start)+\"[\\\\s\\\\S]*?\"+escapeRegex(delimiterPair.end),reIgnore=RegExp(reIgnoreStr,\"ig\"),s=s.replace(reIgnore,function(match){return match.replace(/./g,\" \")}))})),lex=new Lexer(s),lex.on(\"warning\",function(ev){warningAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on(\"error\",function(ev){errorAt.apply(null,[ev.code,ev.line,ev.character].concat(ev.data))}),lex.on(\"fatal\",function(ev){quit(\"E041\",ev.line,ev.from)}),lex.on(\"Identifier\",function(ev){emitter.emit(\"Identifier\",ev)}),lex.on(\"String\",function(ev){emitter.emit(\"String\",ev)}),lex.on(\"Number\",function(ev){emitter.emit(\"Number\",ev)}),lex.start();for(var name in o)_.has(o,name)&&checkOption(name,state.tokens.curr);assume(),combine(predefined,g||{}),comma.first=!0;try{switch(advance(),state.tokens.next.id){case\"{\":case\"[\":destructuringAssignOrJsonValue();break;default:directives(),state.directive[\"use strict\"]&&\"global\"!==state.option.strict&&warning(\"W097\",state.tokens.prev),statements()}\"(end)\"!==state.tokens.next.id&&quit(\"E041\",state.tokens.curr.line),state.funct[\"(scope)\"].unstack()}catch(err){if(!err||\"JSHintError\"!==err.name)throw err;var nt=state.tokens.next||{};JSHINT.errors.push({scope:\"(main)\",raw:err.raw,code:err.code,reason:err.message,line:err.line||nt.line,character:err.character||nt.from},null)}if(\"(main)\"===JSHINT.scope)for(o=o||{},i=0;JSHINT.internals.length>i;i+=1)k=JSHINT.internals[i],o.scope=k.elem,itself(k.value,o,g);return 0===JSHINT.errors.length};return itself.addModule=function(func){extraModules.push(func)},itself.addModule(style.register),itself.data=function(){var fu,f,i,j,n,globals,data={functions:[],options:state.option};itself.errors.length&&(data.errors=itself.errors),state.jsonMode&&(data.json=!0);var impliedGlobals=state.funct[\"(scope)\"].getImpliedGlobals();for(impliedGlobals.length>0&&(data.implieds=impliedGlobals),urls.length>0&&(data.urls=urls),globals=state.funct[\"(scope)\"].getUsedOrDefinedGlobals(),globals.length>0&&(data.globals=globals),i=1;functions.length>i;i+=1){for(f=functions[i],fu={},j=0;functionicity.length>j;j+=1)fu[functionicity[j]]=[];for(j=0;functionicity.length>j;j+=1)0===fu[functionicity[j]].length&&delete fu[functionicity[j]];fu.name=f[\"(name)\"],fu.param=f[\"(params)\"],fu.line=f[\"(line)\"],fu.character=f[\"(character)\"],fu.last=f[\"(last)\"],fu.lastcharacter=f[\"(lastcharacter)\"],fu.metrics={complexity:f[\"(metrics)\"].ComplexityCount,parameters:f[\"(metrics)\"].arity,statements:f[\"(metrics)\"].statementCount},data.functions.push(fu)}var unuseds=state.funct[\"(scope)\"].getUnuseds();unuseds.length>0&&(data.unused=unuseds);for(n in member)if(\"number\"==typeof member[n]){data.member=member;break}return data},itself.jshint=itself,itself}();\"object\"==typeof exports&&exports&&(exports.JSHINT=JSHINT)},{\"../lodash\":\"/node_modules/jshint/lodash.js\",\"./lex.js\":\"/node_modules/jshint/src/lex.js\",\"./messages.js\":\"/node_modules/jshint/src/messages.js\",\"./options.js\":\"/node_modules/jshint/src/options.js\",\"./reg.js\":\"/node_modules/jshint/src/reg.js\",\"./scope-manager.js\":\"/node_modules/jshint/src/scope-manager.js\",\"./state.js\":\"/node_modules/jshint/src/state.js\",\"./style.js\":\"/node_modules/jshint/src/style.js\",\"./vars.js\":\"/node_modules/jshint/src/vars.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/lex.js\":[function(_dereq_,module,exports){\"use strict\";function asyncTrigger(){var _checks=[];return{push:function(fn){_checks.push(fn)},check:function(){for(var check=0;_checks.length>check;++check)_checks[check]();_checks.splice(0,_checks.length)}}}function Lexer(source){var lines=source;\"string\"==typeof lines&&(lines=lines.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\").split(\"\\n\")),lines[0]&&\"#!\"===lines[0].substr(0,2)&&(-1!==lines[0].indexOf(\"node\")&&(state.option.node=!0),lines[0]=\"\"),this.emitter=new events.EventEmitter,this.source=source,this.setLines(lines),this.prereg=!0,this.line=0,this.char=1,this.from=1,this.input=\"\",this.inComment=!1,this.context=[],this.templateStarts=[];for(var i=0;state.option.indent>i;i+=1)state.tab+=\" \";this.ignoreLinterErrors=!1}var _=_dereq_(\"../lodash\"),events=_dereq_(\"events\"),reg=_dereq_(\"./reg.js\"),state=_dereq_(\"./state.js\").state,unicodeData=_dereq_(\"../data/ascii-identifier-data.js\"),asciiIdentifierStartTable=unicodeData.asciiIdentifierStartTable,asciiIdentifierPartTable=unicodeData.asciiIdentifierPartTable,Token={Identifier:1,Punctuator:2,NumericLiteral:3,StringLiteral:4,Comment:5,Keyword:6,NullLiteral:7,BooleanLiteral:8,RegExp:9,TemplateHead:10,TemplateMiddle:11,TemplateTail:12,NoSubstTemplate:13},Context={Block:1,Template:2};Lexer.prototype={_lines:[],inContext:function(ctxType){return this.context.length>0&&this.context[this.context.length-1].type===ctxType},pushContext:function(ctxType){this.context.push({type:ctxType})},popContext:function(){return this.context.pop()},isContext:function(context){return this.context.length>0&&this.context[this.context.length-1]===context},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=state.lines,this._lines},setLines:function(val){this._lines=val,state.lines=this._lines},peek:function(i){return this.input.charAt(i||0)},skip:function(i){i=i||1,this.char+=i,this.input=this.input.slice(i)},on:function(names,listener){names.split(\" \").forEach(function(name){this.emitter.on(name,listener)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(type,args,checks,fn){checks.push(function(){fn()&&this.trigger(type,args)}.bind(this))},scanPunctuator:function(){var ch2,ch3,ch4,ch1=this.peek();switch(ch1){case\".\":if(/^[0-9]$/.test(this.peek(1)))return null;if(\".\"===this.peek(1)&&\".\"===this.peek(2))return{type:Token.Punctuator,value:\"...\"};case\"(\":case\")\":case\";\":case\",\":case\"[\":case\"]\":case\":\":case\"~\":case\"?\":return{type:Token.Punctuator,value:ch1};case\"{\":return this.pushContext(Context.Block),{type:Token.Punctuator,value:ch1};case\"}\":return this.inContext(Context.Block)&&this.popContext(),{type:Token.Punctuator,value:ch1};case\"#\":return{type:Token.Punctuator,value:ch1};case\"\":return null}return ch2=this.peek(1),ch3=this.peek(2),ch4=this.peek(3),\">\"===ch1&&\">\"===ch2&&\">\"===ch3&&\"=\"===ch4?{type:Token.Punctuator,value:\">>>=\"}:\"=\"===ch1&&\"=\"===ch2&&\"=\"===ch3?{type:Token.Punctuator,value:\"===\"}:\"!\"===ch1&&\"=\"===ch2&&\"=\"===ch3?{type:Token.Punctuator,value:\"!==\"}:\">\"===ch1&&\">\"===ch2&&\">\"===ch3?{type:Token.Punctuator,value:\">>>\"}:\"<\"===ch1&&\"<\"===ch2&&\"=\"===ch3?{type:Token.Punctuator,value:\"<<=\"}:\">\"===ch1&&\">\"===ch2&&\"=\"===ch3?{type:Token.Punctuator,value:\">>=\"}:\"=\"===ch1&&\">\"===ch2?{type:Token.Punctuator,value:ch1+ch2}:ch1===ch2&&\"+-<>&|\".indexOf(ch1)>=0?{type:Token.Punctuator,value:ch1+ch2}:\"<>=!+-*%&|^\".indexOf(ch1)>=0?\"=\"===ch2?{type:Token.Punctuator,value:ch1+ch2}:{type:Token.Punctuator,value:ch1}:\"/\"===ch1?\"=\"===ch2?{type:Token.Punctuator,value:\"/=\"}:{type:Token.Punctuator,value:\"/\"}:null},scanComments:function(){function commentToken(label,body,opt){var special=[\"jshint\",\"jslint\",\"members\",\"member\",\"globals\",\"global\",\"exported\"],isSpecial=!1,value=label+body,commentType=\"plain\";return opt=opt||{},opt.isMultiline&&(value+=\"*/\"),body=body.replace(/\\n/g,\" \"),\"/*\"===label&®.fallsThrough.test(body)&&(isSpecial=!0,commentType=\"falls through\"),special.forEach(function(str){if(!isSpecial&&(\"//\"!==label||\"jshint\"===str)&&(\" \"===body.charAt(str.length)&&body.substr(0,str.length)===str&&(isSpecial=!0,label+=str,body=body.substr(str.length)),isSpecial||\" \"!==body.charAt(0)||\" \"!==body.charAt(str.length+1)||body.substr(1,str.length)!==str||(isSpecial=!0,label=label+\" \"+str,body=body.substr(str.length+1)),isSpecial))switch(str){case\"member\":commentType=\"members\";break;case\"global\":commentType=\"globals\";break;default:var options=body.split(\":\").map(function(v){return v.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")});if(2===options.length)switch(options[0]){case\"ignore\":switch(options[1]){case\"start\":self.ignoringLinterErrors=!0,isSpecial=!1;break;case\"end\":self.ignoringLinterErrors=!1,isSpecial=!1}}commentType=str}}),{type:Token.Comment,commentType:commentType,value:value,body:body,isSpecial:isSpecial,isMultiline:opt.isMultiline||!1,isMalformed:opt.isMalformed||!1}}var ch1=this.peek(),ch2=this.peek(1),rest=this.input.substr(2),startLine=this.line,startChar=this.char,self=this;if(\"*\"===ch1&&\"/\"===ch2)return this.trigger(\"error\",{code:\"E018\",line:startLine,character:startChar}),this.skip(2),null;if(\"/\"!==ch1||\"*\"!==ch2&&\"/\"!==ch2)return null;if(\"/\"===ch2)return this.skip(this.input.length),commentToken(\"//\",rest);var body=\"\";if(\"*\"===ch2){for(this.inComment=!0,this.skip(2);\"*\"!==this.peek()||\"/\"!==this.peek(1);)if(\"\"===this.peek()){if(body+=\"\\n\",!this.nextLine())return this.trigger(\"error\",{code:\"E017\",line:startLine,character:startChar}),this.inComment=!1,commentToken(\"/*\",body,{isMultiline:!0,isMalformed:!0})}else body+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,commentToken(\"/*\",body,{isMultiline:!0})}},scanKeyword:function(){var result=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),keywords=[\"if\",\"in\",\"do\",\"var\",\"for\",\"new\",\"try\",\"let\",\"this\",\"else\",\"case\",\"void\",\"with\",\"enum\",\"while\",\"break\",\"catch\",\"throw\",\"const\",\"yield\",\"class\",\"super\",\"return\",\"typeof\",\"delete\",\"switch\",\"export\",\"import\",\"default\",\"finally\",\"extends\",\"function\",\"continue\",\"debugger\",\"instanceof\"];return result&&keywords.indexOf(result[0])>=0?{type:Token.Keyword,value:result[0]}:null},scanIdentifier:function(){function isNonAsciiIdentifierStart(code){return code>256}function isNonAsciiIdentifierPart(code){return code>256}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function removeEscapeSequences(id){return id.replace(/\\\\u([0-9a-fA-F]{4})/g,function(m0,codepoint){return String.fromCharCode(parseInt(codepoint,16))})}var type,char,id=\"\",index=0,readUnicodeEscapeSequence=function(){if(index+=1,\"u\"!==this.peek(index))return null;var code,ch1=this.peek(index+1),ch2=this.peek(index+2),ch3=this.peek(index+3),ch4=this.peek(index+4);return isHexDigit(ch1)&&isHexDigit(ch2)&&isHexDigit(ch3)&&isHexDigit(ch4)?(code=parseInt(ch1+ch2+ch3+ch4,16),asciiIdentifierPartTable[code]||isNonAsciiIdentifierPart(code)?(index+=5,\"\\\\u\"+ch1+ch2+ch3+ch4):null):null}.bind(this),getIdentifierStart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierStartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierStart(code)?(index+=1,chr):null}.bind(this),getIdentifierPart=function(){var chr=this.peek(index),code=chr.charCodeAt(0);return 92===code?readUnicodeEscapeSequence():128>code?asciiIdentifierPartTable[code]?(index+=1,chr):null:isNonAsciiIdentifierPart(code)?(index+=1,chr):null}.bind(this);if(char=getIdentifierStart(),null===char)return null;for(id=char;char=getIdentifierPart(),null!==char;)id+=char;switch(id){case\"true\":case\"false\":type=Token.BooleanLiteral;break;case\"null\":type=Token.NullLiteral;break;default:type=Token.Identifier}return{type:type,value:removeEscapeSequences(id),text:id,tokenLength:id.length}},scanNumericLiteral:function(){function isDecimalDigit(str){return/^[0-9]$/.test(str)}function isOctalDigit(str){return/^[0-7]$/.test(str)}function isBinaryDigit(str){return/^[01]$/.test(str)}function isHexDigit(str){return/^[0-9a-fA-F]$/.test(str)}function isIdentifierStart(ch){return\"$\"===ch||\"_\"===ch||\"\\\\\"===ch||ch>=\"a\"&&\"z\">=ch||ch>=\"A\"&&\"Z\">=ch}var bad,index=0,value=\"\",length=this.input.length,char=this.peek(index),isAllowedDigit=isDecimalDigit,base=10,isLegacy=!1;if(\".\"!==char&&!isDecimalDigit(char))return null;if(\".\"!==char){for(value=this.peek(index),index+=1,char=this.peek(index),\"0\"===value&&((\"x\"===char||\"X\"===char)&&(isAllowedDigit=isHexDigit,base=16,index+=1,value+=char),(\"o\"===char||\"O\"===char)&&(isAllowedDigit=isOctalDigit,base=8,state.inES6(!0)||this.trigger(\"warning\",{code:\"W119\",line:this.line,character:this.char,data:[\"Octal integer literal\",\"6\"]}),index+=1,value+=char),(\"b\"===char||\"B\"===char)&&(isAllowedDigit=isBinaryDigit,base=2,state.inES6(!0)||this.trigger(\"warning\",{code:\"W119\",line:this.line,character:this.char,data:[\"Binary integer literal\",\"6\"]}),index+=1,value+=char),isOctalDigit(char)&&(isAllowedDigit=isOctalDigit,base=8,isLegacy=!0,bad=!1,index+=1,value+=char),!isOctalDigit(char)&&isDecimalDigit(char)&&(index+=1,value+=char));length>index;){if(char=this.peek(index),isLegacy&&isDecimalDigit(char))bad=!0;else if(!isAllowedDigit(char))break;value+=char,index+=1}if(isAllowedDigit!==isDecimalDigit)return!isLegacy&&2>=value.length?{type:Token.NumericLiteral,value:value,isMalformed:!0}:length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isLegacy:isLegacy,isMalformed:!1}}if(\".\"===char)for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1;if(\"e\"===char||\"E\"===char){if(value+=char,index+=1,char=this.peek(index),(\"+\"===char||\"-\"===char)&&(value+=this.peek(index),index+=1),char=this.peek(index),!isDecimalDigit(char))return null;for(value+=char,index+=1;length>index&&(char=this.peek(index),isDecimalDigit(char));)value+=char,index+=1}return length>index&&(char=this.peek(index),isIdentifierStart(char))?null:{type:Token.NumericLiteral,value:value,base:base,isMalformed:!isFinite(value)}},scanEscapeSequence:function(checks){var allowNewLine=!1,jump=1;this.skip();var char=this.peek();switch(char){case\"'\":this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\'\"]},checks,function(){return state.jsonMode});break;case\"b\":char=\"\\\\b\";break;case\"f\":char=\"\\\\f\";break;case\"n\":char=\"\\\\n\";break;case\"r\":char=\"\\\\r\";break;case\"t\":char=\"\\\\t\";break;case\"0\":char=\"\\\\0\";var n=parseInt(this.peek(1),10);this.triggerAsync(\"warning\",{code:\"W115\",line:this.line,character:this.char},checks,function(){return n>=0&&7>=n&&state.isStrict()});break;case\"u\":var hexCode=this.input.substr(1,4),code=parseInt(hexCode,16);isNaN(code)&&this.trigger(\"warning\",{code:\"W052\",line:this.line,character:this.char,data:[\"u\"+hexCode]}),char=String.fromCharCode(code),jump=5;break;case\"v\":this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\v\"]},checks,function(){return state.jsonMode}),char=\"\u000b\";break;case\"x\":var x=parseInt(this.input.substr(1,2),16);this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"\\\\x-\"]},checks,function(){return state.jsonMode}),char=String.fromCharCode(x),jump=3;break;case\"\\\\\":char=\"\\\\\\\\\";break;case'\"':char='\\\\\"';break;case\"/\":break;case\"\":allowNewLine=!0,char=\"\"}return{\"char\":char,jump:jump,allowNewLine:allowNewLine}},scanTemplateLiteral:function(checks){var tokenType,ch,value=\"\",startLine=this.line,startChar=this.char,depth=this.templateStarts.length;if(!state.inES6(!0))return null;if(\"`\"===this.peek())tokenType=Token.TemplateHead,this.templateStarts.push({line:this.line,\"char\":this.char}),depth=this.templateStarts.length,this.skip(1),this.pushContext(Context.Template);else{if(!this.inContext(Context.Template)||\"}\"!==this.peek())return null;tokenType=Token.TemplateMiddle}for(;\"`\"!==this.peek();){for(;\"\"===(ch=this.peek());)if(value+=\"\\n\",!this.nextLine()){var startPos=this.templateStarts.pop();return this.trigger(\"error\",{code:\"E052\",line:startPos.line,character:startPos.char}),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,depth:depth,context:this.popContext()}}if(\"$\"===ch&&\"{\"===this.peek(1))return value+=\"${\",this.skip(2),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.currentContext()};\nif(\"\\\\\"===ch){var escape=this.scanEscapeSequence(checks);value+=escape.char,this.skip(escape.jump)}else\"`\"!==ch&&(value+=ch,this.skip(1))}return tokenType=tokenType===Token.TemplateHead?Token.NoSubstTemplate:Token.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:tokenType,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,depth:depth,context:this.popContext()}},scanStringLiteral:function(checks){var quote=this.peek();if('\"'!==quote&&\"'\"!==quote)return null;this.triggerAsync(\"warning\",{code:\"W108\",line:this.line,character:this.char},checks,function(){return state.jsonMode&&'\"'!==quote});var value=\"\",startLine=this.line,startChar=this.char,allowNewLine=!1;for(this.skip();this.peek()!==quote;)if(\"\"===this.peek()){if(allowNewLine?(allowNewLine=!1,this.triggerAsync(\"warning\",{code:\"W043\",line:this.line,character:this.char},checks,function(){return!state.option.multistr}),this.triggerAsync(\"warning\",{code:\"W042\",line:this.line,character:this.char},checks,function(){return state.jsonMode&&state.option.multistr})):this.trigger(\"warning\",{code:\"W112\",line:this.line,character:this.char}),!this.nextLine())return this.trigger(\"error\",{code:\"E029\",line:startLine,character:startChar}),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!0,quote:quote}}else{allowNewLine=!1;var char=this.peek(),jump=1;if(\" \">char&&this.trigger(\"warning\",{code:\"W113\",line:this.line,character:this.char,data:[\"<non-printable>\"]}),\"\\\\\"===char){var parsed=this.scanEscapeSequence(checks);char=parsed.char,jump=parsed.jump,allowNewLine=parsed.allowNewLine}value+=char,this.skip(jump)}return this.skip(),{type:Token.StringLiteral,value:value,startLine:startLine,startChar:startChar,isUnclosed:!1,quote:quote}},scanRegExp:function(){var terminated,index=0,length=this.input.length,char=this.peek(),value=char,body=\"\",flags=[],malformed=!1,isCharSet=!1,scanUnexpectedChars=function(){\" \">char&&(malformed=!0,this.trigger(\"warning\",{code:\"W048\",line:this.line,character:this.char})),\"<\"===char&&(malformed=!0,this.trigger(\"warning\",{code:\"W049\",line:this.line,character:this.char,data:[char]}))}.bind(this);if(!this.prereg||\"/\"!==char)return null;for(index+=1,terminated=!1;length>index;)if(char=this.peek(index),value+=char,body+=char,isCharSet)\"]\"===char&&(\"\\\\\"!==this.peek(index-1)||\"\\\\\"===this.peek(index-2))&&(isCharSet=!1),\"\\\\\"===char&&(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars()),index+=1;else{if(\"\\\\\"===char){if(index+=1,char=this.peek(index),body+=char,value+=char,scanUnexpectedChars(),\"/\"===char){index+=1;continue}if(\"[\"===char){index+=1;continue}}if(\"[\"!==char){if(\"/\"===char){body=body.substr(0,body.length-1),terminated=!0,index+=1;break}index+=1}else isCharSet=!0,index+=1}if(!terminated)return this.trigger(\"error\",{code:\"E015\",line:this.line,character:this.from}),void this.trigger(\"fatal\",{line:this.line,from:this.from});for(;length>index&&(char=this.peek(index),/[gim]/.test(char));)flags.push(char),value+=char,index+=1;try{RegExp(body,flags.join(\"\"))}catch(err){malformed=!0,this.trigger(\"error\",{code:\"E016\",line:this.line,character:this.char,data:[err.message]})}return{type:Token.RegExp,value:value,flags:flags,isMalformed:malformed}},scanNonBreakingSpaces:function(){return state.option.nonbsp?this.input.search(/(\\u00A0)/):-1},scanUnsafeChars:function(){return this.input.search(reg.unsafeChars)},next:function(checks){this.from=this.char;var start;if(/\\s/.test(this.peek()))for(start=this.char;/\\s/.test(this.peek());)this.from+=1,this.skip();var match=this.scanComments()||this.scanStringLiteral(checks)||this.scanTemplateLiteral(checks);return match?match:(match=this.scanRegExp()||this.scanPunctuator()||this.scanKeyword()||this.scanIdentifier()||this.scanNumericLiteral(),match?(this.skip(match.tokenLength||match.value.length),match):null)},nextLine:function(){var char;if(this.line>=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var inputTrimmed=this.input.trim(),startsWith=function(){return _.some(arguments,function(prefix){return 0===inputTrimmed.indexOf(prefix)})},endsWith=function(){return _.some(arguments,function(suffix){return-1!==inputTrimmed.indexOf(suffix,inputTrimmed.length-suffix.length)})};if(this.ignoringLinterErrors===!0&&(startsWith(\"/*\",\"//\")||this.inComment&&endsWith(\"*/\")||(this.input=\"\")),char=this.scanNonBreakingSpaces(),char>=0&&this.trigger(\"warning\",{code:\"W125\",line:this.line,character:char+1}),this.input=this.input.replace(/\\t/g,state.tab),char=this.scanUnsafeChars(),char>=0&&this.trigger(\"warning\",{code:\"W100\",line:this.line,character:char}),!this.ignoringLinterErrors&&state.option.maxlen&&state.option.maxlen<this.input.length){var inComment=this.inComment||startsWith.call(inputTrimmed,\"//\")||startsWith.call(inputTrimmed,\"/*\"),shouldTriggerError=!inComment||!reg.maxlenException.test(inputTrimmed);shouldTriggerError&&this.trigger(\"warning\",{code:\"W101\",line:this.line,character:this.input.length})}return!0},start:function(){this.nextLine()},token:function(){function isReserved(token,isProperty){if(!token.reserved)return!1;var meta=token.meta;if(meta&&meta.isFutureReservedWord&&state.inES5()){if(!meta.es5)return!1;if(meta.strictOnly&&!state.option.strict&&!state.isStrict())return!1;if(isProperty)return!1}return!0}for(var token,checks=asyncTrigger(),create=function(type,value,isProperty,token){var obj;if(\"(endline)\"!==type&&\"(end)\"!==type&&(this.prereg=!1),\"(punctuator)\"===type){switch(value){case\".\":case\")\":case\"~\":case\"#\":case\"]\":case\"++\":case\"--\":this.prereg=!1;break;default:this.prereg=!0}obj=Object.create(state.syntax[value]||state.syntax[\"(error)\"])}return\"(identifier)\"===type&&((\"return\"===value||\"case\"===value||\"typeof\"===value)&&(this.prereg=!0),_.has(state.syntax,value)&&(obj=Object.create(state.syntax[value]||state.syntax[\"(error)\"]),isReserved(obj,isProperty&&\"(identifier)\"===type)||(obj=null))),obj||(obj=Object.create(state.syntax[type])),obj.identifier=\"(identifier)\"===type,obj.type=obj.type||type,obj.value=value,obj.line=this.line,obj.character=this.char,obj.from=this.from,obj.identifier&&token&&(obj.raw_text=token.text||token.value),token&&token.startLine&&token.startLine!==this.line&&(obj.startLine=token.startLine),token&&token.context&&(obj.context=token.context),token&&token.depth&&(obj.depth=token.depth),token&&token.isUnclosed&&(obj.isUnclosed=token.isUnclosed),isProperty&&obj.identifier&&(obj.isProperty=isProperty),obj.check=checks.check,obj}.bind(this);;){if(!this.input.length)return this.nextLine()?create(\"(endline)\",\"\"):this.exhausted?null:(this.exhausted=!0,create(\"(end)\",\"\"));if(token=this.next(checks))switch(token.type){case Token.StringLiteral:return this.triggerAsync(\"String\",{line:this.line,\"char\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value,quote:token.quote},checks,function(){return!0}),create(\"(string)\",token.value,null,token);case Token.TemplateHead:return this.trigger(\"TemplateHead\",{line:this.line,\"char\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\"(template)\",token.value,null,token);case Token.TemplateMiddle:return this.trigger(\"TemplateMiddle\",{line:this.line,\"char\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\"(template middle)\",token.value,null,token);case Token.TemplateTail:return this.trigger(\"TemplateTail\",{line:this.line,\"char\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\"(template tail)\",token.value,null,token);case Token.NoSubstTemplate:return this.trigger(\"NoSubstTemplate\",{line:this.line,\"char\":this.char,from:this.from,startLine:token.startLine,startChar:token.startChar,value:token.value}),create(\"(no subst template)\",token.value,null,token);case Token.Identifier:this.triggerAsync(\"Identifier\",{line:this.line,\"char\":this.char,from:this.form,name:token.value,raw_name:token.text,isProperty:\".\"===state.tokens.curr.id},checks,function(){return!0});case Token.Keyword:case Token.NullLiteral:case Token.BooleanLiteral:return create(\"(identifier)\",token.value,\".\"===state.tokens.curr.id,token);case Token.NumericLiteral:return token.isMalformed&&this.trigger(\"warning\",{code:\"W045\",line:this.line,character:this.char,data:[token.value]}),this.triggerAsync(\"warning\",{code:\"W114\",line:this.line,character:this.char,data:[\"0x-\"]},checks,function(){return 16===token.base&&state.jsonMode}),this.triggerAsync(\"warning\",{code:\"W115\",line:this.line,character:this.char},checks,function(){return state.isStrict()&&8===token.base&&token.isLegacy}),this.trigger(\"Number\",{line:this.line,\"char\":this.char,from:this.from,value:token.value,base:token.base,isMalformed:token.malformed}),create(\"(number)\",token.value);case Token.RegExp:return create(\"(regexp)\",token.value);case Token.Comment:if(state.tokens.curr.comment=!0,token.isSpecial)return{id:\"(comment)\",value:token.value,body:token.body,type:token.commentType,isSpecial:token.isSpecial,line:this.line,character:this.char,from:this.from};break;case\"\":break;default:return create(\"(punctuator)\",token.value)}else this.input.length&&(this.trigger(\"error\",{code:\"E024\",line:this.line,character:this.char,data:[this.peek()]}),this.input=\"\")}}},exports.Lexer=Lexer,exports.Context=Context},{\"../data/ascii-identifier-data.js\":\"/node_modules/jshint/data/ascii-identifier-data.js\",\"../lodash\":\"/node_modules/jshint/lodash.js\",\"./reg.js\":\"/node_modules/jshint/src/reg.js\",\"./state.js\":\"/node_modules/jshint/src/state.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/messages.js\":[function(_dereq_,module,exports){\"use strict\";var _=_dereq_(\"../lodash\"),errors={E001:\"Bad option: '{a}'.\",E002:\"Bad option value.\",E003:\"Expected a JSON value.\",E004:\"Input is neither a string nor an array of strings.\",E005:\"Input is empty.\",E006:\"Unexpected early end of program.\",E007:'Missing \"use strict\" statement.',E008:\"Strict violation.\",E009:\"Option 'validthis' can't be used in a global scope.\",E010:\"'with' is not allowed in strict mode.\",E011:\"'{a}' has already been declared.\",E012:\"const '{a}' is initialized to 'undefined'.\",E013:\"Attempting to override '{a}' which is a constant.\",E014:\"A regular expression literal can be confused with '/='.\",E015:\"Unclosed regular expression.\",E016:\"Invalid regular expression.\",E017:\"Unclosed comment.\",E018:\"Unbegun comment.\",E019:\"Unmatched '{a}'.\",E020:\"Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.\",E021:\"Expected '{a}' and instead saw '{b}'.\",E022:\"Line breaking error '{a}'.\",E023:\"Missing '{a}'.\",E024:\"Unexpected '{a}'.\",E025:\"Missing ':' on a case clause.\",E026:\"Missing '}' to match '{' from line {a}.\",E027:\"Missing ']' to match '[' from line {a}.\",E028:\"Illegal comma.\",E029:\"Unclosed string.\",E030:\"Expected an identifier and instead saw '{a}'.\",E031:\"Bad assignment.\",E032:\"Expected a small integer or 'false' and instead saw '{a}'.\",E033:\"Expected an operator and instead saw '{a}'.\",E034:\"get/set are ES5 features.\",E035:\"Missing property name.\",E036:\"Expected to see a statement and instead saw a block.\",E037:null,E038:null,E039:\"Function declarations are not invocable. Wrap the whole function invocation in parens.\",E040:\"Each value should have its own case label.\",E041:\"Unrecoverable syntax error.\",E042:\"Stopping.\",E043:\"Too many errors.\",E044:null,E045:\"Invalid for each loop.\",E046:\"A yield statement shall be within a generator function (with syntax: `function*`)\",E047:null,E048:\"{a} declaration not directly within block.\",E049:\"A {a} cannot be named '{b}'.\",E050:\"Mozilla acequires the yield expression to be parenthesized here.\",E051:null,E052:\"Unclosed template literal.\",E053:\"Export declaration must be in global scope.\",E054:\"Class properties must be methods. Expected '(' but instead saw '{a}'.\",E055:\"The '{a}' option cannot be set after any executable code.\",E056:\"'{a}' was used before it was declared, which is illegal for '{b}' variables.\",E057:\"Invalid meta property: '{a}.{b}'.\",E058:\"Missing semicolon.\"},warnings={W001:\"'hasOwnProperty' is a really bad name.\",W002:\"Value of '{a}' may be overwritten in IE 8 and earlier.\",W003:\"'{a}' was used before it was defined.\",W004:\"'{a}' is already defined.\",W005:\"A dot following a number can be confused with a decimal point.\",W006:\"Confusing minuses.\",W007:\"Confusing plusses.\",W008:\"A leading decimal point can be confused with a dot: '{a}'.\",W009:\"The array literal notation [] is preferable.\",W010:\"The object literal notation {} is preferable.\",W011:null,W012:null,W013:null,W014:\"Bad line breaking before '{a}'.\",W015:null,W016:\"Unexpected use of '{a}'.\",W017:\"Bad operand.\",W018:\"Confusing use of '{a}'.\",W019:\"Use the isNaN function to compare with NaN.\",W020:\"Read only.\",W021:\"Reassignment of '{a}', which is is a {b}. Use 'var' or 'let' to declare bindings that may change.\",W022:\"Do not assign to the exception parameter.\",W023:\"Expected an identifier in an assignment and instead saw a function invocation.\",W024:\"Expected an identifier and instead saw '{a}' (a reserved word).\",W025:\"Missing name in function declaration.\",W026:\"Inner functions should be listed at the top of the outer function.\",W027:\"Unreachable '{a}' after '{b}'.\",W028:\"Label '{a}' on {b} statement.\",W030:\"Expected an assignment or function call and instead saw an expression.\",W031:\"Do not use 'new' for side effects.\",W032:\"Unnecessary semicolon.\",W033:\"Missing semicolon.\",W034:'Unnecessary directive \"{a}\".',W035:\"Empty block.\",W036:\"Unexpected /*member '{a}'.\",W037:\"'{a}' is a statement label.\",W038:\"'{a}' used out of scope.\",W039:\"'{a}' is not allowed.\",W040:\"Possible strict violation.\",W041:\"Use '{a}' to compare with '{b}'.\",W042:\"Avoid EOL escaping.\",W043:\"Bad escaping of EOL. Use option multistr if needed.\",W044:\"Bad or unnecessary escaping.\",W045:\"Bad number '{a}'.\",W046:\"Don't use extra leading zeros '{a}'.\",W047:\"A trailing decimal point can be confused with a dot: '{a}'.\",W048:\"Unexpected control character in regular expression.\",W049:\"Unexpected escaped character '{a}' in regular expression.\",W050:\"JavaScript URL.\",W051:\"Variables should not be deleted.\",W052:\"Unexpected '{a}'.\",W053:\"Do not use {a} as a constructor.\",W054:\"The Function constructor is a form of eval.\",W055:\"A constructor name should start with an uppercase letter.\",W056:\"Bad constructor.\",W057:\"Weird construction. Is 'new' necessary?\",W058:\"Missing '()' invoking a constructor.\",W059:\"Avoid arguments.{a}.\",W060:\"document.write can be a form of eval.\",W061:\"eval can be harmful.\",W062:\"Wrap an immediate function invocation in parens to assist the reader in understanding that the expression is the result of a function, and not the function itself.\",W063:\"Math is not a function.\",W064:\"Missing 'new' prefix when invoking a constructor.\",W065:\"Missing radix parameter.\",W066:\"Implied eval. Consider passing a function instead of a string.\",W067:\"Bad invocation.\",W068:\"Wrapping non-IIFE function literals in parens is unnecessary.\",W069:\"['{a}'] is better written in dot notation.\",W070:\"Extra comma. (it breaks older versions of IE)\",W071:\"This function has too many statements. ({a})\",W072:\"This function has too many parameters. ({a})\",W073:\"Blocks are nested too deeply. ({a})\",W074:\"This function's cyclomatic complexity is too high. ({a})\",W075:\"Duplicate {a} '{b}'.\",W076:\"Unexpected parameter '{a}' in get {b} function.\",W077:\"Expected a single parameter in set {a} function.\",W078:\"Setter is defined without getter.\",W079:\"Redefinition of '{a}'.\",W080:\"It's not necessary to initialize '{a}' to 'undefined'.\",W081:null,W082:\"Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.\",W083:\"Don't make functions within a loop.\",W084:\"Assignment in conditional expression\",W085:\"Don't use 'with'.\",W086:\"Expected a 'break' statement before '{a}'.\",W087:\"Forgotten 'debugger' statement?\",W088:\"Creating global 'for' variable. Should be 'for (var {a} ...'.\",W089:\"The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.\",W090:\"'{a}' is not a statement label.\",W091:null,W093:\"Did you mean to return a conditional instead of an assignment?\",W094:\"Unexpected comma.\",W095:\"Expected a string and instead saw {a}.\",W096:\"The '{a}' key may produce unexpected results.\",W097:'Use the function form of \"use strict\".',W098:\"'{a}' is defined but never used.\",W099:null,W100:\"This character may get silently deleted by one or more browsers.\",W101:\"Line is too long.\",W102:null,W103:\"The '{a}' property is deprecated.\",W104:\"'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).\",W105:\"Unexpected {a} in '{b}'.\",W106:\"Identifier '{a}' is not in camel case.\",W107:\"Script URL.\",W108:\"Strings must use doublequote.\",W109:\"Strings must use singlequote.\",W110:\"Mixed double and single quotes.\",W112:\"Unclosed string.\",W113:\"Control character in string: {a}.\",W114:\"Avoid {a}.\",W115:\"Octal literals are not allowed in strict mode.\",W116:\"Expected '{a}' and instead saw '{b}'.\",W117:\"'{a}' is not defined.\",W118:\"'{a}' is only available in Mozilla JavaScript extensions (use moz option).\",W119:\"'{a}' is only available in ES{b} (use 'esversion: {b}').\",W120:\"You might be leaking a variable ({a}) here.\",W121:\"Extending prototype of native object: '{a}'.\",W122:\"Invalid typeof value '{a}'\",W123:\"'{a}' is already defined in outer scope.\",W124:\"A generator function shall contain a yield statement.\",W125:\"This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp\",W126:\"Unnecessary grouping operator.\",W127:\"Unexpected use of a comma operator.\",W128:\"Empty array elements acequire elision=true.\",W129:\"'{a}' is defined in a future version of JavaScript. Use a different variable name to avoid migration issues.\",W130:\"Invalid element after rest element.\",W131:\"Invalid parameter after rest parameter.\",W132:\"`var` declarations are forbidden. Use `let` or `const` instead.\",W133:\"Invalid for-{a} loop left-hand-side: {b}.\",W134:\"The '{a}' option is only available when linting ECMAScript {b} code.\",W135:\"{a} may not be supported by non-browser environments.\",W136:\"'{a}' must be in function scope.\",W137:\"Empty destructuring.\",W138:\"Regular parameters should not come after default parameters.\"},info={I001:\"Comma warnings can be turned off with 'laxcomma'.\",I002:null,I003:\"ES5 option is now set per default\"};exports.errors={},exports.warnings={},exports.info={},_.each(errors,function(desc,code){exports.errors[code]={code:code,desc:desc}}),_.each(warnings,function(desc,code){exports.warnings[code]={code:code,desc:desc}}),_.each(info,function(desc,code){exports.info[code]={code:code,desc:desc}})},{\"../lodash\":\"/node_modules/jshint/lodash.js\"}],\"/node_modules/jshint/src/name-stack.js\":[function(_dereq_,module){\"use strict\";function NameStack(){this._stack=[]}Object.defineProperty(NameStack.prototype,\"length\",{get:function(){return this._stack.length}}),NameStack.prototype.push=function(){this._stack.push(null)},NameStack.prototype.pop=function(){this._stack.pop()},NameStack.prototype.set=function(token){this._stack[this.length-1]=token},NameStack.prototype.infer=function(){var type,nameToken=this._stack[this.length-1],prefix=\"\";return nameToken&&\"class\"!==nameToken.type||(nameToken=this._stack[this.length-2]),nameToken?(type=nameToken.type,\"(string)\"!==type&&\"(number)\"!==type&&\"(identifier)\"!==type&&\"default\"!==type?\"(expression)\":(nameToken.accessorType&&(prefix=nameToken.accessorType+\" \"),prefix+nameToken.value)):\"(empty)\"},module.exports=NameStack},{}],\"/node_modules/jshint/src/options.js\":[function(_dereq_,module,exports){\"use strict\";exports.bool={enforcing:{bitwise:!0,freeze:!0,camelcase:!0,curly:!0,eqeqeq:!0,futurehostile:!0,notypeof:!0,es3:!0,es5:!0,forin:!0,funcscope:!0,immed:!0,iterator:!0,newcap:!0,noarg:!0,nocomma:!0,noempty:!0,nonbsp:!0,nonew:!0,undef:!0,singleGroups:!1,varstmt:!1,enforceall:!1},relaxing:{asi:!0,multistr:!0,debug:!0,boss:!0,evil:!0,globalstrict:!0,plusplus:!0,proto:!0,scripturl:!0,sub:!0,supernew:!0,laxbreak:!0,laxcomma:!0,validthis:!0,withstmt:!0,moz:!0,noyield:!0,eqnull:!0,lastsemic:!0,loopfunc:!0,expr:!0,esnext:!0,elision:!0},environments:{mootools:!0,couch:!0,jasmine:!0,jquery:!0,node:!0,qunit:!0,rhino:!0,shelljs:!0,prototypejs:!0,yui:!0,mocha:!0,module:!0,wsh:!0,worker:!0,nonstandard:!0,browser:!0,browserify:!0,devel:!0,dojo:!0,typed:!0,phantom:!0},obsolete:{onecase:!0,regexp:!0,regexdash:!0}},exports.val={maxlen:!1,indent:!1,maxerr:!1,predef:!1,globals:!1,quotmark:!1,scope:!1,maxstatements:!1,maxdepth:!1,maxparams:!1,maxcomplexity:!1,shadow:!1,strict:!0,unused:!0,latedef:!1,ignore:!1,ignoreDelimiters:!1,esversion:5},exports.inverted={bitwise:!0,forin:!0,newcap:!0,plusplus:!0,regexp:!0,undef:!0,eqeqeq:!0,strict:!0},exports.validNames=Object.keys(exports.val).concat(Object.keys(exports.bool.relaxing)).concat(Object.keys(exports.bool.enforcing)).concat(Object.keys(exports.bool.obsolete)).concat(Object.keys(exports.bool.environments)),exports.renamed={eqeq:\"eqeqeq\",windows:\"wsh\",sloppy:\"strict\"},exports.removed={nomen:!0,onevar:!0,passfail:!0,white:!0,gcl:!0,smarttabs:!0,trailing:!0},exports.noenforceall={varstmt:!0,strict:!0}},{}],\"/node_modules/jshint/src/reg.js\":[function(_dereq_,module,exports){\"use strict\";exports.unsafeString=/@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|</i,exports.unsafeChars=/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/,exports.needEsc=/[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/,exports.needEscGlobal=/[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,exports.starSlash=/\\*\\//,exports.identifier=/^([a-zA-Z_$][a-zA-Z0-9_$]*)$/,exports.javascriptURL=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i,exports.fallsThrough=/^\\s*falls?\\sthrough\\s*$/,exports.maxlenException=/^(?:(?:\\/\\/|\\/\\*|\\*) ?)?[^ ]+$/},{}],\"/node_modules/jshint/src/scope-manager.js\":[function(_dereq_,module){\"use strict\";var _=_dereq_(\"../lodash\"),events=_dereq_(\"events\"),marker={},scopeManager=function(state,predefined,exported,declared){function _newScope(type){_current={\"(labels)\":Object.create(null),\"(usages)\":Object.create(null),\"(breakLabels)\":Object.create(null),\"(parent)\":_current,\"(type)\":type,\"(params)\":\"functionparams\"===type||\"catchparams\"===type?[]:null},_scopeStack.push(_current)}function warning(code,token){emitter.emit(\"warning\",{code:code,token:token,data:_.slice(arguments,2)})}function error(code,token){emitter.emit(\"warning\",{code:code,token:token,data:_.slice(arguments,2)})}function _setupUsages(labelName){_current[\"(usages)\"][labelName]||(_current[\"(usages)\"][labelName]={\"(modified)\":[],\"(reassigned)\":[],\"(tokens)\":[]})}function _checkForUnused(){if(\"functionparams\"===_current[\"(type)\"])return _checkParams(),void 0;var curentLabels=_current[\"(labels)\"];for(var labelName in curentLabels)curentLabels[labelName]&&\"exception\"!==curentLabels[labelName][\"(type)\"]&&curentLabels[labelName][\"(unused)\"]&&_warnUnused(labelName,curentLabels[labelName][\"(token)\"],\"var\")}function _checkParams(){var params=_current[\"(params)\"];if(params)for(var unused_opt,param=params.pop();param;){var label=_current[\"(labels)\"][param];if(unused_opt=_getUnusedOption(state.funct[\"(unusedOption)\"]),\"undefined\"===param)return;if(label[\"(unused)\"])_warnUnused(param,label[\"(token)\"],\"param\",state.funct[\"(unusedOption)\"]);else if(\"last-param\"===unused_opt)return;param=params.pop()}}function _getLabel(labelName){for(var i=_scopeStack.length-1;i>=0;--i){var scopeLabels=_scopeStack[i][\"(labels)\"];if(scopeLabels[labelName])return scopeLabels}}function usedSoFarInCurrentFunction(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current[\"(usages)\"][labelName])return current[\"(usages)\"][labelName];if(current===_currentFunctBody)break}return!1}function _checkOuterShadow(labelName,token){if(\"outer\"===state.option.shadow)for(var isGlobal=\"global\"===_currentFunctBody[\"(type)\"],isNewFunction=\"functionparams\"===_current[\"(type)\"],outsideCurrentFunction=!isGlobal,i=0;_scopeStack.length>i;i++){var stackItem=_scopeStack[i];isNewFunction||_scopeStack[i+1]!==_currentFunctBody||(outsideCurrentFunction=!1),outsideCurrentFunction&&stackItem[\"(labels)\"][labelName]&&warning(\"W123\",token,labelName),stackItem[\"(breakLabels)\"][labelName]&&warning(\"W123\",token,labelName)}}function _latedefWarning(type,labelName,token){state.option.latedef&&(state.option.latedef===!0&&\"function\"===type||\"function\"!==type)&&warning(\"W003\",token,labelName)}var _current,_scopeStack=[];_newScope(\"global\"),_current[\"(predefined)\"]=predefined;var _currentFunctBody=_current,usedPredefinedAndGlobals=Object.create(null),impliedGlobals=Object.create(null),unuseds=[],emitter=new events.EventEmitter,_getUnusedOption=function(unused_opt){return void 0===unused_opt&&(unused_opt=state.option.unused),unused_opt===!0&&(unused_opt=\"last-param\"),unused_opt},_warnUnused=function(name,tkn,type,unused_opt){var line=tkn.line,chr=tkn.from,raw_name=tkn.raw_text||name;unused_opt=_getUnusedOption(unused_opt);var warnable_types={vars:[\"var\"],\"last-param\":[\"var\",\"param\"],strict:[\"var\",\"param\",\"last-param\"]};unused_opt&&warnable_types[unused_opt]&&-1!==warnable_types[unused_opt].indexOf(type)&&warning(\"W098\",{line:line,from:chr},raw_name),(unused_opt||\"var\"===type)&&unuseds.push({name:name,line:line,character:chr})},scopeManagerInst={on:function(names,listener){names.split(\" \").forEach(function(name){emitter.on(name,listener)})},isPredefined:function(labelName){return!this.has(labelName)&&_.has(_scopeStack[0][\"(predefined)\"],labelName)},stack:function(type){var previousScope=_current;_newScope(type),type||\"functionparams\"!==previousScope[\"(type)\"]||(_current[\"(isFuncBody)\"]=!0,_current[\"(context)\"]=_currentFunctBody,_currentFunctBody=_current)},unstack:function(){var i,j,subScope=_scopeStack.length>1?_scopeStack[_scopeStack.length-2]:null,isUnstackingFunctionBody=_current===_currentFunctBody,isUnstackingFunctionParams=\"functionparams\"===_current[\"(type)\"],isUnstackingFunctionOuter=\"functionouter\"===_current[\"(type)\"],currentUsages=_current[\"(usages)\"],currentLabels=_current[\"(labels)\"],usedLabelNameList=Object.keys(currentUsages);for(currentUsages.__proto__&&-1===usedLabelNameList.indexOf(\"__proto__\")&&usedLabelNameList.push(\"__proto__\"),i=0;usedLabelNameList.length>i;i++){var usedLabelName=usedLabelNameList[i],usage=currentUsages[usedLabelName],usedLabel=currentLabels[usedLabelName];if(usedLabel){var usedLabelType=usedLabel[\"(type)\"];if(usedLabel[\"(useOutsideOfScope)\"]&&!state.option.funcscope){var usedTokens=usage[\"(tokens)\"];if(usedTokens)for(j=0;usedTokens.length>j;j++)usedLabel[\"(function)\"]===usedTokens[j][\"(function)\"]&&error(\"W038\",usedTokens[j],usedLabelName)}if(_current[\"(labels)\"][usedLabelName][\"(unused)\"]=!1,\"const\"===usedLabelType&&usage[\"(modified)\"])for(j=0;usage[\"(modified)\"].length>j;j++)error(\"E013\",usage[\"(modified)\"][j],usedLabelName);if((\"function\"===usedLabelType||\"class\"===usedLabelType)&&usage[\"(reassigned)\"])for(j=0;usage[\"(reassigned)\"].length>j;j++)error(\"W021\",usage[\"(reassigned)\"][j],usedLabelName,usedLabelType)}else if(isUnstackingFunctionOuter&&(state.funct[\"(isCapturing)\"]=!0),subScope)if(subScope[\"(usages)\"][usedLabelName]){var subScopeUsage=subScope[\"(usages)\"][usedLabelName];subScopeUsage[\"(modified)\"]=subScopeUsage[\"(modified)\"].concat(usage[\"(modified)\"]),subScopeUsage[\"(tokens)\"]=subScopeUsage[\"(tokens)\"].concat(usage[\"(tokens)\"]),subScopeUsage[\"(reassigned)\"]=subScopeUsage[\"(reassigned)\"].concat(usage[\"(reassigned)\"]),subScopeUsage[\"(onlyUsedSubFunction)\"]=!1}else subScope[\"(usages)\"][usedLabelName]=usage,isUnstackingFunctionBody&&(subScope[\"(usages)\"][usedLabelName][\"(onlyUsedSubFunction)\"]=!0);else if(\"boolean\"==typeof _current[\"(predefined)\"][usedLabelName]){if(delete declared[usedLabelName],usedPredefinedAndGlobals[usedLabelName]=marker,_current[\"(predefined)\"][usedLabelName]===!1&&usage[\"(reassigned)\"])for(j=0;usage[\"(reassigned)\"].length>j;j++)warning(\"W020\",usage[\"(reassigned)\"][j])}else if(usage[\"(tokens)\"])for(j=0;usage[\"(tokens)\"].length>j;j++){var undefinedToken=usage[\"(tokens)\"][j];undefinedToken.forgiveUndef||(state.option.undef&&!undefinedToken.ignoreUndef&&warning(\"W117\",undefinedToken,usedLabelName),impliedGlobals[usedLabelName]?impliedGlobals[usedLabelName].line.push(undefinedToken.line):impliedGlobals[usedLabelName]={name:usedLabelName,line:[undefinedToken.line]})}}if(subScope||Object.keys(declared).forEach(function(labelNotUsed){_warnUnused(labelNotUsed,declared[labelNotUsed],\"var\")}),subScope&&!isUnstackingFunctionBody&&!isUnstackingFunctionParams&&!isUnstackingFunctionOuter){var labelNames=Object.keys(currentLabels);for(i=0;labelNames.length>i;i++){var defLabelName=labelNames[i];currentLabels[defLabelName][\"(blockscoped)\"]||\"exception\"===currentLabels[defLabelName][\"(type)\"]||this.funct.has(defLabelName,{excludeCurrent:!0})||(subScope[\"(labels)\"][defLabelName]=currentLabels[defLabelName],\"global\"!==_currentFunctBody[\"(type)\"]&&(subScope[\"(labels)\"][defLabelName][\"(useOutsideOfScope)\"]=!0),delete currentLabels[defLabelName])}}_checkForUnused(),_scopeStack.pop(),isUnstackingFunctionBody&&(_currentFunctBody=_scopeStack[_.findLastIndex(_scopeStack,function(scope){return scope[\"(isFuncBody)\"]||\"global\"===scope[\"(type)\"]})]),_current=subScope},addParam:function(labelName,token,type){if(type=type||\"param\",\"exception\"===type){var previouslyDefinedLabelType=this.funct.labeltype(labelName);previouslyDefinedLabelType&&\"exception\"!==previouslyDefinedLabelType&&(state.option.node||warning(\"W002\",state.tokens.next,labelName))}if(_.has(_current[\"(labels)\"],labelName)?_current[\"(labels)\"][labelName].duplicated=!0:(_checkOuterShadow(labelName,token,type),_current[\"(labels)\"][labelName]={\"(type)\":type,\"(token)\":token,\"(unused)\":!0},_current[\"(params)\"].push(labelName)),_.has(_current[\"(usages)\"],labelName)){var usage=_current[\"(usages)\"][labelName];usage[\"(onlyUsedSubFunction)\"]?_latedefWarning(type,labelName,token):warning(\"E056\",token,labelName,type)}},validateParams:function(){if(\"global\"!==_currentFunctBody[\"(type)\"]){var isStrict=state.isStrict(),currentFunctParamScope=_currentFunctBody[\"(parent)\"];currentFunctParamScope[\"(params)\"]&¤tFunctParamScope[\"(params)\"].forEach(function(labelName){var label=currentFunctParamScope[\"(labels)\"][labelName];label&&label.duplicated&&(isStrict?warning(\"E011\",label[\"(token)\"],labelName):state.option.shadow!==!0&&warning(\"W004\",label[\"(token)\"],labelName))})}},getUsedOrDefinedGlobals:function(){var list=Object.keys(usedPredefinedAndGlobals);return usedPredefinedAndGlobals.__proto__===marker&&-1===list.indexOf(\"__proto__\")&&list.push(\"__proto__\"),list},getImpliedGlobals:function(){var values=_.values(impliedGlobals),hasProto=!1;return impliedGlobals.__proto__&&(hasProto=values.some(function(value){return\"__proto__\"===value.name}),hasProto||values.push(impliedGlobals.__proto__)),values},getUnuseds:function(){return unuseds},has:function(labelName){return Boolean(_getLabel(labelName))},labeltype:function(labelName){var scopeLabels=_getLabel(labelName);return scopeLabels?scopeLabels[labelName][\"(type)\"]:null},addExported:function(labelName){var globalLabels=_scopeStack[0][\"(labels)\"];if(_.has(declared,labelName))delete declared[labelName];else if(_.has(globalLabels,labelName))globalLabels[labelName][\"(unused)\"]=!1;else{for(var i=1;_scopeStack.length>i;i++){var scope=_scopeStack[i];if(scope[\"(type)\"])break;if(_.has(scope[\"(labels)\"],labelName)&&!scope[\"(labels)\"][labelName][\"(blockscoped)\"])return scope[\"(labels)\"][labelName][\"(unused)\"]=!1,void 0}exported[labelName]=!0}},setExported:function(labelName,token){this.block.use(labelName,token)\n},addlabel:function(labelName,opts){var type=opts.type,token=opts.token,isblockscoped=\"let\"===type||\"const\"===type||\"class\"===type,isexported=\"global\"===(isblockscoped?_current:_currentFunctBody)[\"(type)\"]&&_.has(exported,labelName);if(_checkOuterShadow(labelName,token,type),isblockscoped){var declaredInCurrentScope=_current[\"(labels)\"][labelName];if(declaredInCurrentScope||_current!==_currentFunctBody||\"global\"===_current[\"(type)\"]||(declaredInCurrentScope=!!_currentFunctBody[\"(parent)\"][\"(labels)\"][labelName]),!declaredInCurrentScope&&_current[\"(usages)\"][labelName]){var usage=_current[\"(usages)\"][labelName];usage[\"(onlyUsedSubFunction)\"]?_latedefWarning(type,labelName,token):warning(\"E056\",token,labelName,type)}declaredInCurrentScope?warning(\"E011\",token,labelName):\"outer\"===state.option.shadow&&scopeManagerInst.funct.has(labelName)&&warning(\"W004\",token,labelName),scopeManagerInst.block.add(labelName,type,token,!isexported)}else{var declaredInCurrentFunctionScope=scopeManagerInst.funct.has(labelName);!declaredInCurrentFunctionScope&&usedSoFarInCurrentFunction(labelName)&&_latedefWarning(type,labelName,token),scopeManagerInst.funct.has(labelName,{onlyBlockscoped:!0})?warning(\"E011\",token,labelName):state.option.shadow!==!0&&declaredInCurrentFunctionScope&&\"__proto__\"!==labelName&&\"global\"!==_currentFunctBody[\"(type)\"]&&warning(\"W004\",token,labelName),scopeManagerInst.funct.add(labelName,type,token,!isexported),\"global\"===_currentFunctBody[\"(type)\"]&&(usedPredefinedAndGlobals[labelName]=marker)}},funct:{labeltype:function(labelName,options){for(var onlyBlockscoped=options&&options.onlyBlockscoped,excludeParams=options&&options.excludeParams,currentScopeIndex=_scopeStack.length-(options&&options.excludeCurrent?2:1),i=currentScopeIndex;i>=0;i--){var current=_scopeStack[i];if(current[\"(labels)\"][labelName]&&(!onlyBlockscoped||current[\"(labels)\"][labelName][\"(blockscoped)\"]))return current[\"(labels)\"][labelName][\"(type)\"];var scopeCheck=excludeParams?_scopeStack[i-1]:current;if(scopeCheck&&\"functionparams\"===scopeCheck[\"(type)\"])return null}return null},hasBreakLabel:function(labelName){for(var i=_scopeStack.length-1;i>=0;i--){var current=_scopeStack[i];if(current[\"(breakLabels)\"][labelName])return!0;if(\"functionparams\"===current[\"(type)\"])return!1}return!1},has:function(labelName,options){return Boolean(this.labeltype(labelName,options))},add:function(labelName,type,tok,unused){_current[\"(labels)\"][labelName]={\"(type)\":type,\"(token)\":tok,\"(blockscoped)\":!1,\"(function)\":_currentFunctBody,\"(unused)\":unused}}},block:{isGlobal:function(){return\"global\"===_current[\"(type)\"]},use:function(labelName,token){var paramScope=_currentFunctBody[\"(parent)\"];paramScope&¶mScope[\"(labels)\"][labelName]&&\"param\"===paramScope[\"(labels)\"][labelName][\"(type)\"]&&(scopeManagerInst.funct.has(labelName,{excludeParams:!0,onlyBlockscoped:!0})||(paramScope[\"(labels)\"][labelName][\"(unused)\"]=!1)),token&&(state.ignored.W117||state.option.undef===!1)&&(token.ignoreUndef=!0),_setupUsages(labelName),token&&(token[\"(function)\"]=_currentFunctBody,_current[\"(usages)\"][labelName][\"(tokens)\"].push(token))},reassign:function(labelName,token){this.modify(labelName,token),_current[\"(usages)\"][labelName][\"(reassigned)\"].push(token)},modify:function(labelName,token){_setupUsages(labelName),_current[\"(usages)\"][labelName][\"(modified)\"].push(token)},add:function(labelName,type,tok,unused){_current[\"(labels)\"][labelName]={\"(type)\":type,\"(token)\":tok,\"(blockscoped)\":!0,\"(unused)\":unused}},addBreakLabel:function(labelName,opts){var token=opts.token;scopeManagerInst.funct.hasBreakLabel(labelName)?warning(\"E011\",token,labelName):\"outer\"===state.option.shadow&&(scopeManagerInst.funct.has(labelName)?warning(\"W004\",token,labelName):_checkOuterShadow(labelName,token)),_current[\"(breakLabels)\"][labelName]=token}}};return scopeManagerInst};module.exports=scopeManager},{\"../lodash\":\"/node_modules/jshint/lodash.js\",events:\"/node_modules/browserify/node_modules/events/events.js\"}],\"/node_modules/jshint/src/state.js\":[function(_dereq_,module,exports){\"use strict\";var NameStack=_dereq_(\"./name-stack.js\"),state={syntax:{},isStrict:function(){return this.directive[\"use strict\"]||this.inClassBody||this.option.module||\"implied\"===this.option.strict},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(strict){return strict?!(this.option.esversion&&5!==this.option.esversion||this.option.moz):!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab=\"\",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new NameStack,this.inClassBody=!1}};exports.state=state},{\"./name-stack.js\":\"/node_modules/jshint/src/name-stack.js\"}],\"/node_modules/jshint/src/style.js\":[function(_dereq_,module,exports){\"use strict\";exports.register=function(linter){linter.on(\"Identifier\",function(data){linter.getOption(\"proto\")||\"__proto__\"===data.name&&linter.warn(\"W103\",{line:data.line,\"char\":data.char,data:[data.name,\"6\"]})}),linter.on(\"Identifier\",function(data){linter.getOption(\"iterator\")||\"__iterator__\"===data.name&&linter.warn(\"W103\",{line:data.line,\"char\":data.char,data:[data.name]})}),linter.on(\"Identifier\",function(data){linter.getOption(\"camelcase\")&&data.name.replace(/^_+|_+$/g,\"\").indexOf(\"_\")>-1&&!data.name.match(/^[A-Z0-9_]*$/)&&linter.warn(\"W106\",{line:data.line,\"char\":data.from,data:[data.name]})}),linter.on(\"String\",function(data){var code,quotmark=linter.getOption(\"quotmark\");quotmark&&(\"single\"===quotmark&&\"'\"!==data.quote&&(code=\"W109\"),\"double\"===quotmark&&'\"'!==data.quote&&(code=\"W108\"),quotmark===!0&&(linter.getCache(\"quotmark\")||linter.setCache(\"quotmark\",data.quote),linter.getCache(\"quotmark\")!==data.quote&&(code=\"W110\")),code&&linter.warn(code,{line:data.line,\"char\":data.char}))}),linter.on(\"Number\",function(data){\".\"===data.value.charAt(0)&&linter.warn(\"W008\",{line:data.line,\"char\":data.char,data:[data.value]}),\".\"===data.value.substr(data.value.length-1)&&linter.warn(\"W047\",{line:data.line,\"char\":data.char,data:[data.value]}),/^00+/.test(data.value)&&linter.warn(\"W046\",{line:data.line,\"char\":data.char,data:[data.value]})}),linter.on(\"String\",function(data){var re=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;linter.getOption(\"scripturl\")||re.test(data.value)&&linter.warn(\"W107\",{line:data.line,\"char\":data.char})})}},{}],\"/node_modules/jshint/src/vars.js\":[function(_dereq_,module,exports){\"use strict\";exports.reservedVars={arguments:!1,NaN:!1},exports.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},exports.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},exports.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},exports.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},exports.nonstandard={escape:!1,unescape:!1},exports.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},exports.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,acequire:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},exports.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,acequire:!1,Buffer:!0,exports:!0,process:!0},exports.phantom={phantom:!0,acequire:!0,WebPage:!0,console:!0,exports:!0},exports.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,\"throws\":!1},exports.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},exports.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},exports.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},exports.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},exports.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},exports.jquery={$:!1,jQuery:!1},exports.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},exports.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},exports.yui={YUI:!1,Y:!1,YUI_config:!1},exports.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},exports.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},[\"/node_modules/jshint/src/jshint.js\"])}),ace.define(\"ace/mode/javascript_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/javascript/jshint\"],function(acequire,exports,module){\"use strict\";function startRegex(arr){return RegExp(\"^(\"+arr.join(\"|\")+\")\")}var oop=acequire(\"../lib/oop\"),Mirror=acequire(\"../worker/mirror\").Mirror,lint=acequire(\"./javascript/jshint\").JSHINT,disabledWarningsRe=startRegex([\"Bad for in variable '(.+)'.\",'Missing \"use strict\"']),errorsRe=startRegex([\"Unexpected\",\"Expected \",\"Confusing (plus|minus)\",\"\\\\{a\\\\} unterminated regular expression\",\"Unclosed \",\"Unmatched \",\"Unbegun comment\",\"Bad invocation\",\"Missing space after\",\"Missing operator at\"]),infoRe=startRegex([\"Expected an assignment\",\"Bad escapement of EOL\",\"Unexpected comma\",\"Unexpected space\",\"Missing radix parameter.\",\"A leading decimal point can\",\"\\\\['{a}'\\\\] is better written in dot notation.\",\"'{a}' used out of scope\"]),JavaScriptWorker=exports.JavaScriptWorker=function(sender){Mirror.call(this,sender),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(options){this.options=options||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(newOptions){oop.mixin(this.options,newOptions),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval(\"throw 0;\"+str)}catch(e){if(0===e)return!0}return!1},this.onUpdate=function(){var value=this.doc.getValue();if(value=value.replace(/^#!.*\\n/,\"\\n\"),!value)return this.sender.emit(\"annotate\",[]);var errors=[],maxErrorLevel=this.isValidJS(value)?\"warning\":\"error\";lint(value,this.options);for(var results=lint.errors,errorAdded=!1,i=0;results.length>i;i++){var error=results[i];if(error){var raw=error.raw,type=\"warning\";if(\"Missing semicolon.\"==raw){var str=error.evidence.substr(error.character);str=str.charAt(str.search(/\\S/)),\"error\"==maxErrorLevel&&str&&/[\\w\\d{(['\"]/.test(str)?(error.reason='Missing \";\" before statement',type=\"error\"):type=\"info\"}else{if(disabledWarningsRe.test(raw))continue;infoRe.test(raw)?type=\"info\":errorsRe.test(raw)?(errorAdded=!0,type=maxErrorLevel):\"'{a}' is not defined.\"==raw?type=\"warning\":\"'{a}' is defined but never used.\"==raw&&(type=\"info\")}errors.push({row:error.line-1,column:error.character-1,text:error.reason,type:type,raw:raw})}}this.sender.emit(\"annotate\",errors)}}.call(JavaScriptWorker.prototype)}),ace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,\"sentinel\",{}),\"sentinel\"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if(\"function\"!=typeof target)throw new TypeError(\"Function.prototype.bind called on incompatible \"+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,\"__defineGetter__\"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,\"XXX\"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return\"[object Array]\"==_toString(obj)});var boxedString=Object(\"a\"),splitString=\"a\"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,thisp=arguments[1],i=-1,length=self.length>>>0;if(\"[object Function]\"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0,result=[],thisp=arguments[1];if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0,thisp=arguments[1];if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0,thisp=arguments[1];if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0;if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");if(!length&&1==arguments.length)throw new TypeError(\"reduce of empty array with no initial value\");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError(\"reduce of empty array with no initial value\")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):object,length=self.length>>>0;if(\"[object Function]\"!=_toString(fun))throw new TypeError(fun+\" is not a function\");if(!length&&1==arguments.length)throw new TypeError(\"reduceRight of empty array with no initial value\");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError(\"reduceRight of empty array with no initial value\")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&\"[object String]\"==_toString(this)?this.split(\"\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT=\"Object.getOwnPropertyDescriptor called on a non-object: \";Object.getOwnPropertyDescriptor=function(object,property){if(\"object\"!=typeof object&&\"function\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if(\"object\"!=typeof prototype)throw new TypeError(\"typeof prototype[\"+typeof prototype+\"] != 'object'\");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom=\"undefined\"==typeof document||doesDefinePropertyWork(document.createElement(\"div\"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR=\"Property description must be an object: \",ERR_NON_OBJECT_TARGET=\"Object.defineProperty called on non-object: \",ERR_ACCESSORS_NOT_SUPPORTED=\"getters & setters can not be defined on this javascript engine\";Object.defineProperty=function(object,property,descriptor){if(\"object\"!=typeof object&&\"function\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if(\"object\"!=typeof descriptor&&\"function\"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,\"value\"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,\"get\")&&defineGetter(object,property,descriptor.get),owns(descriptor,\"set\")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return\"function\"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name=\"\";owns(object,name);)name+=\"?\";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if(\"object\"!=typeof object&&\"function\"!=typeof object||null===object)throw new TypeError(\"Object.keys called on a non-object\");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws=\"\t\\n\u000b\\f\\r \\u2028\\u2029\";if(!String.prototype.trim||ws.trim()){ws=\"[\"+ws+\"]\";var trimBeginRegexp=RegExp(\"^\"+ws+ws+\"*\"),trimEndRegexp=RegExp(ws+ws+\"*$\");String.prototype.trim=function(){return(this+\"\").replace(trimBeginRegexp,\"\").replace(trimEndRegexp,\"\")}}var toObject=function(o){if(null==o)throw new TypeError(\"can't convert \"+o+\" to object\");return Object(o)}});";
|
||
|
||
/***/ },
|
||
/* 17 */
|
||
/***/ function(module, exports) {
|
||
|
||
ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var dom = acequire("../lib/dom");
|
||
var lang = acequire("../lib/lang");
|
||
var event = acequire("../lib/event");
|
||
var searchboxCss = "\
|
||
.ace_search {\
|
||
background-color: #ddd;\
|
||
border: 1px solid #cbcbcb;\
|
||
border-top: 0 none;\
|
||
max-width: 325px;\
|
||
overflow: hidden;\
|
||
margin: 0;\
|
||
padding: 4px;\
|
||
padding-right: 6px;\
|
||
padding-bottom: 0;\
|
||
position: absolute;\
|
||
top: 0px;\
|
||
z-index: 99;\
|
||
white-space: normal;\
|
||
}\
|
||
.ace_search.left {\
|
||
border-left: 0 none;\
|
||
border-radius: 0px 0px 5px 0px;\
|
||
left: 0;\
|
||
}\
|
||
.ace_search.right {\
|
||
border-radius: 0px 0px 0px 5px;\
|
||
border-right: 0 none;\
|
||
right: 0;\
|
||
}\
|
||
.ace_search_form, .ace_replace_form {\
|
||
border-radius: 3px;\
|
||
border: 1px solid #cbcbcb;\
|
||
float: left;\
|
||
margin-bottom: 4px;\
|
||
overflow: hidden;\
|
||
}\
|
||
.ace_search_form.ace_nomatch {\
|
||
outline: 1px solid red;\
|
||
}\
|
||
.ace_search_field {\
|
||
background-color: white;\
|
||
border-right: 1px solid #cbcbcb;\
|
||
border: 0 none;\
|
||
-webkit-box-sizing: border-box;\
|
||
-moz-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
float: left;\
|
||
height: 22px;\
|
||
outline: 0;\
|
||
padding: 0 7px;\
|
||
width: 214px;\
|
||
margin: 0;\
|
||
}\
|
||
.ace_searchbtn,\
|
||
.ace_replacebtn {\
|
||
background: #fff;\
|
||
border: 0 none;\
|
||
border-left: 1px solid #dcdcdc;\
|
||
cursor: pointer;\
|
||
float: left;\
|
||
height: 22px;\
|
||
margin: 0;\
|
||
position: relative;\
|
||
}\
|
||
.ace_searchbtn:last-child,\
|
||
.ace_replacebtn:last-child {\
|
||
border-top-right-radius: 3px;\
|
||
border-bottom-right-radius: 3px;\
|
||
}\
|
||
.ace_searchbtn:disabled {\
|
||
background: none;\
|
||
cursor: default;\
|
||
}\
|
||
.ace_searchbtn {\
|
||
background-position: 50% 50%;\
|
||
background-repeat: no-repeat;\
|
||
width: 27px;\
|
||
}\
|
||
.ace_searchbtn.prev {\
|
||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); \
|
||
}\
|
||
.ace_searchbtn.next {\
|
||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); \
|
||
}\
|
||
.ace_searchbtn_close {\
|
||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\
|
||
border-radius: 50%;\
|
||
border: 0 none;\
|
||
color: #656565;\
|
||
cursor: pointer;\
|
||
float: right;\
|
||
font: 16px/16px Arial;\
|
||
height: 14px;\
|
||
margin: 5px 1px 9px 5px;\
|
||
padding: 0;\
|
||
text-align: center;\
|
||
width: 14px;\
|
||
}\
|
||
.ace_searchbtn_close:hover {\
|
||
background-color: #656565;\
|
||
background-position: 50% 100%;\
|
||
color: white;\
|
||
}\
|
||
.ace_replacebtn.prev {\
|
||
width: 54px\
|
||
}\
|
||
.ace_replacebtn.next {\
|
||
width: 27px\
|
||
}\
|
||
.ace_button {\
|
||
margin-left: 2px;\
|
||
cursor: pointer;\
|
||
-webkit-user-select: none;\
|
||
-moz-user-select: none;\
|
||
-o-user-select: none;\
|
||
-ms-user-select: none;\
|
||
user-select: none;\
|
||
overflow: hidden;\
|
||
opacity: 0.7;\
|
||
border: 1px solid rgba(100,100,100,0.23);\
|
||
padding: 1px;\
|
||
-moz-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
color: black;\
|
||
}\
|
||
.ace_button:hover {\
|
||
background-color: #eee;\
|
||
opacity:1;\
|
||
}\
|
||
.ace_button:active {\
|
||
background-color: #ddd;\
|
||
}\
|
||
.ace_button.checked {\
|
||
border-color: #3399ff;\
|
||
opacity:1;\
|
||
}\
|
||
.ace_search_options{\
|
||
margin-bottom: 3px;\
|
||
text-align: right;\
|
||
-webkit-user-select: none;\
|
||
-moz-user-select: none;\
|
||
-o-user-select: none;\
|
||
-ms-user-select: none;\
|
||
user-select: none;\
|
||
}";
|
||
var HashHandler = acequire("../keyboard/hash_handler").HashHandler;
|
||
var keyUtil = acequire("../lib/keys");
|
||
|
||
dom.importCssString(searchboxCss, "ace_searchbox");
|
||
|
||
var html = '<div class="ace_search right">\
|
||
<button type="button" action="hide" class="ace_searchbtn_close"></button>\
|
||
<div class="ace_search_form">\
|
||
<input class="ace_search_field" placeholder="Search for" spellcheck="false"></input>\
|
||
<button type="button" action="findNext" class="ace_searchbtn next"></button>\
|
||
<button type="button" action="findPrev" class="ace_searchbtn prev"></button>\
|
||
<button type="button" action="findAll" class="ace_searchbtn" title="Alt-Enter">All</button>\
|
||
</div>\
|
||
<div class="ace_replace_form">\
|
||
<input class="ace_search_field" placeholder="Replace with" spellcheck="false"></input>\
|
||
<button type="button" action="replaceAndFindNext" class="ace_replacebtn">Replace</button>\
|
||
<button type="button" action="replaceAll" class="ace_replacebtn">All</button>\
|
||
</div>\
|
||
<div class="ace_search_options">\
|
||
<span action="toggleRegexpMode" class="ace_button" title="RegExp Search">.*</span>\
|
||
<span action="toggleCaseSensitive" class="ace_button" title="CaseSensitive Search">Aa</span>\
|
||
<span action="toggleWholeWords" class="ace_button" title="Whole Word Search">\\b</span>\
|
||
</div>\
|
||
</div>'.replace(/>\s+/g, ">");
|
||
|
||
var SearchBox = function(editor, range, showReplaceForm) {
|
||
var div = dom.createElement("div");
|
||
div.innerHTML = html;
|
||
this.element = div.firstChild;
|
||
|
||
this.$init();
|
||
this.setEditor(editor);
|
||
};
|
||
|
||
(function() {
|
||
this.setEditor = function(editor) {
|
||
editor.searchBox = this;
|
||
editor.container.appendChild(this.element);
|
||
this.editor = editor;
|
||
};
|
||
|
||
this.$initElements = function(sb) {
|
||
this.searchBox = sb.querySelector(".ace_search_form");
|
||
this.replaceBox = sb.querySelector(".ace_replace_form");
|
||
this.searchOptions = sb.querySelector(".ace_search_options");
|
||
this.regExpOption = sb.querySelector("[action=toggleRegexpMode]");
|
||
this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]");
|
||
this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]");
|
||
this.searchInput = this.searchBox.querySelector(".ace_search_field");
|
||
this.replaceInput = this.replaceBox.querySelector(".ace_search_field");
|
||
};
|
||
|
||
this.$init = function() {
|
||
var sb = this.element;
|
||
|
||
this.$initElements(sb);
|
||
|
||
var _this = this;
|
||
event.addListener(sb, "mousedown", function(e) {
|
||
setTimeout(function(){
|
||
_this.activeInput.focus();
|
||
}, 0);
|
||
event.stopPropagation(e);
|
||
});
|
||
event.addListener(sb, "click", function(e) {
|
||
var t = e.target || e.srcElement;
|
||
var action = t.getAttribute("action");
|
||
if (action && _this[action])
|
||
_this[action]();
|
||
else if (_this.$searchBarKb.commands[action])
|
||
_this.$searchBarKb.commands[action].exec(_this);
|
||
event.stopPropagation(e);
|
||
});
|
||
|
||
event.addCommandKeyListener(sb, function(e, hashId, keyCode) {
|
||
var keyString = keyUtil.keyCodeToString(keyCode);
|
||
var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);
|
||
if (command && command.exec) {
|
||
command.exec(_this);
|
||
event.stopEvent(e);
|
||
}
|
||
});
|
||
|
||
this.$onChange = lang.delayedCall(function() {
|
||
_this.find(false, false);
|
||
});
|
||
|
||
event.addListener(this.searchInput, "input", function() {
|
||
_this.$onChange.schedule(20);
|
||
});
|
||
event.addListener(this.searchInput, "focus", function() {
|
||
_this.activeInput = _this.searchInput;
|
||
_this.searchInput.value && _this.highlight();
|
||
});
|
||
event.addListener(this.replaceInput, "focus", function() {
|
||
_this.activeInput = _this.replaceInput;
|
||
_this.searchInput.value && _this.highlight();
|
||
});
|
||
};
|
||
this.$closeSearchBarKb = new HashHandler([{
|
||
bindKey: "Esc",
|
||
name: "closeSearchBar",
|
||
exec: function(editor) {
|
||
editor.searchBox.hide();
|
||
}
|
||
}]);
|
||
this.$searchBarKb = new HashHandler();
|
||
this.$searchBarKb.bindKeys({
|
||
"Ctrl-f|Command-f": function(sb) {
|
||
var isReplace = sb.isReplace = !sb.isReplace;
|
||
sb.replaceBox.style.display = isReplace ? "" : "none";
|
||
sb.searchInput.focus();
|
||
},
|
||
"Ctrl-H|Command-Option-F": function(sb) {
|
||
sb.replaceBox.style.display = "";
|
||
sb.replaceInput.focus();
|
||
},
|
||
"Ctrl-G|Command-G": function(sb) {
|
||
sb.findNext();
|
||
},
|
||
"Ctrl-Shift-G|Command-Shift-G": function(sb) {
|
||
sb.findPrev();
|
||
},
|
||
"esc": function(sb) {
|
||
setTimeout(function() { sb.hide();});
|
||
},
|
||
"Return": function(sb) {
|
||
if (sb.activeInput == sb.replaceInput)
|
||
sb.replace();
|
||
sb.findNext();
|
||
},
|
||
"Shift-Return": function(sb) {
|
||
if (sb.activeInput == sb.replaceInput)
|
||
sb.replace();
|
||
sb.findPrev();
|
||
},
|
||
"Alt-Return": function(sb) {
|
||
if (sb.activeInput == sb.replaceInput)
|
||
sb.replaceAll();
|
||
sb.findAll();
|
||
},
|
||
"Tab": function(sb) {
|
||
(sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();
|
||
}
|
||
});
|
||
|
||
this.$searchBarKb.addCommands([{
|
||
name: "toggleRegexpMode",
|
||
bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"},
|
||
exec: function(sb) {
|
||
sb.regExpOption.checked = !sb.regExpOption.checked;
|
||
sb.$syncOptions();
|
||
}
|
||
}, {
|
||
name: "toggleCaseSensitive",
|
||
bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"},
|
||
exec: function(sb) {
|
||
sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;
|
||
sb.$syncOptions();
|
||
}
|
||
}, {
|
||
name: "toggleWholeWords",
|
||
bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"},
|
||
exec: function(sb) {
|
||
sb.wholeWordOption.checked = !sb.wholeWordOption.checked;
|
||
sb.$syncOptions();
|
||
}
|
||
}]);
|
||
|
||
this.$syncOptions = function() {
|
||
dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked);
|
||
dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked);
|
||
dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked);
|
||
this.find(false, false);
|
||
};
|
||
|
||
this.highlight = function(re) {
|
||
this.editor.session.highlight(re || this.editor.$search.$options.re);
|
||
this.editor.renderer.updateBackMarkers()
|
||
};
|
||
this.find = function(skipCurrent, backwards, preventScroll) {
|
||
var range = this.editor.find(this.searchInput.value, {
|
||
skipCurrent: skipCurrent,
|
||
backwards: backwards,
|
||
wrap: true,
|
||
regExp: this.regExpOption.checked,
|
||
caseSensitive: this.caseSensitiveOption.checked,
|
||
wholeWord: this.wholeWordOption.checked,
|
||
preventScroll: preventScroll
|
||
});
|
||
var noMatch = !range && this.searchInput.value;
|
||
dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);
|
||
this.editor._emit("findSearchBox", { match: !noMatch });
|
||
this.highlight();
|
||
};
|
||
this.findNext = function() {
|
||
this.find(true, false);
|
||
};
|
||
this.findPrev = function() {
|
||
this.find(true, true);
|
||
};
|
||
this.findAll = function(){
|
||
var range = this.editor.findAll(this.searchInput.value, {
|
||
regExp: this.regExpOption.checked,
|
||
caseSensitive: this.caseSensitiveOption.checked,
|
||
wholeWord: this.wholeWordOption.checked
|
||
});
|
||
var noMatch = !range && this.searchInput.value;
|
||
dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);
|
||
this.editor._emit("findSearchBox", { match: !noMatch });
|
||
this.highlight();
|
||
this.hide();
|
||
};
|
||
this.replace = function() {
|
||
if (!this.editor.getReadOnly())
|
||
this.editor.replace(this.replaceInput.value);
|
||
};
|
||
this.replaceAndFindNext = function() {
|
||
if (!this.editor.getReadOnly()) {
|
||
this.editor.replace(this.replaceInput.value);
|
||
this.findNext()
|
||
}
|
||
};
|
||
this.replaceAll = function() {
|
||
if (!this.editor.getReadOnly())
|
||
this.editor.replaceAll(this.replaceInput.value);
|
||
};
|
||
|
||
this.hide = function() {
|
||
this.element.style.display = "none";
|
||
this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);
|
||
this.editor.focus();
|
||
};
|
||
this.show = function(value, isReplace) {
|
||
this.element.style.display = "";
|
||
this.replaceBox.style.display = isReplace ? "" : "none";
|
||
|
||
this.isReplace = isReplace;
|
||
|
||
if (value)
|
||
this.searchInput.value = value;
|
||
|
||
this.find(false, false, true);
|
||
|
||
this.searchInput.focus();
|
||
this.searchInput.select();
|
||
|
||
this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);
|
||
};
|
||
|
||
this.isFocused = function() {
|
||
var el = document.activeElement;
|
||
return el == this.searchInput || el == this.replaceInput;
|
||
}
|
||
}).call(SearchBox.prototype);
|
||
|
||
exports.SearchBox = SearchBox;
|
||
|
||
exports.Search = function(editor, isReplace) {
|
||
var sb = editor.searchBox || new SearchBox(editor);
|
||
sb.show(editor.session.getTextRange(), isReplace);
|
||
};
|
||
|
||
});
|
||
(function() {
|
||
ace.acequire(["ace/ext/searchbox"], function() {});
|
||
})();
|
||
|
||
|
||
/***/ },
|
||
/* 18 */
|
||
/***/ function(module, exports) {
|
||
|
||
ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(acequire, exports, module) {
|
||
"use strict";
|
||
var oop = acequire("./lib/oop");
|
||
var EventEmitter = acequire("./lib/event_emitter").EventEmitter;
|
||
var lang = acequire("./lib/lang");
|
||
var Range = acequire("./range").Range;
|
||
var Anchor = acequire("./anchor").Anchor;
|
||
var HashHandler = acequire("./keyboard/hash_handler").HashHandler;
|
||
var Tokenizer = acequire("./tokenizer").Tokenizer;
|
||
var comparePoints = Range.comparePoints;
|
||
|
||
var SnippetManager = function() {
|
||
this.snippetMap = {};
|
||
this.snippetNameMap = {};
|
||
};
|
||
|
||
(function() {
|
||
oop.implement(this, EventEmitter);
|
||
|
||
this.getTokenizer = function() {
|
||
function TabstopToken(str, _, stack) {
|
||
str = str.substr(1);
|
||
if (/^\d+$/.test(str) && !stack.inFormatString)
|
||
return [{tabstopId: parseInt(str, 10)}];
|
||
return [{text: str}];
|
||
}
|
||
function escape(ch) {
|
||
return "(?:[^\\\\" + ch + "]|\\\\.)";
|
||
}
|
||
SnippetManager.$tokenizer = new Tokenizer({
|
||
start: [
|
||
{regex: /:/, onMatch: function(val, state, stack) {
|
||
if (stack.length && stack[0].expectIf) {
|
||
stack[0].expectIf = false;
|
||
stack[0].elseBranch = stack[0];
|
||
return [stack[0]];
|
||
}
|
||
return ":";
|
||
}},
|
||
{regex: /\\./, onMatch: function(val, state, stack) {
|
||
var ch = val[1];
|
||
if (ch == "}" && stack.length) {
|
||
val = ch;
|
||
}else if ("`$\\".indexOf(ch) != -1) {
|
||
val = ch;
|
||
} else if (stack.inFormatString) {
|
||
if (ch == "n")
|
||
val = "\n";
|
||
else if (ch == "t")
|
||
val = "\n";
|
||
else if ("ulULE".indexOf(ch) != -1) {
|
||
val = {changeCase: ch, local: ch > "a"};
|
||
}
|
||
}
|
||
|
||
return [val];
|
||
}},
|
||
{regex: /}/, onMatch: function(val, state, stack) {
|
||
return [stack.length ? stack.shift() : val];
|
||
}},
|
||
{regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken},
|
||
{regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) {
|
||
var t = TabstopToken(str.substr(1), state, stack);
|
||
stack.unshift(t[0]);
|
||
return t;
|
||
}, next: "snippetVar"},
|
||
{regex: /\n/, token: "newline", merge: false}
|
||
],
|
||
snippetVar: [
|
||
{regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) {
|
||
stack[0].choices = val.slice(1, -1).split(",");
|
||
}, next: "start"},
|
||
{regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?",
|
||
onMatch: function(val, state, stack) {
|
||
var ts = stack[0];
|
||
ts.fmtString = val;
|
||
|
||
val = this.splitRegex.exec(val);
|
||
ts.guard = val[1];
|
||
ts.fmt = val[2];
|
||
ts.flag = val[3];
|
||
return "";
|
||
}, next: "start"},
|
||
{regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) {
|
||
stack[0].code = val.splice(1, -1);
|
||
return "";
|
||
}, next: "start"},
|
||
{regex: "\\?", onMatch: function(val, state, stack) {
|
||
if (stack[0])
|
||
stack[0].expectIf = true;
|
||
}, next: "start"},
|
||
{regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"}
|
||
],
|
||
formatString: [
|
||
{regex: "/(" + escape("/") + "+)/", token: "regex"},
|
||
{regex: "", onMatch: function(val, state, stack) {
|
||
stack.inFormatString = true;
|
||
}, next: "start"}
|
||
]
|
||
});
|
||
SnippetManager.prototype.getTokenizer = function() {
|
||
return SnippetManager.$tokenizer;
|
||
};
|
||
return SnippetManager.$tokenizer;
|
||
};
|
||
|
||
this.tokenizeTmSnippet = function(str, startState) {
|
||
return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {
|
||
return x.value || x;
|
||
});
|
||
};
|
||
|
||
this.$getDefaultValue = function(editor, name) {
|
||
if (/^[A-Z]\d+$/.test(name)) {
|
||
var i = name.substr(1);
|
||
return (this.variables[name[0] + "__"] || {})[i];
|
||
}
|
||
if (/^\d+$/.test(name)) {
|
||
return (this.variables.__ || {})[name];
|
||
}
|
||
name = name.replace(/^TM_/, "");
|
||
|
||
if (!editor)
|
||
return;
|
||
var s = editor.session;
|
||
switch(name) {
|
||
case "CURRENT_WORD":
|
||
var r = s.getWordRange();
|
||
case "SELECTION":
|
||
case "SELECTED_TEXT":
|
||
return s.getTextRange(r);
|
||
case "CURRENT_LINE":
|
||
return s.getLine(editor.getCursorPosition().row);
|
||
case "PREV_LINE": // not possible in textmate
|
||
return s.getLine(editor.getCursorPosition().row - 1);
|
||
case "LINE_INDEX":
|
||
return editor.getCursorPosition().column;
|
||
case "LINE_NUMBER":
|
||
return editor.getCursorPosition().row + 1;
|
||
case "SOFT_TABS":
|
||
return s.getUseSoftTabs() ? "YES" : "NO";
|
||
case "TAB_SIZE":
|
||
return s.getTabSize();
|
||
case "FILENAME":
|
||
case "FILEPATH":
|
||
return "";
|
||
case "FULLNAME":
|
||
return "Ace";
|
||
}
|
||
};
|
||
this.variables = {};
|
||
this.getVariableValue = function(editor, varName) {
|
||
if (this.variables.hasOwnProperty(varName))
|
||
return this.variables[varName](editor, varName) || "";
|
||
return this.$getDefaultValue(editor, varName) || "";
|
||
};
|
||
this.tmStrFormat = function(str, ch, editor) {
|
||
var flag = ch.flag || "";
|
||
var re = ch.guard;
|
||
re = new RegExp(re, flag.replace(/[^gi]/, ""));
|
||
var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString");
|
||
var _self = this;
|
||
var formatted = str.replace(re, function() {
|
||
_self.variables.__ = arguments;
|
||
var fmtParts = _self.resolveVariables(fmtTokens, editor);
|
||
var gChangeCase = "E";
|
||
for (var i = 0; i < fmtParts.length; i++) {
|
||
var ch = fmtParts[i];
|
||
if (typeof ch == "object") {
|
||
fmtParts[i] = "";
|
||
if (ch.changeCase && ch.local) {
|
||
var next = fmtParts[i + 1];
|
||
if (next && typeof next == "string") {
|
||
if (ch.changeCase == "u")
|
||
fmtParts[i] = next[0].toUpperCase();
|
||
else
|
||
fmtParts[i] = next[0].toLowerCase();
|
||
fmtParts[i + 1] = next.substr(1);
|
||
}
|
||
} else if (ch.changeCase) {
|
||
gChangeCase = ch.changeCase;
|
||
}
|
||
} else if (gChangeCase == "U") {
|
||
fmtParts[i] = ch.toUpperCase();
|
||
} else if (gChangeCase == "L") {
|
||
fmtParts[i] = ch.toLowerCase();
|
||
}
|
||
}
|
||
return fmtParts.join("");
|
||
});
|
||
this.variables.__ = null;
|
||
return formatted;
|
||
};
|
||
|
||
this.resolveVariables = function(snippet, editor) {
|
||
var result = [];
|
||
for (var i = 0; i < snippet.length; i++) {
|
||
var ch = snippet[i];
|
||
if (typeof ch == "string") {
|
||
result.push(ch);
|
||
} else if (typeof ch != "object") {
|
||
continue;
|
||
} else if (ch.skip) {
|
||
gotoNext(ch);
|
||
} else if (ch.processed < i) {
|
||
continue;
|
||
} else if (ch.text) {
|
||
var value = this.getVariableValue(editor, ch.text);
|
||
if (value && ch.fmtString)
|
||
value = this.tmStrFormat(value, ch);
|
||
ch.processed = i;
|
||
if (ch.expectIf == null) {
|
||
if (value) {
|
||
result.push(value);
|
||
gotoNext(ch);
|
||
}
|
||
} else {
|
||
if (value) {
|
||
ch.skip = ch.elseBranch;
|
||
} else
|
||
gotoNext(ch);
|
||
}
|
||
} else if (ch.tabstopId != null) {
|
||
result.push(ch);
|
||
} else if (ch.changeCase != null) {
|
||
result.push(ch);
|
||
}
|
||
}
|
||
function gotoNext(ch) {
|
||
var i1 = snippet.indexOf(ch, i + 1);
|
||
if (i1 != -1)
|
||
i = i1;
|
||
}
|
||
return result;
|
||
};
|
||
|
||
this.insertSnippetForSelection = function(editor, snippetText) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = editor.session.getLine(cursor.row);
|
||
var tabString = editor.session.getTabString();
|
||
var indentString = line.match(/^\s*/)[0];
|
||
|
||
if (cursor.column < indentString.length)
|
||
indentString = indentString.slice(0, cursor.column);
|
||
|
||
var tokens = this.tokenizeTmSnippet(snippetText);
|
||
tokens = this.resolveVariables(tokens, editor);
|
||
tokens = tokens.map(function(x) {
|
||
if (x == "\n")
|
||
return x + indentString;
|
||
if (typeof x == "string")
|
||
return x.replace(/\t/g, tabString);
|
||
return x;
|
||
});
|
||
var tabstops = [];
|
||
tokens.forEach(function(p, i) {
|
||
if (typeof p != "object")
|
||
return;
|
||
var id = p.tabstopId;
|
||
var ts = tabstops[id];
|
||
if (!ts) {
|
||
ts = tabstops[id] = [];
|
||
ts.index = id;
|
||
ts.value = "";
|
||
}
|
||
if (ts.indexOf(p) !== -1)
|
||
return;
|
||
ts.push(p);
|
||
var i1 = tokens.indexOf(p, i + 1);
|
||
if (i1 === -1)
|
||
return;
|
||
|
||
var value = tokens.slice(i + 1, i1);
|
||
var isNested = value.some(function(t) {return typeof t === "object"});
|
||
if (isNested && !ts.value) {
|
||
ts.value = value;
|
||
} else if (value.length && (!ts.value || typeof ts.value !== "string")) {
|
||
ts.value = value.join("");
|
||
}
|
||
});
|
||
tabstops.forEach(function(ts) {ts.length = 0});
|
||
var expanding = {};
|
||
function copyValue(val) {
|
||
var copy = [];
|
||
for (var i = 0; i < val.length; i++) {
|
||
var p = val[i];
|
||
if (typeof p == "object") {
|
||
if (expanding[p.tabstopId])
|
||
continue;
|
||
var j = val.lastIndexOf(p, i - 1);
|
||
p = copy[j] || {tabstopId: p.tabstopId};
|
||
}
|
||
copy[i] = p;
|
||
}
|
||
return copy;
|
||
}
|
||
for (var i = 0; i < tokens.length; i++) {
|
||
var p = tokens[i];
|
||
if (typeof p != "object")
|
||
continue;
|
||
var id = p.tabstopId;
|
||
var i1 = tokens.indexOf(p, i + 1);
|
||
if (expanding[id]) {
|
||
if (expanding[id] === p)
|
||
expanding[id] = null;
|
||
continue;
|
||
}
|
||
|
||
var ts = tabstops[id];
|
||
var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
|
||
arg.unshift(i + 1, Math.max(0, i1 - i));
|
||
arg.push(p);
|
||
expanding[id] = p;
|
||
tokens.splice.apply(tokens, arg);
|
||
|
||
if (ts.indexOf(p) === -1)
|
||
ts.push(p);
|
||
}
|
||
var row = 0, column = 0;
|
||
var text = "";
|
||
tokens.forEach(function(t) {
|
||
if (typeof t === "string") {
|
||
if (t[0] === "\n"){
|
||
column = t.length - 1;
|
||
row ++;
|
||
} else
|
||
column += t.length;
|
||
text += t;
|
||
} else {
|
||
if (!t.start)
|
||
t.start = {row: row, column: column};
|
||
else
|
||
t.end = {row: row, column: column};
|
||
}
|
||
});
|
||
var range = editor.getSelectionRange();
|
||
var end = editor.session.replace(range, text);
|
||
|
||
var tabstopManager = new TabstopManager(editor);
|
||
var selectionId = editor.inVirtualSelectionMode && editor.selection.index;
|
||
tabstopManager.addTabstops(tabstops, range.start, end, selectionId);
|
||
};
|
||
|
||
this.insertSnippet = function(editor, snippetText) {
|
||
var self = this;
|
||
if (editor.inVirtualSelectionMode)
|
||
return self.insertSnippetForSelection(editor, snippetText);
|
||
|
||
editor.forEachSelection(function() {
|
||
self.insertSnippetForSelection(editor, snippetText);
|
||
}, null, {keepOrder: true});
|
||
|
||
if (editor.tabstopManager)
|
||
editor.tabstopManager.tabNext();
|
||
};
|
||
|
||
this.$getScope = function(editor) {
|
||
var scope = editor.session.$mode.$id || "";
|
||
scope = scope.split("/").pop();
|
||
if (scope === "html" || scope === "php") {
|
||
if (scope === "php" && !editor.session.$mode.inlinePhp)
|
||
scope = "html";
|
||
var c = editor.getCursorPosition();
|
||
var state = editor.session.getState(c.row);
|
||
if (typeof state === "object") {
|
||
state = state[0];
|
||
}
|
||
if (state.substring) {
|
||
if (state.substring(0, 3) == "js-")
|
||
scope = "javascript";
|
||
else if (state.substring(0, 4) == "css-")
|
||
scope = "css";
|
||
else if (state.substring(0, 4) == "php-")
|
||
scope = "php";
|
||
}
|
||
}
|
||
|
||
return scope;
|
||
};
|
||
|
||
this.getActiveScopes = function(editor) {
|
||
var scope = this.$getScope(editor);
|
||
var scopes = [scope];
|
||
var snippetMap = this.snippetMap;
|
||
if (snippetMap[scope] && snippetMap[scope].includeScopes) {
|
||
scopes.push.apply(scopes, snippetMap[scope].includeScopes);
|
||
}
|
||
scopes.push("_");
|
||
return scopes;
|
||
};
|
||
|
||
this.expandWithTab = function(editor, options) {
|
||
var self = this;
|
||
var result = editor.forEachSelection(function() {
|
||
return self.expandSnippetForSelection(editor, options);
|
||
}, null, {keepOrder: true});
|
||
if (result && editor.tabstopManager)
|
||
editor.tabstopManager.tabNext();
|
||
return result;
|
||
};
|
||
|
||
this.expandSnippetForSelection = function(editor, options) {
|
||
var cursor = editor.getCursorPosition();
|
||
var line = editor.session.getLine(cursor.row);
|
||
var before = line.substring(0, cursor.column);
|
||
var after = line.substr(cursor.column);
|
||
|
||
var snippetMap = this.snippetMap;
|
||
var snippet;
|
||
this.getActiveScopes(editor).some(function(scope) {
|
||
var snippets = snippetMap[scope];
|
||
if (snippets)
|
||
snippet = this.findMatchingSnippet(snippets, before, after);
|
||
return !!snippet;
|
||
}, this);
|
||
if (!snippet)
|
||
return false;
|
||
if (options && options.dryRun)
|
||
return true;
|
||
editor.session.doc.removeInLine(cursor.row,
|
||
cursor.column - snippet.replaceBefore.length,
|
||
cursor.column + snippet.replaceAfter.length
|
||
);
|
||
|
||
this.variables.M__ = snippet.matchBefore;
|
||
this.variables.T__ = snippet.matchAfter;
|
||
this.insertSnippetForSelection(editor, snippet.content);
|
||
|
||
this.variables.M__ = this.variables.T__ = null;
|
||
return true;
|
||
};
|
||
|
||
this.findMatchingSnippet = function(snippetList, before, after) {
|
||
for (var i = snippetList.length; i--;) {
|
||
var s = snippetList[i];
|
||
if (s.startRe && !s.startRe.test(before))
|
||
continue;
|
||
if (s.endRe && !s.endRe.test(after))
|
||
continue;
|
||
if (!s.startRe && !s.endRe)
|
||
continue;
|
||
|
||
s.matchBefore = s.startRe ? s.startRe.exec(before) : [""];
|
||
s.matchAfter = s.endRe ? s.endRe.exec(after) : [""];
|
||
s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : "";
|
||
s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : "";
|
||
return s;
|
||
}
|
||
};
|
||
|
||
this.snippetMap = {};
|
||
this.snippetNameMap = {};
|
||
this.register = function(snippets, scope) {
|
||
var snippetMap = this.snippetMap;
|
||
var snippetNameMap = this.snippetNameMap;
|
||
var self = this;
|
||
|
||
if (!snippets)
|
||
snippets = [];
|
||
|
||
function wrapRegexp(src) {
|
||
if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src))
|
||
src = "(?:" + src + ")";
|
||
|
||
return src || "";
|
||
}
|
||
function guardedRegexp(re, guard, opening) {
|
||
re = wrapRegexp(re);
|
||
guard = wrapRegexp(guard);
|
||
if (opening) {
|
||
re = guard + re;
|
||
if (re && re[re.length - 1] != "$")
|
||
re = re + "$";
|
||
} else {
|
||
re = re + guard;
|
||
if (re && re[0] != "^")
|
||
re = "^" + re;
|
||
}
|
||
return new RegExp(re);
|
||
}
|
||
|
||
function addSnippet(s) {
|
||
if (!s.scope)
|
||
s.scope = scope || "_";
|
||
scope = s.scope;
|
||
if (!snippetMap[scope]) {
|
||
snippetMap[scope] = [];
|
||
snippetNameMap[scope] = {};
|
||
}
|
||
|
||
var map = snippetNameMap[scope];
|
||
if (s.name) {
|
||
var old = map[s.name];
|
||
if (old)
|
||
self.unregister(old);
|
||
map[s.name] = s;
|
||
}
|
||
snippetMap[scope].push(s);
|
||
|
||
if (s.tabTrigger && !s.trigger) {
|
||
if (!s.guard && /^\w/.test(s.tabTrigger))
|
||
s.guard = "\\b";
|
||
s.trigger = lang.escapeRegExp(s.tabTrigger);
|
||
}
|
||
|
||
if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard)
|
||
return;
|
||
|
||
s.startRe = guardedRegexp(s.trigger, s.guard, true);
|
||
s.triggerRe = new RegExp(s.trigger, "", true);
|
||
|
||
s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);
|
||
s.endTriggerRe = new RegExp(s.endTrigger, "", true);
|
||
}
|
||
|
||
if (snippets && snippets.content)
|
||
addSnippet(snippets);
|
||
else if (Array.isArray(snippets))
|
||
snippets.forEach(addSnippet);
|
||
|
||
this._signal("registerSnippets", {scope: scope});
|
||
};
|
||
this.unregister = function(snippets, scope) {
|
||
var snippetMap = this.snippetMap;
|
||
var snippetNameMap = this.snippetNameMap;
|
||
|
||
function removeSnippet(s) {
|
||
var nameMap = snippetNameMap[s.scope||scope];
|
||
if (nameMap && nameMap[s.name]) {
|
||
delete nameMap[s.name];
|
||
var map = snippetMap[s.scope||scope];
|
||
var i = map && map.indexOf(s);
|
||
if (i >= 0)
|
||
map.splice(i, 1);
|
||
}
|
||
}
|
||
if (snippets.content)
|
||
removeSnippet(snippets);
|
||
else if (Array.isArray(snippets))
|
||
snippets.forEach(removeSnippet);
|
||
};
|
||
this.parseSnippetFile = function(str) {
|
||
str = str.replace(/\r/g, "");
|
||
var list = [], snippet = {};
|
||
var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;
|
||
var m;
|
||
while (m = re.exec(str)) {
|
||
if (m[1]) {
|
||
try {
|
||
snippet = JSON.parse(m[1]);
|
||
list.push(snippet);
|
||
} catch (e) {}
|
||
} if (m[4]) {
|
||
snippet.content = m[4].replace(/^\t/gm, "");
|
||
list.push(snippet);
|
||
snippet = {};
|
||
} else {
|
||
var key = m[2], val = m[3];
|
||
if (key == "regex") {
|
||
var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g;
|
||
snippet.guard = guardRe.exec(val)[1];
|
||
snippet.trigger = guardRe.exec(val)[1];
|
||
snippet.endTrigger = guardRe.exec(val)[1];
|
||
snippet.endGuard = guardRe.exec(val)[1];
|
||
} else if (key == "snippet") {
|
||
snippet.tabTrigger = val.match(/^\S*/)[0];
|
||
if (!snippet.name)
|
||
snippet.name = val;
|
||
} else {
|
||
snippet[key] = val;
|
||
}
|
||
}
|
||
}
|
||
return list;
|
||
};
|
||
this.getSnippetByName = function(name, editor) {
|
||
var snippetMap = this.snippetNameMap;
|
||
var snippet;
|
||
this.getActiveScopes(editor).some(function(scope) {
|
||
var snippets = snippetMap[scope];
|
||
if (snippets)
|
||
snippet = snippets[name];
|
||
return !!snippet;
|
||
}, this);
|
||
return snippet;
|
||
};
|
||
|
||
}).call(SnippetManager.prototype);
|
||
|
||
|
||
var TabstopManager = function(editor) {
|
||
if (editor.tabstopManager)
|
||
return editor.tabstopManager;
|
||
editor.tabstopManager = this;
|
||
this.$onChange = this.onChange.bind(this);
|
||
this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;
|
||
this.$onChangeSession = this.onChangeSession.bind(this);
|
||
this.$onAfterExec = this.onAfterExec.bind(this);
|
||
this.attach(editor);
|
||
};
|
||
(function() {
|
||
this.attach = function(editor) {
|
||
this.index = 0;
|
||
this.ranges = [];
|
||
this.tabstops = [];
|
||
this.$openTabstops = null;
|
||
this.selectedTabstop = null;
|
||
|
||
this.editor = editor;
|
||
this.editor.on("change", this.$onChange);
|
||
this.editor.on("changeSelection", this.$onChangeSelection);
|
||
this.editor.on("changeSession", this.$onChangeSession);
|
||
this.editor.commands.on("afterExec", this.$onAfterExec);
|
||
this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
|
||
};
|
||
this.detach = function() {
|
||
this.tabstops.forEach(this.removeTabstopMarkers, this);
|
||
this.ranges = null;
|
||
this.tabstops = null;
|
||
this.selectedTabstop = null;
|
||
this.editor.removeListener("change", this.$onChange);
|
||
this.editor.removeListener("changeSelection", this.$onChangeSelection);
|
||
this.editor.removeListener("changeSession", this.$onChangeSession);
|
||
this.editor.commands.removeListener("afterExec", this.$onAfterExec);
|
||
this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
|
||
this.editor.tabstopManager = null;
|
||
this.editor = null;
|
||
};
|
||
|
||
this.onChange = function(delta) {
|
||
var changeRange = delta;
|
||
var isRemove = delta.action[0] == "r";
|
||
var start = delta.start;
|
||
var end = delta.end;
|
||
var startRow = start.row;
|
||
var endRow = end.row;
|
||
var lineDif = endRow - startRow;
|
||
var colDiff = end.column - start.column;
|
||
|
||
if (isRemove) {
|
||
lineDif = -lineDif;
|
||
colDiff = -colDiff;
|
||
}
|
||
if (!this.$inChange && isRemove) {
|
||
var ts = this.selectedTabstop;
|
||
var changedOutside = ts && !ts.some(function(r) {
|
||
return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;
|
||
});
|
||
if (changedOutside)
|
||
return this.detach();
|
||
}
|
||
var ranges = this.ranges;
|
||
for (var i = 0; i < ranges.length; i++) {
|
||
var r = ranges[i];
|
||
if (r.end.row < start.row)
|
||
continue;
|
||
|
||
if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {
|
||
this.removeRange(r);
|
||
i--;
|
||
continue;
|
||
}
|
||
|
||
if (r.start.row == startRow && r.start.column > start.column)
|
||
r.start.column += colDiff;
|
||
if (r.end.row == startRow && r.end.column >= start.column)
|
||
r.end.column += colDiff;
|
||
if (r.start.row >= startRow)
|
||
r.start.row += lineDif;
|
||
if (r.end.row >= startRow)
|
||
r.end.row += lineDif;
|
||
|
||
if (comparePoints(r.start, r.end) > 0)
|
||
this.removeRange(r);
|
||
}
|
||
if (!ranges.length)
|
||
this.detach();
|
||
};
|
||
this.updateLinkedFields = function() {
|
||
var ts = this.selectedTabstop;
|
||
if (!ts || !ts.hasLinkedRanges)
|
||
return;
|
||
this.$inChange = true;
|
||
var session = this.editor.session;
|
||
var text = session.getTextRange(ts.firstNonLinked);
|
||
for (var i = ts.length; i--;) {
|
||
var range = ts[i];
|
||
if (!range.linked)
|
||
continue;
|
||
var fmt = exports.snippetManager.tmStrFormat(text, range.original);
|
||
session.replace(range, fmt);
|
||
}
|
||
this.$inChange = false;
|
||
};
|
||
this.onAfterExec = function(e) {
|
||
if (e.command && !e.command.readOnly)
|
||
this.updateLinkedFields();
|
||
};
|
||
this.onChangeSelection = function() {
|
||
if (!this.editor)
|
||
return;
|
||
var lead = this.editor.selection.lead;
|
||
var anchor = this.editor.selection.anchor;
|
||
var isEmpty = this.editor.selection.isEmpty();
|
||
for (var i = this.ranges.length; i--;) {
|
||
if (this.ranges[i].linked)
|
||
continue;
|
||
var containsLead = this.ranges[i].contains(lead.row, lead.column);
|
||
var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);
|
||
if (containsLead && containsAnchor)
|
||
return;
|
||
}
|
||
this.detach();
|
||
};
|
||
this.onChangeSession = function() {
|
||
this.detach();
|
||
};
|
||
this.tabNext = function(dir) {
|
||
var max = this.tabstops.length;
|
||
var index = this.index + (dir || 1);
|
||
index = Math.min(Math.max(index, 1), max);
|
||
if (index == max)
|
||
index = 0;
|
||
this.selectTabstop(index);
|
||
if (index === 0)
|
||
this.detach();
|
||
};
|
||
this.selectTabstop = function(index) {
|
||
this.$openTabstops = null;
|
||
var ts = this.tabstops[this.index];
|
||
if (ts)
|
||
this.addTabstopMarkers(ts);
|
||
this.index = index;
|
||
ts = this.tabstops[this.index];
|
||
if (!ts || !ts.length)
|
||
return;
|
||
|
||
this.selectedTabstop = ts;
|
||
if (!this.editor.inVirtualSelectionMode) {
|
||
var sel = this.editor.multiSelect;
|
||
sel.toSingleRange(ts.firstNonLinked.clone());
|
||
for (var i = ts.length; i--;) {
|
||
if (ts.hasLinkedRanges && ts[i].linked)
|
||
continue;
|
||
sel.addRange(ts[i].clone(), true);
|
||
}
|
||
if (sel.ranges[0])
|
||
sel.addRange(sel.ranges[0].clone());
|
||
} else {
|
||
this.editor.selection.setRange(ts.firstNonLinked);
|
||
}
|
||
|
||
this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
|
||
};
|
||
this.addTabstops = function(tabstops, start, end) {
|
||
if (!this.$openTabstops)
|
||
this.$openTabstops = [];
|
||
if (!tabstops[0]) {
|
||
var p = Range.fromPoints(end, end);
|
||
moveRelative(p.start, start);
|
||
moveRelative(p.end, start);
|
||
tabstops[0] = [p];
|
||
tabstops[0].index = 0;
|
||
}
|
||
|
||
var i = this.index;
|
||
var arg = [i + 1, 0];
|
||
var ranges = this.ranges;
|
||
tabstops.forEach(function(ts, index) {
|
||
var dest = this.$openTabstops[index] || ts;
|
||
|
||
for (var i = ts.length; i--;) {
|
||
var p = ts[i];
|
||
var range = Range.fromPoints(p.start, p.end || p.start);
|
||
movePoint(range.start, start);
|
||
movePoint(range.end, start);
|
||
range.original = p;
|
||
range.tabstop = dest;
|
||
ranges.push(range);
|
||
if (dest != ts)
|
||
dest.unshift(range);
|
||
else
|
||
dest[i] = range;
|
||
if (p.fmtString) {
|
||
range.linked = true;
|
||
dest.hasLinkedRanges = true;
|
||
} else if (!dest.firstNonLinked)
|
||
dest.firstNonLinked = range;
|
||
}
|
||
if (!dest.firstNonLinked)
|
||
dest.hasLinkedRanges = false;
|
||
if (dest === ts) {
|
||
arg.push(dest);
|
||
this.$openTabstops[index] = dest;
|
||
}
|
||
this.addTabstopMarkers(dest);
|
||
}, this);
|
||
|
||
if (arg.length > 2) {
|
||
if (this.tabstops.length)
|
||
arg.push(arg.splice(2, 1)[0]);
|
||
this.tabstops.splice.apply(this.tabstops, arg);
|
||
}
|
||
};
|
||
|
||
this.addTabstopMarkers = function(ts) {
|
||
var session = this.editor.session;
|
||
ts.forEach(function(range) {
|
||
if (!range.markerId)
|
||
range.markerId = session.addMarker(range, "ace_snippet-marker", "text");
|
||
});
|
||
};
|
||
this.removeTabstopMarkers = function(ts) {
|
||
var session = this.editor.session;
|
||
ts.forEach(function(range) {
|
||
session.removeMarker(range.markerId);
|
||
range.markerId = null;
|
||
});
|
||
};
|
||
this.removeRange = function(range) {
|
||
var i = range.tabstop.indexOf(range);
|
||
range.tabstop.splice(i, 1);
|
||
i = this.ranges.indexOf(range);
|
||
this.ranges.splice(i, 1);
|
||
this.editor.session.removeMarker(range.markerId);
|
||
if (!range.tabstop.length) {
|
||
i = this.tabstops.indexOf(range.tabstop);
|
||
if (i != -1)
|
||
this.tabstops.splice(i, 1);
|
||
if (!this.tabstops.length)
|
||
this.detach();
|
||
}
|
||
};
|
||
|
||
this.keyboardHandler = new HashHandler();
|
||
this.keyboardHandler.bindKeys({
|
||
"Tab": function(ed) {
|
||
if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {
|
||
return;
|
||
}
|
||
|
||
ed.tabstopManager.tabNext(1);
|
||
},
|
||
"Shift-Tab": function(ed) {
|
||
ed.tabstopManager.tabNext(-1);
|
||
},
|
||
"Esc": function(ed) {
|
||
ed.tabstopManager.detach();
|
||
},
|
||
"Return": function(ed) {
|
||
return false;
|
||
}
|
||
});
|
||
}).call(TabstopManager.prototype);
|
||
|
||
|
||
|
||
var changeTracker = {};
|
||
changeTracker.onChange = Anchor.prototype.onChange;
|
||
changeTracker.setPosition = function(row, column) {
|
||
this.pos.row = row;
|
||
this.pos.column = column;
|
||
};
|
||
changeTracker.update = function(pos, delta, $insertRight) {
|
||
this.$insertRight = $insertRight;
|
||
this.pos = pos;
|
||
this.onChange(delta);
|
||
};
|
||
|
||
var movePoint = function(point, diff) {
|
||
if (point.row == 0)
|
||
point.column += diff.column;
|
||
point.row += diff.row;
|
||
};
|
||
|
||
var moveRelative = function(point, start) {
|
||
if (point.row == start.row)
|
||
point.column -= start.column;
|
||
point.row -= start.row;
|
||
};
|
||
|
||
|
||
acequire("./lib/dom").importCssString("\
|
||
.ace_snippet-marker {\
|
||
-moz-box-sizing: border-box;\
|
||
box-sizing: border-box;\
|
||
background: rgba(194, 193, 208, 0.09);\
|
||
border: 1px dotted rgba(211, 208, 235, 0.62);\
|
||
position: absolute;\
|
||
}");
|
||
|
||
exports.snippetManager = new SnippetManager();
|
||
|
||
|
||
var Editor = acequire("./editor").Editor;
|
||
(function() {
|
||
this.insertSnippet = function(content, options) {
|
||
return exports.snippetManager.insertSnippet(this, content, options);
|
||
};
|
||
this.expandSnippet = function(options) {
|
||
return exports.snippetManager.expandWithTab(this, options);
|
||
};
|
||
}).call(Editor.prototype);
|
||
|
||
});
|
||
|
||
ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var Renderer = acequire("../virtual_renderer").VirtualRenderer;
|
||
var Editor = acequire("../editor").Editor;
|
||
var Range = acequire("../range").Range;
|
||
var event = acequire("../lib/event");
|
||
var lang = acequire("../lib/lang");
|
||
var dom = acequire("../lib/dom");
|
||
|
||
var $singleLineEditor = function(el) {
|
||
var renderer = new Renderer(el);
|
||
|
||
renderer.$maxLines = 4;
|
||
|
||
var editor = new Editor(renderer);
|
||
|
||
editor.setHighlightActiveLine(false);
|
||
editor.setShowPrintMargin(false);
|
||
editor.renderer.setShowGutter(false);
|
||
editor.renderer.setHighlightGutterLine(false);
|
||
|
||
editor.$mouseHandler.$focusWaitTimout = 0;
|
||
editor.$highlightTagPending = true;
|
||
|
||
return editor;
|
||
};
|
||
|
||
var AcePopup = function(parentNode) {
|
||
var el = dom.createElement("div");
|
||
var popup = new $singleLineEditor(el);
|
||
|
||
if (parentNode)
|
||
parentNode.appendChild(el);
|
||
el.style.display = "none";
|
||
popup.renderer.content.style.cursor = "default";
|
||
popup.renderer.setStyle("ace_autocomplete");
|
||
|
||
popup.setOption("displayIndentGuides", false);
|
||
popup.setOption("dragDelay", 150);
|
||
|
||
var noop = function(){};
|
||
|
||
popup.focus = noop;
|
||
popup.$isFocused = true;
|
||
|
||
popup.renderer.$cursorLayer.restartTimer = noop;
|
||
popup.renderer.$cursorLayer.element.style.opacity = 0;
|
||
|
||
popup.renderer.$maxLines = 8;
|
||
popup.renderer.$keepTextAreaAtCursor = false;
|
||
|
||
popup.setHighlightActiveLine(false);
|
||
popup.session.highlight("");
|
||
popup.session.$searchHighlight.clazz = "ace_highlight-marker";
|
||
|
||
popup.on("mousedown", function(e) {
|
||
var pos = e.getDocumentPosition();
|
||
popup.selection.moveToPosition(pos);
|
||
selectionMarker.start.row = selectionMarker.end.row = pos.row;
|
||
e.stop();
|
||
});
|
||
|
||
var lastMouseEvent;
|
||
var hoverMarker = new Range(-1,0,-1,Infinity);
|
||
var selectionMarker = new Range(-1,0,-1,Infinity);
|
||
selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine");
|
||
popup.setSelectOnHover = function(val) {
|
||
if (!val) {
|
||
hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine");
|
||
} else if (hoverMarker.id) {
|
||
popup.session.removeMarker(hoverMarker.id);
|
||
hoverMarker.id = null;
|
||
}
|
||
};
|
||
popup.setSelectOnHover(false);
|
||
popup.on("mousemove", function(e) {
|
||
if (!lastMouseEvent) {
|
||
lastMouseEvent = e;
|
||
return;
|
||
}
|
||
if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {
|
||
return;
|
||
}
|
||
lastMouseEvent = e;
|
||
lastMouseEvent.scrollTop = popup.renderer.scrollTop;
|
||
var row = lastMouseEvent.getDocumentPosition().row;
|
||
if (hoverMarker.start.row != row) {
|
||
if (!hoverMarker.id)
|
||
popup.setRow(row);
|
||
setHoverMarker(row);
|
||
}
|
||
});
|
||
popup.renderer.on("beforeRender", function() {
|
||
if (lastMouseEvent && hoverMarker.start.row != -1) {
|
||
lastMouseEvent.$pos = null;
|
||
var row = lastMouseEvent.getDocumentPosition().row;
|
||
if (!hoverMarker.id)
|
||
popup.setRow(row);
|
||
setHoverMarker(row, true);
|
||
}
|
||
});
|
||
popup.renderer.on("afterRender", function() {
|
||
var row = popup.getRow();
|
||
var t = popup.renderer.$textLayer;
|
||
var selected = t.element.childNodes[row - t.config.firstRow];
|
||
if (selected == t.selectedNode)
|
||
return;
|
||
if (t.selectedNode)
|
||
dom.removeCssClass(t.selectedNode, "ace_selected");
|
||
t.selectedNode = selected;
|
||
if (selected)
|
||
dom.addCssClass(selected, "ace_selected");
|
||
});
|
||
var hideHoverMarker = function() { setHoverMarker(-1) };
|
||
var setHoverMarker = function(row, suppressRedraw) {
|
||
if (row !== hoverMarker.start.row) {
|
||
hoverMarker.start.row = hoverMarker.end.row = row;
|
||
if (!suppressRedraw)
|
||
popup.session._emit("changeBackMarker");
|
||
popup._emit("changeHoverMarker");
|
||
}
|
||
};
|
||
popup.getHoveredRow = function() {
|
||
return hoverMarker.start.row;
|
||
};
|
||
|
||
event.addListener(popup.container, "mouseout", hideHoverMarker);
|
||
popup.on("hide", hideHoverMarker);
|
||
popup.on("changeSelection", hideHoverMarker);
|
||
|
||
popup.session.doc.getLength = function() {
|
||
return popup.data.length;
|
||
};
|
||
popup.session.doc.getLine = function(i) {
|
||
var data = popup.data[i];
|
||
if (typeof data == "string")
|
||
return data;
|
||
return (data && data.value) || "";
|
||
};
|
||
|
||
var bgTokenizer = popup.session.bgTokenizer;
|
||
bgTokenizer.$tokenizeRow = function(row) {
|
||
var data = popup.data[row];
|
||
var tokens = [];
|
||
if (!data)
|
||
return tokens;
|
||
if (typeof data == "string")
|
||
data = {value: data};
|
||
if (!data.caption)
|
||
data.caption = data.value || data.name;
|
||
|
||
var last = -1;
|
||
var flag, c;
|
||
for (var i = 0; i < data.caption.length; i++) {
|
||
c = data.caption[i];
|
||
flag = data.matchMask & (1 << i) ? 1 : 0;
|
||
if (last !== flag) {
|
||
tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c});
|
||
last = flag;
|
||
} else {
|
||
tokens[tokens.length - 1].value += c;
|
||
}
|
||
}
|
||
|
||
if (data.meta) {
|
||
var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;
|
||
var metaData = data.meta;
|
||
if (metaData.length + data.caption.length > maxW - 2) {
|
||
metaData = metaData.substr(0, maxW - data.caption.length - 3) + "\u2026"
|
||
}
|
||
tokens.push({type: "rightAlignedText", value: metaData});
|
||
}
|
||
return tokens;
|
||
};
|
||
bgTokenizer.$updateOnChange = noop;
|
||
bgTokenizer.start = noop;
|
||
|
||
popup.session.$computeWidth = function() {
|
||
return this.screenWidth = 0;
|
||
};
|
||
|
||
popup.$blockScrolling = Infinity;
|
||
popup.isOpen = false;
|
||
popup.isTopdown = false;
|
||
|
||
popup.data = [];
|
||
popup.setData = function(list) {
|
||
popup.setValue(lang.stringRepeat("\n", list.length), -1);
|
||
popup.data = list || [];
|
||
popup.setRow(0);
|
||
};
|
||
popup.getData = function(row) {
|
||
return popup.data[row];
|
||
};
|
||
|
||
popup.getRow = function() {
|
||
return selectionMarker.start.row;
|
||
};
|
||
popup.setRow = function(line) {
|
||
line = Math.max(0, Math.min(this.data.length, line));
|
||
if (selectionMarker.start.row != line) {
|
||
popup.selection.clearSelection();
|
||
selectionMarker.start.row = selectionMarker.end.row = line || 0;
|
||
popup.session._emit("changeBackMarker");
|
||
popup.moveCursorTo(line || 0, 0);
|
||
if (popup.isOpen)
|
||
popup._signal("select");
|
||
}
|
||
};
|
||
|
||
popup.on("changeSelection", function() {
|
||
if (popup.isOpen)
|
||
popup.setRow(popup.selection.lead.row);
|
||
popup.renderer.scrollCursorIntoView();
|
||
});
|
||
|
||
popup.hide = function() {
|
||
this.container.style.display = "none";
|
||
this._signal("hide");
|
||
popup.isOpen = false;
|
||
};
|
||
popup.show = function(pos, lineHeight, topdownOnly) {
|
||
var el = this.container;
|
||
var screenHeight = window.innerHeight;
|
||
var screenWidth = window.innerWidth;
|
||
var renderer = this.renderer;
|
||
var maxH = renderer.$maxLines * lineHeight * 1.4;
|
||
var top = pos.top + this.$borderSize;
|
||
if (top + maxH > screenHeight - lineHeight && !topdownOnly) {
|
||
el.style.top = "";
|
||
el.style.bottom = screenHeight - top + "px";
|
||
popup.isTopdown = false;
|
||
} else {
|
||
top += lineHeight;
|
||
el.style.top = top + "px";
|
||
el.style.bottom = "";
|
||
popup.isTopdown = true;
|
||
}
|
||
|
||
el.style.display = "";
|
||
this.renderer.$textLayer.checkForSizeChanges();
|
||
|
||
var left = pos.left;
|
||
if (left + el.offsetWidth > screenWidth)
|
||
left = screenWidth - el.offsetWidth;
|
||
|
||
el.style.left = left + "px";
|
||
|
||
this._signal("show");
|
||
lastMouseEvent = null;
|
||
popup.isOpen = true;
|
||
};
|
||
|
||
popup.getTextLeftOffset = function() {
|
||
return this.$borderSize + this.renderer.$padding + this.$imageSize;
|
||
};
|
||
|
||
popup.$imageSize = 0;
|
||
popup.$borderSize = 1;
|
||
|
||
return popup;
|
||
};
|
||
|
||
dom.importCssString("\
|
||
.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\
|
||
background-color: #CAD6FA;\
|
||
z-index: 1;\
|
||
}\
|
||
.ace_editor.ace_autocomplete .ace_line-hover {\
|
||
border: 1px solid #abbffe;\
|
||
margin-top: -1px;\
|
||
background: rgba(233,233,253,0.4);\
|
||
}\
|
||
.ace_editor.ace_autocomplete .ace_line-hover {\
|
||
position: absolute;\
|
||
z-index: 2;\
|
||
}\
|
||
.ace_editor.ace_autocomplete .ace_scroller {\
|
||
background: none;\
|
||
border: none;\
|
||
box-shadow: none;\
|
||
}\
|
||
.ace_rightAlignedText {\
|
||
color: gray;\
|
||
display: inline-block;\
|
||
position: absolute;\
|
||
right: 4px;\
|
||
text-align: right;\
|
||
z-index: -1;\
|
||
}\
|
||
.ace_editor.ace_autocomplete .ace_completion-highlight{\
|
||
color: #000;\
|
||
text-shadow: 0 0 0.01em;\
|
||
}\
|
||
.ace_editor.ace_autocomplete {\
|
||
width: 280px;\
|
||
z-index: 200000;\
|
||
background: #fbfbfb;\
|
||
color: #444;\
|
||
border: 1px lightgray solid;\
|
||
position: fixed;\
|
||
box-shadow: 2px 3px 5px rgba(0,0,0,.2);\
|
||
line-height: 1.4;\
|
||
}");
|
||
|
||
exports.AcePopup = AcePopup;
|
||
|
||
});
|
||
|
||
ace.define("ace/autocomplete/util",["require","exports","module"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
exports.parForEach = function(array, fn, callback) {
|
||
var completed = 0;
|
||
var arLength = array.length;
|
||
if (arLength === 0)
|
||
callback();
|
||
for (var i = 0; i < arLength; i++) {
|
||
fn(array[i], function(result, err) {
|
||
completed++;
|
||
if (completed === arLength)
|
||
callback(result, err);
|
||
});
|
||
}
|
||
};
|
||
|
||
var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/;
|
||
|
||
exports.retrievePrecedingIdentifier = function(text, pos, regex) {
|
||
regex = regex || ID_REGEX;
|
||
var buf = [];
|
||
for (var i = pos-1; i >= 0; i--) {
|
||
if (regex.test(text[i]))
|
||
buf.push(text[i]);
|
||
else
|
||
break;
|
||
}
|
||
return buf.reverse().join("");
|
||
};
|
||
|
||
exports.retrieveFollowingIdentifier = function(text, pos, regex) {
|
||
regex = regex || ID_REGEX;
|
||
var buf = [];
|
||
for (var i = pos; i < text.length; i++) {
|
||
if (regex.test(text[i]))
|
||
buf.push(text[i]);
|
||
else
|
||
break;
|
||
}
|
||
return buf;
|
||
};
|
||
|
||
exports.getCompletionPrefix = function (editor) {
|
||
var pos = editor.getCursorPosition();
|
||
var line = editor.session.getLine(pos.row);
|
||
var prefix;
|
||
editor.completers.forEach(function(completer) {
|
||
if (completer.identifierRegexps) {
|
||
completer.identifierRegexps.forEach(function(identifierRegex) {
|
||
if (!prefix && identifierRegex)
|
||
prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex);
|
||
}.bind(this));
|
||
}
|
||
}.bind(this));
|
||
return prefix || this.retrievePrecedingIdentifier(line, pos.column);
|
||
};
|
||
|
||
});
|
||
|
||
ace.define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/snippets"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var HashHandler = acequire("./keyboard/hash_handler").HashHandler;
|
||
var AcePopup = acequire("./autocomplete/popup").AcePopup;
|
||
var util = acequire("./autocomplete/util");
|
||
var event = acequire("./lib/event");
|
||
var lang = acequire("./lib/lang");
|
||
var dom = acequire("./lib/dom");
|
||
var snippetManager = acequire("./snippets").snippetManager;
|
||
|
||
var Autocomplete = function() {
|
||
this.autoInsert = false;
|
||
this.autoSelect = true;
|
||
this.exactMatch = false;
|
||
this.gatherCompletionsId = 0;
|
||
this.keyboardHandler = new HashHandler();
|
||
this.keyboardHandler.bindKeys(this.commands);
|
||
|
||
this.blurListener = this.blurListener.bind(this);
|
||
this.changeListener = this.changeListener.bind(this);
|
||
this.mousedownListener = this.mousedownListener.bind(this);
|
||
this.mousewheelListener = this.mousewheelListener.bind(this);
|
||
|
||
this.changeTimer = lang.delayedCall(function() {
|
||
this.updateCompletions(true);
|
||
}.bind(this));
|
||
|
||
this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);
|
||
};
|
||
|
||
(function() {
|
||
|
||
this.$init = function() {
|
||
this.popup = new AcePopup(document.body || document.documentElement);
|
||
this.popup.on("click", function(e) {
|
||
this.insertMatch();
|
||
e.stop();
|
||
}.bind(this));
|
||
this.popup.focus = this.editor.focus.bind(this.editor);
|
||
this.popup.on("show", this.tooltipTimer.bind(null, null));
|
||
this.popup.on("select", this.tooltipTimer.bind(null, null));
|
||
this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null));
|
||
return this.popup;
|
||
};
|
||
|
||
this.getPopup = function() {
|
||
return this.popup || this.$init();
|
||
};
|
||
|
||
this.openPopup = function(editor, prefix, keepPopupPosition) {
|
||
if (!this.popup)
|
||
this.$init();
|
||
|
||
this.popup.setData(this.completions.filtered);
|
||
|
||
editor.keyBinding.addKeyboardHandler(this.keyboardHandler);
|
||
|
||
var renderer = editor.renderer;
|
||
this.popup.setRow(this.autoSelect ? 0 : -1);
|
||
if (!keepPopupPosition) {
|
||
this.popup.setTheme(editor.getTheme());
|
||
this.popup.setFontSize(editor.getFontSize());
|
||
|
||
var lineHeight = renderer.layerConfig.lineHeight;
|
||
|
||
var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);
|
||
pos.left -= this.popup.getTextLeftOffset();
|
||
|
||
var rect = editor.container.getBoundingClientRect();
|
||
pos.top += rect.top - renderer.layerConfig.offset;
|
||
pos.left += rect.left - editor.renderer.scrollLeft;
|
||
pos.left += renderer.gutterWidth;
|
||
|
||
this.popup.show(pos, lineHeight);
|
||
} else if (keepPopupPosition && !prefix) {
|
||
this.detach();
|
||
}
|
||
};
|
||
|
||
this.detach = function() {
|
||
this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);
|
||
this.editor.off("changeSelection", this.changeListener);
|
||
this.editor.off("blur", this.blurListener);
|
||
this.editor.off("mousedown", this.mousedownListener);
|
||
this.editor.off("mousewheel", this.mousewheelListener);
|
||
this.changeTimer.cancel();
|
||
this.hideDocTooltip();
|
||
|
||
this.gatherCompletionsId += 1;
|
||
if (this.popup && this.popup.isOpen)
|
||
this.popup.hide();
|
||
|
||
if (this.base)
|
||
this.base.detach();
|
||
this.activated = false;
|
||
this.completions = this.base = null;
|
||
};
|
||
|
||
this.changeListener = function(e) {
|
||
var cursor = this.editor.selection.lead;
|
||
if (cursor.row != this.base.row || cursor.column < this.base.column) {
|
||
this.detach();
|
||
}
|
||
if (this.activated)
|
||
this.changeTimer.schedule();
|
||
else
|
||
this.detach();
|
||
};
|
||
|
||
this.blurListener = function(e) {
|
||
var el = document.activeElement;
|
||
var text = this.editor.textInput.getElement();
|
||
var fromTooltip = e.relatedTarget && e.relatedTarget == this.tooltipNode;
|
||
var container = this.popup && this.popup.container;
|
||
if (el != text && el.parentNode != container && !fromTooltip
|
||
&& el != this.tooltipNode && e.relatedTarget != text
|
||
) {
|
||
this.detach();
|
||
}
|
||
};
|
||
|
||
this.mousedownListener = function(e) {
|
||
this.detach();
|
||
};
|
||
|
||
this.mousewheelListener = function(e) {
|
||
this.detach();
|
||
};
|
||
|
||
this.goTo = function(where) {
|
||
var row = this.popup.getRow();
|
||
var max = this.popup.session.getLength() - 1;
|
||
|
||
switch(where) {
|
||
case "up": row = row <= 0 ? max : row - 1; break;
|
||
case "down": row = row >= max ? -1 : row + 1; break;
|
||
case "start": row = 0; break;
|
||
case "end": row = max; break;
|
||
}
|
||
|
||
this.popup.setRow(row);
|
||
};
|
||
|
||
this.insertMatch = function(data, options) {
|
||
if (!data)
|
||
data = this.popup.getData(this.popup.getRow());
|
||
if (!data)
|
||
return false;
|
||
|
||
if (data.completer && data.completer.insertMatch) {
|
||
data.completer.insertMatch(this.editor, data);
|
||
} else {
|
||
if (this.completions.filterText) {
|
||
var ranges = this.editor.selection.getAllRanges();
|
||
for (var i = 0, range; range = ranges[i]; i++) {
|
||
range.start.column -= this.completions.filterText.length;
|
||
this.editor.session.remove(range);
|
||
}
|
||
}
|
||
if (data.snippet)
|
||
snippetManager.insertSnippet(this.editor, data.snippet);
|
||
else
|
||
this.editor.execCommand("insertstring", data.value || data);
|
||
}
|
||
this.detach();
|
||
};
|
||
|
||
|
||
this.commands = {
|
||
"Up": function(editor) { editor.completer.goTo("up"); },
|
||
"Down": function(editor) { editor.completer.goTo("down"); },
|
||
"Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },
|
||
"Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },
|
||
|
||
"Esc": function(editor) { editor.completer.detach(); },
|
||
"Return": function(editor) { return editor.completer.insertMatch(); },
|
||
"Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); },
|
||
"Tab": function(editor) {
|
||
var result = editor.completer.insertMatch();
|
||
if (!result && !editor.tabstopManager)
|
||
editor.completer.goTo("down");
|
||
else
|
||
return result;
|
||
},
|
||
|
||
"PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },
|
||
"PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }
|
||
};
|
||
|
||
this.gatherCompletions = function(editor, callback) {
|
||
var session = editor.getSession();
|
||
var pos = editor.getCursorPosition();
|
||
|
||
var line = session.getLine(pos.row);
|
||
var prefix = util.getCompletionPrefix(editor);
|
||
|
||
this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);
|
||
this.base.$insertRight = true;
|
||
|
||
var matches = [];
|
||
var total = editor.completers.length;
|
||
editor.completers.forEach(function(completer, i) {
|
||
completer.getCompletions(editor, session, pos, prefix, function(err, results) {
|
||
if (!err && results)
|
||
matches = matches.concat(results);
|
||
var pos = editor.getCursorPosition();
|
||
var line = session.getLine(pos.row);
|
||
callback(null, {
|
||
prefix: prefix,
|
||
matches: matches,
|
||
finished: (--total === 0)
|
||
});
|
||
});
|
||
});
|
||
return true;
|
||
};
|
||
|
||
this.showPopup = function(editor) {
|
||
if (this.editor)
|
||
this.detach();
|
||
|
||
this.activated = true;
|
||
|
||
this.editor = editor;
|
||
if (editor.completer != this) {
|
||
if (editor.completer)
|
||
editor.completer.detach();
|
||
editor.completer = this;
|
||
}
|
||
|
||
editor.on("changeSelection", this.changeListener);
|
||
editor.on("blur", this.blurListener);
|
||
editor.on("mousedown", this.mousedownListener);
|
||
editor.on("mousewheel", this.mousewheelListener);
|
||
|
||
this.updateCompletions();
|
||
};
|
||
|
||
this.updateCompletions = function(keepPopupPosition) {
|
||
if (keepPopupPosition && this.base && this.completions) {
|
||
var pos = this.editor.getCursorPosition();
|
||
var prefix = this.editor.session.getTextRange({start: this.base, end: pos});
|
||
if (prefix == this.completions.filterText)
|
||
return;
|
||
this.completions.setFilter(prefix);
|
||
if (!this.completions.filtered.length)
|
||
return this.detach();
|
||
if (this.completions.filtered.length == 1
|
||
&& this.completions.filtered[0].value == prefix
|
||
&& !this.completions.filtered[0].snippet)
|
||
return this.detach();
|
||
this.openPopup(this.editor, prefix, keepPopupPosition);
|
||
return;
|
||
}
|
||
var _id = this.gatherCompletionsId;
|
||
this.gatherCompletions(this.editor, function(err, results) {
|
||
var detachIfFinished = function() {
|
||
if (!results.finished) return;
|
||
return this.detach();
|
||
}.bind(this);
|
||
|
||
var prefix = results.prefix;
|
||
var matches = results && results.matches;
|
||
|
||
if (!matches || !matches.length)
|
||
return detachIfFinished();
|
||
if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)
|
||
return;
|
||
|
||
this.completions = new FilteredList(matches);
|
||
|
||
if (this.exactMatch)
|
||
this.completions.exactMatch = true;
|
||
|
||
this.completions.setFilter(prefix);
|
||
var filtered = this.completions.filtered;
|
||
if (!filtered.length)
|
||
return detachIfFinished();
|
||
if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)
|
||
return detachIfFinished();
|
||
if (this.autoInsert && filtered.length == 1 && results.finished)
|
||
return this.insertMatch(filtered[0]);
|
||
|
||
this.openPopup(this.editor, prefix, keepPopupPosition);
|
||
}.bind(this));
|
||
};
|
||
|
||
this.cancelContextMenu = function() {
|
||
this.editor.$mouseHandler.cancelContextMenu();
|
||
};
|
||
|
||
this.updateDocTooltip = function() {
|
||
var popup = this.popup;
|
||
var all = popup.data;
|
||
var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);
|
||
var doc = null;
|
||
if (!selected || !this.editor || !this.popup.isOpen)
|
||
return this.hideDocTooltip();
|
||
this.editor.completers.some(function(completer) {
|
||
if (completer.getDocTooltip)
|
||
doc = completer.getDocTooltip(selected);
|
||
return doc;
|
||
});
|
||
if (!doc)
|
||
doc = selected;
|
||
|
||
if (typeof doc == "string")
|
||
doc = {docText: doc};
|
||
if (!doc || !(doc.docHTML || doc.docText))
|
||
return this.hideDocTooltip();
|
||
this.showDocTooltip(doc);
|
||
};
|
||
|
||
this.showDocTooltip = function(item) {
|
||
if (!this.tooltipNode) {
|
||
this.tooltipNode = dom.createElement("div");
|
||
this.tooltipNode.className = "ace_tooltip ace_doc-tooltip";
|
||
this.tooltipNode.style.margin = 0;
|
||
this.tooltipNode.style.pointerEvents = "auto";
|
||
this.tooltipNode.tabIndex = -1;
|
||
this.tooltipNode.onblur = this.blurListener.bind(this);
|
||
}
|
||
|
||
var tooltipNode = this.tooltipNode;
|
||
if (item.docHTML) {
|
||
tooltipNode.innerHTML = item.docHTML;
|
||
} else if (item.docText) {
|
||
tooltipNode.textContent = item.docText;
|
||
}
|
||
|
||
if (!tooltipNode.parentNode)
|
||
document.body.appendChild(tooltipNode);
|
||
var popup = this.popup;
|
||
var rect = popup.container.getBoundingClientRect();
|
||
tooltipNode.style.top = popup.container.style.top;
|
||
tooltipNode.style.bottom = popup.container.style.bottom;
|
||
|
||
if (window.innerWidth - rect.right < 320) {
|
||
tooltipNode.style.right = window.innerWidth - rect.left + "px";
|
||
tooltipNode.style.left = "";
|
||
} else {
|
||
tooltipNode.style.left = (rect.right + 1) + "px";
|
||
tooltipNode.style.right = "";
|
||
}
|
||
tooltipNode.style.display = "block";
|
||
};
|
||
|
||
this.hideDocTooltip = function() {
|
||
this.tooltipTimer.cancel();
|
||
if (!this.tooltipNode) return;
|
||
var el = this.tooltipNode;
|
||
if (!this.editor.isFocused() && document.activeElement == el)
|
||
this.editor.focus();
|
||
this.tooltipNode = null;
|
||
if (el.parentNode)
|
||
el.parentNode.removeChild(el);
|
||
};
|
||
|
||
}).call(Autocomplete.prototype);
|
||
|
||
Autocomplete.startCommand = {
|
||
name: "startAutocomplete",
|
||
exec: function(editor) {
|
||
if (!editor.completer)
|
||
editor.completer = new Autocomplete();
|
||
editor.completer.autoInsert = false;
|
||
editor.completer.autoSelect = true;
|
||
editor.completer.showPopup(editor);
|
||
editor.completer.cancelContextMenu();
|
||
},
|
||
bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"
|
||
};
|
||
|
||
var FilteredList = function(array, filterText) {
|
||
this.all = array;
|
||
this.filtered = array;
|
||
this.filterText = filterText || "";
|
||
this.exactMatch = false;
|
||
};
|
||
(function(){
|
||
this.setFilter = function(str) {
|
||
if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)
|
||
var matches = this.filtered;
|
||
else
|
||
var matches = this.all;
|
||
|
||
this.filterText = str;
|
||
matches = this.filterCompletions(matches, this.filterText);
|
||
matches = matches.sort(function(a, b) {
|
||
return b.exactMatch - a.exactMatch || b.score - a.score;
|
||
});
|
||
var prev = null;
|
||
matches = matches.filter(function(item){
|
||
var caption = item.snippet || item.caption || item.value;
|
||
if (caption === prev) return false;
|
||
prev = caption;
|
||
return true;
|
||
});
|
||
|
||
this.filtered = matches;
|
||
};
|
||
this.filterCompletions = function(items, needle) {
|
||
var results = [];
|
||
var upper = needle.toUpperCase();
|
||
var lower = needle.toLowerCase();
|
||
loop: for (var i = 0, item; item = items[i]; i++) {
|
||
var caption = item.value || item.caption || item.snippet;
|
||
if (!caption) continue;
|
||
var lastIndex = -1;
|
||
var matchMask = 0;
|
||
var penalty = 0;
|
||
var index, distance;
|
||
|
||
if (this.exactMatch) {
|
||
if (needle !== caption.substr(0, needle.length))
|
||
continue loop;
|
||
}else{
|
||
for (var j = 0; j < needle.length; j++) {
|
||
var i1 = caption.indexOf(lower[j], lastIndex + 1);
|
||
var i2 = caption.indexOf(upper[j], lastIndex + 1);
|
||
index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;
|
||
if (index < 0)
|
||
continue loop;
|
||
distance = index - lastIndex - 1;
|
||
if (distance > 0) {
|
||
if (lastIndex === -1)
|
||
penalty += 10;
|
||
penalty += distance;
|
||
}
|
||
matchMask = matchMask | (1 << index);
|
||
lastIndex = index;
|
||
}
|
||
}
|
||
item.matchMask = matchMask;
|
||
item.exactMatch = penalty ? 0 : 1;
|
||
item.score = (item.score || 0) - penalty;
|
||
results.push(item);
|
||
}
|
||
return results;
|
||
};
|
||
}).call(FilteredList.prototype);
|
||
|
||
exports.Autocomplete = Autocomplete;
|
||
exports.FilteredList = FilteredList;
|
||
|
||
});
|
||
|
||
ace.define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(acequire, exports, module) {
|
||
var Range = acequire("../range").Range;
|
||
|
||
var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;
|
||
|
||
function getWordIndex(doc, pos) {
|
||
var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));
|
||
return textBefore.split(splitRegex).length - 1;
|
||
}
|
||
function wordDistance(doc, pos) {
|
||
var prefixPos = getWordIndex(doc, pos);
|
||
var words = doc.getValue().split(splitRegex);
|
||
var wordScores = Object.create(null);
|
||
|
||
var currentWord = words[prefixPos];
|
||
|
||
words.forEach(function(word, idx) {
|
||
if (!word || word === currentWord) return;
|
||
|
||
var distance = Math.abs(prefixPos - idx);
|
||
var score = words.length - distance;
|
||
if (wordScores[word]) {
|
||
wordScores[word] = Math.max(score, wordScores[word]);
|
||
} else {
|
||
wordScores[word] = score;
|
||
}
|
||
});
|
||
return wordScores;
|
||
}
|
||
|
||
exports.getCompletions = function(editor, session, pos, prefix, callback) {
|
||
var wordScore = wordDistance(session, pos, prefix);
|
||
var wordList = Object.keys(wordScore);
|
||
callback(null, wordList.map(function(word) {
|
||
return {
|
||
caption: word,
|
||
value: word,
|
||
score: wordScore[word],
|
||
meta: "local"
|
||
};
|
||
}));
|
||
};
|
||
});
|
||
|
||
ace.define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(acequire, exports, module) {
|
||
"use strict";
|
||
|
||
var snippetManager = acequire("../snippets").snippetManager;
|
||
var Autocomplete = acequire("../autocomplete").Autocomplete;
|
||
var config = acequire("../config");
|
||
var lang = acequire("../lib/lang");
|
||
var util = acequire("../autocomplete/util");
|
||
|
||
var textCompleter = acequire("../autocomplete/text_completer");
|
||
var keyWordCompleter = {
|
||
getCompletions: function(editor, session, pos, prefix, callback) {
|
||
if (session.$mode.completer) {
|
||
return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);
|
||
}
|
||
var state = editor.session.getState(pos.row);
|
||
var completions = session.$mode.getCompletions(state, session, pos, prefix);
|
||
callback(null, completions);
|
||
}
|
||
};
|
||
|
||
var snippetCompleter = {
|
||
getCompletions: function(editor, session, pos, prefix, callback) {
|
||
var snippetMap = snippetManager.snippetMap;
|
||
var completions = [];
|
||
snippetManager.getActiveScopes(editor).forEach(function(scope) {
|
||
var snippets = snippetMap[scope] || [];
|
||
for (var i = snippets.length; i--;) {
|
||
var s = snippets[i];
|
||
var caption = s.name || s.tabTrigger;
|
||
if (!caption)
|
||
continue;
|
||
completions.push({
|
||
caption: caption,
|
||
snippet: s.content,
|
||
meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet",
|
||
type: "snippet"
|
||
});
|
||
}
|
||
}, this);
|
||
callback(null, completions);
|
||
},
|
||
getDocTooltip: function(item) {
|
||
if (item.type == "snippet" && !item.docHTML) {
|
||
item.docHTML = [
|
||
"<b>", lang.escapeHTML(item.caption), "</b>", "<hr></hr>",
|
||
lang.escapeHTML(item.snippet)
|
||
].join("");
|
||
}
|
||
}
|
||
};
|
||
|
||
var completers = [snippetCompleter, textCompleter, keyWordCompleter];
|
||
exports.setCompleters = function(val) {
|
||
completers.length = 0;
|
||
if (val) completers.push.apply(completers, val);
|
||
};
|
||
exports.addCompleter = function(completer) {
|
||
completers.push(completer);
|
||
};
|
||
exports.textCompleter = textCompleter;
|
||
exports.keyWordCompleter = keyWordCompleter;
|
||
exports.snippetCompleter = snippetCompleter;
|
||
|
||
var expandSnippet = {
|
||
name: "expandSnippet",
|
||
exec: function(editor) {
|
||
return snippetManager.expandWithTab(editor);
|
||
},
|
||
bindKey: "Tab"
|
||
};
|
||
|
||
var onChangeMode = function(e, editor) {
|
||
loadSnippetsForMode(editor.session.$mode);
|
||
};
|
||
|
||
var loadSnippetsForMode = function(mode) {
|
||
var id = mode.$id;
|
||
if (!snippetManager.files)
|
||
snippetManager.files = {};
|
||
loadSnippetFile(id);
|
||
if (mode.modes)
|
||
mode.modes.forEach(loadSnippetsForMode);
|
||
};
|
||
|
||
var loadSnippetFile = function(id) {
|
||
if (!id || snippetManager.files[id])
|
||
return;
|
||
var snippetFilePath = id.replace("mode", "snippets");
|
||
snippetManager.files[id] = {};
|
||
config.loadModule(snippetFilePath, function(m) {
|
||
if (m) {
|
||
snippetManager.files[id] = m;
|
||
if (!m.snippets && m.snippetText)
|
||
m.snippets = snippetManager.parseSnippetFile(m.snippetText);
|
||
snippetManager.register(m.snippets || [], m.scope);
|
||
if (m.includeScopes) {
|
||
snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;
|
||
m.includeScopes.forEach(function(x) {
|
||
loadSnippetFile("ace/mode/" + x);
|
||
});
|
||
}
|
||
}
|
||
});
|
||
};
|
||
|
||
var doLiveAutocomplete = function(e) {
|
||
var editor = e.editor;
|
||
var hasCompleter = editor.completer && editor.completer.activated;
|
||
if (e.command.name === "backspace") {
|
||
if (hasCompleter && !util.getCompletionPrefix(editor))
|
||
editor.completer.detach();
|
||
}
|
||
else if (e.command.name === "insertstring") {
|
||
var prefix = util.getCompletionPrefix(editor);
|
||
if (prefix && !hasCompleter) {
|
||
if (!editor.completer) {
|
||
editor.completer = new Autocomplete();
|
||
}
|
||
editor.completer.autoInsert = false;
|
||
editor.completer.showPopup(editor);
|
||
}
|
||
}
|
||
};
|
||
|
||
var Editor = acequire("../editor").Editor;
|
||
acequire("../config").defineOptions(Editor.prototype, "editor", {
|
||
enableBasicAutocompletion: {
|
||
set: function(val) {
|
||
if (val) {
|
||
if (!this.completers)
|
||
this.completers = Array.isArray(val)? val: completers;
|
||
this.commands.addCommand(Autocomplete.startCommand);
|
||
} else {
|
||
this.commands.removeCommand(Autocomplete.startCommand);
|
||
}
|
||
},
|
||
value: false
|
||
},
|
||
enableLiveAutocompletion: {
|
||
set: function(val) {
|
||
if (val) {
|
||
if (!this.completers)
|
||
this.completers = Array.isArray(val)? val: completers;
|
||
this.commands.on('afterExec', doLiveAutocomplete);
|
||
} else {
|
||
this.commands.removeListener('afterExec', doLiveAutocomplete);
|
||
}
|
||
},
|
||
value: false
|
||
},
|
||
enableSnippets: {
|
||
set: function(val) {
|
||
if (val) {
|
||
this.commands.addCommand(expandSnippet);
|
||
this.on("changeMode", onChangeMode);
|
||
onChangeMode(null, this);
|
||
} else {
|
||
this.commands.removeCommand(expandSnippet);
|
||
this.off("changeMode", onChangeMode);
|
||
}
|
||
},
|
||
value: false
|
||
}
|
||
});
|
||
});
|
||
(function() {
|
||
ace.acequire(["ace/ext/language_tools"], function() {});
|
||
})();
|
||
|
||
|
||
/***/ },
|
||
/* 19 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<pre class=\"editor\" v-el:editor>{{text}}</pre>\n";
|
||
|
||
/***/ },
|
||
/* 20 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(21)
|
||
__vue_script__ = __webpack_require__(23)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/DNSConfig.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(75)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-3430d522/DNSConfig.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 21 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(22);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./DNSConfig.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./DNSConfig.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 22 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 23 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _Domain = __webpack_require__(24);
|
||
|
||
var _Domain2 = _interopRequireDefault(_Domain);
|
||
|
||
var _RunResults = __webpack_require__(83);
|
||
|
||
var _RunResults2 = _interopRequireDefault(_RunResults);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
data: function data() {
|
||
return {
|
||
showModal: false,
|
||
query: {}
|
||
};
|
||
},
|
||
props: {
|
||
data: Object,
|
||
selected: String
|
||
},
|
||
computed: {
|
||
sortedDomains: function sortedDomains() {
|
||
var selected = this.selected;
|
||
return _.sortBy(this.data.domains, function (d) {
|
||
return d.name != selected;
|
||
}, function (d, i) {
|
||
return i;
|
||
});
|
||
}
|
||
},
|
||
methods: {
|
||
preview: function preview(data) {
|
||
this.query = data;
|
||
this.showModal = true;
|
||
}
|
||
},
|
||
components: { Domain: _Domain2.default, RunResults: _RunResults2.default }
|
||
};
|
||
|
||
/***/ },
|
||
/* 24 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(25)
|
||
__vue_script__ = __webpack_require__(27)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/Domain.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(74)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-69af4360/Domain.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 25 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(26);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Domain.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Domain.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 26 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.domain{\n padding-bottom: 15px;\n}\n.noselect {\n -webkit-touch-callout: none; \n -webkit-user-select: none; \n -moz-user-select: none; \n -ms-user-select: none; \n user-select: none; \n cursor: pointer;\n}\n.domain:nth-of-type(odd) {\n background: #e0e0e0;\n}\n.label {\n margin-right: 4px;\n}\n.btn-domain {\n margin-top: 20px;\n}\n.meta{\n margin-top: 28px;\n margin-left: 10px;\n}\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 27 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _Metadata = __webpack_require__(28);
|
||
|
||
var _Metadata2 = _interopRequireDefault(_Metadata);
|
||
|
||
var _Record = __webpack_require__(69);
|
||
|
||
var _Record2 = _interopRequireDefault(_Record);
|
||
|
||
var _vueStrap = __webpack_require__(67);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
name: "domain",
|
||
props: {
|
||
d: Object,
|
||
onPreview: { type: Function, required: true } },
|
||
data: function data() {
|
||
return {
|
||
registrarEnabled: true,
|
||
dsps: []
|
||
};
|
||
},
|
||
created: function created() {
|
||
for (var i = 0; i < this.d.dsps.length; i++) {
|
||
this.dsps[i] = true;
|
||
}
|
||
},
|
||
methods: {
|
||
preview: function preview() {
|
||
var data = {
|
||
Domain: this.d.name,
|
||
Registrar: this.registrarEnabled,
|
||
Dsps: this.dsps
|
||
};
|
||
this.onPreview(data);
|
||
},
|
||
regTooltip: function regTooltip() {
|
||
return (this.registrarEnabled ? "Disable" : "Enable") + " checking of registrar entries with " + this.d.registrar;
|
||
},
|
||
dspTooltip: function dspTooltip(i) {
|
||
return (this.dsps[i] ? "Disable" : "Enable") + " checking of domain records with " + this.d.dsps[i];
|
||
}
|
||
},
|
||
components: { Metadata: _Metadata2.default, Record: _Record2.default, tooltip: _vueStrap.tooltip }
|
||
};
|
||
|
||
/***/ },
|
||
/* 28 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(29)
|
||
__vue_script__ = __webpack_require__(31)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/Metadata.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(68)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-f81f2b8a/Metadata.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 29 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(30);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Metadata.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Metadata.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 30 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 31 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _keys = __webpack_require__(32);
|
||
|
||
var _keys2 = _interopRequireDefault(_keys);
|
||
|
||
var _vueStrap = __webpack_require__(67);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
name: "metadata",
|
||
data: function data() {
|
||
return {};
|
||
},
|
||
methods: {
|
||
hasMeta: function hasMeta() {
|
||
return (0, _keys2.default)(this.meta).length > 0;
|
||
}
|
||
},
|
||
props: {
|
||
meta: { type: Object, required: true }
|
||
},
|
||
components: { popover: _vueStrap.popover }
|
||
};
|
||
|
||
/***/ },
|
||
/* 32 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = { "default": __webpack_require__(33), __esModule: true };
|
||
|
||
/***/ },
|
||
/* 33 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(34);
|
||
module.exports = __webpack_require__(54).Object.keys;
|
||
|
||
/***/ },
|
||
/* 34 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 19.1.2.14 Object.keys(O)
|
||
var toObject = __webpack_require__(35)
|
||
, $keys = __webpack_require__(37);
|
||
|
||
__webpack_require__(52)('keys', function(){
|
||
return function keys(it){
|
||
return $keys(toObject(it));
|
||
};
|
||
});
|
||
|
||
/***/ },
|
||
/* 35 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.13 ToObject(argument)
|
||
var defined = __webpack_require__(36);
|
||
module.exports = function(it){
|
||
return Object(defined(it));
|
||
};
|
||
|
||
/***/ },
|
||
/* 36 */
|
||
/***/ function(module, exports) {
|
||
|
||
// 7.2.1 RequireObjectCoercible(argument)
|
||
module.exports = function(it){
|
||
if(it == undefined)throw TypeError("Can't call method on " + it);
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 37 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
|
||
var $keys = __webpack_require__(38)
|
||
, enumBugKeys = __webpack_require__(51);
|
||
|
||
module.exports = Object.keys || function keys(O){
|
||
return $keys(O, enumBugKeys);
|
||
};
|
||
|
||
/***/ },
|
||
/* 38 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var has = __webpack_require__(39)
|
||
, toIObject = __webpack_require__(40)
|
||
, arrayIndexOf = __webpack_require__(43)(false)
|
||
, IE_PROTO = __webpack_require__(47)('IE_PROTO');
|
||
|
||
module.exports = function(object, names){
|
||
var O = toIObject(object)
|
||
, i = 0
|
||
, result = []
|
||
, key;
|
||
for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
|
||
// Don't enum bug & hidden keys
|
||
while(names.length > i)if(has(O, key = names[i++])){
|
||
~arrayIndexOf(result, key) || result.push(key);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
/***/ },
|
||
/* 39 */
|
||
/***/ function(module, exports) {
|
||
|
||
var hasOwnProperty = {}.hasOwnProperty;
|
||
module.exports = function(it, key){
|
||
return hasOwnProperty.call(it, key);
|
||
};
|
||
|
||
/***/ },
|
||
/* 40 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// to indexed object, toObject with fallback for non-array-like ES3 strings
|
||
var IObject = __webpack_require__(41)
|
||
, defined = __webpack_require__(36);
|
||
module.exports = function(it){
|
||
return IObject(defined(it));
|
||
};
|
||
|
||
/***/ },
|
||
/* 41 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// fallback for non-array-like ES3 and non-enumerable old V8 strings
|
||
var cof = __webpack_require__(42);
|
||
module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
|
||
return cof(it) == 'String' ? it.split('') : Object(it);
|
||
};
|
||
|
||
/***/ },
|
||
/* 42 */
|
||
/***/ function(module, exports) {
|
||
|
||
var toString = {}.toString;
|
||
|
||
module.exports = function(it){
|
||
return toString.call(it).slice(8, -1);
|
||
};
|
||
|
||
/***/ },
|
||
/* 43 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// false -> Array#indexOf
|
||
// true -> Array#includes
|
||
var toIObject = __webpack_require__(40)
|
||
, toLength = __webpack_require__(44)
|
||
, toIndex = __webpack_require__(46);
|
||
module.exports = function(IS_INCLUDES){
|
||
return function($this, el, fromIndex){
|
||
var O = toIObject($this)
|
||
, length = toLength(O.length)
|
||
, index = toIndex(fromIndex, length)
|
||
, value;
|
||
// Array#includes uses SameValueZero equality algorithm
|
||
if(IS_INCLUDES && el != el)while(length > index){
|
||
value = O[index++];
|
||
if(value != value)return true;
|
||
// Array#toIndex ignores holes, Array#includes - not
|
||
} else for(;length > index; index++)if(IS_INCLUDES || index in O){
|
||
if(O[index] === el)return IS_INCLUDES || index || 0;
|
||
} return !IS_INCLUDES && -1;
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 44 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.15 ToLength
|
||
var toInteger = __webpack_require__(45)
|
||
, min = Math.min;
|
||
module.exports = function(it){
|
||
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
|
||
};
|
||
|
||
/***/ },
|
||
/* 45 */
|
||
/***/ function(module, exports) {
|
||
|
||
// 7.1.4 ToInteger
|
||
var ceil = Math.ceil
|
||
, floor = Math.floor;
|
||
module.exports = function(it){
|
||
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
|
||
};
|
||
|
||
/***/ },
|
||
/* 46 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var toInteger = __webpack_require__(45)
|
||
, max = Math.max
|
||
, min = Math.min;
|
||
module.exports = function(index, length){
|
||
index = toInteger(index);
|
||
return index < 0 ? max(index + length, 0) : min(index, length);
|
||
};
|
||
|
||
/***/ },
|
||
/* 47 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var shared = __webpack_require__(48)('keys')
|
||
, uid = __webpack_require__(50);
|
||
module.exports = function(key){
|
||
return shared[key] || (shared[key] = uid(key));
|
||
};
|
||
|
||
/***/ },
|
||
/* 48 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var global = __webpack_require__(49)
|
||
, SHARED = '__core-js_shared__'
|
||
, store = global[SHARED] || (global[SHARED] = {});
|
||
module.exports = function(key){
|
||
return store[key] || (store[key] = {});
|
||
};
|
||
|
||
/***/ },
|
||
/* 49 */
|
||
/***/ function(module, exports) {
|
||
|
||
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
|
||
var global = module.exports = typeof window != 'undefined' && window.Math == Math
|
||
? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
|
||
if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
|
||
|
||
/***/ },
|
||
/* 50 */
|
||
/***/ function(module, exports) {
|
||
|
||
var id = 0
|
||
, px = Math.random();
|
||
module.exports = function(key){
|
||
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
|
||
};
|
||
|
||
/***/ },
|
||
/* 51 */
|
||
/***/ function(module, exports) {
|
||
|
||
// IE 8- don't enum bug keys
|
||
module.exports = (
|
||
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
|
||
).split(',');
|
||
|
||
/***/ },
|
||
/* 52 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// most Object methods by ES6 should accept primitives
|
||
var $export = __webpack_require__(53)
|
||
, core = __webpack_require__(54)
|
||
, fails = __webpack_require__(63);
|
||
module.exports = function(KEY, exec){
|
||
var fn = (core.Object || {})[KEY] || Object[KEY]
|
||
, exp = {};
|
||
exp[KEY] = exec(fn);
|
||
$export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
|
||
};
|
||
|
||
/***/ },
|
||
/* 53 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var global = __webpack_require__(49)
|
||
, core = __webpack_require__(54)
|
||
, ctx = __webpack_require__(55)
|
||
, hide = __webpack_require__(57)
|
||
, PROTOTYPE = 'prototype';
|
||
|
||
var $export = function(type, name, source){
|
||
var IS_FORCED = type & $export.F
|
||
, IS_GLOBAL = type & $export.G
|
||
, IS_STATIC = type & $export.S
|
||
, IS_PROTO = type & $export.P
|
||
, IS_BIND = type & $export.B
|
||
, IS_WRAP = type & $export.W
|
||
, exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
|
||
, expProto = exports[PROTOTYPE]
|
||
, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
|
||
, key, own, out;
|
||
if(IS_GLOBAL)source = name;
|
||
for(key in source){
|
||
// contains in native
|
||
own = !IS_FORCED && target && target[key] !== undefined;
|
||
if(own && key in exports)continue;
|
||
// export native or passed
|
||
out = own ? target[key] : source[key];
|
||
// prevent global pollution for namespaces
|
||
exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
|
||
// bind timers to global for call from export context
|
||
: IS_BIND && own ? ctx(out, global)
|
||
// wrap global constructors for prevent change them in library
|
||
: IS_WRAP && target[key] == out ? (function(C){
|
||
var F = function(a, b, c){
|
||
if(this instanceof C){
|
||
switch(arguments.length){
|
||
case 0: return new C;
|
||
case 1: return new C(a);
|
||
case 2: return new C(a, b);
|
||
} return new C(a, b, c);
|
||
} return C.apply(this, arguments);
|
||
};
|
||
F[PROTOTYPE] = C[PROTOTYPE];
|
||
return F;
|
||
// make static versions for prototype methods
|
||
})(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
|
||
// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
|
||
if(IS_PROTO){
|
||
(exports.virtual || (exports.virtual = {}))[key] = out;
|
||
// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
|
||
if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
|
||
}
|
||
}
|
||
};
|
||
// type bitmap
|
||
$export.F = 1; // forced
|
||
$export.G = 2; // global
|
||
$export.S = 4; // static
|
||
$export.P = 8; // proto
|
||
$export.B = 16; // bind
|
||
$export.W = 32; // wrap
|
||
$export.U = 64; // safe
|
||
$export.R = 128; // real proto method for `library`
|
||
module.exports = $export;
|
||
|
||
/***/ },
|
||
/* 54 */
|
||
/***/ function(module, exports) {
|
||
|
||
var core = module.exports = {version: '2.4.0'};
|
||
if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
|
||
|
||
/***/ },
|
||
/* 55 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// optional / simple context binding
|
||
var aFunction = __webpack_require__(56);
|
||
module.exports = function(fn, that, length){
|
||
aFunction(fn);
|
||
if(that === undefined)return fn;
|
||
switch(length){
|
||
case 1: return function(a){
|
||
return fn.call(that, a);
|
||
};
|
||
case 2: return function(a, b){
|
||
return fn.call(that, a, b);
|
||
};
|
||
case 3: return function(a, b, c){
|
||
return fn.call(that, a, b, c);
|
||
};
|
||
}
|
||
return function(/* ...args */){
|
||
return fn.apply(that, arguments);
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 56 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(it){
|
||
if(typeof it != 'function')throw TypeError(it + ' is not a function!');
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 57 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var dP = __webpack_require__(58)
|
||
, createDesc = __webpack_require__(66);
|
||
module.exports = __webpack_require__(62) ? function(object, key, value){
|
||
return dP.f(object, key, createDesc(1, value));
|
||
} : function(object, key, value){
|
||
object[key] = value;
|
||
return object;
|
||
};
|
||
|
||
/***/ },
|
||
/* 58 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var anObject = __webpack_require__(59)
|
||
, IE8_DOM_DEFINE = __webpack_require__(61)
|
||
, toPrimitive = __webpack_require__(65)
|
||
, dP = Object.defineProperty;
|
||
|
||
exports.f = __webpack_require__(62) ? Object.defineProperty : function defineProperty(O, P, Attributes){
|
||
anObject(O);
|
||
P = toPrimitive(P, true);
|
||
anObject(Attributes);
|
||
if(IE8_DOM_DEFINE)try {
|
||
return dP(O, P, Attributes);
|
||
} catch(e){ /* empty */ }
|
||
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
|
||
if('value' in Attributes)O[P] = Attributes.value;
|
||
return O;
|
||
};
|
||
|
||
/***/ },
|
||
/* 59 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var isObject = __webpack_require__(60);
|
||
module.exports = function(it){
|
||
if(!isObject(it))throw TypeError(it + ' is not an object!');
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 60 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(it){
|
||
return typeof it === 'object' ? it !== null : typeof it === 'function';
|
||
};
|
||
|
||
/***/ },
|
||
/* 61 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = !__webpack_require__(62) && !__webpack_require__(63)(function(){
|
||
return Object.defineProperty(__webpack_require__(64)('div'), 'a', {get: function(){ return 7; }}).a != 7;
|
||
});
|
||
|
||
/***/ },
|
||
/* 62 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// Thank's IE8 for his funny defineProperty
|
||
module.exports = !__webpack_require__(63)(function(){
|
||
return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
|
||
});
|
||
|
||
/***/ },
|
||
/* 63 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(exec){
|
||
try {
|
||
return !!exec();
|
||
} catch(e){
|
||
return true;
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 64 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var isObject = __webpack_require__(60)
|
||
, document = __webpack_require__(49).document
|
||
// in old IE typeof document.createElement is 'object'
|
||
, is = isObject(document) && isObject(document.createElement);
|
||
module.exports = function(it){
|
||
return is ? document.createElement(it) : {};
|
||
};
|
||
|
||
/***/ },
|
||
/* 65 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.1 ToPrimitive(input [, PreferredType])
|
||
var isObject = __webpack_require__(60);
|
||
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
|
||
// and the second argument - flag - preferred type is a string
|
||
module.exports = function(it, S){
|
||
if(!isObject(it))return it;
|
||
var fn, val;
|
||
if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
throw TypeError("Can't convert object to primitive value");
|
||
};
|
||
|
||
/***/ },
|
||
/* 66 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(bitmap, value){
|
||
return {
|
||
enumerable : !(bitmap & 1),
|
||
configurable: !(bitmap & 2),
|
||
writable : !(bitmap & 4),
|
||
value : value
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 67 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
(function webpackUniversalModuleDefinition(root, factory) {
|
||
if(true)
|
||
module.exports = factory();
|
||
else if(typeof define === 'function' && define.amd)
|
||
define([], factory);
|
||
else if(typeof exports === 'object')
|
||
exports["VueStrap"] = factory();
|
||
else
|
||
root["VueStrap"] = factory();
|
||
})(this, function() {
|
||
return /******/ (function(modules) { // webpackBootstrap
|
||
/******/ // The module cache
|
||
/******/ var installedModules = {};
|
||
/******/
|
||
/******/ // The require function
|
||
/******/ function __webpack_require__(moduleId) {
|
||
/******/
|
||
/******/ // Check if module is in cache
|
||
/******/ if(installedModules[moduleId])
|
||
/******/ return installedModules[moduleId].exports;
|
||
/******/
|
||
/******/ // Create a new module (and put it into the cache)
|
||
/******/ var module = installedModules[moduleId] = {
|
||
/******/ exports: {},
|
||
/******/ id: moduleId,
|
||
/******/ loaded: false
|
||
/******/ };
|
||
/******/
|
||
/******/ // Execute the module function
|
||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||
/******/
|
||
/******/ // Flag the module as loaded
|
||
/******/ module.loaded = true;
|
||
/******/
|
||
/******/ // Return the exports of the module
|
||
/******/ return module.exports;
|
||
/******/ }
|
||
/******/
|
||
/******/
|
||
/******/ // expose the modules object (__webpack_modules__)
|
||
/******/ __webpack_require__.m = modules;
|
||
/******/
|
||
/******/ // expose the module cache
|
||
/******/ __webpack_require__.c = installedModules;
|
||
/******/
|
||
/******/ // __webpack_public_path__
|
||
/******/ __webpack_require__.p = "";
|
||
/******/
|
||
/******/ // Load entry module and return exports
|
||
/******/ return __webpack_require__(0);
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ([
|
||
/* 0 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
var _Alert = __webpack_require__(25);
|
||
|
||
var _Alert2 = _interopRequireDefault(_Alert);
|
||
|
||
var _Carousel = __webpack_require__(33);
|
||
|
||
var _Carousel2 = _interopRequireDefault(_Carousel);
|
||
|
||
var _Slider = __webpack_require__(93);
|
||
|
||
var _Slider2 = _interopRequireDefault(_Slider);
|
||
|
||
var _Accordion = __webpack_require__(96);
|
||
|
||
var _Accordion2 = _interopRequireDefault(_Accordion);
|
||
|
||
var _Affix = __webpack_require__(99);
|
||
|
||
var _Affix2 = _interopRequireDefault(_Affix);
|
||
|
||
var _Aside = __webpack_require__(104);
|
||
|
||
var _Aside2 = _interopRequireDefault(_Aside);
|
||
|
||
var _checkboxGroup = __webpack_require__(110);
|
||
|
||
var _checkboxGroup2 = _interopRequireDefault(_checkboxGroup);
|
||
|
||
var _checkboxBtn = __webpack_require__(113);
|
||
|
||
var _checkboxBtn2 = _interopRequireDefault(_checkboxBtn);
|
||
|
||
var _Datepicker = __webpack_require__(116);
|
||
|
||
var _Datepicker2 = _interopRequireDefault(_Datepicker);
|
||
|
||
var _Dropdown = __webpack_require__(123);
|
||
|
||
var _Dropdown2 = _interopRequireDefault(_Dropdown);
|
||
|
||
var _Modal = __webpack_require__(126);
|
||
|
||
var _Modal2 = _interopRequireDefault(_Modal);
|
||
|
||
var _Option = __webpack_require__(135);
|
||
|
||
var _Option2 = _interopRequireDefault(_Option);
|
||
|
||
var _Panel = __webpack_require__(140);
|
||
|
||
var _Panel2 = _interopRequireDefault(_Panel);
|
||
|
||
var _Popover = __webpack_require__(145);
|
||
|
||
var _Popover2 = _interopRequireDefault(_Popover);
|
||
|
||
var _Progressbar = __webpack_require__(151);
|
||
|
||
var _Progressbar2 = _interopRequireDefault(_Progressbar);
|
||
|
||
var _radioBtn = __webpack_require__(154);
|
||
|
||
var _radioBtn2 = _interopRequireDefault(_radioBtn);
|
||
|
||
var _radioGroup = __webpack_require__(157);
|
||
|
||
var _radioGroup2 = _interopRequireDefault(_radioGroup);
|
||
|
||
var _Select = __webpack_require__(160);
|
||
|
||
var _Select2 = _interopRequireDefault(_Select);
|
||
|
||
var _Tab = __webpack_require__(172);
|
||
|
||
var _Tab2 = _interopRequireDefault(_Tab);
|
||
|
||
var _Tabset = __webpack_require__(177);
|
||
|
||
var _Tabset2 = _interopRequireDefault(_Tabset);
|
||
|
||
var _Tooltip = __webpack_require__(182);
|
||
|
||
var _Tooltip2 = _interopRequireDefault(_Tooltip);
|
||
|
||
var _Typeahead = __webpack_require__(187);
|
||
|
||
var _Typeahead2 = _interopRequireDefault(_Typeahead);
|
||
|
||
var _Navbar = __webpack_require__(193);
|
||
|
||
var _Navbar2 = _interopRequireDefault(_Navbar);
|
||
|
||
var _Spinner = __webpack_require__(196);
|
||
|
||
var _Spinner2 = _interopRequireDefault(_Spinner);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var VueStrap = {
|
||
alert: _Alert2.default,
|
||
carousel: _Carousel2.default,
|
||
slider: _Slider2.default,
|
||
accordion: _Accordion2.default,
|
||
affix: _Affix2.default,
|
||
aside: _Aside2.default,
|
||
checkboxBtn: _checkboxBtn2.default,
|
||
checkboxGroup: _checkboxGroup2.default,
|
||
datepicker: _Datepicker2.default,
|
||
dropdown: _Dropdown2.default,
|
||
modal: _Modal2.default,
|
||
option: _Option2.default,
|
||
panel: _Panel2.default,
|
||
popover: _Popover2.default,
|
||
progressbar: _Progressbar2.default,
|
||
radioGroup: _radioGroup2.default,
|
||
radioBtn: _radioBtn2.default,
|
||
select: _Select2.default,
|
||
tab: _Tab2.default,
|
||
tabset: _Tabset2.default,
|
||
tooltip: _Tooltip2.default,
|
||
typeahead: _Typeahead2.default,
|
||
navbar: _Navbar2.default,
|
||
spinner: _Spinner2.default
|
||
};
|
||
|
||
module.exports = VueStrap;
|
||
|
||
/***/ },
|
||
/* 1 */,
|
||
/* 2 */,
|
||
/* 3 */,
|
||
/* 4 */,
|
||
/* 5 */,
|
||
/* 6 */,
|
||
/* 7 */,
|
||
/* 8 */,
|
||
/* 9 */,
|
||
/* 10 */,
|
||
/* 11 */,
|
||
/* 12 */,
|
||
/* 13 */,
|
||
/* 14 */,
|
||
/* 15 */,
|
||
/* 16 */,
|
||
/* 17 */,
|
||
/* 18 */,
|
||
/* 19 */,
|
||
/* 20 */,
|
||
/* 21 */,
|
||
/* 22 */,
|
||
/* 23 */,
|
||
/* 24 */,
|
||
/* 25 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(26)
|
||
module.exports = __webpack_require__(30)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(32)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Alert.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Alert.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Alert.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Alert.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Alert.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 26 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(27);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-cc8c6960&file=Alert.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Alert.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-cc8c6960&file=Alert.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Alert.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 27 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".fade-transition {\n -webkit-transition: opacity .3s ease;\n transition: opacity .3s ease;\n}\n.fade-enter,\n.fade-leave {\n height: 0;\n opacity: 0;\n}\n.alert.top {\n position: fixed;\n top: 30px;\n margin: 0 auto;\n left: 0;\n right: 0;\n z-index: 2;\n}\n.alert.top-right {\n position: fixed;\n top: 30px;\n right: 50px;\n z-index: 2;\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 28 */
|
||
/***/ function(module, exports) {
|
||
|
||
/*
|
||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
Author Tobias Koppers @sokra
|
||
*/
|
||
// css base code, injected by the css-loader
|
||
module.exports = function() {
|
||
var list = [];
|
||
|
||
// return the list of modules as css string
|
||
list.toString = function toString() {
|
||
var result = [];
|
||
for(var i = 0; i < this.length; i++) {
|
||
var item = this[i];
|
||
if(item[2]) {
|
||
result.push("@media " + item[2] + "{" + item[1] + "}");
|
||
} else {
|
||
result.push(item[1]);
|
||
}
|
||
}
|
||
return result.join("");
|
||
};
|
||
|
||
// import a list of modules into the list
|
||
list.i = function(modules, mediaQuery) {
|
||
if(typeof modules === "string")
|
||
modules = [[null, modules, ""]];
|
||
var alreadyImportedModules = {};
|
||
for(var i = 0; i < this.length; i++) {
|
||
var id = this[i][0];
|
||
if(typeof id === "number")
|
||
alreadyImportedModules[id] = true;
|
||
}
|
||
for(i = 0; i < modules.length; i++) {
|
||
var item = modules[i];
|
||
// skip already imported module
|
||
// this implementation is not 100% perfect for weird media query combinations
|
||
// when a module is imported multiple times with different media queries.
|
||
// I hope this will never occur (Hey this way we have smaller bundles)
|
||
if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
|
||
if(mediaQuery && !item[2]) {
|
||
item[2] = mediaQuery;
|
||
} else if(mediaQuery) {
|
||
item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
|
||
}
|
||
list.push(item);
|
||
}
|
||
}
|
||
};
|
||
return list;
|
||
};
|
||
|
||
|
||
/***/ },
|
||
/* 29 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
/*
|
||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
Author Tobias Koppers @sokra
|
||
*/
|
||
var stylesInDom = {},
|
||
memoize = function(fn) {
|
||
var memo;
|
||
return function () {
|
||
if (typeof memo === "undefined") memo = fn.apply(this, arguments);
|
||
return memo;
|
||
};
|
||
},
|
||
isOldIE = memoize(function() {
|
||
return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
|
||
}),
|
||
getHeadElement = memoize(function () {
|
||
return document.head || document.getElementsByTagName("head")[0];
|
||
}),
|
||
singletonElement = null,
|
||
singletonCounter = 0,
|
||
styleElementsInsertedAtTop = [];
|
||
|
||
module.exports = function(list, options) {
|
||
if(false) {
|
||
if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
|
||
}
|
||
|
||
options = options || {};
|
||
// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
|
||
// tags it will allow on a page
|
||
if (typeof options.singleton === "undefined") options.singleton = isOldIE();
|
||
|
||
// By default, add <style> tags to the bottom of <head>.
|
||
if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
|
||
|
||
var styles = listToStyles(list);
|
||
addStylesToDom(styles, options);
|
||
|
||
return function update(newList) {
|
||
var mayRemove = [];
|
||
for(var i = 0; i < styles.length; i++) {
|
||
var item = styles[i];
|
||
var domStyle = stylesInDom[item.id];
|
||
domStyle.refs--;
|
||
mayRemove.push(domStyle);
|
||
}
|
||
if(newList) {
|
||
var newStyles = listToStyles(newList);
|
||
addStylesToDom(newStyles, options);
|
||
}
|
||
for(var i = 0; i < mayRemove.length; i++) {
|
||
var domStyle = mayRemove[i];
|
||
if(domStyle.refs === 0) {
|
||
for(var j = 0; j < domStyle.parts.length; j++)
|
||
domStyle.parts[j]();
|
||
delete stylesInDom[domStyle.id];
|
||
}
|
||
}
|
||
};
|
||
}
|
||
|
||
function addStylesToDom(styles, options) {
|
||
for(var i = 0; i < styles.length; i++) {
|
||
var item = styles[i];
|
||
var domStyle = stylesInDom[item.id];
|
||
if(domStyle) {
|
||
domStyle.refs++;
|
||
for(var j = 0; j < domStyle.parts.length; j++) {
|
||
domStyle.parts[j](item.parts[j]);
|
||
}
|
||
for(; j < item.parts.length; j++) {
|
||
domStyle.parts.push(addStyle(item.parts[j], options));
|
||
}
|
||
} else {
|
||
var parts = [];
|
||
for(var j = 0; j < item.parts.length; j++) {
|
||
parts.push(addStyle(item.parts[j], options));
|
||
}
|
||
stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
|
||
}
|
||
}
|
||
}
|
||
|
||
function listToStyles(list) {
|
||
var styles = [];
|
||
var newStyles = {};
|
||
for(var i = 0; i < list.length; i++) {
|
||
var item = list[i];
|
||
var id = item[0];
|
||
var css = item[1];
|
||
var media = item[2];
|
||
var sourceMap = item[3];
|
||
var part = {css: css, media: media, sourceMap: sourceMap};
|
||
if(!newStyles[id])
|
||
styles.push(newStyles[id] = {id: id, parts: [part]});
|
||
else
|
||
newStyles[id].parts.push(part);
|
||
}
|
||
return styles;
|
||
}
|
||
|
||
function insertStyleElement(options, styleElement) {
|
||
var head = getHeadElement();
|
||
var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
|
||
if (options.insertAt === "top") {
|
||
if(!lastStyleElementInsertedAtTop) {
|
||
head.insertBefore(styleElement, head.firstChild);
|
||
} else if(lastStyleElementInsertedAtTop.nextSibling) {
|
||
head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
|
||
} else {
|
||
head.appendChild(styleElement);
|
||
}
|
||
styleElementsInsertedAtTop.push(styleElement);
|
||
} else if (options.insertAt === "bottom") {
|
||
head.appendChild(styleElement);
|
||
} else {
|
||
throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
|
||
}
|
||
}
|
||
|
||
function removeStyleElement(styleElement) {
|
||
styleElement.parentNode.removeChild(styleElement);
|
||
var idx = styleElementsInsertedAtTop.indexOf(styleElement);
|
||
if(idx >= 0) {
|
||
styleElementsInsertedAtTop.splice(idx, 1);
|
||
}
|
||
}
|
||
|
||
function createStyleElement(options) {
|
||
var styleElement = document.createElement("style");
|
||
styleElement.type = "text/css";
|
||
insertStyleElement(options, styleElement);
|
||
return styleElement;
|
||
}
|
||
|
||
function createLinkElement(options) {
|
||
var linkElement = document.createElement("link");
|
||
linkElement.rel = "stylesheet";
|
||
insertStyleElement(options, linkElement);
|
||
return linkElement;
|
||
}
|
||
|
||
function addStyle(obj, options) {
|
||
var styleElement, update, remove;
|
||
|
||
if (options.singleton) {
|
||
var styleIndex = singletonCounter++;
|
||
styleElement = singletonElement || (singletonElement = createStyleElement(options));
|
||
update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
|
||
remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
|
||
} else if(obj.sourceMap &&
|
||
typeof URL === "function" &&
|
||
typeof URL.createObjectURL === "function" &&
|
||
typeof URL.revokeObjectURL === "function" &&
|
||
typeof Blob === "function" &&
|
||
typeof btoa === "function") {
|
||
styleElement = createLinkElement(options);
|
||
update = updateLink.bind(null, styleElement);
|
||
remove = function() {
|
||
removeStyleElement(styleElement);
|
||
if(styleElement.href)
|
||
URL.revokeObjectURL(styleElement.href);
|
||
};
|
||
} else {
|
||
styleElement = createStyleElement(options);
|
||
update = applyToTag.bind(null, styleElement);
|
||
remove = function() {
|
||
removeStyleElement(styleElement);
|
||
};
|
||
}
|
||
|
||
update(obj);
|
||
|
||
return function updateStyle(newObj) {
|
||
if(newObj) {
|
||
if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
|
||
return;
|
||
update(obj = newObj);
|
||
} else {
|
||
remove();
|
||
}
|
||
};
|
||
}
|
||
|
||
var replaceText = (function () {
|
||
var textStore = [];
|
||
|
||
return function (index, replacement) {
|
||
textStore[index] = replacement;
|
||
return textStore.filter(Boolean).join('\n');
|
||
};
|
||
})();
|
||
|
||
function applyToSingletonTag(styleElement, index, remove, obj) {
|
||
var css = remove ? "" : obj.css;
|
||
|
||
if (styleElement.styleSheet) {
|
||
styleElement.styleSheet.cssText = replaceText(index, css);
|
||
} else {
|
||
var cssNode = document.createTextNode(css);
|
||
var childNodes = styleElement.childNodes;
|
||
if (childNodes[index]) styleElement.removeChild(childNodes[index]);
|
||
if (childNodes.length) {
|
||
styleElement.insertBefore(cssNode, childNodes[index]);
|
||
} else {
|
||
styleElement.appendChild(cssNode);
|
||
}
|
||
}
|
||
}
|
||
|
||
function applyToTag(styleElement, obj) {
|
||
var css = obj.css;
|
||
var media = obj.media;
|
||
var sourceMap = obj.sourceMap;
|
||
|
||
if(media) {
|
||
styleElement.setAttribute("media", media)
|
||
}
|
||
|
||
if(styleElement.styleSheet) {
|
||
styleElement.styleSheet.cssText = css;
|
||
} else {
|
||
while(styleElement.firstChild) {
|
||
styleElement.removeChild(styleElement.firstChild);
|
||
}
|
||
styleElement.appendChild(document.createTextNode(css));
|
||
}
|
||
}
|
||
|
||
function updateLink(linkElement, obj) {
|
||
var css = obj.css;
|
||
var media = obj.media;
|
||
var sourceMap = obj.sourceMap;
|
||
|
||
if(sourceMap) {
|
||
// http://stackoverflow.com/a/26603875
|
||
css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
|
||
}
|
||
|
||
var blob = new Blob([css], { type: "text/css" });
|
||
|
||
var oldSrc = linkElement.href;
|
||
|
||
linkElement.href = URL.createObjectURL(blob);
|
||
|
||
if(oldSrc)
|
||
URL.revokeObjectURL(oldSrc);
|
||
}
|
||
|
||
|
||
/***/ },
|
||
/* 30 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
type: {
|
||
type: String
|
||
},
|
||
dismissable: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
show: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: true,
|
||
twoWay: true
|
||
},
|
||
duration: {
|
||
type: Number,
|
||
default: 0
|
||
},
|
||
width: {
|
||
type: String
|
||
},
|
||
placement: {
|
||
type: String
|
||
}
|
||
},
|
||
watch: {
|
||
show: function show(val) {
|
||
var _this = this;
|
||
|
||
if (this._timeout) clearTimeout(this._timeout);
|
||
if (val && Boolean(this.duration)) {
|
||
this._timeout = setTimeout(function () {
|
||
return _this.show = false;
|
||
}, this.duration);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .fade-transition {
|
||
// transition: opacity .3s ease;
|
||
// }
|
||
// .fade-enter,
|
||
// .fade-leave {
|
||
// height: 0;
|
||
// opacity: 0;
|
||
// }
|
||
// .alert.top {
|
||
// position: fixed;
|
||
// top: 30px;
|
||
// margin: 0 auto;
|
||
// left: 0;
|
||
// right: 0;
|
||
// z-index: 2;
|
||
// }
|
||
// .alert.top-right {
|
||
// position: fixed;
|
||
// top: 30px;
|
||
// right: 50px;
|
||
// z-index: 2;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div
|
||
// v-show="show"
|
||
// v-bind:class="{
|
||
// 'alert': true,
|
||
// 'alert-success':(type == 'success'),
|
||
// 'alert-warning':(type == 'warning'),
|
||
// 'alert-info': (type == 'info'),
|
||
// 'alert-danger': (type == 'danger'),
|
||
// 'top': (placement === 'top'),
|
||
// 'top-right': (placement === 'top-right')
|
||
// }"
|
||
// transition="fade"
|
||
// v-bind:style="{width:width}"
|
||
// role="alert">
|
||
// <button v-show="dismissable" type="button" class="close"
|
||
// @click="show = false">
|
||
// <span>×</span>
|
||
// </button>
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 31 */
|
||
/***/ function(module, exports) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// Attempt to convert a string value to a Boolean. Otherwise, return the value
|
||
// without modification so Vue can throw a warning.
|
||
|
||
exports.default = function (val) {
|
||
return typeof val !== "string" ? val : val === "true" ? true : val === "false" ? false : val === "null" ? false : val === "undefined" ? false : val;
|
||
};
|
||
|
||
/***/ },
|
||
/* 32 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div\n v-show=\"show\"\n v-bind:class=\"{\n 'alert':\t\ttrue,\n 'alert-success':(type == 'success'),\n 'alert-warning':(type == 'warning'),\n 'alert-info':\t(type == 'info'),\n 'alert-danger':\t(type == 'danger'),\n 'top': \t\t\t(placement === 'top'),\n 'top-right': \t(placement === 'top-right')\n }\"\n transition=\"fade\"\n v-bind:style=\"{width:width}\"\n role=\"alert\">\n <button v-show=\"dismissable\" type=\"button\" class=\"close\"\n @click=\"show = false\">\n <span>×</span>\n </button>\n <slot></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 33 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(34)
|
||
module.exports = __webpack_require__(36)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(92)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Carousel.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Carousel.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-1ce6791c&file=Carousel.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Carousel.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Carousel.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-1ce6791c&file=Carousel.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Carousel.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 34 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(35);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-1ce6791c&file=Carousel.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Carousel.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-1ce6791c&file=Carousel.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Carousel.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 35 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".carousel-control[_v-1ce6791c] {\n cursor: pointer;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 36 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _toConsumableArray2 = __webpack_require__(37);
|
||
|
||
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
// <template>
|
||
// <div class="carousel slide" data-ride="carousel">
|
||
// <!-- Indicators -->
|
||
// <ol class="carousel-indicators" v-show="indicators">
|
||
// <indicator :indicator.sync="indicator" :active-index.sync="activeIndex" :is-animating.sync="isAnimating"></indicator>
|
||
// </ol>
|
||
// <!-- Wrapper for slides -->
|
||
// <div class="carousel-inner" role="listbox">
|
||
// <slot></slot>
|
||
// </div>
|
||
// <!-- Controls -->
|
||
// <div v-show="controls" class="carousel-controls hidden-xs">
|
||
// <a class="left carousel-control" role="button" @click="prevClick">
|
||
// <span class="fa fa-arrow-left" aria-hidden="true"></span>
|
||
// </a>
|
||
// <a class="right carousel-control" role="button" @click="nextClick">
|
||
// <span class="fa fa-arrow-right" aria-hidden="true"></span>
|
||
// </a>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
props: {
|
||
indicators: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: true
|
||
},
|
||
controls: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: true
|
||
},
|
||
interval: {
|
||
type: Number,
|
||
default: 5000
|
||
}
|
||
},
|
||
components: {
|
||
'indicator': {
|
||
//inherit: true,
|
||
props: ['indicator', 'activeIndex', 'isAnimating'],
|
||
template: '<li v-for="i in indicator" @click="handleIndicatorClick($index)" v-bind:class="{\'active\':$index === activeIndex}"><span></span></li>',
|
||
methods: {
|
||
handleIndicatorClick: function handleIndicatorClick(index) {
|
||
if (this.isAnimating) return false;
|
||
this.isAnimating = true;
|
||
this.activeIndex = index;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
indicator: [],
|
||
activeIndex: 0,
|
||
isAnimating: false
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
slider: function slider() {
|
||
return this.$el.querySelectorAll('.item');
|
||
}
|
||
},
|
||
watch: {
|
||
activeIndex: function activeIndex(newVal, oldVal) {
|
||
newVal > oldVal ? this.slide('left', newVal, oldVal) : this.slide('right', newVal, oldVal);
|
||
}
|
||
},
|
||
methods: {
|
||
slide: function slide(direction, selected, prev) {
|
||
var _this = this;
|
||
|
||
if (this._prevSelectedEvent) this._prevSelectedEvent.remove();
|
||
if (this._selectedEvent) this._selectedEvent.remove();
|
||
|
||
var prevSelectedEl = this.slider[prev];
|
||
var selectedEl = this.slider[selected];
|
||
var transitionendFn = function transitionendFn() {
|
||
[].concat((0, _toConsumableArray3.default)(_this.slider)).forEach(function (el) {
|
||
return el.className = 'item';
|
||
});
|
||
selectedEl.classList.add('active');
|
||
_this.isAnimating = false;
|
||
};
|
||
|
||
direction === 'left' ? selectedEl.classList.add('next') : selectedEl.classList.add('prev');
|
||
// request property that requires layout to force a layout
|
||
var x = selectedEl.clientHeight;
|
||
this._prevSelectedEvent = _EventListener2.default.listen(prevSelectedEl, 'transitionend', transitionendFn);
|
||
this._selectedEvent = _EventListener2.default.listen(selectedEl, 'transitionend', transitionendFn);
|
||
prevSelectedEl.classList.add(direction);
|
||
selectedEl.classList.add(direction);
|
||
},
|
||
nextClick: function nextClick() {
|
||
if (this.isAnimating) return false;
|
||
this.isAnimating = true;
|
||
this.activeIndex + 1 < this.slider.length ? this.activeIndex += 1 : this.activeIndex = 0;
|
||
},
|
||
prevClick: function prevClick() {
|
||
if (this.isAnimating) return false;
|
||
this.isAnimating = true;
|
||
this.activeIndex === 0 ? this.activeIndex = this.slider.length - 1 : this.activeIndex -= 1;
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var _this2 = this;
|
||
|
||
var intervalID = null;
|
||
var el = this.$el;
|
||
function intervalManager(flag, func, time) {
|
||
flag ? intervalID = setInterval(func, time) : clearInterval(intervalID);
|
||
}
|
||
if (!!this.interval) {
|
||
intervalManager(true, this.nextClick, this.interval);
|
||
el.addEventListener('mouseenter', function () {
|
||
return intervalManager(false);
|
||
});
|
||
el.addEventListener('mouseleave', function () {
|
||
return intervalManager(true, _this2.nextClick, _this2.interval);
|
||
});
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style scoped>
|
||
// .carousel-control {
|
||
// cursor: pointer;
|
||
// }
|
||
// </style>
|
||
|
||
/***/ },
|
||
/* 37 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
"use strict";
|
||
|
||
exports.__esModule = true;
|
||
|
||
var _from = __webpack_require__(38);
|
||
|
||
var _from2 = _interopRequireDefault(_from);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = function (arr) {
|
||
if (Array.isArray(arr)) {
|
||
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
|
||
arr2[i] = arr[i];
|
||
}
|
||
|
||
return arr2;
|
||
} else {
|
||
return (0, _from2.default)(arr);
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 38 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = { "default": __webpack_require__(39), __esModule: true };
|
||
|
||
/***/ },
|
||
/* 39 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(40);
|
||
__webpack_require__(84);
|
||
module.exports = __webpack_require__(48).Array.from;
|
||
|
||
/***/ },
|
||
/* 40 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var $at = __webpack_require__(41)(true);
|
||
|
||
// 21.1.3.27 String.prototype[@@iterator]()
|
||
__webpack_require__(44)(String, 'String', function(iterated){
|
||
this._t = String(iterated); // target
|
||
this._i = 0; // next index
|
||
// 21.1.5.2.1 %StringIteratorPrototype%.next()
|
||
}, function(){
|
||
var O = this._t
|
||
, index = this._i
|
||
, point;
|
||
if(index >= O.length)return {value: undefined, done: true};
|
||
point = $at(O, index);
|
||
this._i += point.length;
|
||
return {value: point, done: false};
|
||
});
|
||
|
||
/***/ },
|
||
/* 41 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var toInteger = __webpack_require__(42)
|
||
, defined = __webpack_require__(43);
|
||
// true -> String#at
|
||
// false -> String#codePointAt
|
||
module.exports = function(TO_STRING){
|
||
return function(that, pos){
|
||
var s = String(defined(that))
|
||
, i = toInteger(pos)
|
||
, l = s.length
|
||
, a, b;
|
||
if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
|
||
a = s.charCodeAt(i);
|
||
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
|
||
? TO_STRING ? s.charAt(i) : a
|
||
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 42 */
|
||
/***/ function(module, exports) {
|
||
|
||
// 7.1.4 ToInteger
|
||
var ceil = Math.ceil
|
||
, floor = Math.floor;
|
||
module.exports = function(it){
|
||
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
|
||
};
|
||
|
||
/***/ },
|
||
/* 43 */
|
||
/***/ function(module, exports) {
|
||
|
||
// 7.2.1 RequireObjectCoercible(argument)
|
||
module.exports = function(it){
|
||
if(it == undefined)throw TypeError("Can't call method on " + it);
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 44 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var LIBRARY = __webpack_require__(45)
|
||
, $export = __webpack_require__(46)
|
||
, redefine = __webpack_require__(61)
|
||
, hide = __webpack_require__(51)
|
||
, has = __webpack_require__(62)
|
||
, Iterators = __webpack_require__(63)
|
||
, $iterCreate = __webpack_require__(64)
|
||
, setToStringTag = __webpack_require__(80)
|
||
, getPrototypeOf = __webpack_require__(82)
|
||
, ITERATOR = __webpack_require__(81)('iterator')
|
||
, BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
|
||
, FF_ITERATOR = '@@iterator'
|
||
, KEYS = 'keys'
|
||
, VALUES = 'values';
|
||
|
||
var returnThis = function(){ return this; };
|
||
|
||
module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
|
||
$iterCreate(Constructor, NAME, next);
|
||
var getMethod = function(kind){
|
||
if(!BUGGY && kind in proto)return proto[kind];
|
||
switch(kind){
|
||
case KEYS: return function keys(){ return new Constructor(this, kind); };
|
||
case VALUES: return function values(){ return new Constructor(this, kind); };
|
||
} return function entries(){ return new Constructor(this, kind); };
|
||
};
|
||
var TAG = NAME + ' Iterator'
|
||
, DEF_VALUES = DEFAULT == VALUES
|
||
, VALUES_BUG = false
|
||
, proto = Base.prototype
|
||
, $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
|
||
, $default = $native || getMethod(DEFAULT)
|
||
, $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
|
||
, $anyNative = NAME == 'Array' ? proto.entries || $native : $native
|
||
, methods, key, IteratorPrototype;
|
||
// Fix native
|
||
if($anyNative){
|
||
IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
|
||
if(IteratorPrototype !== Object.prototype){
|
||
// Set @@toStringTag to native iterators
|
||
setToStringTag(IteratorPrototype, TAG, true);
|
||
// fix for some old engines
|
||
if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);
|
||
}
|
||
}
|
||
// fix Array#{values, @@iterator}.name in V8 / FF
|
||
if(DEF_VALUES && $native && $native.name !== VALUES){
|
||
VALUES_BUG = true;
|
||
$default = function values(){ return $native.call(this); };
|
||
}
|
||
// Define iterator
|
||
if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
|
||
hide(proto, ITERATOR, $default);
|
||
}
|
||
// Plug for library
|
||
Iterators[NAME] = $default;
|
||
Iterators[TAG] = returnThis;
|
||
if(DEFAULT){
|
||
methods = {
|
||
values: DEF_VALUES ? $default : getMethod(VALUES),
|
||
keys: IS_SET ? $default : getMethod(KEYS),
|
||
entries: $entries
|
||
};
|
||
if(FORCED)for(key in methods){
|
||
if(!(key in proto))redefine(proto, key, methods[key]);
|
||
} else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
|
||
}
|
||
return methods;
|
||
};
|
||
|
||
/***/ },
|
||
/* 45 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = true;
|
||
|
||
/***/ },
|
||
/* 46 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var global = __webpack_require__(47)
|
||
, core = __webpack_require__(48)
|
||
, ctx = __webpack_require__(49)
|
||
, hide = __webpack_require__(51)
|
||
, PROTOTYPE = 'prototype';
|
||
|
||
var $export = function(type, name, source){
|
||
var IS_FORCED = type & $export.F
|
||
, IS_GLOBAL = type & $export.G
|
||
, IS_STATIC = type & $export.S
|
||
, IS_PROTO = type & $export.P
|
||
, IS_BIND = type & $export.B
|
||
, IS_WRAP = type & $export.W
|
||
, exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
|
||
, expProto = exports[PROTOTYPE]
|
||
, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
|
||
, key, own, out;
|
||
if(IS_GLOBAL)source = name;
|
||
for(key in source){
|
||
// contains in native
|
||
own = !IS_FORCED && target && target[key] !== undefined;
|
||
if(own && key in exports)continue;
|
||
// export native or passed
|
||
out = own ? target[key] : source[key];
|
||
// prevent global pollution for namespaces
|
||
exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
|
||
// bind timers to global for call from export context
|
||
: IS_BIND && own ? ctx(out, global)
|
||
// wrap global constructors for prevent change them in library
|
||
: IS_WRAP && target[key] == out ? (function(C){
|
||
var F = function(a, b, c){
|
||
if(this instanceof C){
|
||
switch(arguments.length){
|
||
case 0: return new C;
|
||
case 1: return new C(a);
|
||
case 2: return new C(a, b);
|
||
} return new C(a, b, c);
|
||
} return C.apply(this, arguments);
|
||
};
|
||
F[PROTOTYPE] = C[PROTOTYPE];
|
||
return F;
|
||
// make static versions for prototype methods
|
||
})(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
|
||
// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
|
||
if(IS_PROTO){
|
||
(exports.virtual || (exports.virtual = {}))[key] = out;
|
||
// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
|
||
if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
|
||
}
|
||
}
|
||
};
|
||
// type bitmap
|
||
$export.F = 1; // forced
|
||
$export.G = 2; // global
|
||
$export.S = 4; // static
|
||
$export.P = 8; // proto
|
||
$export.B = 16; // bind
|
||
$export.W = 32; // wrap
|
||
$export.U = 64; // safe
|
||
$export.R = 128; // real proto method for `library`
|
||
module.exports = $export;
|
||
|
||
/***/ },
|
||
/* 47 */
|
||
/***/ function(module, exports) {
|
||
|
||
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
|
||
var global = module.exports = typeof window != 'undefined' && window.Math == Math
|
||
? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
|
||
if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
|
||
|
||
/***/ },
|
||
/* 48 */
|
||
/***/ function(module, exports) {
|
||
|
||
var core = module.exports = {version: '2.4.0'};
|
||
if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
|
||
|
||
/***/ },
|
||
/* 49 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// optional / simple context binding
|
||
var aFunction = __webpack_require__(50);
|
||
module.exports = function(fn, that, length){
|
||
aFunction(fn);
|
||
if(that === undefined)return fn;
|
||
switch(length){
|
||
case 1: return function(a){
|
||
return fn.call(that, a);
|
||
};
|
||
case 2: return function(a, b){
|
||
return fn.call(that, a, b);
|
||
};
|
||
case 3: return function(a, b, c){
|
||
return fn.call(that, a, b, c);
|
||
};
|
||
}
|
||
return function(/* ...args */){
|
||
return fn.apply(that, arguments);
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 50 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(it){
|
||
if(typeof it != 'function')throw TypeError(it + ' is not a function!');
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 51 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var dP = __webpack_require__(52)
|
||
, createDesc = __webpack_require__(60);
|
||
module.exports = __webpack_require__(56) ? function(object, key, value){
|
||
return dP.f(object, key, createDesc(1, value));
|
||
} : function(object, key, value){
|
||
object[key] = value;
|
||
return object;
|
||
};
|
||
|
||
/***/ },
|
||
/* 52 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var anObject = __webpack_require__(53)
|
||
, IE8_DOM_DEFINE = __webpack_require__(55)
|
||
, toPrimitive = __webpack_require__(59)
|
||
, dP = Object.defineProperty;
|
||
|
||
exports.f = __webpack_require__(56) ? Object.defineProperty : function defineProperty(O, P, Attributes){
|
||
anObject(O);
|
||
P = toPrimitive(P, true);
|
||
anObject(Attributes);
|
||
if(IE8_DOM_DEFINE)try {
|
||
return dP(O, P, Attributes);
|
||
} catch(e){ /* empty */ }
|
||
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
|
||
if('value' in Attributes)O[P] = Attributes.value;
|
||
return O;
|
||
};
|
||
|
||
/***/ },
|
||
/* 53 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var isObject = __webpack_require__(54);
|
||
module.exports = function(it){
|
||
if(!isObject(it))throw TypeError(it + ' is not an object!');
|
||
return it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 54 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(it){
|
||
return typeof it === 'object' ? it !== null : typeof it === 'function';
|
||
};
|
||
|
||
/***/ },
|
||
/* 55 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = !__webpack_require__(56) && !__webpack_require__(57)(function(){
|
||
return Object.defineProperty(__webpack_require__(58)('div'), 'a', {get: function(){ return 7; }}).a != 7;
|
||
});
|
||
|
||
/***/ },
|
||
/* 56 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// Thank's IE8 for his funny defineProperty
|
||
module.exports = !__webpack_require__(57)(function(){
|
||
return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
|
||
});
|
||
|
||
/***/ },
|
||
/* 57 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(exec){
|
||
try {
|
||
return !!exec();
|
||
} catch(e){
|
||
return true;
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 58 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var isObject = __webpack_require__(54)
|
||
, document = __webpack_require__(47).document
|
||
// in old IE typeof document.createElement is 'object'
|
||
, is = isObject(document) && isObject(document.createElement);
|
||
module.exports = function(it){
|
||
return is ? document.createElement(it) : {};
|
||
};
|
||
|
||
/***/ },
|
||
/* 59 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.1 ToPrimitive(input [, PreferredType])
|
||
var isObject = __webpack_require__(54);
|
||
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
|
||
// and the second argument - flag - preferred type is a string
|
||
module.exports = function(it, S){
|
||
if(!isObject(it))return it;
|
||
var fn, val;
|
||
if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
|
||
throw TypeError("Can't convert object to primitive value");
|
||
};
|
||
|
||
/***/ },
|
||
/* 60 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(bitmap, value){
|
||
return {
|
||
enumerable : !(bitmap & 1),
|
||
configurable: !(bitmap & 2),
|
||
writable : !(bitmap & 4),
|
||
value : value
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 61 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(51);
|
||
|
||
/***/ },
|
||
/* 62 */
|
||
/***/ function(module, exports) {
|
||
|
||
var hasOwnProperty = {}.hasOwnProperty;
|
||
module.exports = function(it, key){
|
||
return hasOwnProperty.call(it, key);
|
||
};
|
||
|
||
/***/ },
|
||
/* 63 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = {};
|
||
|
||
/***/ },
|
||
/* 64 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var create = __webpack_require__(65)
|
||
, descriptor = __webpack_require__(60)
|
||
, setToStringTag = __webpack_require__(80)
|
||
, IteratorPrototype = {};
|
||
|
||
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
|
||
__webpack_require__(51)(IteratorPrototype, __webpack_require__(81)('iterator'), function(){ return this; });
|
||
|
||
module.exports = function(Constructor, NAME, next){
|
||
Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});
|
||
setToStringTag(Constructor, NAME + ' Iterator');
|
||
};
|
||
|
||
/***/ },
|
||
/* 65 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
|
||
var anObject = __webpack_require__(53)
|
||
, dPs = __webpack_require__(66)
|
||
, enumBugKeys = __webpack_require__(78)
|
||
, IE_PROTO = __webpack_require__(75)('IE_PROTO')
|
||
, Empty = function(){ /* empty */ }
|
||
, PROTOTYPE = 'prototype';
|
||
|
||
// Create object with fake `null` prototype: use iframe Object with cleared prototype
|
||
var createDict = function(){
|
||
// Thrash, waste and sodomy: IE GC bug
|
||
var iframe = __webpack_require__(58)('iframe')
|
||
, i = enumBugKeys.length
|
||
, gt = '>'
|
||
, iframeDocument;
|
||
iframe.style.display = 'none';
|
||
__webpack_require__(79).appendChild(iframe);
|
||
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
|
||
// createDict = iframe.contentWindow.Object;
|
||
// html.removeChild(iframe);
|
||
iframeDocument = iframe.contentWindow.document;
|
||
iframeDocument.open();
|
||
iframeDocument.write('<script>document.F=Object</script' + gt);
|
||
iframeDocument.close();
|
||
createDict = iframeDocument.F;
|
||
while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];
|
||
return createDict();
|
||
};
|
||
|
||
module.exports = Object.create || function create(O, Properties){
|
||
var result;
|
||
if(O !== null){
|
||
Empty[PROTOTYPE] = anObject(O);
|
||
result = new Empty;
|
||
Empty[PROTOTYPE] = null;
|
||
// add "__proto__" for Object.getPrototypeOf polyfill
|
||
result[IE_PROTO] = O;
|
||
} else result = createDict();
|
||
return Properties === undefined ? result : dPs(result, Properties);
|
||
};
|
||
|
||
/***/ },
|
||
/* 66 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var dP = __webpack_require__(52)
|
||
, anObject = __webpack_require__(53)
|
||
, getKeys = __webpack_require__(67);
|
||
|
||
module.exports = __webpack_require__(56) ? Object.defineProperties : function defineProperties(O, Properties){
|
||
anObject(O);
|
||
var keys = getKeys(Properties)
|
||
, length = keys.length
|
||
, i = 0
|
||
, P;
|
||
while(length > i)dP.f(O, P = keys[i++], Properties[P]);
|
||
return O;
|
||
};
|
||
|
||
/***/ },
|
||
/* 67 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
|
||
var $keys = __webpack_require__(68)
|
||
, enumBugKeys = __webpack_require__(78);
|
||
|
||
module.exports = Object.keys || function keys(O){
|
||
return $keys(O, enumBugKeys);
|
||
};
|
||
|
||
/***/ },
|
||
/* 68 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var has = __webpack_require__(62)
|
||
, toIObject = __webpack_require__(69)
|
||
, arrayIndexOf = __webpack_require__(72)(false)
|
||
, IE_PROTO = __webpack_require__(75)('IE_PROTO');
|
||
|
||
module.exports = function(object, names){
|
||
var O = toIObject(object)
|
||
, i = 0
|
||
, result = []
|
||
, key;
|
||
for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
|
||
// Don't enum bug & hidden keys
|
||
while(names.length > i)if(has(O, key = names[i++])){
|
||
~arrayIndexOf(result, key) || result.push(key);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
/***/ },
|
||
/* 69 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// to indexed object, toObject with fallback for non-array-like ES3 strings
|
||
var IObject = __webpack_require__(70)
|
||
, defined = __webpack_require__(43);
|
||
module.exports = function(it){
|
||
return IObject(defined(it));
|
||
};
|
||
|
||
/***/ },
|
||
/* 70 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// fallback for non-array-like ES3 and non-enumerable old V8 strings
|
||
var cof = __webpack_require__(71);
|
||
module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
|
||
return cof(it) == 'String' ? it.split('') : Object(it);
|
||
};
|
||
|
||
/***/ },
|
||
/* 71 */
|
||
/***/ function(module, exports) {
|
||
|
||
var toString = {}.toString;
|
||
|
||
module.exports = function(it){
|
||
return toString.call(it).slice(8, -1);
|
||
};
|
||
|
||
/***/ },
|
||
/* 72 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// false -> Array#indexOf
|
||
// true -> Array#includes
|
||
var toIObject = __webpack_require__(69)
|
||
, toLength = __webpack_require__(73)
|
||
, toIndex = __webpack_require__(74);
|
||
module.exports = function(IS_INCLUDES){
|
||
return function($this, el, fromIndex){
|
||
var O = toIObject($this)
|
||
, length = toLength(O.length)
|
||
, index = toIndex(fromIndex, length)
|
||
, value;
|
||
// Array#includes uses SameValueZero equality algorithm
|
||
if(IS_INCLUDES && el != el)while(length > index){
|
||
value = O[index++];
|
||
if(value != value)return true;
|
||
// Array#toIndex ignores holes, Array#includes - not
|
||
} else for(;length > index; index++)if(IS_INCLUDES || index in O){
|
||
if(O[index] === el)return IS_INCLUDES || index || 0;
|
||
} return !IS_INCLUDES && -1;
|
||
};
|
||
};
|
||
|
||
/***/ },
|
||
/* 73 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.15 ToLength
|
||
var toInteger = __webpack_require__(42)
|
||
, min = Math.min;
|
||
module.exports = function(it){
|
||
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
|
||
};
|
||
|
||
/***/ },
|
||
/* 74 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var toInteger = __webpack_require__(42)
|
||
, max = Math.max
|
||
, min = Math.min;
|
||
module.exports = function(index, length){
|
||
index = toInteger(index);
|
||
return index < 0 ? max(index + length, 0) : min(index, length);
|
||
};
|
||
|
||
/***/ },
|
||
/* 75 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var shared = __webpack_require__(76)('keys')
|
||
, uid = __webpack_require__(77);
|
||
module.exports = function(key){
|
||
return shared[key] || (shared[key] = uid(key));
|
||
};
|
||
|
||
/***/ },
|
||
/* 76 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var global = __webpack_require__(47)
|
||
, SHARED = '__core-js_shared__'
|
||
, store = global[SHARED] || (global[SHARED] = {});
|
||
module.exports = function(key){
|
||
return store[key] || (store[key] = {});
|
||
};
|
||
|
||
/***/ },
|
||
/* 77 */
|
||
/***/ function(module, exports) {
|
||
|
||
var id = 0
|
||
, px = Math.random();
|
||
module.exports = function(key){
|
||
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
|
||
};
|
||
|
||
/***/ },
|
||
/* 78 */
|
||
/***/ function(module, exports) {
|
||
|
||
// IE 8- don't enum bug keys
|
||
module.exports = (
|
||
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
|
||
).split(',');
|
||
|
||
/***/ },
|
||
/* 79 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(47).document && document.documentElement;
|
||
|
||
/***/ },
|
||
/* 80 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var def = __webpack_require__(52).f
|
||
, has = __webpack_require__(62)
|
||
, TAG = __webpack_require__(81)('toStringTag');
|
||
|
||
module.exports = function(it, tag, stat){
|
||
if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
|
||
};
|
||
|
||
/***/ },
|
||
/* 81 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var store = __webpack_require__(76)('wks')
|
||
, uid = __webpack_require__(77)
|
||
, Symbol = __webpack_require__(47).Symbol
|
||
, USE_SYMBOL = typeof Symbol == 'function';
|
||
|
||
var $exports = module.exports = function(name){
|
||
return store[name] || (store[name] =
|
||
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
|
||
};
|
||
|
||
$exports.store = store;
|
||
|
||
/***/ },
|
||
/* 82 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
|
||
var has = __webpack_require__(62)
|
||
, toObject = __webpack_require__(83)
|
||
, IE_PROTO = __webpack_require__(75)('IE_PROTO')
|
||
, ObjectProto = Object.prototype;
|
||
|
||
module.exports = Object.getPrototypeOf || function(O){
|
||
O = toObject(O);
|
||
if(has(O, IE_PROTO))return O[IE_PROTO];
|
||
if(typeof O.constructor == 'function' && O instanceof O.constructor){
|
||
return O.constructor.prototype;
|
||
} return O instanceof Object ? ObjectProto : null;
|
||
};
|
||
|
||
/***/ },
|
||
/* 83 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 7.1.13 ToObject(argument)
|
||
var defined = __webpack_require__(43);
|
||
module.exports = function(it){
|
||
return Object(defined(it));
|
||
};
|
||
|
||
/***/ },
|
||
/* 84 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var ctx = __webpack_require__(49)
|
||
, $export = __webpack_require__(46)
|
||
, toObject = __webpack_require__(83)
|
||
, call = __webpack_require__(85)
|
||
, isArrayIter = __webpack_require__(86)
|
||
, toLength = __webpack_require__(73)
|
||
, createProperty = __webpack_require__(87)
|
||
, getIterFn = __webpack_require__(88);
|
||
|
||
$export($export.S + $export.F * !__webpack_require__(90)(function(iter){ Array.from(iter); }), 'Array', {
|
||
// 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
|
||
from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){
|
||
var O = toObject(arrayLike)
|
||
, C = typeof this == 'function' ? this : Array
|
||
, aLen = arguments.length
|
||
, mapfn = aLen > 1 ? arguments[1] : undefined
|
||
, mapping = mapfn !== undefined
|
||
, index = 0
|
||
, iterFn = getIterFn(O)
|
||
, length, result, step, iterator;
|
||
if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
|
||
// if object isn't iterable or it's array with default iterator - use simple case
|
||
if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
|
||
for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){
|
||
createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
|
||
}
|
||
} else {
|
||
length = toLength(O.length);
|
||
for(result = new C(length); length > index; index++){
|
||
createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
|
||
}
|
||
}
|
||
result.length = index;
|
||
return result;
|
||
}
|
||
});
|
||
|
||
|
||
/***/ },
|
||
/* 85 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// call something on iterator step with safe closing on error
|
||
var anObject = __webpack_require__(53);
|
||
module.exports = function(iterator, fn, value, entries){
|
||
try {
|
||
return entries ? fn(anObject(value)[0], value[1]) : fn(value);
|
||
// 7.4.6 IteratorClose(iterator, completion)
|
||
} catch(e){
|
||
var ret = iterator['return'];
|
||
if(ret !== undefined)anObject(ret.call(iterator));
|
||
throw e;
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 86 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// check on default Array iterator
|
||
var Iterators = __webpack_require__(63)
|
||
, ITERATOR = __webpack_require__(81)('iterator')
|
||
, ArrayProto = Array.prototype;
|
||
|
||
module.exports = function(it){
|
||
return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
|
||
};
|
||
|
||
/***/ },
|
||
/* 87 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var $defineProperty = __webpack_require__(52)
|
||
, createDesc = __webpack_require__(60);
|
||
|
||
module.exports = function(object, index, value){
|
||
if(index in object)$defineProperty.f(object, index, createDesc(0, value));
|
||
else object[index] = value;
|
||
};
|
||
|
||
/***/ },
|
||
/* 88 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var classof = __webpack_require__(89)
|
||
, ITERATOR = __webpack_require__(81)('iterator')
|
||
, Iterators = __webpack_require__(63);
|
||
module.exports = __webpack_require__(48).getIteratorMethod = function(it){
|
||
if(it != undefined)return it[ITERATOR]
|
||
|| it['@@iterator']
|
||
|| Iterators[classof(it)];
|
||
};
|
||
|
||
/***/ },
|
||
/* 89 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// getting tag from 19.1.3.6 Object.prototype.toString()
|
||
var cof = __webpack_require__(71)
|
||
, TAG = __webpack_require__(81)('toStringTag')
|
||
// ES3 wrong here
|
||
, ARG = cof(function(){ return arguments; }()) == 'Arguments';
|
||
|
||
// fallback for IE11 Script Access Denied error
|
||
var tryGet = function(it, key){
|
||
try {
|
||
return it[key];
|
||
} catch(e){ /* empty */ }
|
||
};
|
||
|
||
module.exports = function(it){
|
||
var O, T, B;
|
||
return it === undefined ? 'Undefined' : it === null ? 'Null'
|
||
// @@toStringTag case
|
||
: typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
|
||
// builtinTag case
|
||
: ARG ? cof(O)
|
||
// ES3 arguments fallback
|
||
: (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
|
||
};
|
||
|
||
/***/ },
|
||
/* 90 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var ITERATOR = __webpack_require__(81)('iterator')
|
||
, SAFE_CLOSING = false;
|
||
|
||
try {
|
||
var riter = [7][ITERATOR]();
|
||
riter['return'] = function(){ SAFE_CLOSING = true; };
|
||
Array.from(riter, function(){ throw 2; });
|
||
} catch(e){ /* empty */ }
|
||
|
||
module.exports = function(exec, skipClosing){
|
||
if(!skipClosing && !SAFE_CLOSING)return false;
|
||
var safe = false;
|
||
try {
|
||
var arr = [7]
|
||
, iter = arr[ITERATOR]();
|
||
iter.next = function(){ return {done: safe = true}; };
|
||
arr[ITERATOR] = function(){ return iter; };
|
||
exec(arr);
|
||
} catch(e){ /* empty */ }
|
||
return safe;
|
||
};
|
||
|
||
/***/ },
|
||
/* 91 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
var EventListener = {
|
||
/**
|
||
* Listen to DOM events during the bubble phase.
|
||
*
|
||
* @param {DOMEventTarget} target DOM element to register listener on.
|
||
* @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
|
||
* @param {function} callback Callback function.
|
||
* @return {object} Object with a `remove` method.
|
||
*/
|
||
|
||
listen: function listen(target, eventType, callback) {
|
||
if (target.addEventListener) {
|
||
target.addEventListener(eventType, callback, false);
|
||
return {
|
||
remove: function remove() {
|
||
target.removeEventListener(eventType, callback, false);
|
||
}
|
||
};
|
||
} else if (target.attachEvent) {
|
||
target.attachEvent('on' + eventType, callback);
|
||
return {
|
||
remove: function remove() {
|
||
target.detachEvent('on' + eventType, callback);
|
||
}
|
||
};
|
||
}
|
||
}
|
||
};
|
||
|
||
exports.default = EventListener;
|
||
|
||
/***/ },
|
||
/* 92 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"carousel slide\" data-ride=\"carousel\" _v-1ce6791c=\"\">\n <!-- Indicators -->\n <ol class=\"carousel-indicators\" v-show=\"indicators\" _v-1ce6791c=\"\">\n <indicator :indicator.sync=\"indicator\" :active-index.sync=\"activeIndex\" :is-animating.sync=\"isAnimating\" _v-1ce6791c=\"\"></indicator>\n </ol>\n <!-- Wrapper for slides -->\n <div class=\"carousel-inner\" role=\"listbox\" _v-1ce6791c=\"\">\n <slot _v-1ce6791c=\"\"></slot>\n </div>\n <!-- Controls -->\n <div v-show=\"controls\" class=\"carousel-controls hidden-xs\" _v-1ce6791c=\"\">\n <a class=\"left carousel-control\" role=\"button\" @click=\"prevClick\" _v-1ce6791c=\"\">\n <span class=\"fa fa-arrow-left\" aria-hidden=\"true\" _v-1ce6791c=\"\"></span>\n </a>\n <a class=\"right carousel-control\" role=\"button\" @click=\"nextClick\" _v-1ce6791c=\"\">\n <span class=\"fa fa-arrow-right\" aria-hidden=\"true\" _v-1ce6791c=\"\"></span>\n </a>\n </div>\n</div>";
|
||
|
||
/***/ },
|
||
/* 93 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(94)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(95)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Slider.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Slider.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Slider.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Slider.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Slider.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 94 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// <template>
|
||
// <div class="item">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
data: function data() {
|
||
return {
|
||
index: 0,
|
||
show: false
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
show: function show() {
|
||
return this.$parent.activeIndex === this.index;
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
for (var c in this.$parent.$children) {
|
||
if (this.$parent.$children[c].$el == this.$el) {
|
||
this.index = parseInt(c, 10);
|
||
break;
|
||
}
|
||
}
|
||
//this.index = [...this.$el.parentNode.children].indexOf(this.$el)
|
||
this.$parent.indicator.push(this.index);
|
||
if (this.index === 0) {
|
||
this.$el.classList.add('active');
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
/***/ },
|
||
/* 95 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"item\">\n <slot></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 96 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(97)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(98)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Accordion.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Accordion.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Accordion.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Accordion.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Accordion.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 97 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
oneAtATime: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
created: function created() {
|
||
var _this = this;
|
||
|
||
this.$on('isOpenEvent', function (child) {
|
||
if (_this.oneAtATime) {
|
||
_this.$children.forEach(function (item) {
|
||
if (child !== item) {
|
||
item.isOpen = false;
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <div class="panel-group">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 98 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"panel-group\">\n <slot></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 99 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(100)
|
||
module.exports = __webpack_require__(102)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(103)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Affix.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Affix.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Affix.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Affix.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Affix.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 100 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(101);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-5035b9c4&file=Affix.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Affix.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-5035b9c4&file=Affix.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Affix.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 101 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".vue-affix {\n position: fixed;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 102 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
offset: {
|
||
type: Number,
|
||
default: 0
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
affixed: false,
|
||
styles: {}
|
||
};
|
||
},
|
||
|
||
methods: {
|
||
scrolling: function scrolling() {
|
||
var scrollTop = this.getScroll(window, true);
|
||
var elementOffset = this.getOffset(this.$el);
|
||
if (!this.affixed && scrollTop > elementOffset.top) {
|
||
this.affixed = true;
|
||
this.styles = {
|
||
top: this.offset + 'px',
|
||
left: elementOffset.left + 'px',
|
||
width: this.$el.offsetWidth + 'px'
|
||
};
|
||
}
|
||
if (this.affixed && scrollTop < elementOffset.top) {
|
||
this.affixed = false;
|
||
this.styles = {};
|
||
}
|
||
},
|
||
|
||
// from https://github.com/ant-design/ant-design/blob/master/components/affix/index.jsx#L20
|
||
getScroll: function getScroll(w, top) {
|
||
var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];
|
||
var method = 'scroll' + (top ? 'Top' : 'Left');
|
||
if (typeof ret !== 'number') {
|
||
var d = w.document;
|
||
// ie6,7,8 standard mode
|
||
ret = d.documentElement[method];
|
||
if (typeof ret !== 'number') {
|
||
// quirks mode
|
||
ret = d.body[method];
|
||
}
|
||
}
|
||
return ret;
|
||
},
|
||
getOffset: function getOffset(element) {
|
||
var rect = element.getBoundingClientRect();
|
||
var body = document.body;
|
||
var clientTop = element.clientTop || body.clientTop || 0;
|
||
var clientLeft = element.clientLeft || body.clientLeft || 0;
|
||
var scrollTop = this.getScroll(window, true);
|
||
var scrollLeft = this.getScroll(window);
|
||
return {
|
||
top: rect.top + scrollTop - clientTop,
|
||
left: rect.left + scrollLeft - clientLeft
|
||
};
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
this._scrollEvent = _EventListener2.default.listen(window, 'scroll', this.scrolling);
|
||
this._resizeEvent = _EventListener2.default.listen(window, 'resize', this.scrolling);
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
if (this._scrollEvent) {
|
||
this._scrollEvent.remove();
|
||
}
|
||
if (this._resizeEvent) {
|
||
this._resizeEvent.remove();
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .vue-affix {
|
||
// position: fixed;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div>
|
||
// <div v-bind:class="{'vue-affix': affixed}"
|
||
// v-bind:style="styles">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 103 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div>\n<div v-bind:class=\"{'vue-affix': affixed}\"\n v-bind:style=\"styles\">\n <slot></slot>\n</div>\n</div>";
|
||
|
||
/***/ },
|
||
/* 104 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(105)
|
||
module.exports = __webpack_require__(107)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(109)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Aside.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Aside.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Aside.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Aside.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Aside.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 105 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(106);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-2bc3b92c&file=Aside.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Aside.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-2bc3b92c&file=Aside.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Aside.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 106 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".aside-open {\n -webkit-transition: -webkit-transform 0.3s;\n transition: -webkit-transform 0.3s;\n transition: transform 0.3s;\n transition: transform 0.3s, -webkit-transform 0.3s;\n }\n .aside-open.has-push-right {\n -webkit-transform: translateX(-300px);\n transform: translateX(-300px);\n }\n .aside {\n position: fixed;\n top: 0;\n bottom: 0;\n z-index: 1049;\n overflow: auto;\n background: #fff;\n }\n .aside.left {\n left: 0;\n right: auto;\n }\n .aside.right {\n left: auto;\n right: 0;\n }\n\n .slideleft-enter {\n -webkit-animation:slideleft-in .3s;\n animation:slideleft-in .3s;\n }\n .slideleft-leave {\n -webkit-animation:slideleft-out .3s;\n animation:slideleft-out .3s;\n }\n @-webkit-keyframes slideleft-in {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n opacity: 0;\n }\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n }\n @keyframes slideleft-in {\n 0% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n opacity: 0;\n }\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n }\n @-webkit-keyframes slideleft-out {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n opacity: 0;\n }\n }\n @keyframes slideleft-out {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n opacity: 0;\n }\n }\n .slideright-enter {\n -webkit-animation:slideright-in .3s;\n animation:slideright-in .3s;\n }\n .slideright-leave {\n -webkit-animation:slideright-out .3s;\n animation:slideright-out .3s;\n }\n @-webkit-keyframes slideright-in {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n opacity: 0;\n }\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n }\n @keyframes slideright-in {\n 0% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n opacity: 0;\n }\n 100% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n }\n @-webkit-keyframes slideright-out {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n opacity: 0;\n }\n }\n @keyframes slideright-out {\n 0% {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n opacity: 0;\n }\n }\n\n .aside:focus {\n outline: 0\n }\n\n @media (max-width: 991px) {\n .aside {\n min-width:240px\n }\n }\n\n .aside.left {\n right: auto;\n left: 0\n }\n\n .aside.right {\n right: 0;\n left: auto\n }\n\n .aside .aside-dialog .aside-header {\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.43px;\n padding: 6px 15px;\n background: #337ab7;\n color: #fff\n }\n\n .aside .aside-dialog .aside-header .close {\n margin-right: -8px;\n padding: 4px 8px;\n color: #fff;\n font-size: 25px;\n opacity: .8\n }\n\n .aside .aside-dialog .aside-body {\n position: relative;\n padding: 15px\n }\n\n .aside .aside-dialog .aside-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5\n }\n\n .aside .aside-dialog .aside-footer .btn+.btn {\n margin-left: 5px;\n margin-bottom: 0\n }\n\n .aside .aside-dialog .aside-footer .btn-group .btn+.btn {\n margin-left: -1px\n }\n\n .aside .aside-dialog .aside-footer .btn-block+.btn-block {\n margin-left: 0\n }\n\n .aside-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n opacity: 0;\n -webkit-transition: opacity .3s ease;\n transition: opacity .3s ease;\n background-color: #000\n }\n\n\n .aside-backdrop.in {\n opacity: .5;\n filter: alpha(opacity=50)\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 107 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
var _getScrollBarWidth = __webpack_require__(108);
|
||
|
||
var _getScrollBarWidth2 = _interopRequireDefault(_getScrollBarWidth);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
show: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
require: true,
|
||
twoWay: true
|
||
},
|
||
placement: {
|
||
type: String,
|
||
default: 'right'
|
||
},
|
||
header: {
|
||
type: String
|
||
},
|
||
width: {
|
||
type: Number,
|
||
default: '320'
|
||
}
|
||
},
|
||
watch: {
|
||
show: function show(val) {
|
||
var backdrop = document.createElement('div');
|
||
var body = document.body;
|
||
backdrop.className = 'aside-backdrop';
|
||
var scrollBarWidth = (0, _getScrollBarWidth2.default)();
|
||
if (val) {
|
||
body.appendChild(backdrop);
|
||
body.classList.add('modal-open');
|
||
if (scrollBarWidth !== 0) {
|
||
body.style.paddingRight = scrollBarWidth + 'px';
|
||
}
|
||
// request property that requires layout to force a layout
|
||
var x = backdrop.clientHeight;
|
||
backdrop.className += ' in';
|
||
this._clickEvent = _EventListener2.default.listen(backdrop, 'click', this.close);
|
||
} else {
|
||
if (this._clickEvent) this._clickEvent.remove();
|
||
backdrop = document.querySelector('.aside-backdrop');
|
||
try {
|
||
backdrop.className = 'aside-backdrop';
|
||
body.classList.remove('modal-open');
|
||
body.style.paddingRight = '0';
|
||
body.removeChild(backdrop);
|
||
} catch (e) {}
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
close: function close() {
|
||
this.show = false;
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .aside-open {
|
||
// transition: transform 0.3s;
|
||
// }
|
||
// .aside-open.has-push-right {
|
||
// transform: translateX(-300px);
|
||
// }
|
||
// .aside {
|
||
// position: fixed;
|
||
// top: 0;
|
||
// bottom: 0;
|
||
// z-index: 1049;
|
||
// overflow: auto;
|
||
// background: #fff;
|
||
// }
|
||
// .aside.left {
|
||
// left: 0;
|
||
// right: auto;
|
||
// }
|
||
// .aside.right {
|
||
// left: auto;
|
||
// right: 0;
|
||
// }
|
||
|
||
// .slideleft-enter {
|
||
// animation:slideleft-in .3s;
|
||
// }
|
||
// .slideleft-leave {
|
||
// animation:slideleft-out .3s;
|
||
// }
|
||
// @keyframes slideleft-in {
|
||
// 0% {
|
||
// transform: translateX(-100%);
|
||
// opacity: 0;
|
||
// }
|
||
// 100% {
|
||
// transform: translateX(0);
|
||
// opacity: 1;
|
||
// }
|
||
// }
|
||
// @keyframes slideleft-out {
|
||
// 0% {
|
||
// transform: translateX(0);
|
||
// opacity: 1;
|
||
// }
|
||
// 100% {
|
||
// transform: translateX(-100%);
|
||
// opacity: 0;
|
||
// }
|
||
// }
|
||
// .slideright-enter {
|
||
// animation:slideright-in .3s;
|
||
// }
|
||
// .slideright-leave {
|
||
// animation:slideright-out .3s;
|
||
// }
|
||
// @keyframes slideright-in {
|
||
// 0% {
|
||
// transform: translateX(100%);
|
||
// opacity: 0;
|
||
// }
|
||
// 100% {
|
||
// transform: translateX(0);
|
||
// opacity: 1;
|
||
// }
|
||
// }
|
||
// @keyframes slideright-out {
|
||
// 0% {
|
||
// transform: translateX(0);
|
||
// opacity: 1;
|
||
// }
|
||
// 100% {
|
||
// transform: translateX(100%);
|
||
// opacity: 0;
|
||
// }
|
||
// }
|
||
|
||
// .aside:focus {
|
||
// outline: 0
|
||
// }
|
||
|
||
// @media (max-width: 991px) {
|
||
// .aside {
|
||
// min-width:240px
|
||
// }
|
||
// }
|
||
|
||
// .aside.left {
|
||
// right: auto;
|
||
// left: 0
|
||
// }
|
||
|
||
// .aside.right {
|
||
// right: 0;
|
||
// left: auto
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-header {
|
||
// border-bottom: 1px solid #e5e5e5;
|
||
// min-height: 16.43px;
|
||
// padding: 6px 15px;
|
||
// background: #337ab7;
|
||
// color: #fff
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-header .close {
|
||
// margin-right: -8px;
|
||
// padding: 4px 8px;
|
||
// color: #fff;
|
||
// font-size: 25px;
|
||
// opacity: .8
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-body {
|
||
// position: relative;
|
||
// padding: 15px
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-footer {
|
||
// padding: 15px;
|
||
// text-align: right;
|
||
// border-top: 1px solid #e5e5e5
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-footer .btn+.btn {
|
||
// margin-left: 5px;
|
||
// margin-bottom: 0
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-footer .btn-group .btn+.btn {
|
||
// margin-left: -1px
|
||
// }
|
||
|
||
// .aside .aside-dialog .aside-footer .btn-block+.btn-block {
|
||
// margin-left: 0
|
||
// }
|
||
|
||
// .aside-backdrop {
|
||
// position: fixed;
|
||
// top: 0;
|
||
// right: 0;
|
||
// bottom: 0;
|
||
// left: 0;
|
||
// z-index: 1040;
|
||
// opacity: 0;
|
||
// transition: opacity .3s ease;
|
||
// background-color: #000
|
||
// }
|
||
|
||
// .aside-backdrop.in {
|
||
// opacity: .5;
|
||
// filter: alpha(opacity=50)
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div class="aside"
|
||
// v-bind:style="{width:width + 'px'}"
|
||
// v-bind:class="{
|
||
// left:placement === 'left',
|
||
// right:placement === 'right'
|
||
// }"
|
||
// v-show="show"
|
||
// :transition="(this.placement === 'left') ? 'slideleft' : 'slideright'">
|
||
// <div class="aside-dialog">
|
||
// <div class="aside-content">
|
||
// <div class="aside-header">
|
||
// <button type="button" class="close" @click='close'><span>×</span></button>
|
||
// <h4 class="aside-title">
|
||
// <slot name="header">
|
||
// {{ header }}
|
||
// </slot>
|
||
// </h4>
|
||
// </div>
|
||
// <div class="aside-body">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 108 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
exports.default = function () {
|
||
if (document.documentElement.scrollHeight <= document.documentElement.clientHeight) {
|
||
return 0;
|
||
}
|
||
var inner = document.createElement('p');
|
||
inner.style.width = '100%';
|
||
inner.style.height = '200px';
|
||
|
||
var outer = document.createElement('div');
|
||
outer.style.position = 'absolute';
|
||
outer.style.top = '0px';
|
||
outer.style.left = '0px';
|
||
outer.style.visibility = 'hidden';
|
||
outer.style.width = '200px';
|
||
outer.style.height = '150px';
|
||
outer.style.overflow = 'hidden';
|
||
outer.appendChild(inner);
|
||
|
||
document.body.appendChild(outer);
|
||
var w1 = inner.offsetWidth;
|
||
outer.style.overflow = 'scroll';
|
||
var w2 = inner.offsetWidth;
|
||
if (w1 === w2) w2 = outer.clientWidth;
|
||
|
||
document.body.removeChild(outer);
|
||
|
||
return w1 - w2;
|
||
};
|
||
|
||
/***/ },
|
||
/* 109 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"aside\"\n v-bind:style=\"{width:width + 'px'}\"\n v-bind:class=\"{\n left:placement === 'left',\n right:placement === 'right'\n }\"\n v-show=\"show\"\n :transition=\"(this.placement === 'left') ? 'slideleft' : 'slideright'\">\n <div class=\"aside-dialog\">\n <div class=\"aside-content\">\n <div class=\"aside-header\">\n <button type=\"button\" class=\"close\" @click='close'><span>×</span></button>\n <h4 class=\"aside-title\"> \n <slot name=\"header\"> \n {{ header }}\n </slot>\n </h4>\n </div>\n <div class=\"aside-body\">\n <slot></slot>\n </div>\n </div>\n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 110 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(111)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(112)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxGroup.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxGroup.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./checkboxGroup.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxGroup.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./checkboxGroup.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 111 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// <template>
|
||
// <div class="btn-group" data-toggle="buttons">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: Array,
|
||
default: function _default() {
|
||
return [];
|
||
}
|
||
},
|
||
type: {
|
||
type: String,
|
||
default: 'default'
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
/***/ },
|
||
/* 112 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"btn-group\" data-toggle=\"buttons\">\n <slot></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 113 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(114)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(115)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxBtn.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxBtn.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./checkboxBtn.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkboxBtn.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./checkboxBtn.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 114 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: String
|
||
},
|
||
checked: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
computed: {
|
||
type: function type() {
|
||
return this.$parent.type;
|
||
}
|
||
},
|
||
methods: {
|
||
handleClick: function handleClick() {
|
||
var parent = this.$parent;
|
||
var index = parent.value.indexOf(this.value);
|
||
index === -1 ? parent.value.push(this.value) : parent.value.splice(index, 1);
|
||
this.checked = !this.checked;
|
||
}
|
||
},
|
||
created: function created() {
|
||
if (this.$parent.value.length) {
|
||
this.checked = this.$parent.value.indexOf(this.value) > -1;
|
||
} else if (this.checked) {
|
||
this.$parent.value.push(this.value);
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <label class="btn"
|
||
// v-bind:class="{
|
||
// 'active':checked,
|
||
// 'btn-success':type == 'success',
|
||
// 'btn-warning':type == 'warning',
|
||
// 'btn-info':type == 'info',
|
||
// 'btn-danger':type == 'danger',
|
||
// 'btn-default':type == 'default',
|
||
// 'btn-primary':type == 'primary'
|
||
// }">
|
||
|
||
// <input type="checkbox" autocomplete="off"
|
||
// :checked="checked"
|
||
// @click="handleClick"
|
||
// />
|
||
|
||
// <slot></slot>
|
||
// </label>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 115 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<label class=\"btn\"\n v-bind:class=\"{\n 'active':checked,\n 'btn-success':type == 'success',\n 'btn-warning':type == 'warning',\n 'btn-info':type == 'info',\n 'btn-danger':type == 'danger',\n 'btn-default':type == 'default',\n 'btn-primary':type == 'primary'\n }\">\n\n <input type=\"checkbox\" autocomplete=\"off\"\n :checked=\"checked\"\n @click=\"handleClick\"\n />\n\n <slot></slot>\n </label>";
|
||
|
||
/***/ },
|
||
/* 116 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(117)
|
||
__webpack_require__(119)
|
||
module.exports = __webpack_require__(121)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(122)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Datepicker.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Datepicker.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Datepicker.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Datepicker.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Datepicker.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 117 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(118);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-663cce78&file=Datepicker.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Datepicker.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-663cce78&file=Datepicker.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Datepicker.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 118 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "input.datepicker-input.with-reset-button {\n padding-right: 25px;\n }\n\n div.datepicker > button.close {\n position: absolute;\n top: calc(50% - 13px);\n right: 10px;\n }\n\n div.datepicker > button.close {\n outline: none;\n z-index: 2;\n }\n\n div.datepicker > button.close:focus {\n opacity: .2;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 119 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(120);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-663cce78&file=Datepicker.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=1!./Datepicker.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-663cce78&file=Datepicker.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=1!./Datepicker.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 120 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".datepicker{\n position: relative;\n display: inline-block;\n}\n\n.datepicker-popup{\n position: absolute;\n border: 1px solid #ccc;\n border-radius: 5px;\n background: #fff;\n margin-top: 2px;\n z-index: 1000;\n box-shadow: 0 6px 12px rgba(0,0,0,0.175);\n}\n.datepicker-inner{\n width: 218px;\n\n}\n.datepicker-body{\n padding: 10px 10px;\n}\n.datepicker-ctrl p,\n.datepicker-ctrl span,\n.datepicker-body span{\n display: inline-block;\n width: 28px;\n line-height: 28px;\n height: 28px;\n border-radius: 4px;\n}\n.datepicker-ctrl p {\n width: 65%;\n}\n.datepicker-ctrl span {\n position: absolute;\n}\n.datepicker-body span {\n text-align: center;\n}\n.datepicker-monthRange span{\n width: 48px;\n height: 50px;\n line-height: 45px;\n}\n.datepicker-item-disable {\n background-color: white!important;\n cursor: not-allowed!important;\n}\n.decadeRange span:first-child,\n.decadeRange span:last-child,\n.datepicker-item-disable,\n.datepicker-item-gray{\n color: #999;\n}\n\n.datepicker-dateRange-item-active:hover,\n.datepicker-dateRange-item-active {\n background: rgb(50, 118, 177)!important;\n color: white!important;\n}\n.datepicker-monthRange {\n margin-top: 10px\n}\n.datepicker-monthRange span,\n.datepicker-ctrl span,\n.datepicker-ctrl p,\n.datepicker-dateRange span {\n cursor: pointer;\n}\n.datepicker-monthRange span:hover,\n.datepicker-ctrl p:hover,\n.datepicker-ctrl i:hover,\n.datepicker-dateRange span:hover,\n.datepicker-dateRange-item-hover {\n background-color : #eeeeee;\n}\n\n.datepicker-weekRange span{\n font-weight: bold;\n}\n.datepicker-label{\n background-color: #f8f8f8;\n font-weight: 700;\n padding: 7px 0;\n text-align: center;\n}\n.datepicker-ctrl{\n position: relative;\n height: 30px;\n line-height: 30px;\n font-weight: bold;\n text-align: center;\n}\n.month-btn{\n font-weight: bold;\n -webkit-user-select:none;\n -moz-user-select:none;\n -ms-user-select:none;\n user-select:none;\n}\n.datepicker-preBtn{\n left: 2px;\n}\n.datepicker-nextBtn{\n right: 2px;\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 121 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: String,
|
||
twoWay: true
|
||
},
|
||
format: {
|
||
default: 'MMMM/dd/yyyy'
|
||
},
|
||
disabledDaysOfWeek: {
|
||
type: Array,
|
||
default: function _default() {
|
||
return [];
|
||
}
|
||
},
|
||
width: {
|
||
type: String,
|
||
default: '200px'
|
||
},
|
||
showResetButton: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
weekRange: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
||
dateRange: [],
|
||
decadeRange: [],
|
||
currDate: new Date(),
|
||
displayDayView: false,
|
||
displayMonthView: false,
|
||
displayYearView: false,
|
||
monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
||
};
|
||
},
|
||
|
||
watch: {
|
||
currDate: function currDate() {
|
||
this.getDateRange();
|
||
}
|
||
},
|
||
methods: {
|
||
close: function close() {
|
||
this.displayDayView = this.displayMonthView = this.displayYearView = false;
|
||
},
|
||
inputClick: function inputClick() {
|
||
if (this.displayMonthView || this.displayYearView) {
|
||
this.displayDayView = false;
|
||
} else {
|
||
this.displayDayView = !this.displayDayView;
|
||
}
|
||
},
|
||
preNextDecadeClick: function preNextDecadeClick(flag) {
|
||
var year = this.currDate.getFullYear();
|
||
var months = this.currDate.getMonth();
|
||
var date = this.currDate.getDate();
|
||
|
||
if (flag === 0) {
|
||
this.currDate = new Date(year - 10, months, date);
|
||
} else {
|
||
this.currDate = new Date(year + 10, months, date);
|
||
}
|
||
},
|
||
preNextMonthClick: function preNextMonthClick(flag) {
|
||
var year = this.currDate.getFullYear();
|
||
var month = this.currDate.getMonth();
|
||
var date = this.currDate.getDate();
|
||
|
||
if (flag === 0) {
|
||
var preMonth = this.getYearMonth(year, month - 1);
|
||
this.currDate = new Date(preMonth.year, preMonth.month, date);
|
||
} else {
|
||
var nextMonth = this.getYearMonth(year, month + 1);
|
||
this.currDate = new Date(nextMonth.year, nextMonth.month, date);
|
||
}
|
||
},
|
||
preNextYearClick: function preNextYearClick(flag) {
|
||
var year = this.currDate.getFullYear();
|
||
var months = this.currDate.getMonth();
|
||
var date = this.currDate.getDate();
|
||
|
||
if (flag === 0) {
|
||
this.currDate = new Date(year - 1, months, date);
|
||
} else {
|
||
this.currDate = new Date(year + 1, months, date);
|
||
}
|
||
},
|
||
yearSelect: function yearSelect(year) {
|
||
this.displayYearView = false;
|
||
this.displayMonthView = true;
|
||
this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());
|
||
},
|
||
daySelect: function daySelect(date, el) {
|
||
if (el.$el.classList[0] === 'datepicker-item-disable') {
|
||
return false;
|
||
} else {
|
||
this.currDate = date;
|
||
this.value = this.stringify(this.currDate);
|
||
this.displayDayView = false;
|
||
}
|
||
},
|
||
switchMonthView: function switchMonthView() {
|
||
this.displayDayView = false;
|
||
this.displayMonthView = true;
|
||
},
|
||
switchDecadeView: function switchDecadeView() {
|
||
this.displayMonthView = false;
|
||
this.displayYearView = true;
|
||
},
|
||
monthSelect: function monthSelect(index) {
|
||
this.displayMonthView = false;
|
||
this.displayDayView = true;
|
||
this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());
|
||
},
|
||
getYearMonth: function getYearMonth(year, month) {
|
||
if (month > 11) {
|
||
year++;
|
||
month = 0;
|
||
} else if (month < 0) {
|
||
year--;
|
||
month = 11;
|
||
}
|
||
return { year: year, month: month };
|
||
},
|
||
stringifyDecadeHeader: function stringifyDecadeHeader(date) {
|
||
var yearStr = date.getFullYear().toString();
|
||
var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;
|
||
var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;
|
||
return firstYearOfDecade + '-' + lastYearOfDecade;
|
||
},
|
||
stringifyDayHeader: function stringifyDayHeader(date) {
|
||
return this.monthNames[date.getMonth()] + ' ' + date.getFullYear();
|
||
},
|
||
parseMonth: function parseMonth(date) {
|
||
return this.monthNames[date.getMonth()];
|
||
},
|
||
stringifyYearHeader: function stringifyYearHeader(date) {
|
||
return date.getFullYear();
|
||
},
|
||
stringify: function stringify(date) {
|
||
var format = arguments.length <= 1 || arguments[1] === undefined ? this.format : arguments[1];
|
||
|
||
var year = date.getFullYear();
|
||
var month = date.getMonth() + 1;
|
||
var day = date.getDate();
|
||
var monthName = this.parseMonth(date);
|
||
|
||
return format.replace(/yyyy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/dd/g, ('0' + day).slice(-2)).replace(/yy/g, year).replace(/M(?!a)/g, month).replace(/d/g, day);
|
||
},
|
||
parse: function parse(str) {
|
||
if (str.length == 10 && (this.format == 'dd-MM-yyyy' || this.format == 'dd/MM/yyyy')) {
|
||
str = str.substring(3, 5) + '-' + str.substring(0, 2) + '-' + str.substring(6, 10);
|
||
}
|
||
var date = new Date(str);
|
||
return isNaN(date.getFullYear()) ? null : date;
|
||
},
|
||
getDayCount: function getDayCount(year, month) {
|
||
var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
||
|
||
if (month === 1) {
|
||
if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {
|
||
return 29;
|
||
}
|
||
return 28;
|
||
}
|
||
|
||
return dict[month];
|
||
},
|
||
getDateRange: function getDateRange() {
|
||
var _this = this;
|
||
|
||
this.dateRange = [];
|
||
this.decadeRange = [];
|
||
var time = {
|
||
year: this.currDate.getFullYear(),
|
||
month: this.currDate.getMonth(),
|
||
day: this.currDate.getDate()
|
||
};
|
||
var yearStr = time.year.toString();
|
||
var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;
|
||
for (var i = 0; i < 12; i++) {
|
||
this.decadeRange.push({
|
||
text: firstYearOfDecade + i
|
||
});
|
||
}
|
||
|
||
var currMonthFirstDay = new Date(time.year, time.month, 1);
|
||
var firstDayWeek = currMonthFirstDay.getDay() + 1;
|
||
if (firstDayWeek === 0) {
|
||
firstDayWeek = 7;
|
||
}
|
||
var dayCount = this.getDayCount(time.year, time.month);
|
||
if (firstDayWeek > 1) {
|
||
var preMonth = this.getYearMonth(time.year, time.month - 1);
|
||
var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);
|
||
for (var i = 1; i < firstDayWeek; i++) {
|
||
var dayText = prevMonthDayCount - firstDayWeek + i + 1;
|
||
this.dateRange.push({
|
||
text: dayText,
|
||
date: new Date(preMonth.year, preMonth.month, dayText),
|
||
sclass: 'datepicker-item-gray'
|
||
});
|
||
}
|
||
}
|
||
|
||
var _loop = function _loop(i) {
|
||
var date = new Date(time.year, time.month, i);
|
||
var week = date.getDay();
|
||
var sclass = '';
|
||
_this.disabledDaysOfWeek.forEach(function (el) {
|
||
if (week === parseInt(el, 10)) sclass = 'datepicker-item-disable';
|
||
});
|
||
|
||
if (i === time.day) {
|
||
if (_this.value) {
|
||
var valueDate = _this.parse(_this.value);
|
||
if (valueDate) {
|
||
if (valueDate.getFullYear() === time.year && valueDate.getMonth() === time.month) {
|
||
sclass = 'datepicker-dateRange-item-active';
|
||
}
|
||
}
|
||
}
|
||
}
|
||
_this.dateRange.push({
|
||
text: i,
|
||
date: date,
|
||
sclass: sclass
|
||
});
|
||
};
|
||
|
||
for (var i = 1; i <= dayCount; i++) {
|
||
_loop(i);
|
||
}
|
||
|
||
if (this.dateRange.length < 42) {
|
||
var nextMonthNeed = 42 - this.dateRange.length;
|
||
var nextMonth = this.getYearMonth(time.year, time.month + 1);
|
||
|
||
for (var i = 1; i <= nextMonthNeed; i++) {
|
||
this.dateRange.push({
|
||
text: i,
|
||
date: new Date(nextMonth.year, nextMonth.month, i),
|
||
sclass: 'datepicker-item-gray'
|
||
});
|
||
}
|
||
}
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var _this2 = this;
|
||
|
||
this.$dispatch('child-created', this);
|
||
this.currDate = this.parse(this.value) || this.parse(new Date());
|
||
this._closeEvent = _EventListener2.default.listen(window, 'click', function (e) {
|
||
if (!_this2.$el.contains(e.target)) _this2.close();
|
||
});
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
if (this._closeEvent) this._closeEvent.remove();
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .datepicker{
|
||
// position: relative;
|
||
// display: inline-block;
|
||
// }
|
||
|
||
// .datepicker-popup{
|
||
// position: absolute;
|
||
// border: 1px solid #ccc;
|
||
// border-radius: 5px;
|
||
// background: #fff;
|
||
// margin-top: 2px;
|
||
// z-index: 1000;
|
||
// box-shadow: 0 6px 12px rgba(0,0,0,0.175);
|
||
// }
|
||
// .datepicker-inner{
|
||
// width: 218px;
|
||
|
||
// }
|
||
// .datepicker-body{
|
||
// padding: 10px 10px;
|
||
// }
|
||
// .datepicker-ctrl p,
|
||
// .datepicker-ctrl span,
|
||
// .datepicker-body span{
|
||
// display: inline-block;
|
||
// width: 28px;
|
||
// line-height: 28px;
|
||
// height: 28px;
|
||
// border-radius: 4px;
|
||
// }
|
||
// .datepicker-ctrl p {
|
||
// width: 65%;
|
||
// }
|
||
// .datepicker-ctrl span {
|
||
// position: absolute;
|
||
// }
|
||
// .datepicker-body span {
|
||
// text-align: center;
|
||
// }
|
||
// .datepicker-monthRange span{
|
||
// width: 48px;
|
||
// height: 50px;
|
||
// line-height: 45px;
|
||
// }
|
||
// .datepicker-item-disable {
|
||
// background-color: white!important;
|
||
// cursor: not-allowed!important;
|
||
// }
|
||
// .decadeRange span:first-child,
|
||
// .decadeRange span:last-child,
|
||
// .datepicker-item-disable,
|
||
// .datepicker-item-gray{
|
||
// color: #999;
|
||
// }
|
||
|
||
// .datepicker-dateRange-item-active:hover,
|
||
// .datepicker-dateRange-item-active {
|
||
// background: rgb(50, 118, 177)!important;
|
||
// color: white!important;
|
||
// }
|
||
// .datepicker-monthRange {
|
||
// margin-top: 10px
|
||
// }
|
||
// .datepicker-monthRange span,
|
||
// .datepicker-ctrl span,
|
||
// .datepicker-ctrl p,
|
||
// .datepicker-dateRange span {
|
||
// cursor: pointer;
|
||
// }
|
||
// .datepicker-monthRange span:hover,
|
||
// .datepicker-ctrl p:hover,
|
||
// .datepicker-ctrl i:hover,
|
||
// .datepicker-dateRange span:hover,
|
||
// .datepicker-dateRange-item-hover {
|
||
// background-color : #eeeeee;
|
||
// }
|
||
|
||
// .datepicker-weekRange span{
|
||
// font-weight: bold;
|
||
// }
|
||
// .datepicker-label{
|
||
// background-color: #f8f8f8;
|
||
// font-weight: 700;
|
||
// padding: 7px 0;
|
||
// text-align: center;
|
||
// }
|
||
// .datepicker-ctrl{
|
||
// position: relative;
|
||
// height: 30px;
|
||
// line-height: 30px;
|
||
// font-weight: bold;
|
||
// text-align: center;
|
||
// }
|
||
// .month-btn{
|
||
// font-weight: bold;
|
||
// -webkit-user-select:none;
|
||
// -moz-user-select:none;
|
||
// -ms-user-select:none;
|
||
// user-select:none;
|
||
// }
|
||
// .datepicker-preBtn{
|
||
// left: 2px;
|
||
// }
|
||
// .datepicker-nextBtn{
|
||
// right: 2px;
|
||
// }
|
||
// </style>
|
||
// <style>
|
||
// input.datepicker-input.with-reset-button {
|
||
// padding-right: 25px;
|
||
// }
|
||
|
||
// div.datepicker > button.close {
|
||
// position: absolute;
|
||
// top: calc(50% - 13px);
|
||
// right: 10px;
|
||
// }
|
||
|
||
// div.datepicker > button.close {
|
||
// outline: none;
|
||
// z-index: 2;
|
||
// }
|
||
|
||
// div.datepicker > button.close:focus {
|
||
// opacity: .2;
|
||
// }
|
||
// </style>
|
||
|
||
// <template>
|
||
// <div class="datepicker">
|
||
// <input class="form-control datepicker-input" :class="{'with-reset-button': showResetButton}" type="text"
|
||
// v-bind:style="{width:width}"
|
||
// @click="inputClick"
|
||
// v-model="value"/>
|
||
// <button v-if="showResetButton" type="button" class="close" @click="value = ''">
|
||
// <span>×</span>
|
||
// </button>
|
||
// <div class="datepicker-popup" v-show="displayDayView">
|
||
// <div class="datepicker-inner">
|
||
// <div class="datepicker-body">
|
||
// <div class="datepicker-ctrl">
|
||
// <span class="month-btn datepicker-preBtn" @click="preNextMonthClick(0)"><</span>
|
||
// <span class="month-btn datepicker-nextBtn" @click="preNextMonthClick(1)">></span>
|
||
// <p @click="switchMonthView">{{stringifyDayHeader(currDate)}}</p>
|
||
// </div>
|
||
// <div class="datepicker-weekRange">
|
||
// <span v-for="w in weekRange">{{w}}</span>
|
||
// </div>
|
||
// <div class="datepicker-dateRange">
|
||
// <span v-for="d in dateRange" v-bind:class="d.sclass" @click="daySelect(d.date,this)">{{d.text}}</span>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// <div class="datepicker-popup" v-show="displayMonthView">
|
||
// <div class="datepicker-inner">
|
||
// <div class="datepicker-body">
|
||
// <div class="datepicker-ctrl">
|
||
// <span class="month-btn datepicker-preBtn" @click="preNextYearClick(0)"><</span>
|
||
// <span class="month-btn datepicker-nextBtn" @click="preNextYearClick(1)">></span>
|
||
// <p @click="switchDecadeView">{{stringifyYearHeader(currDate)}}</p>
|
||
// </div>
|
||
// <div class="datepicker-monthRange">
|
||
// <template v-for="m in monthNames">
|
||
// <span v-bind:class="{'datepicker-dateRange-item-active':
|
||
// (this.monthNames[this.parse(this.value).getMonth()] === m) &&
|
||
// this.currDate.getFullYear() === this.parse(this.value).getFullYear()}"
|
||
// @click="monthSelect($index)"
|
||
// >{{m.substr(0,3)}}</span>
|
||
// </template>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// <div class="datepicker-popup" v-show="displayYearView">
|
||
// <div class="datepicker-inner">
|
||
// <div class="datepicker-body">
|
||
// <div class="datepicker-ctrl">
|
||
// <span class="month-btn datepicker-preBtn" @click="preNextDecadeClick(0)"><</span>
|
||
// <span class="month-btn datepicker-nextBtn" @click="preNextDecadeClick(1)">></span>
|
||
// <p>{{stringifyDecadeHeader(currDate)}}</p>
|
||
// </div>
|
||
// <div class="datepicker-monthRange decadeRange">
|
||
// <template v-for="decade in decadeRange">
|
||
// <span v-bind:class="{'datepicker-dateRange-item-active':
|
||
// this.parse(this.value).getFullYear() === decade.text}"
|
||
// @click.stop="yearSelect(decade.text)"
|
||
// >{{decade.text}}</span>
|
||
// </template>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 122 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"datepicker\">\n <input class=\"form-control datepicker-input\" :class=\"{'with-reset-button': showResetButton}\" type=\"text\"\n v-bind:style=\"{width:width}\"\n @click=\"inputClick\"\n v-model=\"value\"/>\n <button v-if=\"showResetButton\" type=\"button\" class=\"close\" @click=\"value = ''\">\n <span>×</span>\n </button>\n <div class=\"datepicker-popup\" v-show=\"displayDayView\">\n <div class=\"datepicker-inner\">\n <div class=\"datepicker-body\">\n <div class=\"datepicker-ctrl\">\n <span class=\"month-btn datepicker-preBtn\" @click=\"preNextMonthClick(0)\"><</span>\n <span class=\"month-btn datepicker-nextBtn\" @click=\"preNextMonthClick(1)\">></span>\n <p @click=\"switchMonthView\">{{stringifyDayHeader(currDate)}}</p>\n </div>\n <div class=\"datepicker-weekRange\">\n <span v-for=\"w in weekRange\">{{w}}</span>\n </div>\n <div class=\"datepicker-dateRange\">\n <span v-for=\"d in dateRange\" v-bind:class=\"d.sclass\" @click=\"daySelect(d.date,this)\">{{d.text}}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"datepicker-popup\" v-show=\"displayMonthView\">\n <div class=\"datepicker-inner\">\n <div class=\"datepicker-body\">\n <div class=\"datepicker-ctrl\">\n <span class=\"month-btn datepicker-preBtn\" @click=\"preNextYearClick(0)\"><</span>\n <span class=\"month-btn datepicker-nextBtn\" @click=\"preNextYearClick(1)\">></span>\n <p @click=\"switchDecadeView\">{{stringifyYearHeader(currDate)}}</p>\n </div>\n <div class=\"datepicker-monthRange\">\n <template v-for=\"m in monthNames\">\n <span v-bind:class=\"{'datepicker-dateRange-item-active':\n (this.monthNames[this.parse(this.value).getMonth()] === m) &&\n this.currDate.getFullYear() === this.parse(this.value).getFullYear()}\"\n @click=\"monthSelect($index)\"\n >{{m.substr(0,3)}}</span>\n </template>\n </div>\n </div>\n </div>\n </div>\n <div class=\"datepicker-popup\" v-show=\"displayYearView\">\n <div class=\"datepicker-inner\">\n <div class=\"datepicker-body\">\n <div class=\"datepicker-ctrl\">\n <span class=\"month-btn datepicker-preBtn\" @click=\"preNextDecadeClick(0)\"><</span>\n <span class=\"month-btn datepicker-nextBtn\" @click=\"preNextDecadeClick(1)\">></span>\n <p>{{stringifyDecadeHeader(currDate)}}</p>\n </div>\n <div class=\"datepicker-monthRange decadeRange\">\n <template v-for=\"decade in decadeRange\">\n <span v-bind:class=\"{'datepicker-dateRange-item-active':\n this.parse(this.value).getFullYear() === decade.text}\"\n @click.stop=\"yearSelect(decade.text)\"\n >{{decade.text}}</span>\n </template>\n </div>\n </div>\n </div>\n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 123 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(124)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(125)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Dropdown.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Dropdown.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Dropdown.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Dropdown.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Dropdown.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 124 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
methods: {
|
||
toggleDropdown: function toggleDropdown(e) {
|
||
e.preventDefault();
|
||
this.$el.classList.toggle('open');
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var el = this.$el;
|
||
var toggle = el.querySelector('[data-toggle="dropdown"]');
|
||
if (toggle) {
|
||
toggle.style.borderRadius = '4px';
|
||
toggle.addEventListener('click', this.toggleDropdown);
|
||
}
|
||
this._closeEvent = _EventListener2.default.listen(window, 'click', function (e) {
|
||
if (!el.contains(e.target) || e.target.nodeName.toLowerCase() == 'a') el.classList.remove('open');
|
||
});
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
if (this._closeEvent) this._closeEvent.remove();
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <div class="btn-group">
|
||
// <slot></slot>
|
||
// <slot name="dropdown-menu"></slot>
|
||
// </div>
|
||
// </template>
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 125 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"btn-group\">\n <slot></slot>\n <slot name=\"dropdown-menu\"></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 126 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(127)
|
||
module.exports = __webpack_require__(129)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(134)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Modal.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Modal.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Modal.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Modal.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Modal.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 127 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(128);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-72392c21&file=Modal.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Modal.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-72392c21&file=Modal.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Modal.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 128 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".modal {\n -webkit-transition: all 0.3s ease;\n transition: all 0.3s ease;\n}\n.modal.in {\n background-color: rgba(0,0,0,0.5);\n}\n.modal.zoom .modal-dialog {\n -webkit-transform: scale(0.1);\n transform: scale(0.1);\n top: 300px;\n opacity: 0;\n -webkit-transition: all 0.3s;\n transition: all 0.3s;\n}\n.modal.zoom.in .modal-dialog {\n -webkit-transform: scale(1);\n transform: scale(1);\n -webkit-transform: translate3d(0, -300px, 0);\n transform: translate3d(0, -300px, 0);\n opacity: 1;\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 129 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _isInteger = __webpack_require__(130);
|
||
|
||
var _isInteger2 = _interopRequireDefault(_isInteger);
|
||
|
||
var _getScrollBarWidth = __webpack_require__(108);
|
||
|
||
var _getScrollBarWidth2 = _interopRequireDefault(_getScrollBarWidth);
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
okText: {
|
||
type: String,
|
||
default: 'Save changes'
|
||
},
|
||
cancelText: {
|
||
type: String,
|
||
default: 'Close'
|
||
},
|
||
title: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
show: {
|
||
require: true,
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
twoWay: true
|
||
},
|
||
width: {
|
||
default: null
|
||
},
|
||
callback: {
|
||
type: Function,
|
||
default: function _default() {}
|
||
},
|
||
effect: {
|
||
type: String,
|
||
default: null
|
||
},
|
||
backdrop: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: true
|
||
},
|
||
large: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
small: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var _this = this;
|
||
|
||
this.$watch('show', function (val) {
|
||
var el = _this.$el;
|
||
var body = document.body;
|
||
var scrollBarWidth = (0, _getScrollBarWidth2.default)();
|
||
if (val) {
|
||
el.querySelector('.modal-content').focus();
|
||
el.style.display = 'block';
|
||
setTimeout(function () {
|
||
return el.classList.add('in');
|
||
}, 0);
|
||
body.classList.add('modal-open');
|
||
if (scrollBarWidth !== 0) {
|
||
body.style.paddingRight = scrollBarWidth + 'px';
|
||
}
|
||
if (_this.backdrop) {
|
||
_this._blurModalContentEvent = _EventListener2.default.listen(_this.$el, 'click', function (e) {
|
||
if (e.target === el) _this.show = false;
|
||
});
|
||
}
|
||
} else {
|
||
if (_this._blurModalContentEvent) _this._blurModalContentEvent.remove();
|
||
el.classList.remove('in');
|
||
setTimeout(function () {
|
||
el.style.display = 'none';
|
||
body.classList.remove('modal-open');
|
||
body.style.paddingRight = '0';
|
||
}, 300);
|
||
}
|
||
}, { immediate: true });
|
||
},
|
||
|
||
computed: {
|
||
optionalWidth: function optionalWidth() {
|
||
if (this.width === null) {
|
||
return null;
|
||
} else if ((0, _isInteger2.default)(this.width)) {
|
||
return this.width + "px";
|
||
}
|
||
return this.width;
|
||
}
|
||
},
|
||
methods: {
|
||
close: function close() {
|
||
this.show = false;
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
// <style>
|
||
// .modal {
|
||
// transition: all 0.3s ease;
|
||
// }
|
||
// .modal.in {
|
||
// background-color: rgba(0,0,0,0.5);
|
||
// }
|
||
// .modal.zoom .modal-dialog {
|
||
// -webkit-transform: scale(0.1);
|
||
// -moz-transform: scale(0.1);
|
||
// -ms-transform: scale(0.1);
|
||
// transform: scale(0.1);
|
||
// top: 300px;
|
||
// opacity: 0;
|
||
// -webkit-transition: all 0.3s;
|
||
// -moz-transition: all 0.3s;
|
||
// transition: all 0.3s;
|
||
// }
|
||
// .modal.zoom.in .modal-dialog {
|
||
// -webkit-transform: scale(1);
|
||
// -moz-transform: scale(1);
|
||
// -ms-transform: scale(1);
|
||
// transform: scale(1);
|
||
// -webkit-transform: translate3d(0, -300px, 0);
|
||
// transform: translate3d(0, -300px, 0);
|
||
// opacity: 1;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div role="dialog"
|
||
// v-bind:class="{
|
||
// 'modal':true,
|
||
// 'fade':effect === 'fade',
|
||
// 'zoom':effect === 'zoom'
|
||
// }"
|
||
// >
|
||
// <div v-bind:class="{'modal-dialog':true,'modal-lg':large,'modal-sm':small}" role="document"
|
||
// v-bind:style="{width: optionalWidth}">
|
||
// <div class="modal-content">
|
||
// <slot name="modal-header">
|
||
// <div class="modal-header">
|
||
// <button type="button" class="close" @click="close"><span>×</span></button>
|
||
// <h4 class="modal-title" >
|
||
// <slot name="title">
|
||
// {{title}}
|
||
// </slot>
|
||
// </h4>
|
||
// </div>
|
||
// </slot>
|
||
// <slot name="modal-body">
|
||
// <div class="modal-body"></div>
|
||
// </slot>
|
||
// <slot name="modal-footer">
|
||
// <div class="modal-footer">
|
||
// <button type="button" class="btn btn-default" @click="close">{{ cancelText }}</button>
|
||
// <button type="button" class="btn btn-primary" @click="callback">{{ okText }}</button>
|
||
// </div>
|
||
// </slot>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 130 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = { "default": __webpack_require__(131), __esModule: true };
|
||
|
||
/***/ },
|
||
/* 131 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(132);
|
||
module.exports = __webpack_require__(48).Number.isInteger;
|
||
|
||
/***/ },
|
||
/* 132 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 20.1.2.3 Number.isInteger(number)
|
||
var $export = __webpack_require__(46);
|
||
|
||
$export($export.S, 'Number', {isInteger: __webpack_require__(133)});
|
||
|
||
/***/ },
|
||
/* 133 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// 20.1.2.3 Number.isInteger(number)
|
||
var isObject = __webpack_require__(54)
|
||
, floor = Math.floor;
|
||
module.exports = function isInteger(it){
|
||
return !isObject(it) && isFinite(it) && floor(it) === it;
|
||
};
|
||
|
||
/***/ },
|
||
/* 134 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div role=\"dialog\"\n v-bind:class=\"{\n 'modal':true,\n 'fade':effect === 'fade',\n 'zoom':effect === 'zoom'\n }\"\n >\n <div v-bind:class=\"{'modal-dialog':true,'modal-lg':large,'modal-sm':small}\" role=\"document\"\n v-bind:style=\"{width: optionalWidth}\">\n <div class=\"modal-content\">\n <slot name=\"modal-header\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"close\" @click=\"close\"><span>×</span></button>\n <h4 class=\"modal-title\" > \n <slot name=\"title\">\n {{title}}\n </slot>\n </h4>\n </div>\n </slot>\n <slot name=\"modal-body\">\n <div class=\"modal-body\"></div>\n </slot>\n <slot name=\"modal-footer\">\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-default\" @click=\"close\">{{ cancelText }}</button>\n <button type=\"button\" class=\"btn btn-primary\" @click=\"callback\">{{ okText }}</button>\n </div>\n </slot>\n </div>\n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 135 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(136)
|
||
module.exports = __webpack_require__(138)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(139)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Option.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Option.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-7f8c06b1&file=Option.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Option.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Option.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-7f8c06b1&file=Option.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Option.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 136 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(137);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-7f8c06b1&file=Option.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Option.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-7f8c06b1&file=Option.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Option.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 137 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "a span.check-mark[_v-7f8c06b1] {\n position: absolute;\n display: inline-block;\n right: 15px;\n margin-top: 5px;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 138 */
|
||
/***/ function(module, exports) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// <template>
|
||
// <li style="position:relative">
|
||
// <a @mousedown.prevent="handleClick" style="cursor:pointer">
|
||
// <span v-el:v><slot></slot></span>
|
||
// <span class="glyphicon glyphicon-ok check-mark" v-show="chosen"></span>
|
||
// </a>
|
||
// </li>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: String
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
chosen: false
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
chosen: function chosen() {
|
||
return this.$parent.value.indexOf(this.value) !== -1;
|
||
}
|
||
},
|
||
methods: {
|
||
handleClick: function handleClick() {
|
||
var parent = this.$parent;
|
||
if (parent.multiple) {
|
||
var index = parent.value.indexOf(this.value);
|
||
index === -1 ? parent.value.push(this.value) : parent.value.splice(index, 1);
|
||
} else {
|
||
parent.value = [this.value];
|
||
parent.show = false;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style scoped>
|
||
// a span.check-mark {
|
||
// position: absolute;
|
||
// display: inline-block;
|
||
// right: 15px;
|
||
// margin-top: 5px;
|
||
// }
|
||
// </style>
|
||
|
||
/***/ },
|
||
/* 139 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<li style=\"position:relative\" _v-7f8c06b1=\"\">\n <a @mousedown.prevent=\"handleClick\" style=\"cursor:pointer\" _v-7f8c06b1=\"\">\n <span v-el:v=\"\" _v-7f8c06b1=\"\"><slot _v-7f8c06b1=\"\"></slot></span>\n <span class=\"glyphicon glyphicon-ok check-mark\" v-show=\"chosen\" _v-7f8c06b1=\"\"></span>\n </a>\n </li>";
|
||
|
||
/***/ },
|
||
/* 140 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(141)
|
||
module.exports = __webpack_require__(143)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(144)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Panel.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Panel.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Panel.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Panel.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Panel.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 141 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(142);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-cef09010&file=Panel.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Panel.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-cef09010&file=Panel.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Panel.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 142 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".accordion-toggle {\n cursor: pointer;\n}\n\n.collapse-transition {\n -webkit-transition: max-height .5s ease;\n transition: max-height .5s ease;\n overflow: hidden;\n}\n\n.collapse-enter, .collapse-leave {\n max-height: 0!important;\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 143 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
isOpen: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
header: {
|
||
type: String
|
||
}
|
||
},
|
||
methods: {
|
||
toggleIsOpen: function toggleIsOpen() {
|
||
this.isOpen = !this.isOpen;
|
||
this.$dispatch('isOpenEvent', this);
|
||
}
|
||
},
|
||
transitions: {
|
||
collapse: {
|
||
afterEnter: function afterEnter(el) {
|
||
el.style.maxHeight = "";
|
||
},
|
||
beforeLeave: function beforeLeave(el) {
|
||
el.style.maxHeight = el.offsetHeight + "px";
|
||
// Recalculate DOM before the class gets added.
|
||
return el.offsetHeight;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .accordion-toggle {
|
||
// cursor: pointer;
|
||
// }
|
||
|
||
// .collapse-transition {
|
||
// transition: max-height .5s ease;
|
||
// overflow: hidden;
|
||
// }
|
||
|
||
// .collapse-enter, .collapse-leave {
|
||
// max-height: 0!important;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div class="panel panel-default">
|
||
// <div class="panel-heading">
|
||
// <h4 class="panel-title">
|
||
// <a class="accordion-toggle"
|
||
// @click="toggleIsOpen()">
|
||
// <slot name="header">
|
||
// {{ header }}
|
||
// </slot>
|
||
// </a>
|
||
// </h4>
|
||
// </div>
|
||
// <div class="panel-collapse"
|
||
// v-el:panel
|
||
// v-show="isOpen"
|
||
// transition="collapse"
|
||
// >
|
||
// <div class="panel-body">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 144 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"panel panel-default\">\n <div class=\"panel-heading\">\n <h4 class=\"panel-title\">\n <a class=\"accordion-toggle\"\n @click=\"toggleIsOpen()\">\n <slot name=\"header\"> \n {{ header }}\n </slot>\n </a>\n </h4>\n </div>\n <div class=\"panel-collapse\"\n v-el:panel\n v-show=\"isOpen\"\n transition=\"collapse\"\n >\n <div class=\"panel-body\">\n <slot></slot>\n </div>\n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 145 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(146)
|
||
module.exports = __webpack_require__(148)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(150)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Popover.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Popover.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Popover.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Popover.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Popover.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 146 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(147);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-d15a25ce&file=Popover.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Popover.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-d15a25ce&file=Popover.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Popover.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 147 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".scale-transition,\n.fade-transition {\n display: block;\n}\n.scale-enter {\n -webkit-animation:scale-in 0.15s ease-in;\n animation:scale-in 0.15s ease-in;\n}\n.scale-leave {\n -webkit-animation:scale-out 0.15s ease-out;\n animation:scale-out 0.15s ease-out;\n}\n@-webkit-keyframes scale-in {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n -webkit-transform: scale(1);\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes scale-in {\n 0% {\n -webkit-transform: scale(0);\n transform: scale(0);\n opacity: 0;\n }\n 100% {\n -webkit-transform: scale(1);\n transform: scale(1);\n opacity: 1;\n }\n}\n@-webkit-keyframes scale-out {\n 0% {\n -webkit-transform: scale(1);\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n -webkit-transform: scale(0);\n transform: scale(0);\n opacity: 0;\n }\n}\n@keyframes scale-out {\n 0% {\n -webkit-transform: scale(1);\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n -webkit-transform: scale(0);\n transform: scale(0);\n opacity: 0;\n }\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 148 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _popoverMixins = __webpack_require__(149);
|
||
|
||
var _popoverMixins2 = _interopRequireDefault(_popoverMixins);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
mixins: [_popoverMixins2.default]
|
||
};
|
||
// </script>
|
||
// <style>
|
||
// .scale-transition,
|
||
// .fade-transition {
|
||
// display: block;
|
||
// }
|
||
// .scale-enter {
|
||
// animation:scale-in 0.15s ease-in;
|
||
// }
|
||
// .scale-leave {
|
||
// animation:scale-out 0.15s ease-out;
|
||
// }
|
||
// @keyframes scale-in {
|
||
// 0% {
|
||
// transform: scale(0);
|
||
// opacity: 0;
|
||
// }
|
||
// 100% {
|
||
// transform: scale(1);
|
||
// opacity: 1;
|
||
// }
|
||
// }
|
||
// @keyframes scale-out {
|
||
// 0% {
|
||
// transform: scale(1);
|
||
// opacity: 1;
|
||
// }
|
||
// 100% {
|
||
// transform: scale(0);
|
||
// opacity: 0;
|
||
// }
|
||
// }
|
||
|
||
// </style>
|
||
// <template>
|
||
// <span v-el:trigger>
|
||
// <slot>
|
||
// </slot>
|
||
// </span>
|
||
// <div class="popover"
|
||
// v-bind:class="{
|
||
// 'top':placement === 'top',
|
||
// 'left':placement === 'left',
|
||
// 'right':placement === 'right',
|
||
// 'bottom':placement === 'bottom'
|
||
// }"
|
||
// v-el:popover
|
||
// v-show="show"
|
||
// :transition="effect">
|
||
// <div class="arrow"></div>
|
||
// <h3 class="popover-title" v-show="title">
|
||
// <slot name="title">
|
||
// {{title}}
|
||
// </slot>
|
||
// </h3>
|
||
// <div class="popover-content">
|
||
// <slot name="content">
|
||
// {{{content}}}
|
||
// </slot>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 149 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
var PopoverMixin = {
|
||
props: {
|
||
trigger: {
|
||
type: String,
|
||
default: 'click'
|
||
},
|
||
effect: {
|
||
type: String,
|
||
default: 'fadein'
|
||
},
|
||
title: {
|
||
type: String
|
||
},
|
||
content: {
|
||
type: String
|
||
},
|
||
header: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: true
|
||
},
|
||
placement: {
|
||
type: String
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
position: {
|
||
top: 0,
|
||
left: 0
|
||
},
|
||
show: true
|
||
};
|
||
},
|
||
|
||
methods: {
|
||
toggle: function toggle() {
|
||
this.show = !this.show;
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var _this = this;
|
||
|
||
if (!this.$els.popover) return console.error("Couldn't find popover v-el in your component that uses popoverMixin.");
|
||
var popover = this.$els.popover;
|
||
var triger = this.$els.trigger.children[0];
|
||
if (this.trigger === 'hover') {
|
||
this._mouseenterEvent = _EventListener2.default.listen(triger, 'mouseenter', function () {
|
||
return _this.show = true;
|
||
});
|
||
this._mouseleaveEvent = _EventListener2.default.listen(triger, 'mouseleave', function () {
|
||
return _this.show = false;
|
||
});
|
||
} else if (this.trigger === 'focus') {
|
||
this._focusEvent = _EventListener2.default.listen(triger, 'focus', function () {
|
||
return _this.show = true;
|
||
});
|
||
this._blurEvent = _EventListener2.default.listen(triger, 'blur', function () {
|
||
return _this.show = false;
|
||
});
|
||
} else {
|
||
this._clickEvent = _EventListener2.default.listen(triger, 'click', this.toggle);
|
||
}
|
||
|
||
switch (this.placement) {
|
||
case 'top':
|
||
this.position.left = triger.offsetLeft - popover.offsetWidth / 2 + triger.offsetWidth / 2;
|
||
this.position.top = triger.offsetTop - popover.offsetHeight;
|
||
break;
|
||
case 'left':
|
||
this.position.left = triger.offsetLeft - popover.offsetWidth;
|
||
this.position.top = triger.offsetTop + triger.offsetHeight / 2 - popover.offsetHeight / 2;
|
||
break;
|
||
case 'right':
|
||
this.position.left = triger.offsetLeft + triger.offsetWidth;
|
||
this.position.top = triger.offsetTop + triger.offsetHeight / 2 - popover.offsetHeight / 2;
|
||
break;
|
||
case 'bottom':
|
||
this.position.left = triger.offsetLeft - popover.offsetWidth / 2 + triger.offsetWidth / 2;
|
||
this.position.top = triger.offsetTop + triger.offsetHeight;
|
||
break;
|
||
default:
|
||
console.log('Wrong placement prop');
|
||
}
|
||
popover.style.top = this.position.top + 'px';
|
||
popover.style.left = this.position.left + 'px';
|
||
popover.style.display = 'none';
|
||
this.show = !this.show;
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
if (this._blurEvent) {
|
||
this._blurEvent.remove();
|
||
this._focusEvent.remove();
|
||
}
|
||
if (this._mouseenterEvent) {
|
||
this._mouseenterEvent.remove();
|
||
this._mouseleaveEvent.remove();
|
||
}
|
||
if (this._clickEvent) this._clickEvent.remove();
|
||
}
|
||
};
|
||
|
||
exports.default = PopoverMixin;
|
||
|
||
/***/ },
|
||
/* 150 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<span v-el:trigger>\n <slot>\n </slot>\n </span>\n <div class=\"popover\"\n v-bind:class=\"{\n 'top':placement === 'top',\n 'left':placement === 'left',\n 'right':placement === 'right',\n 'bottom':placement === 'bottom'\n }\"\n v-el:popover\n v-show=\"show\"\n :transition=\"effect\">\n <div class=\"arrow\"></div>\n <h3 class=\"popover-title\" v-show=\"title\"> \n <slot name=\"title\">\n {{title}} \n </slot> \n </h3>\n <div class=\"popover-content\">\n <slot name=\"content\"> \n {{{content}}} \n </slot> \n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 151 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(152)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(153)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Progressbar.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Progressbar.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Progressbar.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Progressbar.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Progressbar.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 152 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
now: {
|
||
type: Number,
|
||
require: true
|
||
},
|
||
label: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
type: {
|
||
type: String
|
||
},
|
||
striped: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
animated: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <div role="progressbar"
|
||
// v-bind:class="{
|
||
// 'progress-bar' : true,
|
||
// 'progress-bar-success':type == 'success',
|
||
// 'progress-bar-warning':type == 'warning',
|
||
// 'progress-bar-info':type == 'info',
|
||
// 'progress-bar-danger':type == 'danger',
|
||
// 'progress-bar-striped':striped,
|
||
// 'active':animated
|
||
// }"
|
||
// v-bind:style="{width: now + '%'}">
|
||
// {{label ? now + '%':'' }}
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 153 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div role=\"progressbar\"\n v-bind:class=\"{\n 'progress-bar' : true,\n 'progress-bar-success':type == 'success',\n 'progress-bar-warning':type == 'warning',\n 'progress-bar-info':type == 'info',\n 'progress-bar-danger':type == 'danger',\n 'progress-bar-striped':striped,\n 'active':animated\n }\"\n v-bind:style=\"{width: now + '%'}\">\n {{label ? now + '%':'' }}\n </div>";
|
||
|
||
/***/ },
|
||
/* 154 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(155)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(156)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioBtn.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioBtn.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./radioBtn.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioBtn.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./radioBtn.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 155 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: String
|
||
},
|
||
checked: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
computed: {
|
||
type: function type() {
|
||
return this.$parent.type;
|
||
},
|
||
active: function active() {
|
||
return this.$parent.value === this.value;
|
||
}
|
||
},
|
||
methods: {
|
||
handleClick: function handleClick() {
|
||
this.$parent.value = this.value;
|
||
}
|
||
},
|
||
created: function created() {
|
||
if (this.$parent.value === this.value) {
|
||
this.checked = true;
|
||
} else if (!this.$parent.value.length && this.checked) {
|
||
this.$parent.value = this.value;
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <label class="btn"
|
||
// v-bind:class="{
|
||
// 'active':active,
|
||
// 'btn-success':type == 'success',
|
||
// 'btn-warning':type == 'warning',
|
||
// 'btn-info':type == 'info',
|
||
// 'btn-danger':type == 'danger',
|
||
// 'btn-default':type == 'default',
|
||
// 'btn-primary':type == 'primary'
|
||
// }">
|
||
|
||
// <input type="radio" autocomplete="off"
|
||
// :checked="checked"
|
||
// @click="handleClick"
|
||
// />
|
||
|
||
// <slot></slot>
|
||
|
||
// </label>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 156 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<label class=\"btn\"\n v-bind:class=\"{\n 'active':active,\n 'btn-success':type == 'success',\n 'btn-warning':type == 'warning',\n 'btn-info':type == 'info',\n 'btn-danger':type == 'danger',\n 'btn-default':type == 'default',\n 'btn-primary':type == 'primary'\n }\">\n\n <input type=\"radio\" autocomplete=\"off\"\n :checked=\"checked\"\n @click=\"handleClick\"\n />\n\n <slot></slot>\n\n </label>";
|
||
|
||
/***/ },
|
||
/* 157 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(158)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(159)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioGroup.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioGroup.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./radioGroup.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./radioGroup.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./radioGroup.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 158 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// <template>
|
||
// <div class="btn-group" data-toggle="buttons">
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
props: {
|
||
value: {
|
||
type: String,
|
||
twoWay: true
|
||
},
|
||
type: {
|
||
type: String,
|
||
default: 'default'
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
/***/ },
|
||
/* 159 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"btn-group\" data-toggle=\"buttons\">\n <slot></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 160 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(161)
|
||
module.exports = __webpack_require__(163)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(171)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Select.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Select.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-6a0dd090&file=Select.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Select.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Select.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-6a0dd090&file=Select.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Select.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 161 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(162);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-6a0dd090&file=Select.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Select.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-6a0dd090&file=Select.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Select.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 162 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".bs-searchbox[_v-6a0dd090] {\n padding: 4px 8px;\n }\n .btn-group .dropdown-menu .notify[_v-6a0dd090] {\n position: absolute;\n bottom: 5px;\n width: 96%;\n margin: 0 2%;\n min-height: 26px;\n padding: 3px 5px;\n background: #f5f5f5;\n border: 1px solid #e3e3e3;\n box-shadow: inset 0 1px 1px rgba(0,0,0,.05);\n pointer-events: none;\n opacity: .9;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 163 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _getIterator2 = __webpack_require__(164);
|
||
|
||
var _getIterator3 = _interopRequireDefault(_getIterator2);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
options: {
|
||
type: Array,
|
||
default: function _default() {
|
||
return [];
|
||
}
|
||
},
|
||
value: {
|
||
twoWay: true
|
||
},
|
||
placeholder: {
|
||
type: String,
|
||
default: 'Nothing Selected'
|
||
},
|
||
multiple: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
search: { // Allow searching (only works when options are provided)
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
limit: {
|
||
type: Number,
|
||
default: 1024
|
||
},
|
||
closeOnSelect: { // only works when multiple==false
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
disabled: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
if (this.value.constructor !== Array) {
|
||
if (this.value.length === 0) {
|
||
this.value = [];
|
||
} else {
|
||
this.value = [this.value];
|
||
}
|
||
} else {
|
||
if (!this.multiple && this.value.length > 1) {
|
||
this.value = this.value.slice(0, 1);
|
||
} else if (this.multiple && this.value.length > this.limit) {
|
||
this.value = this.value.slice(0, this.limit);
|
||
}
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
searchText: null,
|
||
show: false,
|
||
showNotify: false
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
selectedItems: function selectedItems() {
|
||
var foundItems = [];
|
||
if (this.value.length) {
|
||
var _iteratorNormalCompletion = true;
|
||
var _didIteratorError = false;
|
||
var _iteratorError = undefined;
|
||
|
||
try {
|
||
for (var _iterator = (0, _getIterator3.default)(this.value), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
||
var item = _step.value;
|
||
|
||
if (this.options.length === 0) {
|
||
//
|
||
foundItems = this.value;
|
||
} else {
|
||
if (typeof item === "string") {
|
||
var option = undefined;
|
||
this.options.some(function (o) {
|
||
if (o.value === item) {
|
||
option = o;
|
||
return true;
|
||
}
|
||
});
|
||
option && foundItems.push(option.label);
|
||
}
|
||
}
|
||
}
|
||
} catch (err) {
|
||
_didIteratorError = true;
|
||
_iteratorError = err;
|
||
} finally {
|
||
try {
|
||
if (!_iteratorNormalCompletion && _iterator.return) {
|
||
_iterator.return();
|
||
}
|
||
} finally {
|
||
if (_didIteratorError) {
|
||
throw _iteratorError;
|
||
}
|
||
}
|
||
}
|
||
|
||
return foundItems.join(', ');
|
||
}
|
||
},
|
||
showPlaceholder: function showPlaceholder() {
|
||
return this.value.length === 0;
|
||
}
|
||
},
|
||
watch: {
|
||
value: function value(val) {
|
||
var _this = this;
|
||
|
||
if (val.length > this.limit) {
|
||
this.showNotify = true;
|
||
this.value.pop();
|
||
setTimeout(function () {
|
||
return _this.showNotify = false;
|
||
}, 1000);
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
select: function select(v) {
|
||
if (this.value.indexOf(v) === -1) {
|
||
if (this.multiple) {
|
||
this.value.push(v);
|
||
} else {
|
||
this.value = [v];
|
||
}
|
||
} else {
|
||
if (this.multiple) {
|
||
this.value.$remove(v);
|
||
}
|
||
}
|
||
if (this.closeOnSelect) {
|
||
this.toggleDropdown();
|
||
}
|
||
},
|
||
isSelected: function isSelected(v) {
|
||
if (this.value.constructor !== Array) {
|
||
return this.value == v;
|
||
} else {
|
||
return this.value.indexOf(v) !== -1;
|
||
}
|
||
},
|
||
toggleDropdown: function toggleDropdown() {
|
||
this.show = !this.show;
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style scoped>
|
||
// .bs-searchbox {
|
||
// padding: 4px 8px;
|
||
// }
|
||
// .btn-group .dropdown-menu .notify {
|
||
// position: absolute;
|
||
// bottom: 5px;
|
||
// width: 96%;
|
||
// margin: 0 2%;
|
||
// min-height: 26px;
|
||
// padding: 3px 5px;
|
||
// background: #f5f5f5;
|
||
// border: 1px solid #e3e3e3;
|
||
// box-shadow: inset 0 1px 1px rgba(0,0,0,.05);
|
||
// pointer-events: none;
|
||
// opacity: .9;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div class="btn-group" v-bind:class="{open: show}">
|
||
// <button v-el:btn type="button" class="btn btn-default dropdown-toggle"
|
||
// @click="toggleDropdown"
|
||
// @blur="show = (search ? show : false)"
|
||
// v-bind="{disabled: disabled}"
|
||
// >
|
||
// <span class="btn-placeholder" v-show="showPlaceholder">{{placeholder}}</span>
|
||
// <span class="btn-content">{{ selectedItems }}</span>
|
||
// <span class="caret"></span>
|
||
// </button>
|
||
// <ul class="dropdown-menu">
|
||
// <template v-if="options.length">
|
||
// <li v-if="search" class="bs-searchbox">
|
||
// <input type="text" placeholder="Search" v-model="searchText" class="form-control" autocomplete="off">
|
||
// </li>
|
||
// <li v-for="option in options | filterBy searchText " v-bind:id="option.value" style="position:relative">
|
||
// <a @mousedown.prevent="select(option.value)" style="cursor:pointer">
|
||
// {{ option.label }}
|
||
// <span class="glyphicon glyphicon-ok check-mark" v-show="isSelected(option.value)"></span>
|
||
// </a>
|
||
// </li>
|
||
// </template>
|
||
// <slot v-else></slot>
|
||
// <div class="notify" v-show="showNotify" transition="fadein">Limit reached ({{limit}} items max).
|
||
// </div>
|
||
// </ul>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 164 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = { "default": __webpack_require__(165), __esModule: true };
|
||
|
||
/***/ },
|
||
/* 165 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(166);
|
||
__webpack_require__(40);
|
||
module.exports = __webpack_require__(170);
|
||
|
||
/***/ },
|
||
/* 166 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(167);
|
||
var global = __webpack_require__(47)
|
||
, hide = __webpack_require__(51)
|
||
, Iterators = __webpack_require__(63)
|
||
, TO_STRING_TAG = __webpack_require__(81)('toStringTag');
|
||
|
||
for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
|
||
var NAME = collections[i]
|
||
, Collection = global[NAME]
|
||
, proto = Collection && Collection.prototype;
|
||
if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);
|
||
Iterators[NAME] = Iterators.Array;
|
||
}
|
||
|
||
/***/ },
|
||
/* 167 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
var addToUnscopables = __webpack_require__(168)
|
||
, step = __webpack_require__(169)
|
||
, Iterators = __webpack_require__(63)
|
||
, toIObject = __webpack_require__(69);
|
||
|
||
// 22.1.3.4 Array.prototype.entries()
|
||
// 22.1.3.13 Array.prototype.keys()
|
||
// 22.1.3.29 Array.prototype.values()
|
||
// 22.1.3.30 Array.prototype[@@iterator]()
|
||
module.exports = __webpack_require__(44)(Array, 'Array', function(iterated, kind){
|
||
this._t = toIObject(iterated); // target
|
||
this._i = 0; // next index
|
||
this._k = kind; // kind
|
||
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
|
||
}, function(){
|
||
var O = this._t
|
||
, kind = this._k
|
||
, index = this._i++;
|
||
if(!O || index >= O.length){
|
||
this._t = undefined;
|
||
return step(1);
|
||
}
|
||
if(kind == 'keys' )return step(0, index);
|
||
if(kind == 'values')return step(0, O[index]);
|
||
return step(0, [index, O[index]]);
|
||
}, 'values');
|
||
|
||
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
|
||
Iterators.Arguments = Iterators.Array;
|
||
|
||
addToUnscopables('keys');
|
||
addToUnscopables('values');
|
||
addToUnscopables('entries');
|
||
|
||
/***/ },
|
||
/* 168 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(){ /* empty */ };
|
||
|
||
/***/ },
|
||
/* 169 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(done, value){
|
||
return {value: value, done: !!done};
|
||
};
|
||
|
||
/***/ },
|
||
/* 170 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var anObject = __webpack_require__(53)
|
||
, get = __webpack_require__(88);
|
||
module.exports = __webpack_require__(48).getIterator = function(it){
|
||
var iterFn = get(it);
|
||
if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
|
||
return anObject(iterFn.call(it));
|
||
};
|
||
|
||
/***/ },
|
||
/* 171 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"btn-group\" v-bind:class=\"{open: show}\" _v-6a0dd090=\"\">\n <button v-el:btn=\"\" type=\"button\" class=\"btn btn-default dropdown-toggle\" @click=\"toggleDropdown\" @blur=\"show = (search ? show : false)\" v-bind=\"{disabled: disabled}\" _v-6a0dd090=\"\">\n <span class=\"btn-placeholder\" v-show=\"showPlaceholder\" _v-6a0dd090=\"\">{{placeholder}}</span>\n <span class=\"btn-content\" _v-6a0dd090=\"\">{{ selectedItems }}</span>\n <span class=\"caret\" _v-6a0dd090=\"\"></span>\n </button>\n <ul class=\"dropdown-menu\" _v-6a0dd090=\"\">\n <template v-if=\"options.length\" _v-6a0dd090=\"\">\n <li v-if=\"search\" class=\"bs-searchbox\" _v-6a0dd090=\"\">\n <input type=\"text\" placeholder=\"Search\" v-model=\"searchText\" class=\"form-control\" autocomplete=\"off\" _v-6a0dd090=\"\">\n </li>\n <li v-for=\"option in options | filterBy searchText \" v-bind:id=\"option.value\" style=\"position:relative\" _v-6a0dd090=\"\">\n <a @mousedown.prevent=\"select(option.value)\" style=\"cursor:pointer\" _v-6a0dd090=\"\">\n {{ option.label }}\n <span class=\"glyphicon glyphicon-ok check-mark\" v-show=\"isSelected(option.value)\" _v-6a0dd090=\"\"></span>\n </a>\n </li>\n </template>\n <slot v-else=\"\" _v-6a0dd090=\"\"></slot>\n <div class=\"notify\" v-show=\"showNotify\" transition=\"fadein\" _v-6a0dd090=\"\">Limit reached ({{limit}} items max).\n </div>\n </ul>\n </div>";
|
||
|
||
/***/ },
|
||
/* 172 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(173)
|
||
module.exports = __webpack_require__(175)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(176)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tab.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tab.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-0c89e409&file=Tab.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tab.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tab.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-0c89e409&file=Tab.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tab.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 173 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(174);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-0c89e409&file=Tab.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tab.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-0c89e409&file=Tab.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tab.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 174 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".tab-content > .tab-pane[_v-0c89e409] {\n display: block;\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 175 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
header: {
|
||
type: String
|
||
},
|
||
disabled: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
index: 0,
|
||
show: false
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
show: function show() {
|
||
return this.$parent.active == this.index;
|
||
},
|
||
transition: function transition() {
|
||
return this.$parent.effect;
|
||
}
|
||
},
|
||
created: function created() {
|
||
this.$parent.renderData.push({
|
||
header: this.header,
|
||
disabled: this.disabled
|
||
});
|
||
},
|
||
ready: function ready() {
|
||
for (var c in this.$parent.$children) {
|
||
if (this.$parent.$children[c].$el == this.$el) {
|
||
this.index = c;
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
this.$parent.renderData.splice(this.index, 1);
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style scoped>
|
||
// .tab-content > .tab-pane {
|
||
// display: block;
|
||
// }
|
||
// </style>
|
||
// <template>
|
||
// <div role="tabpanel" class="tab-pane"
|
||
// v-bind:class="{hide:!show}"
|
||
// v-show="show"
|
||
// :transition="transition"
|
||
// >
|
||
// <slot></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 176 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div role=\"tabpanel\" class=\"tab-pane\" v-bind:class=\"{hide:!show}\" v-show=\"show\" :transition=\"transition\" _v-0c89e409=\"\">\n <slot _v-0c89e409=\"\"></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 177 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(178)
|
||
module.exports = __webpack_require__(180)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(181)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tabset.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tabset.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-4765fae9&file=Tabset.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tabset.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tabset.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/template-rewriter.js?id=_v-4765fae9&file=Tabset.vue!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tabset.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 178 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(179);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-4765fae9&file=Tabset.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tabset.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-4765fae9&file=Tabset.vue&scoped=true!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tabset.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 179 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".nav-tabs[_v-4765fae9] {\n margin-bottom: 15px\n }", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 180 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
// <template>
|
||
// <div>
|
||
// <!-- Nav tabs -->
|
||
// <ul class="nav nav-{{navStyle}}" role="tablist">
|
||
// <li
|
||
// v-for="r in renderData"
|
||
// v-bind:class="{
|
||
// 'active': ($index === active),
|
||
// 'disabled': r.disabled
|
||
// }"
|
||
// @click.prevent="handleTabListClick($index, r)"
|
||
// :disabled="r.disabled"
|
||
// >
|
||
// <a href="#">
|
||
// <slot name="header">
|
||
// {{{r.header}}}
|
||
// </slot>
|
||
// </a>
|
||
// </li>
|
||
// </ul>
|
||
|
||
// <!-- Tab panes -->
|
||
// <div class="tab-content" v-el:tab-content>
|
||
// <slot></slot>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
exports.default = {
|
||
props: {
|
||
navStyle: {
|
||
type: String,
|
||
default: 'tabs'
|
||
},
|
||
effect: {
|
||
type: String,
|
||
default: 'fadein'
|
||
},
|
||
active: {
|
||
type: Number,
|
||
default: 0
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
renderData: []
|
||
};
|
||
},
|
||
|
||
methods: {
|
||
handleTabListClick: function handleTabListClick(index, el) {
|
||
if (!el.disabled) this.active = index;
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style scoped>
|
||
// .nav-tabs {
|
||
// margin-bottom: 15px
|
||
// }
|
||
// </style>
|
||
|
||
/***/ },
|
||
/* 181 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div _v-4765fae9=\"\">\n <!-- Nav tabs -->\n <ul class=\"nav nav-{{navStyle}}\" role=\"tablist\" _v-4765fae9=\"\">\n <li v-for=\"r in renderData\" v-bind:class=\"{\n 'active': ($index === active),\n 'disabled': r.disabled\n }\" @click.prevent=\"handleTabListClick($index, r)\" :disabled=\"r.disabled\" _v-4765fae9=\"\">\n <a href=\"#\" _v-4765fae9=\"\"> \n <slot name=\"header\" _v-4765fae9=\"\"> \n {{{r.header}}}\n </slot> \n </a>\n </li>\n </ul>\n\n <!-- Tab panes -->\n <div class=\"tab-content\" v-el:tab-content=\"\" _v-4765fae9=\"\">\n <slot _v-4765fae9=\"\"></slot>\n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 182 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(183)
|
||
module.exports = __webpack_require__(185)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(186)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tooltip.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tooltip.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tooltip.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Tooltip.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Tooltip.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 183 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(184);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-882f0112&file=Tooltip.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tooltip.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-882f0112&file=Tooltip.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Tooltip.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 184 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".tooltip {\n opacity: .9\n }\n.fadein-enter {\n -webkit-animation:fadein-in 0.3s ease-in;\n animation:fadein-in 0.3s ease-in;\n}\n.fadein-leave {\n -webkit-animation:fadein-out 0.3s ease-out;\n animation:fadein-out 0.3s ease-out;\n}\n@-webkit-keyframes fadein-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes fadein-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@-webkit-keyframes fadein-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes fadein-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 185 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _popoverMixins = __webpack_require__(149);
|
||
|
||
var _popoverMixins2 = _interopRequireDefault(_popoverMixins);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
mixins: [_popoverMixins2.default],
|
||
props: {
|
||
trigger: {
|
||
type: String,
|
||
default: 'hover'
|
||
},
|
||
effect: {
|
||
type: String,
|
||
default: 'scale'
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
// <style>
|
||
// .tooltip {
|
||
// opacity: .9
|
||
// }
|
||
// .fadein-enter {
|
||
// animation:fadein-in 0.3s ease-in;
|
||
// }
|
||
// .fadein-leave {
|
||
// animation:fadein-out 0.3s ease-out;
|
||
// }
|
||
// @keyframes fadein-in {
|
||
// 0% {
|
||
// opacity: 0;
|
||
// }
|
||
// 100% {
|
||
// opacity: 1;
|
||
// }
|
||
// }
|
||
// @keyframes fadein-out {
|
||
// 0% {
|
||
// opacity: 1;
|
||
// }
|
||
// 100% {
|
||
// opacity: 0;
|
||
// }
|
||
// }
|
||
|
||
// </style>
|
||
// <template>
|
||
// <span v-el:trigger>
|
||
// <slot>
|
||
// </slot>
|
||
// </span>
|
||
// <div class="tooltip"
|
||
// v-bind:class="{
|
||
// 'top': placement === 'top',
|
||
// 'left': placement === 'left',
|
||
// 'right': placement === 'right',
|
||
// 'bottom': placement === 'bottom'
|
||
// }"
|
||
// v-el:popover
|
||
// v-show="show"
|
||
// :transition="effect"
|
||
// role="tooltip">
|
||
// <div class="tooltip-arrow"></div>
|
||
// <div class="tooltip-inner">
|
||
// <slot name="content">
|
||
// {{{content}}}
|
||
// </slot>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 186 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<span v-el:trigger>\n <slot>\n </slot>\n </span>\n <div class=\"tooltip\"\n v-bind:class=\"{\n 'top': placement === 'top',\n 'left': placement === 'left',\n 'right': placement === 'right',\n 'bottom': placement === 'bottom'\n }\"\n v-el:popover\n v-show=\"show\"\n :transition=\"effect\"\n role=\"tooltip\">\n <div class=\"tooltip-arrow\"></div>\n <div class=\"tooltip-inner\">\n <slot name=\"content\">\n {{{content}}}\n </slot> \n </div>\n </div>";
|
||
|
||
/***/ },
|
||
/* 187 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
__webpack_require__(188)
|
||
module.exports = __webpack_require__(190)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(192)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Typeahead.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Typeahead.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Typeahead.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Typeahead.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Typeahead.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 188 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(189);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-3ea9213b&file=Typeahead.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Typeahead.vue", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/vue-loader/lib/style-rewriter.js?id=_v-3ea9213b&file=Typeahead.vue!./../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Typeahead.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 189 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, ".dropdown-menu > li > a {\n cursor: pointer;\n}", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 190 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _callAjax = __webpack_require__(191);
|
||
|
||
var _callAjax2 = _interopRequireDefault(_callAjax);
|
||
|
||
var _coerceBoolean = __webpack_require__(31);
|
||
|
||
var _coerceBoolean2 = _interopRequireDefault(_coerceBoolean);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
// <template>
|
||
// <div style="position: relative"
|
||
// v-bind:class="{'open':showDropdown}"
|
||
// >
|
||
// <input type="text" class="form-control"
|
||
// :placeholder="placeholder"
|
||
// autocomplete="off"
|
||
// v-model="query"
|
||
// @input="update"
|
||
// @keydown.up="up"
|
||
// @keydown.down="down"
|
||
// @keydown.enter= "hit"
|
||
// @keydown.esc="reset"
|
||
// @blur="showDropdown = false"
|
||
// />
|
||
// <ul class="dropdown-menu" v-el:dropdown>
|
||
// <li v-for="item in items" v-bind:class="{'active': isActive($index)}">
|
||
// <a @mousedown.prevent="hit" @mousemove="setActive($index)">
|
||
// <partial :name="templateName"></partial>
|
||
// </a>
|
||
// </li>
|
||
// </ul>
|
||
// </div>
|
||
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
var typeahead = {
|
||
created: function created() {
|
||
this.items = this.primitiveData;
|
||
},
|
||
|
||
partials: {
|
||
'default': '<span v-html="item | highlight query"></span>'
|
||
},
|
||
props: {
|
||
data: {
|
||
type: Array
|
||
},
|
||
limit: {
|
||
type: Number,
|
||
default: 8
|
||
},
|
||
async: {
|
||
type: String
|
||
},
|
||
template: {
|
||
type: String
|
||
},
|
||
templateName: {
|
||
type: String,
|
||
default: 'default'
|
||
},
|
||
key: {
|
||
type: String,
|
||
default: null
|
||
},
|
||
matchCase: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
matchStart: {
|
||
type: Boolean,
|
||
coerce: _coerceBoolean2.default,
|
||
default: false
|
||
},
|
||
onHit: {
|
||
type: Function,
|
||
default: function _default(items) {
|
||
this.reset();
|
||
this.query = items;
|
||
}
|
||
},
|
||
placeholder: {
|
||
type: String
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
query: '',
|
||
showDropdown: false,
|
||
noResults: true,
|
||
current: 0,
|
||
items: []
|
||
};
|
||
},
|
||
|
||
computed: {
|
||
primitiveData: function primitiveData() {
|
||
var _this = this;
|
||
|
||
if (this.data) {
|
||
return this.data.filter(function (value) {
|
||
value = _this.matchCase ? value : value.toLowerCase();
|
||
var query = _this.matchCase ? _this.query : _this.query.toLowerCase();
|
||
return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;
|
||
}).slice(0, this.limit);
|
||
}
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
// register a partial:
|
||
if (this.templateName && this.templateName !== 'default') {
|
||
Vue.partial(this.templateName, this.template);
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
update: function update() {
|
||
var _this2 = this;
|
||
|
||
if (!this.query) {
|
||
this.reset();
|
||
return false;
|
||
}
|
||
if (this.data) {
|
||
this.items = this.primitiveData;
|
||
this.showDropdown = this.items.length ? true : false;
|
||
}
|
||
if (this.async) {
|
||
(0, _callAjax2.default)(this.async + this.query, function (data) {
|
||
_this2.items = (_this2.key ? data[_this2.key] : data).slice(0, _this2.limit);
|
||
_this2.showDropdown = _this2.items.length ? true : false;
|
||
});
|
||
}
|
||
},
|
||
reset: function reset() {
|
||
this.items = [];
|
||
this.query = '';
|
||
this.loading = false;
|
||
this.showDropdown = false;
|
||
},
|
||
setActive: function setActive(index) {
|
||
this.current = index;
|
||
},
|
||
isActive: function isActive(index) {
|
||
return this.current === index;
|
||
},
|
||
hit: function hit(e) {
|
||
e.preventDefault();
|
||
this.onHit(this.items[this.current], this);
|
||
},
|
||
up: function up() {
|
||
if (this.current > 0) this.current--;
|
||
},
|
||
down: function down() {
|
||
if (this.current < this.items.length - 1) this.current++;
|
||
}
|
||
},
|
||
filters: {
|
||
highlight: function highlight(value, phrase) {
|
||
return value.replace(new RegExp('(' + phrase + ')', 'gi'), '<strong>$1</strong>');
|
||
}
|
||
}
|
||
};
|
||
exports.default = typeahead;
|
||
// </script>
|
||
|
||
// <style>
|
||
// .dropdown-menu > li > a {
|
||
// cursor: pointer;
|
||
// }
|
||
// </style>
|
||
|
||
/***/ },
|
||
/* 191 */
|
||
/***/ function(module, exports) {
|
||
|
||
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
exports.default = function (url, callback) {
|
||
var httpRequest = new XMLHttpRequest();
|
||
httpRequest.onreadystatechange = function () {
|
||
if (httpRequest.readyState === 4) {
|
||
if (httpRequest.status === 200) {
|
||
var data = JSON.parse(httpRequest.responseText);
|
||
if (callback) callback(data);
|
||
}
|
||
}
|
||
};
|
||
httpRequest.open('GET', url);
|
||
httpRequest.setRequestHeader("Accept", "application/json");
|
||
httpRequest.send();
|
||
};
|
||
|
||
/***/ },
|
||
/* 192 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div style=\"position: relative\"\n v-bind:class=\"{'open':showDropdown}\"\n >\n <input type=\"text\" class=\"form-control\"\n :placeholder=\"placeholder\"\n autocomplete=\"off\"\n v-model=\"query\"\n @input=\"update\"\n @keydown.up=\"up\"\n @keydown.down=\"down\"\n @keydown.enter= \"hit\"\n @keydown.esc=\"reset\"\n @blur=\"showDropdown = false\"\n />\n <ul class=\"dropdown-menu\" v-el:dropdown>\n <li v-for=\"item in items\" v-bind:class=\"{'active': isActive($index)}\">\n <a @mousedown.prevent=\"hit\" @mousemove=\"setActive($index)\">\n <partial :name=\"templateName\"></partial>\n </a>\n </li>\n </ul>\n</div>";
|
||
|
||
/***/ },
|
||
/* 193 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(194)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(195)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Navbar.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Navbar.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Navbar.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Navbar.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Navbar.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 194 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _EventListener = __webpack_require__(91);
|
||
|
||
var _EventListener2 = _interopRequireDefault(_EventListener);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
methods: {
|
||
toggleCollapse: function toggleCollapse(e) {
|
||
e.preventDefault();
|
||
|
||
// collapse data-target
|
||
var tmp = this.$el.querySelector('[data-target]');
|
||
var id = tmp.getAttribute('data-target');
|
||
var o = document.getElementById(id.substring(1));
|
||
o.classList.toggle('collapse');
|
||
}
|
||
},
|
||
ready: function ready() {
|
||
var _this = this;
|
||
|
||
var toggle = this.$el.querySelector('[data-toggle="collapse"]');
|
||
if (toggle) {
|
||
toggle.style.borderRadius = '4px';
|
||
toggle.addEventListener('click', this.toggleCollapse);
|
||
}
|
||
this._closeEvent = _EventListener2.default.listen(window, 'click', function (e) {
|
||
if (!_this.$el.contains(e.target)) {
|
||
_this.$el.classList.remove('open');
|
||
}
|
||
});
|
||
},
|
||
beforeDestroy: function beforeDestroy() {
|
||
if (this._closeEvent) {
|
||
this._closeEvent.remove();
|
||
}
|
||
}
|
||
};
|
||
// </script>
|
||
// <template>
|
||
// <div class="container-fluid">
|
||
// <div class="navbar-header">
|
||
// <slot></slot>
|
||
// </div>
|
||
// <slot name="dropdown-menu"></slot>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
|
||
/***/ },
|
||
/* 195 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"container-fluid\">\n <div class=\"navbar-header\">\n <slot></slot>\n </div>\n <slot name=\"dropdown-menu\"></slot>\n </div>";
|
||
|
||
/***/ },
|
||
/* 196 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = __webpack_require__(197)
|
||
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
;(typeof module.exports === "function" ? module.exports.options : module.exports).template = __webpack_require__(200)
|
||
if (false) {
|
||
(function () {
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"))
|
||
if (!hotAPI.compatible) return
|
||
var id = "-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Spinner.vue"
|
||
hotAPI.createRecord(id, module.exports)
|
||
module.hot.accept(["-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Spinner.vue","-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Spinner.vue"], function () {
|
||
var newOptions = require("-!babel!./../node_modules/vue-loader/lib/selector.js?type=script&index=0!./Spinner.vue")
|
||
if (newOptions && newOptions.__esModule) newOptions = newOptions.default
|
||
var newTemplate = require("-!vue-html-loader!./../node_modules/vue-loader/lib/selector.js?type=template&index=0!./Spinner.vue")
|
||
hotAPI.update(id, newOptions, newTemplate)
|
||
})
|
||
})()
|
||
}
|
||
|
||
/***/ },
|
||
/* 197 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
__webpack_require__(198);
|
||
|
||
var MIN_WAIT = 500; // in ms
|
||
|
||
// <template>
|
||
// <div class="spinner spinner-gritcode {{spinnerSize}} {{fixed ? 'spinner-fixed' : ''}}" v-show="active">
|
||
// <div class="spinner-wrapper">
|
||
// <div class="spinner-circle"></div>
|
||
// <div class="spinner-text">{{text}}</div>
|
||
// </div>
|
||
// </div>
|
||
// </template>
|
||
|
||
// <script>
|
||
// import styling
|
||
exports.default = {
|
||
data: function data() {
|
||
return {
|
||
active: false
|
||
};
|
||
},
|
||
|
||
props: {
|
||
size: {
|
||
type: String,
|
||
default: 'md'
|
||
},
|
||
text: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
fixed: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
computed: {
|
||
spinnerSize: function spinnerSize() {
|
||
return this.size ? 'spinner-' + this.size : 'spinner-sm';
|
||
}
|
||
},
|
||
methods: {
|
||
getMinWait: function getMinWait(delay) {
|
||
delay = delay || 0;
|
||
return new Date().getTime() - this._started.getTime() < MIN_WAIT ? MIN_WAIT - parseInt(new Date().getTime() - this._started.getTime(), 10) + delay : 0 + delay;
|
||
},
|
||
show: function show(options) {
|
||
if (options && options.text) {
|
||
this.text = options.text;
|
||
}
|
||
if (options && options.size) {
|
||
this.size = options.size;
|
||
}
|
||
if (options && options.fixed) {
|
||
this.fixed = options.fixed;
|
||
}
|
||
|
||
// block scrolling when spinner is on
|
||
this._body.style.overflowY = 'hidden';
|
||
|
||
// activate spinner
|
||
this._started = new Date();
|
||
this.active = true;
|
||
this.$root.$broadcast('shown::spinner');
|
||
},
|
||
hide: function hide() {
|
||
var _this = this;
|
||
|
||
var delay = 0;
|
||
this._spinnerAnimation = setTimeout(function () {
|
||
_this.active = false;
|
||
_this._body.style.overflowY = _this._bodyOverflow;
|
||
_this.$root.$broadcast('hidden::spinner');
|
||
}, this.getMinWait(delay));
|
||
}
|
||
},
|
||
events: {
|
||
'show::spinner': function showSpinner(options) {
|
||
this.show(options);
|
||
},
|
||
'hide::spinner': function hideSpinner() {
|
||
this.hide();
|
||
},
|
||
'start::ajax': function startAjax(options) {
|
||
this.show(options);
|
||
},
|
||
'end::ajax': function endAjax() {
|
||
this.hide();
|
||
}
|
||
},
|
||
destroyed: function destroyed() {
|
||
clearTimeout(this._spinnerAnimation);
|
||
this._body.style.overflowY = this._bodyOverflow;
|
||
},
|
||
ready: function ready() {
|
||
this._body = document.querySelector('body');
|
||
this._bodyOverflow = this._body.style.overflowY || '';
|
||
}
|
||
};
|
||
// </script>
|
||
|
||
/***/ },
|
||
/* 198 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(199);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(29)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../node_modules/css-loader/index.js!./../node_modules/sass-loader/index.js!./spinner.scss", function() {
|
||
var newContent = require("!!./../node_modules/css-loader/index.js!./../node_modules/sass-loader/index.js!./spinner.scss");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 199 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(28)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "/*!\n *\n * Spinner\n * With fallback to IE9\n *\n */\n@keyframes spin {\n 100% {\n transform: rotate(360deg); } }\n\n.spinner-gritcode {\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n z-index: 9998;\n position: absolute;\n width: 100%;\n text-align: center;\n background: rgba(255, 255, 255, 0.9); }\n .spinner-gritcode.spinner-fixed {\n position: fixed; }\n .spinner-gritcode .spinner-wrapper {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n -ms-transform: translate(-50%, -50%); }\n .spinner-gritcode .spinner-circle {\n position: relative;\n border: 4px solid #ccc;\n border-right-color: #337ab7;\n border-radius: 50%;\n display: inline-block;\n animation: spin 0.6s linear;\n animation-iteration-count: infinite;\n width: 3em;\n height: 3em;\n z-index: 2; }\n .spinner-gritcode .spinner-text {\n position: relative;\n text-align: center;\n margin-top: 0.5em;\n z-index: 2;\n width: 100%;\n font-size: 95%;\n color: #337ab7; }\n\n.spinner-gritcode.spinner-sm .spinner-circle {\n width: 1.5em;\n height: 1.5em; }\n\n.spinner-gritcode.spinner-md .spinner-circle {\n width: 2em;\n height: 2em; }\n\n.spinner-gritcode.spinner-lg .spinner-circle {\n width: 2.5em;\n height: 2.5em; }\n\n.spinner-gritcode.spinner-xl .spinner-circle {\n width: 3.5em;\n height: 3.5em; }\n\n.lt-ie10 .spinner-gritcode .spinner-circle, .ie9 .spinner-gritcode .spinner-circle, .oldie .spinner-gritcode .spinner-circle, .no-csstransitions .spinner-gritcode .spinner-circle, .no-csstransforms3d .spinner-gritcode .spinner-circle {\n background: url(\"http://i2.wp.com/www.thegreatnovelingadventure.com/wp-content/plugins/wp-polls/images/loading.gif\") center center no-repeat;\n animation: none;\n margin-left: 0;\n margin-top: 5px;\n border: none;\n width: 32px;\n height: 32px; }\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 200 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "<div class=\"spinner spinner-gritcode {{spinnerSize}} {{fixed ? 'spinner-fixed' : ''}}\" v-show=\"active\">\n <div class=\"spinner-wrapper\">\n <div class=\"spinner-circle\"></div>\n <div class=\"spinner-text\">{{text}}</div>\n </div>\n </div>";
|
||
|
||
/***/ }
|
||
/******/ ])
|
||
});
|
||
;
|
||
|
||
|
||
/***/ },
|
||
/* 68 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div style=\"position: relative\">\n<popover v-if=\"hasMeta()\" effect=\"fade\" placement=\"right\" title=\"Metadata\" trigger=\"hover\">\n <span class=\"label label-info noselect\">Metadata</span>\n <div slot=\"content\">\n <table class='table '>\n <tbody>\n <tr v-for=\"(k,v) in meta\">\n <td><b>{{k}}</b></td>\n <td>{{v}}</td>\n </tr>\n </tbody>\n </table>\n </div>\n</popover>\n</div>\n";
|
||
|
||
/***/ },
|
||
/* 69 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(70)
|
||
__vue_script__ = __webpack_require__(72)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/Record.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(73)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-411a675d/Record.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 70 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(71);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Record.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Record.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 71 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 72 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _Metadata = __webpack_require__(28);
|
||
|
||
var _Metadata2 = _interopRequireDefault(_Metadata);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
data: function data() {
|
||
return {};
|
||
},
|
||
props: {
|
||
record: { type: Object, required: true }
|
||
},
|
||
components: { Metadata: _Metadata2.default }
|
||
};
|
||
|
||
/***/ },
|
||
/* 73 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div class='clearfix'><b class='pull-left'>{{record.type}} {{record.name}} {{record.target | truncate 50}}</b> \n <div style='margin-left:8px' class='pull-left'><metadata :meta=\"record.meta\"></metadata></div></div>\n";
|
||
|
||
/***/ },
|
||
/* 74 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div class='domain'>\n <div class='row'>\n <div class='col-md-12' style='padding-left:20px;padding-right:25px;'>\n <div class='pull-left'><h2>{{d.name}}</h2></div>\n <div class='meta pull-left'><metadata :meta=\"d.meta\"></metadata></div>\n <tooltip trigger=\"hover\" placement=\"bottom\" content=\"Compare data with provider state and view corrections\">\n <div class='pull-right'><button class='btn btn-default btn-domain' @click=\"preview\">Preview</button></div>\n </tooltip>\n </div>\n </div>\n <tooltip trigger=\"hover\" placement=\"bottom\" :content=\"regTooltip()\">\n <span :class=\"['label','noselect',registrarEnabled?'label-success':'label-default']\" @click=\"registrarEnabled = !registrarEnabled\">{{d.registrar}}</span>\n </tooltip>\n <tooltip v-for=\"(i,dsp) in d.dsps\" trigger=\"hover\" placement=\"bottom\" :content=\"dspTooltip(i)\">\n <span :class=\"['label','noselect',dsps[i]?'label-success':'label-default']\" @click=\"dsps.$set(i,!this.dsps[i])\">{{dsp}}</span>\n </tooltip>\n <record v-for=\"record in d.records\" :record=\"record\"></record>\n</div>\n";
|
||
|
||
/***/ },
|
||
/* 75 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div>\n <run-results :show.sync=\"showModal\" :config=\"data\" :query=\"query\"></run-results>\n <domain v-for=\"domain in sortedDomains\" :d=\"domain\" :on-preview=\"preview\"></domain>\n</div>\n";
|
||
|
||
/***/ },
|
||
/* 76 */
|
||
/***/ function(module, exports) {
|
||
|
||
(function(self) {
|
||
'use strict';
|
||
|
||
if (self.fetch) {
|
||
return
|
||
}
|
||
|
||
var support = {
|
||
searchParams: 'URLSearchParams' in self,
|
||
iterable: 'Symbol' in self && 'iterator' in Symbol,
|
||
blob: 'FileReader' in self && 'Blob' in self && (function() {
|
||
try {
|
||
new Blob()
|
||
return true
|
||
} catch(e) {
|
||
return false
|
||
}
|
||
})(),
|
||
formData: 'FormData' in self,
|
||
arrayBuffer: 'ArrayBuffer' in self
|
||
}
|
||
|
||
function normalizeName(name) {
|
||
if (typeof name !== 'string') {
|
||
name = String(name)
|
||
}
|
||
if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
|
||
throw new TypeError('Invalid character in header field name')
|
||
}
|
||
return name.toLowerCase()
|
||
}
|
||
|
||
function normalizeValue(value) {
|
||
if (typeof value !== 'string') {
|
||
value = String(value)
|
||
}
|
||
return value
|
||
}
|
||
|
||
// Build a destructive iterator for the value list
|
||
function iteratorFor(items) {
|
||
var iterator = {
|
||
next: function() {
|
||
var value = items.shift()
|
||
return {done: value === undefined, value: value}
|
||
}
|
||
}
|
||
|
||
if (support.iterable) {
|
||
iterator[Symbol.iterator] = function() {
|
||
return iterator
|
||
}
|
||
}
|
||
|
||
return iterator
|
||
}
|
||
|
||
function Headers(headers) {
|
||
this.map = {}
|
||
|
||
if (headers instanceof Headers) {
|
||
headers.forEach(function(value, name) {
|
||
this.append(name, value)
|
||
}, this)
|
||
|
||
} else if (headers) {
|
||
Object.getOwnPropertyNames(headers).forEach(function(name) {
|
||
this.append(name, headers[name])
|
||
}, this)
|
||
}
|
||
}
|
||
|
||
Headers.prototype.append = function(name, value) {
|
||
name = normalizeName(name)
|
||
value = normalizeValue(value)
|
||
var list = this.map[name]
|
||
if (!list) {
|
||
list = []
|
||
this.map[name] = list
|
||
}
|
||
list.push(value)
|
||
}
|
||
|
||
Headers.prototype['delete'] = function(name) {
|
||
delete this.map[normalizeName(name)]
|
||
}
|
||
|
||
Headers.prototype.get = function(name) {
|
||
var values = this.map[normalizeName(name)]
|
||
return values ? values[0] : null
|
||
}
|
||
|
||
Headers.prototype.getAll = function(name) {
|
||
return this.map[normalizeName(name)] || []
|
||
}
|
||
|
||
Headers.prototype.has = function(name) {
|
||
return this.map.hasOwnProperty(normalizeName(name))
|
||
}
|
||
|
||
Headers.prototype.set = function(name, value) {
|
||
this.map[normalizeName(name)] = [normalizeValue(value)]
|
||
}
|
||
|
||
Headers.prototype.forEach = function(callback, thisArg) {
|
||
Object.getOwnPropertyNames(this.map).forEach(function(name) {
|
||
this.map[name].forEach(function(value) {
|
||
callback.call(thisArg, value, name, this)
|
||
}, this)
|
||
}, this)
|
||
}
|
||
|
||
Headers.prototype.keys = function() {
|
||
var items = []
|
||
this.forEach(function(value, name) { items.push(name) })
|
||
return iteratorFor(items)
|
||
}
|
||
|
||
Headers.prototype.values = function() {
|
||
var items = []
|
||
this.forEach(function(value) { items.push(value) })
|
||
return iteratorFor(items)
|
||
}
|
||
|
||
Headers.prototype.entries = function() {
|
||
var items = []
|
||
this.forEach(function(value, name) { items.push([name, value]) })
|
||
return iteratorFor(items)
|
||
}
|
||
|
||
if (support.iterable) {
|
||
Headers.prototype[Symbol.iterator] = Headers.prototype.entries
|
||
}
|
||
|
||
function consumed(body) {
|
||
if (body.bodyUsed) {
|
||
return Promise.reject(new TypeError('Already read'))
|
||
}
|
||
body.bodyUsed = true
|
||
}
|
||
|
||
function fileReaderReady(reader) {
|
||
return new Promise(function(resolve, reject) {
|
||
reader.onload = function() {
|
||
resolve(reader.result)
|
||
}
|
||
reader.onerror = function() {
|
||
reject(reader.error)
|
||
}
|
||
})
|
||
}
|
||
|
||
function readBlobAsArrayBuffer(blob) {
|
||
var reader = new FileReader()
|
||
reader.readAsArrayBuffer(blob)
|
||
return fileReaderReady(reader)
|
||
}
|
||
|
||
function readBlobAsText(blob) {
|
||
var reader = new FileReader()
|
||
reader.readAsText(blob)
|
||
return fileReaderReady(reader)
|
||
}
|
||
|
||
function Body() {
|
||
this.bodyUsed = false
|
||
|
||
this._initBody = function(body) {
|
||
this._bodyInit = body
|
||
if (typeof body === 'string') {
|
||
this._bodyText = body
|
||
} else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
|
||
this._bodyBlob = body
|
||
} else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
|
||
this._bodyFormData = body
|
||
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
|
||
this._bodyText = body.toString()
|
||
} else if (!body) {
|
||
this._bodyText = ''
|
||
} else if (support.arrayBuffer && ArrayBuffer.prototype.isPrototypeOf(body)) {
|
||
// Only support ArrayBuffers for POST method.
|
||
// Receiving ArrayBuffers happens via Blobs, instead.
|
||
} else {
|
||
throw new Error('unsupported BodyInit type')
|
||
}
|
||
|
||
if (!this.headers.get('content-type')) {
|
||
if (typeof body === 'string') {
|
||
this.headers.set('content-type', 'text/plain;charset=UTF-8')
|
||
} else if (this._bodyBlob && this._bodyBlob.type) {
|
||
this.headers.set('content-type', this._bodyBlob.type)
|
||
} else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
|
||
this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
|
||
}
|
||
}
|
||
}
|
||
|
||
if (support.blob) {
|
||
this.blob = function() {
|
||
var rejected = consumed(this)
|
||
if (rejected) {
|
||
return rejected
|
||
}
|
||
|
||
if (this._bodyBlob) {
|
||
return Promise.resolve(this._bodyBlob)
|
||
} else if (this._bodyFormData) {
|
||
throw new Error('could not read FormData body as blob')
|
||
} else {
|
||
return Promise.resolve(new Blob([this._bodyText]))
|
||
}
|
||
}
|
||
|
||
this.arrayBuffer = function() {
|
||
return this.blob().then(readBlobAsArrayBuffer)
|
||
}
|
||
|
||
this.text = function() {
|
||
var rejected = consumed(this)
|
||
if (rejected) {
|
||
return rejected
|
||
}
|
||
|
||
if (this._bodyBlob) {
|
||
return readBlobAsText(this._bodyBlob)
|
||
} else if (this._bodyFormData) {
|
||
throw new Error('could not read FormData body as text')
|
||
} else {
|
||
return Promise.resolve(this._bodyText)
|
||
}
|
||
}
|
||
} else {
|
||
this.text = function() {
|
||
var rejected = consumed(this)
|
||
return rejected ? rejected : Promise.resolve(this._bodyText)
|
||
}
|
||
}
|
||
|
||
if (support.formData) {
|
||
this.formData = function() {
|
||
return this.text().then(decode)
|
||
}
|
||
}
|
||
|
||
this.json = function() {
|
||
return this.text().then(JSON.parse)
|
||
}
|
||
|
||
return this
|
||
}
|
||
|
||
// HTTP methods whose capitalization should be normalized
|
||
var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
|
||
|
||
function normalizeMethod(method) {
|
||
var upcased = method.toUpperCase()
|
||
return (methods.indexOf(upcased) > -1) ? upcased : method
|
||
}
|
||
|
||
function Request(input, options) {
|
||
options = options || {}
|
||
var body = options.body
|
||
if (Request.prototype.isPrototypeOf(input)) {
|
||
if (input.bodyUsed) {
|
||
throw new TypeError('Already read')
|
||
}
|
||
this.url = input.url
|
||
this.credentials = input.credentials
|
||
if (!options.headers) {
|
||
this.headers = new Headers(input.headers)
|
||
}
|
||
this.method = input.method
|
||
this.mode = input.mode
|
||
if (!body) {
|
||
body = input._bodyInit
|
||
input.bodyUsed = true
|
||
}
|
||
} else {
|
||
this.url = input
|
||
}
|
||
|
||
this.credentials = options.credentials || this.credentials || 'omit'
|
||
if (options.headers || !this.headers) {
|
||
this.headers = new Headers(options.headers)
|
||
}
|
||
this.method = normalizeMethod(options.method || this.method || 'GET')
|
||
this.mode = options.mode || this.mode || null
|
||
this.referrer = null
|
||
|
||
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
|
||
throw new TypeError('Body not allowed for GET or HEAD requests')
|
||
}
|
||
this._initBody(body)
|
||
}
|
||
|
||
Request.prototype.clone = function() {
|
||
return new Request(this)
|
||
}
|
||
|
||
function decode(body) {
|
||
var form = new FormData()
|
||
body.trim().split('&').forEach(function(bytes) {
|
||
if (bytes) {
|
||
var split = bytes.split('=')
|
||
var name = split.shift().replace(/\+/g, ' ')
|
||
var value = split.join('=').replace(/\+/g, ' ')
|
||
form.append(decodeURIComponent(name), decodeURIComponent(value))
|
||
}
|
||
})
|
||
return form
|
||
}
|
||
|
||
function headers(xhr) {
|
||
var head = new Headers()
|
||
var pairs = (xhr.getAllResponseHeaders() || '').trim().split('\n')
|
||
pairs.forEach(function(header) {
|
||
var split = header.trim().split(':')
|
||
var key = split.shift().trim()
|
||
var value = split.join(':').trim()
|
||
head.append(key, value)
|
||
})
|
||
return head
|
||
}
|
||
|
||
Body.call(Request.prototype)
|
||
|
||
function Response(bodyInit, options) {
|
||
if (!options) {
|
||
options = {}
|
||
}
|
||
|
||
this.type = 'default'
|
||
this.status = options.status
|
||
this.ok = this.status >= 200 && this.status < 300
|
||
this.statusText = options.statusText
|
||
this.headers = options.headers instanceof Headers ? options.headers : new Headers(options.headers)
|
||
this.url = options.url || ''
|
||
this._initBody(bodyInit)
|
||
}
|
||
|
||
Body.call(Response.prototype)
|
||
|
||
Response.prototype.clone = function() {
|
||
return new Response(this._bodyInit, {
|
||
status: this.status,
|
||
statusText: this.statusText,
|
||
headers: new Headers(this.headers),
|
||
url: this.url
|
||
})
|
||
}
|
||
|
||
Response.error = function() {
|
||
var response = new Response(null, {status: 0, statusText: ''})
|
||
response.type = 'error'
|
||
return response
|
||
}
|
||
|
||
var redirectStatuses = [301, 302, 303, 307, 308]
|
||
|
||
Response.redirect = function(url, status) {
|
||
if (redirectStatuses.indexOf(status) === -1) {
|
||
throw new RangeError('Invalid status code')
|
||
}
|
||
|
||
return new Response(null, {status: status, headers: {location: url}})
|
||
}
|
||
|
||
self.Headers = Headers
|
||
self.Request = Request
|
||
self.Response = Response
|
||
|
||
self.fetch = function(input, init) {
|
||
return new Promise(function(resolve, reject) {
|
||
var request
|
||
if (Request.prototype.isPrototypeOf(input) && !init) {
|
||
request = input
|
||
} else {
|
||
request = new Request(input, init)
|
||
}
|
||
|
||
var xhr = new XMLHttpRequest()
|
||
|
||
function responseURL() {
|
||
if ('responseURL' in xhr) {
|
||
return xhr.responseURL
|
||
}
|
||
|
||
// Avoid security warnings on getResponseHeader when not allowed by CORS
|
||
if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
|
||
return xhr.getResponseHeader('X-Request-URL')
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
xhr.onload = function() {
|
||
var options = {
|
||
status: xhr.status,
|
||
statusText: xhr.statusText,
|
||
headers: headers(xhr),
|
||
url: responseURL()
|
||
}
|
||
var body = 'response' in xhr ? xhr.response : xhr.responseText
|
||
resolve(new Response(body, options))
|
||
}
|
||
|
||
xhr.onerror = function() {
|
||
reject(new TypeError('Network request failed'))
|
||
}
|
||
|
||
xhr.ontimeout = function() {
|
||
reject(new TypeError('Network request failed'))
|
||
}
|
||
|
||
xhr.open(request.method, request.url, true)
|
||
|
||
if (request.credentials === 'include') {
|
||
xhr.withCredentials = true
|
||
}
|
||
|
||
if ('responseType' in xhr && support.blob) {
|
||
xhr.responseType = 'blob'
|
||
}
|
||
|
||
request.headers.forEach(function(value, name) {
|
||
xhr.setRequestHeader(name, value)
|
||
})
|
||
|
||
xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
|
||
})
|
||
}
|
||
self.fetch.polyfill = true
|
||
})(typeof self !== 'undefined' ? self : this);
|
||
|
||
|
||
/***/ },
|
||
/* 77 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {/**
|
||
* @license
|
||
* lodash <https://lodash.com/>
|
||
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
||
* Released under MIT license <https://lodash.com/license>
|
||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||
*/
|
||
;(function() {
|
||
|
||
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
|
||
var undefined;
|
||
|
||
/** Used as the semantic version number. */
|
||
var VERSION = '4.14.1';
|
||
|
||
/** Used as the size to enable large array optimizations. */
|
||
var LARGE_ARRAY_SIZE = 200;
|
||
|
||
/** Used as the `TypeError` message for "Functions" methods. */
|
||
var FUNC_ERROR_TEXT = 'Expected a function';
|
||
|
||
/** Used to stand-in for `undefined` hash values. */
|
||
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
||
|
||
/** Used as the internal argument placeholder. */
|
||
var PLACEHOLDER = '__lodash_placeholder__';
|
||
|
||
/** Used to compose bitmasks for function metadata. */
|
||
var BIND_FLAG = 1,
|
||
BIND_KEY_FLAG = 2,
|
||
CURRY_BOUND_FLAG = 4,
|
||
CURRY_FLAG = 8,
|
||
CURRY_RIGHT_FLAG = 16,
|
||
PARTIAL_FLAG = 32,
|
||
PARTIAL_RIGHT_FLAG = 64,
|
||
ARY_FLAG = 128,
|
||
REARG_FLAG = 256,
|
||
FLIP_FLAG = 512;
|
||
|
||
/** Used to compose bitmasks for comparison styles. */
|
||
var UNORDERED_COMPARE_FLAG = 1,
|
||
PARTIAL_COMPARE_FLAG = 2;
|
||
|
||
/** Used as default options for `_.truncate`. */
|
||
var DEFAULT_TRUNC_LENGTH = 30,
|
||
DEFAULT_TRUNC_OMISSION = '...';
|
||
|
||
/** Used to detect hot functions by number of calls within a span of milliseconds. */
|
||
var HOT_COUNT = 150,
|
||
HOT_SPAN = 16;
|
||
|
||
/** Used to indicate the type of lazy iteratees. */
|
||
var LAZY_FILTER_FLAG = 1,
|
||
LAZY_MAP_FLAG = 2,
|
||
LAZY_WHILE_FLAG = 3;
|
||
|
||
/** Used as references for various `Number` constants. */
|
||
var INFINITY = 1 / 0,
|
||
MAX_SAFE_INTEGER = 9007199254740991,
|
||
MAX_INTEGER = 1.7976931348623157e+308,
|
||
NAN = 0 / 0;
|
||
|
||
/** Used as references for the maximum length and index of an array. */
|
||
var MAX_ARRAY_LENGTH = 4294967295,
|
||
MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
|
||
HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
|
||
|
||
/** Used to associate wrap methods with their bit flags. */
|
||
var wrapFlags = [
|
||
['ary', ARY_FLAG],
|
||
['bind', BIND_FLAG],
|
||
['bindKey', BIND_KEY_FLAG],
|
||
['curry', CURRY_FLAG],
|
||
['curryRight', CURRY_RIGHT_FLAG],
|
||
['flip', FLIP_FLAG],
|
||
['partial', PARTIAL_FLAG],
|
||
['partialRight', PARTIAL_RIGHT_FLAG],
|
||
['rearg', REARG_FLAG]
|
||
];
|
||
|
||
/** `Object#toString` result references. */
|
||
var argsTag = '[object Arguments]',
|
||
arrayTag = '[object Array]',
|
||
boolTag = '[object Boolean]',
|
||
dateTag = '[object Date]',
|
||
errorTag = '[object Error]',
|
||
funcTag = '[object Function]',
|
||
genTag = '[object GeneratorFunction]',
|
||
mapTag = '[object Map]',
|
||
numberTag = '[object Number]',
|
||
objectTag = '[object Object]',
|
||
promiseTag = '[object Promise]',
|
||
regexpTag = '[object RegExp]',
|
||
setTag = '[object Set]',
|
||
stringTag = '[object String]',
|
||
symbolTag = '[object Symbol]',
|
||
weakMapTag = '[object WeakMap]',
|
||
weakSetTag = '[object WeakSet]';
|
||
|
||
var arrayBufferTag = '[object ArrayBuffer]',
|
||
dataViewTag = '[object DataView]',
|
||
float32Tag = '[object Float32Array]',
|
||
float64Tag = '[object Float64Array]',
|
||
int8Tag = '[object Int8Array]',
|
||
int16Tag = '[object Int16Array]',
|
||
int32Tag = '[object Int32Array]',
|
||
uint8Tag = '[object Uint8Array]',
|
||
uint8ClampedTag = '[object Uint8ClampedArray]',
|
||
uint16Tag = '[object Uint16Array]',
|
||
uint32Tag = '[object Uint32Array]';
|
||
|
||
/** Used to match empty string literals in compiled template source. */
|
||
var reEmptyStringLeading = /\b__p \+= '';/g,
|
||
reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
|
||
reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
|
||
|
||
/** Used to match HTML entities and HTML characters. */
|
||
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
|
||
reUnescapedHtml = /[&<>"'`]/g,
|
||
reHasEscapedHtml = RegExp(reEscapedHtml.source),
|
||
reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
|
||
|
||
/** Used to match template delimiters. */
|
||
var reEscape = /<%-([\s\S]+?)%>/g,
|
||
reEvaluate = /<%([\s\S]+?)%>/g,
|
||
reInterpolate = /<%=([\s\S]+?)%>/g;
|
||
|
||
/** Used to match property names within property paths. */
|
||
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
|
||
reIsPlainProp = /^\w*$/,
|
||
reLeadingDot = /^\./,
|
||
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
||
|
||
/**
|
||
* Used to match `RegExp`
|
||
* [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns).
|
||
*/
|
||
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
|
||
reHasRegExpChar = RegExp(reRegExpChar.source);
|
||
|
||
/** Used to match leading and trailing whitespace. */
|
||
var reTrim = /^\s+|\s+$/g,
|
||
reTrimStart = /^\s+/,
|
||
reTrimEnd = /\s+$/;
|
||
|
||
/** Used to match wrap detail comments. */
|
||
var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
|
||
reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
|
||
reSplitDetails = /,? & /;
|
||
|
||
/** Used to match non-compound words composed of alphanumeric characters. */
|
||
var reBasicWord = /[a-zA-Z0-9]+/g;
|
||
|
||
/** Used to match backslashes in property paths. */
|
||
var reEscapeChar = /\\(\\)?/g;
|
||
|
||
/**
|
||
* Used to match
|
||
* [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components).
|
||
*/
|
||
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
|
||
|
||
/** Used to match `RegExp` flags from their coerced string values. */
|
||
var reFlags = /\w*$/;
|
||
|
||
/** Used to detect hexadecimal string values. */
|
||
var reHasHexPrefix = /^0x/i;
|
||
|
||
/** Used to detect bad signed hexadecimal string values. */
|
||
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
||
|
||
/** Used to detect binary string values. */
|
||
var reIsBinary = /^0b[01]+$/i;
|
||
|
||
/** Used to detect host constructors (Safari). */
|
||
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
||
|
||
/** Used to detect octal string values. */
|
||
var reIsOctal = /^0o[0-7]+$/i;
|
||
|
||
/** Used to detect unsigned integer values. */
|
||
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
||
|
||
/** Used to match latin-1 supplementary letters (excluding mathematical operators). */
|
||
var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
|
||
|
||
/** Used to ensure capturing order of template delimiters. */
|
||
var reNoMatch = /($^)/;
|
||
|
||
/** Used to match unescaped characters in compiled string literals. */
|
||
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
|
||
|
||
/** Used to compose unicode character classes. */
|
||
var rsAstralRange = '\\ud800-\\udfff',
|
||
rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
|
||
rsComboSymbolsRange = '\\u20d0-\\u20f0',
|
||
rsDingbatRange = '\\u2700-\\u27bf',
|
||
rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
|
||
rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
|
||
rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
|
||
rsPunctuationRange = '\\u2000-\\u206f',
|
||
rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
|
||
rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
|
||
rsVarRange = '\\ufe0e\\ufe0f',
|
||
rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
|
||
|
||
/** Used to compose unicode capture groups. */
|
||
var rsApos = "['\u2019]",
|
||
rsAstral = '[' + rsAstralRange + ']',
|
||
rsBreak = '[' + rsBreakRange + ']',
|
||
rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
|
||
rsDigits = '\\d+',
|
||
rsDingbat = '[' + rsDingbatRange + ']',
|
||
rsLower = '[' + rsLowerRange + ']',
|
||
rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
|
||
rsFitz = '\\ud83c[\\udffb-\\udfff]',
|
||
rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
|
||
rsNonAstral = '[^' + rsAstralRange + ']',
|
||
rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
|
||
rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
|
||
rsUpper = '[' + rsUpperRange + ']',
|
||
rsZWJ = '\\u200d';
|
||
|
||
/** Used to compose unicode regexes. */
|
||
var rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',
|
||
rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',
|
||
rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
|
||
rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
|
||
reOptMod = rsModifier + '?',
|
||
rsOptVar = '[' + rsVarRange + ']?',
|
||
rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
|
||
rsSeq = rsOptVar + reOptMod + rsOptJoin,
|
||
rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
|
||
rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
|
||
|
||
/** Used to match apostrophes. */
|
||
var reApos = RegExp(rsApos, 'g');
|
||
|
||
/**
|
||
* Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
|
||
* [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
|
||
*/
|
||
var reComboMark = RegExp(rsCombo, 'g');
|
||
|
||
/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
|
||
var reComplexSymbol = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
|
||
|
||
/** Used to match complex or compound words. */
|
||
var reComplexWord = RegExp([
|
||
rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
|
||
rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',
|
||
rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,
|
||
rsUpper + '+' + rsOptUpperContr,
|
||
rsDigits,
|
||
rsEmoji
|
||
].join('|'), 'g');
|
||
|
||
/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
|
||
var reHasComplexSymbol = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
|
||
|
||
/** Used to detect strings that need a more robust regexp to match words. */
|
||
var reHasComplexWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
|
||
|
||
/** Used to assign default `context` object properties. */
|
||
var contextProps = [
|
||
'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
|
||
'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
|
||
'Promise', 'Reflect', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError',
|
||
'Uint8Array', 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
|
||
'_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
|
||
];
|
||
|
||
/** Used to make template sourceURLs easier to identify. */
|
||
var templateCounter = -1;
|
||
|
||
/** Used to identify `toStringTag` values of typed arrays. */
|
||
var typedArrayTags = {};
|
||
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
|
||
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
|
||
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
|
||
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
|
||
typedArrayTags[uint32Tag] = true;
|
||
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
|
||
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
|
||
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
|
||
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
|
||
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
|
||
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
|
||
typedArrayTags[setTag] = typedArrayTags[stringTag] =
|
||
typedArrayTags[weakMapTag] = false;
|
||
|
||
/** Used to identify `toStringTag` values supported by `_.clone`. */
|
||
var cloneableTags = {};
|
||
cloneableTags[argsTag] = cloneableTags[arrayTag] =
|
||
cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
|
||
cloneableTags[boolTag] = cloneableTags[dateTag] =
|
||
cloneableTags[float32Tag] = cloneableTags[float64Tag] =
|
||
cloneableTags[int8Tag] = cloneableTags[int16Tag] =
|
||
cloneableTags[int32Tag] = cloneableTags[mapTag] =
|
||
cloneableTags[numberTag] = cloneableTags[objectTag] =
|
||
cloneableTags[regexpTag] = cloneableTags[setTag] =
|
||
cloneableTags[stringTag] = cloneableTags[symbolTag] =
|
||
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
|
||
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
|
||
cloneableTags[errorTag] = cloneableTags[funcTag] =
|
||
cloneableTags[weakMapTag] = false;
|
||
|
||
/** Used to map latin-1 supplementary letters to basic latin letters. */
|
||
var deburredLetters = {
|
||
'\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
|
||
'\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
|
||
'\xc7': 'C', '\xe7': 'c',
|
||
'\xd0': 'D', '\xf0': 'd',
|
||
'\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
|
||
'\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
|
||
'\xcC': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
|
||
'\xeC': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
|
||
'\xd1': 'N', '\xf1': 'n',
|
||
'\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
|
||
'\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
|
||
'\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
|
||
'\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
|
||
'\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
|
||
'\xc6': 'Ae', '\xe6': 'ae',
|
||
'\xde': 'Th', '\xfe': 'th',
|
||
'\xdf': 'ss'
|
||
};
|
||
|
||
/** Used to map characters to HTML entities. */
|
||
var htmlEscapes = {
|
||
'&': '&',
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
"'": ''',
|
||
'`': '`'
|
||
};
|
||
|
||
/** Used to map HTML entities to characters. */
|
||
var htmlUnescapes = {
|
||
'&': '&',
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
''': "'",
|
||
'`': '`'
|
||
};
|
||
|
||
/** Used to escape characters for inclusion in compiled string literals. */
|
||
var stringEscapes = {
|
||
'\\': '\\',
|
||
"'": "'",
|
||
'\n': 'n',
|
||
'\r': 'r',
|
||
'\u2028': 'u2028',
|
||
'\u2029': 'u2029'
|
||
};
|
||
|
||
/** Built-in method references without a dependency on `root`. */
|
||
var freeParseFloat = parseFloat,
|
||
freeParseInt = parseInt;
|
||
|
||
/** Detect free variable `global` from Node.js. */
|
||
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
||
|
||
/** Detect free variable `self`. */
|
||
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
||
|
||
/** Used as a reference to the global object. */
|
||
var root = freeGlobal || freeSelf || Function('return this')();
|
||
|
||
/** Detect free variable `exports`. */
|
||
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
|
||
|
||
/** Detect free variable `module`. */
|
||
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
|
||
|
||
/** Detect the popular CommonJS extension `module.exports`. */
|
||
var moduleExports = freeModule && freeModule.exports === freeExports;
|
||
|
||
/** Detect free variable `process` from Node.js. */
|
||
var freeProcess = moduleExports && freeGlobal.process;
|
||
|
||
/** Used to access faster Node.js helpers. */
|
||
var nodeUtil = (function() {
|
||
try {
|
||
return freeProcess && freeProcess.binding('util');
|
||
} catch (e) {}
|
||
}());
|
||
|
||
/* Node.js helper references. */
|
||
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
|
||
nodeIsDate = nodeUtil && nodeUtil.isDate,
|
||
nodeIsMap = nodeUtil && nodeUtil.isMap,
|
||
nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
|
||
nodeIsSet = nodeUtil && nodeUtil.isSet,
|
||
nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Adds the key-value `pair` to `map`.
|
||
*
|
||
* @private
|
||
* @param {Object} map The map to modify.
|
||
* @param {Array} pair The key-value pair to add.
|
||
* @returns {Object} Returns `map`.
|
||
*/
|
||
function addMapEntry(map, pair) {
|
||
// Don't return `map.set` because it's not chainable in IE 11.
|
||
map.set(pair[0], pair[1]);
|
||
return map;
|
||
}
|
||
|
||
/**
|
||
* Adds `value` to `set`.
|
||
*
|
||
* @private
|
||
* @param {Object} set The set to modify.
|
||
* @param {*} value The value to add.
|
||
* @returns {Object} Returns `set`.
|
||
*/
|
||
function addSetEntry(set, value) {
|
||
// Don't return `set.add` because it's not chainable in IE 11.
|
||
set.add(value);
|
||
return set;
|
||
}
|
||
|
||
/**
|
||
* A faster alternative to `Function#apply`, this function invokes `func`
|
||
* with the `this` binding of `thisArg` and the arguments of `args`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to invoke.
|
||
* @param {*} thisArg The `this` binding of `func`.
|
||
* @param {Array} args The arguments to invoke `func` with.
|
||
* @returns {*} Returns the result of `func`.
|
||
*/
|
||
function apply(func, thisArg, args) {
|
||
switch (args.length) {
|
||
case 0: return func.call(thisArg);
|
||
case 1: return func.call(thisArg, args[0]);
|
||
case 2: return func.call(thisArg, args[0], args[1]);
|
||
case 3: return func.call(thisArg, args[0], args[1], args[2]);
|
||
}
|
||
return func.apply(thisArg, args);
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseAggregator` for arrays.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} setter The function to set `accumulator` values.
|
||
* @param {Function} iteratee The iteratee to transform keys.
|
||
* @param {Object} accumulator The initial aggregated object.
|
||
* @returns {Function} Returns `accumulator`.
|
||
*/
|
||
function arrayAggregator(array, setter, iteratee, accumulator) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
setter(accumulator, value, iteratee(value), array);
|
||
}
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.forEach` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function arrayEach(array, iteratee) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
while (++index < length) {
|
||
if (iteratee(array[index], index, array) === false) {
|
||
break;
|
||
}
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.forEachRight` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function arrayEachRight(array, iteratee) {
|
||
var length = array ? array.length : 0;
|
||
|
||
while (length--) {
|
||
if (iteratee(array[length], length, array) === false) {
|
||
break;
|
||
}
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.every` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||
* else `false`.
|
||
*/
|
||
function arrayEvery(array, predicate) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
while (++index < length) {
|
||
if (!predicate(array[index], index, array)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.filter` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {Array} Returns the new filtered array.
|
||
*/
|
||
function arrayFilter(array, predicate) {
|
||
var index = -1,
|
||
length = array ? array.length : 0,
|
||
resIndex = 0,
|
||
result = [];
|
||
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
if (predicate(value, index, array)) {
|
||
result[resIndex++] = value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.includes` for arrays without support for
|
||
* specifying an index to search from.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to search.
|
||
* @param {*} target The value to search for.
|
||
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||
*/
|
||
function arrayIncludes(array, value) {
|
||
var length = array ? array.length : 0;
|
||
return !!length && baseIndexOf(array, value, 0) > -1;
|
||
}
|
||
|
||
/**
|
||
* This function is like `arrayIncludes` except that it accepts a comparator.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to search.
|
||
* @param {*} target The value to search for.
|
||
* @param {Function} comparator The comparator invoked per element.
|
||
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||
*/
|
||
function arrayIncludesWith(array, value, comparator) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
while (++index < length) {
|
||
if (comparator(value, array[index])) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.map` for arrays without support for iteratee
|
||
* shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array} Returns the new mapped array.
|
||
*/
|
||
function arrayMap(array, iteratee) {
|
||
var index = -1,
|
||
length = array ? array.length : 0,
|
||
result = Array(length);
|
||
|
||
while (++index < length) {
|
||
result[index] = iteratee(array[index], index, array);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Appends the elements of `values` to `array`.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to modify.
|
||
* @param {Array} values The values to append.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function arrayPush(array, values) {
|
||
var index = -1,
|
||
length = values.length,
|
||
offset = array.length;
|
||
|
||
while (++index < length) {
|
||
array[offset + index] = values[index];
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.reduce` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @param {*} [accumulator] The initial value.
|
||
* @param {boolean} [initAccum] Specify using the first element of `array` as
|
||
* the initial value.
|
||
* @returns {*} Returns the accumulated value.
|
||
*/
|
||
function arrayReduce(array, iteratee, accumulator, initAccum) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
if (initAccum && length) {
|
||
accumulator = array[++index];
|
||
}
|
||
while (++index < length) {
|
||
accumulator = iteratee(accumulator, array[index], index, array);
|
||
}
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.reduceRight` for arrays without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @param {*} [accumulator] The initial value.
|
||
* @param {boolean} [initAccum] Specify using the last element of `array` as
|
||
* the initial value.
|
||
* @returns {*} Returns the accumulated value.
|
||
*/
|
||
function arrayReduceRight(array, iteratee, accumulator, initAccum) {
|
||
var length = array ? array.length : 0;
|
||
if (initAccum && length) {
|
||
accumulator = array[--length];
|
||
}
|
||
while (length--) {
|
||
accumulator = iteratee(accumulator, array[length], length, array);
|
||
}
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `_.some` for arrays without support for iteratee
|
||
* shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} [array] The array to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||
* else `false`.
|
||
*/
|
||
function arraySome(array, predicate) {
|
||
var index = -1,
|
||
length = array ? array.length : 0;
|
||
|
||
while (++index < length) {
|
||
if (predicate(array[index], index, array)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.findKey` and `_.findLastKey`,
|
||
* without support for iteratee shorthands, which iterates over `collection`
|
||
* using `eachFunc`.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to search.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||
* @returns {*} Returns the found element or its key, else `undefined`.
|
||
*/
|
||
function baseFindKey(collection, predicate, eachFunc) {
|
||
var result;
|
||
eachFunc(collection, function(value, key, collection) {
|
||
if (predicate(value, key, collection)) {
|
||
result = key;
|
||
return false;
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.findIndex` and `_.findLastIndex` without
|
||
* support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to search.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @param {number} fromIndex The index to search from.
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
*/
|
||
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
||
var length = array.length,
|
||
index = fromIndex + (fromRight ? 1 : -1);
|
||
|
||
while ((fromRight ? index-- : ++index < length)) {
|
||
if (predicate(array[index], index, array)) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @param {number} fromIndex The index to search from.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
*/
|
||
function baseIndexOf(array, value, fromIndex) {
|
||
if (value !== value) {
|
||
return baseFindIndex(array, baseIsNaN, fromIndex);
|
||
}
|
||
var index = fromIndex - 1,
|
||
length = array.length;
|
||
|
||
while (++index < length) {
|
||
if (array[index] === value) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* This function is like `baseIndexOf` except that it accepts a comparator.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @param {number} fromIndex The index to search from.
|
||
* @param {Function} comparator The comparator invoked per element.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
*/
|
||
function baseIndexOfWith(array, value, fromIndex, comparator) {
|
||
var index = fromIndex - 1,
|
||
length = array.length;
|
||
|
||
while (++index < length) {
|
||
if (comparator(array[index], value)) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isNaN` without support for number objects.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
|
||
*/
|
||
function baseIsNaN(value) {
|
||
return value !== value;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.mean` and `_.meanBy` without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {number} Returns the mean.
|
||
*/
|
||
function baseMean(array, iteratee) {
|
||
var length = array ? array.length : 0;
|
||
return length ? (baseSum(array, iteratee) / length) : NAN;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.property` without support for deep paths.
|
||
*
|
||
* @private
|
||
* @param {string} key The key of the property to get.
|
||
* @returns {Function} Returns the new accessor function.
|
||
*/
|
||
function baseProperty(key) {
|
||
return function(object) {
|
||
return object == null ? undefined : object[key];
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.propertyOf` without support for deep paths.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Function} Returns the new accessor function.
|
||
*/
|
||
function basePropertyOf(object) {
|
||
return function(key) {
|
||
return object == null ? undefined : object[key];
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.reduce` and `_.reduceRight`, without support
|
||
* for iteratee shorthands, which iterates over `collection` using `eachFunc`.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @param {*} accumulator The initial value.
|
||
* @param {boolean} initAccum Specify using the first or last element of
|
||
* `collection` as the initial value.
|
||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||
* @returns {*} Returns the accumulated value.
|
||
*/
|
||
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
|
||
eachFunc(collection, function(value, index, collection) {
|
||
accumulator = initAccum
|
||
? (initAccum = false, value)
|
||
: iteratee(accumulator, value, index, collection);
|
||
});
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.sortBy` which uses `comparer` to define the
|
||
* sort order of `array` and replaces criteria objects with their corresponding
|
||
* values.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to sort.
|
||
* @param {Function} comparer The function to define sort order.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function baseSortBy(array, comparer) {
|
||
var length = array.length;
|
||
|
||
array.sort(comparer);
|
||
while (length--) {
|
||
array[length] = array[length].value;
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.sum` and `_.sumBy` without support for
|
||
* iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {number} Returns the sum.
|
||
*/
|
||
function baseSum(array, iteratee) {
|
||
var result,
|
||
index = -1,
|
||
length = array.length;
|
||
|
||
while (++index < length) {
|
||
var current = iteratee(array[index]);
|
||
if (current !== undefined) {
|
||
result = result === undefined ? current : (result + current);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.times` without support for iteratee shorthands
|
||
* or max array length checks.
|
||
*
|
||
* @private
|
||
* @param {number} n The number of times to invoke `iteratee`.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array} Returns the array of results.
|
||
*/
|
||
function baseTimes(n, iteratee) {
|
||
var index = -1,
|
||
result = Array(n);
|
||
|
||
while (++index < n) {
|
||
result[index] = iteratee(index);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
|
||
* of key-value pairs for `object` corresponding to the property names of `props`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array} props The property names to get values for.
|
||
* @returns {Object} Returns the key-value pairs.
|
||
*/
|
||
function baseToPairs(object, props) {
|
||
return arrayMap(props, function(key) {
|
||
return [key, object[key]];
|
||
});
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.unary` without support for storing metadata.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to cap arguments for.
|
||
* @returns {Function} Returns the new capped function.
|
||
*/
|
||
function baseUnary(func) {
|
||
return function(value) {
|
||
return func(value);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.values` and `_.valuesIn` which creates an
|
||
* array of `object` property values corresponding to the property names
|
||
* of `props`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array} props The property names to get values for.
|
||
* @returns {Object} Returns the array of property values.
|
||
*/
|
||
function baseValues(object, props) {
|
||
return arrayMap(props, function(key) {
|
||
return object[key];
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Checks if a cache value for `key` exists.
|
||
*
|
||
* @private
|
||
* @param {Object} cache The cache to query.
|
||
* @param {string} key The key of the entry to check.
|
||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||
*/
|
||
function cacheHas(cache, key) {
|
||
return cache.has(key);
|
||
}
|
||
|
||
/**
|
||
* Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
|
||
* that is not found in the character symbols.
|
||
*
|
||
* @private
|
||
* @param {Array} strSymbols The string symbols to inspect.
|
||
* @param {Array} chrSymbols The character symbols to find.
|
||
* @returns {number} Returns the index of the first unmatched string symbol.
|
||
*/
|
||
function charsStartIndex(strSymbols, chrSymbols) {
|
||
var index = -1,
|
||
length = strSymbols.length;
|
||
|
||
while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
|
||
return index;
|
||
}
|
||
|
||
/**
|
||
* Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
|
||
* that is not found in the character symbols.
|
||
*
|
||
* @private
|
||
* @param {Array} strSymbols The string symbols to inspect.
|
||
* @param {Array} chrSymbols The character symbols to find.
|
||
* @returns {number} Returns the index of the last unmatched string symbol.
|
||
*/
|
||
function charsEndIndex(strSymbols, chrSymbols) {
|
||
var index = strSymbols.length;
|
||
|
||
while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
|
||
return index;
|
||
}
|
||
|
||
/**
|
||
* Gets the number of `placeholder` occurrences in `array`.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to inspect.
|
||
* @param {*} placeholder The placeholder to search for.
|
||
* @returns {number} Returns the placeholder count.
|
||
*/
|
||
function countHolders(array, placeholder) {
|
||
var length = array.length,
|
||
result = 0;
|
||
|
||
while (length--) {
|
||
if (array[length] === placeholder) {
|
||
result++;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
|
||
*
|
||
* @private
|
||
* @param {string} letter The matched letter to deburr.
|
||
* @returns {string} Returns the deburred letter.
|
||
*/
|
||
var deburrLetter = basePropertyOf(deburredLetters);
|
||
|
||
/**
|
||
* Used by `_.escape` to convert characters to HTML entities.
|
||
*
|
||
* @private
|
||
* @param {string} chr The matched character to escape.
|
||
* @returns {string} Returns the escaped character.
|
||
*/
|
||
var escapeHtmlChar = basePropertyOf(htmlEscapes);
|
||
|
||
/**
|
||
* Used by `_.template` to escape characters for inclusion in compiled string literals.
|
||
*
|
||
* @private
|
||
* @param {string} chr The matched character to escape.
|
||
* @returns {string} Returns the escaped character.
|
||
*/
|
||
function escapeStringChar(chr) {
|
||
return '\\' + stringEscapes[chr];
|
||
}
|
||
|
||
/**
|
||
* Gets the value at `key` of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} [object] The object to query.
|
||
* @param {string} key The key of the property to get.
|
||
* @returns {*} Returns the property value.
|
||
*/
|
||
function getValue(object, key) {
|
||
return object == null ? undefined : object[key];
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a host object in IE < 9.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
|
||
*/
|
||
function isHostObject(value) {
|
||
// Many host objects are `Object` objects that can coerce to strings
|
||
// despite having improperly defined `toString` methods.
|
||
var result = false;
|
||
if (value != null && typeof value.toString != 'function') {
|
||
try {
|
||
result = !!(value + '');
|
||
} catch (e) {}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `iterator` to an array.
|
||
*
|
||
* @private
|
||
* @param {Object} iterator The iterator to convert.
|
||
* @returns {Array} Returns the converted array.
|
||
*/
|
||
function iteratorToArray(iterator) {
|
||
var data,
|
||
result = [];
|
||
|
||
while (!(data = iterator.next()).done) {
|
||
result.push(data.value);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `map` to its key-value pairs.
|
||
*
|
||
* @private
|
||
* @param {Object} map The map to convert.
|
||
* @returns {Array} Returns the key-value pairs.
|
||
*/
|
||
function mapToArray(map) {
|
||
var index = -1,
|
||
result = Array(map.size);
|
||
|
||
map.forEach(function(value, key) {
|
||
result[++index] = [key, value];
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with its first argument transformed.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to wrap.
|
||
* @param {Function} transform The argument transform.
|
||
* @returns {Function} Returns the new function.
|
||
*/
|
||
function overArg(func, transform) {
|
||
return function(arg) {
|
||
return func(transform(arg));
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Replaces all `placeholder` elements in `array` with an internal placeholder
|
||
* and returns an array of their indexes.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to modify.
|
||
* @param {*} placeholder The placeholder to replace.
|
||
* @returns {Array} Returns the new array of placeholder indexes.
|
||
*/
|
||
function replaceHolders(array, placeholder) {
|
||
var index = -1,
|
||
length = array.length,
|
||
resIndex = 0,
|
||
result = [];
|
||
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
if (value === placeholder || value === PLACEHOLDER) {
|
||
array[index] = PLACEHOLDER;
|
||
result[resIndex++] = index;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `set` to an array of its values.
|
||
*
|
||
* @private
|
||
* @param {Object} set The set to convert.
|
||
* @returns {Array} Returns the values.
|
||
*/
|
||
function setToArray(set) {
|
||
var index = -1,
|
||
result = Array(set.size);
|
||
|
||
set.forEach(function(value) {
|
||
result[++index] = value;
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `set` to its value-value pairs.
|
||
*
|
||
* @private
|
||
* @param {Object} set The set to convert.
|
||
* @returns {Array} Returns the value-value pairs.
|
||
*/
|
||
function setToPairs(set) {
|
||
var index = -1,
|
||
result = Array(set.size);
|
||
|
||
set.forEach(function(value) {
|
||
result[++index] = [value, value];
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Gets the number of symbols in `string`.
|
||
*
|
||
* @private
|
||
* @param {string} string The string to inspect.
|
||
* @returns {number} Returns the string size.
|
||
*/
|
||
function stringSize(string) {
|
||
if (!(string && reHasComplexSymbol.test(string))) {
|
||
return string.length;
|
||
}
|
||
var result = reComplexSymbol.lastIndex = 0;
|
||
while (reComplexSymbol.test(string)) {
|
||
result++;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `string` to an array.
|
||
*
|
||
* @private
|
||
* @param {string} string The string to convert.
|
||
* @returns {Array} Returns the converted array.
|
||
*/
|
||
function stringToArray(string) {
|
||
return string.match(reComplexSymbol);
|
||
}
|
||
|
||
/**
|
||
* Used by `_.unescape` to convert HTML entities to characters.
|
||
*
|
||
* @private
|
||
* @param {string} chr The matched character to unescape.
|
||
* @returns {string} Returns the unescaped character.
|
||
*/
|
||
var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Create a new pristine `lodash` function using the `context` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.1.0
|
||
* @category Util
|
||
* @param {Object} [context=root] The context object.
|
||
* @returns {Function} Returns a new `lodash` function.
|
||
* @example
|
||
*
|
||
* _.mixin({ 'foo': _.constant('foo') });
|
||
*
|
||
* var lodash = _.runInContext();
|
||
* lodash.mixin({ 'bar': lodash.constant('bar') });
|
||
*
|
||
* _.isFunction(_.foo);
|
||
* // => true
|
||
* _.isFunction(_.bar);
|
||
* // => false
|
||
*
|
||
* lodash.isFunction(lodash.foo);
|
||
* // => false
|
||
* lodash.isFunction(lodash.bar);
|
||
* // => true
|
||
*
|
||
* // Use `context` to stub `Date#getTime` use in `_.now`.
|
||
* var stubbed = _.runInContext({
|
||
* 'Date': function() {
|
||
* return { 'getTime': stubGetTime };
|
||
* }
|
||
* });
|
||
*
|
||
* // Create a suped-up `defer` in Node.js.
|
||
* var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
|
||
*/
|
||
function runInContext(context) {
|
||
context = context ? _.defaults({}, context, _.pick(root, contextProps)) : root;
|
||
|
||
/** Built-in constructor references. */
|
||
var Array = context.Array,
|
||
Date = context.Date,
|
||
Error = context.Error,
|
||
Math = context.Math,
|
||
RegExp = context.RegExp,
|
||
TypeError = context.TypeError;
|
||
|
||
/** Used for built-in method references. */
|
||
var arrayProto = context.Array.prototype,
|
||
objectProto = context.Object.prototype,
|
||
stringProto = context.String.prototype;
|
||
|
||
/** Used to detect overreaching core-js shims. */
|
||
var coreJsData = context['__core-js_shared__'];
|
||
|
||
/** Used to detect methods masquerading as native. */
|
||
var maskSrcKey = (function() {
|
||
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
||
return uid ? ('Symbol(src)_1.' + uid) : '';
|
||
}());
|
||
|
||
/** Used to resolve the decompiled source of functions. */
|
||
var funcToString = context.Function.prototype.toString;
|
||
|
||
/** Used to check objects for own properties. */
|
||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||
|
||
/** Used to generate unique IDs. */
|
||
var idCounter = 0;
|
||
|
||
/** Used to infer the `Object` constructor. */
|
||
var objectCtorString = funcToString.call(Object);
|
||
|
||
/**
|
||
* Used to resolve the
|
||
* [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
|
||
* of values.
|
||
*/
|
||
var objectToString = objectProto.toString;
|
||
|
||
/** Used to restore the original `_` reference in `_.noConflict`. */
|
||
var oldDash = root._;
|
||
|
||
/** Used to detect if a method is native. */
|
||
var reIsNative = RegExp('^' +
|
||
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
||
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
||
);
|
||
|
||
/** Built-in value references. */
|
||
var Buffer = moduleExports ? context.Buffer : undefined,
|
||
Reflect = context.Reflect,
|
||
Symbol = context.Symbol,
|
||
Uint8Array = context.Uint8Array,
|
||
enumerate = Reflect ? Reflect.enumerate : undefined,
|
||
iteratorSymbol = Symbol ? Symbol.iterator : undefined,
|
||
objectCreate = context.Object.create,
|
||
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
||
splice = arrayProto.splice,
|
||
spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
|
||
|
||
/** Built-in method references that are mockable. */
|
||
var clearTimeout = function(id) { return context.clearTimeout.call(root, id); },
|
||
setTimeout = function(func, wait) { return context.setTimeout.call(root, func, wait); };
|
||
|
||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||
var nativeCeil = Math.ceil,
|
||
nativeFloor = Math.floor,
|
||
nativeGetPrototype = Object.getPrototypeOf,
|
||
nativeGetSymbols = Object.getOwnPropertySymbols,
|
||
nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
|
||
nativeIsFinite = context.isFinite,
|
||
nativeJoin = arrayProto.join,
|
||
nativeKeys = Object.keys,
|
||
nativeMax = Math.max,
|
||
nativeMin = Math.min,
|
||
nativeParseInt = context.parseInt,
|
||
nativeRandom = Math.random,
|
||
nativeReplace = stringProto.replace,
|
||
nativeReverse = arrayProto.reverse,
|
||
nativeSplit = stringProto.split;
|
||
|
||
/* Built-in method references that are verified to be native. */
|
||
var DataView = getNative(context, 'DataView'),
|
||
Map = getNative(context, 'Map'),
|
||
Promise = getNative(context, 'Promise'),
|
||
Set = getNative(context, 'Set'),
|
||
WeakMap = getNative(context, 'WeakMap'),
|
||
nativeCreate = getNative(context.Object, 'create');
|
||
|
||
/* Used to set `toString` methods. */
|
||
var defineProperty = (function() {
|
||
var func = getNative(context.Object, 'defineProperty'),
|
||
name = getNative.name;
|
||
|
||
return (name && name.length > 2) ? func : undefined;
|
||
}());
|
||
|
||
/** Used to store function metadata. */
|
||
var metaMap = WeakMap && new WeakMap;
|
||
|
||
/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */
|
||
var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');
|
||
|
||
/** Used to lookup unminified function names. */
|
||
var realNames = {};
|
||
|
||
/** Used to detect maps, sets, and weakmaps. */
|
||
var dataViewCtorString = toSource(DataView),
|
||
mapCtorString = toSource(Map),
|
||
promiseCtorString = toSource(Promise),
|
||
setCtorString = toSource(Set),
|
||
weakMapCtorString = toSource(WeakMap);
|
||
|
||
/** Used to convert symbols to primitives and strings. */
|
||
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
||
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
|
||
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a `lodash` object which wraps `value` to enable implicit method
|
||
* chain sequences. Methods that operate on and return arrays, collections,
|
||
* and functions can be chained together. Methods that retrieve a single value
|
||
* or may return a primitive value will automatically end the chain sequence
|
||
* and return the unwrapped value. Otherwise, the value must be unwrapped
|
||
* with `_#value`.
|
||
*
|
||
* Explicit chain sequences, which must be unwrapped with `_#value`, may be
|
||
* enabled using `_.chain`.
|
||
*
|
||
* The execution of chained methods is lazy, that is, it's deferred until
|
||
* `_#value` is implicitly or explicitly called.
|
||
*
|
||
* Lazy evaluation allows several methods to support shortcut fusion.
|
||
* Shortcut fusion is an optimization to merge iteratee calls; this avoids
|
||
* the creation of intermediate arrays and can greatly reduce the number of
|
||
* iteratee executions. Sections of a chain sequence qualify for shortcut
|
||
* fusion if the section is applied to an array of at least `200` elements
|
||
* and any iteratees accept only one argument. The heuristic for whether a
|
||
* section qualifies for shortcut fusion is subject to change.
|
||
*
|
||
* Chaining is supported in custom builds as long as the `_#value` method is
|
||
* directly or indirectly included in the build.
|
||
*
|
||
* In addition to lodash methods, wrappers have `Array` and `String` methods.
|
||
*
|
||
* The wrapper `Array` methods are:
|
||
* `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
|
||
*
|
||
* The wrapper `String` methods are:
|
||
* `replace` and `split`
|
||
*
|
||
* The wrapper methods that support shortcut fusion are:
|
||
* `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
|
||
* `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
|
||
* `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
|
||
*
|
||
* The chainable wrapper methods are:
|
||
* `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
|
||
* `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
|
||
* `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
|
||
* `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
|
||
* `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
|
||
* `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
|
||
* `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
|
||
* `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
|
||
* `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
|
||
* `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
|
||
* `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
|
||
* `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
|
||
* `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
|
||
* `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
|
||
* `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
|
||
* `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
|
||
* `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
|
||
* `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
|
||
* `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
|
||
* `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
|
||
* `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
|
||
* `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
|
||
* `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
|
||
* `zipObject`, `zipObjectDeep`, and `zipWith`
|
||
*
|
||
* The wrapper methods that are **not** chainable by default are:
|
||
* `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
|
||
* `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
|
||
* `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
|
||
* `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
|
||
* `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
|
||
* `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
|
||
* `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
|
||
* `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
|
||
* `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
|
||
* `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
|
||
* `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
|
||
* `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
|
||
* `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
|
||
* `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
|
||
* `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
|
||
* `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
|
||
* `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
|
||
* `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
|
||
* `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
|
||
* `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
|
||
* `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
|
||
* `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
|
||
* `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
|
||
* `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
|
||
* `upperFirst`, `value`, and `words`
|
||
*
|
||
* @name _
|
||
* @constructor
|
||
* @category Seq
|
||
* @param {*} value The value to wrap in a `lodash` instance.
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* var wrapped = _([1, 2, 3]);
|
||
*
|
||
* // Returns an unwrapped value.
|
||
* wrapped.reduce(_.add);
|
||
* // => 6
|
||
*
|
||
* // Returns a wrapped value.
|
||
* var squares = wrapped.map(square);
|
||
*
|
||
* _.isArray(squares);
|
||
* // => false
|
||
*
|
||
* _.isArray(squares.value());
|
||
* // => true
|
||
*/
|
||
function lodash(value) {
|
||
if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
|
||
if (value instanceof LodashWrapper) {
|
||
return value;
|
||
}
|
||
if (hasOwnProperty.call(value, '__wrapped__')) {
|
||
return wrapperClone(value);
|
||
}
|
||
}
|
||
return new LodashWrapper(value);
|
||
}
|
||
|
||
/**
|
||
* The function whose prototype chain sequence wrappers inherit from.
|
||
*
|
||
* @private
|
||
*/
|
||
function baseLodash() {
|
||
// No operation performed.
|
||
}
|
||
|
||
/**
|
||
* The base constructor for creating `lodash` wrapper objects.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to wrap.
|
||
* @param {boolean} [chainAll] Enable explicit method chain sequences.
|
||
*/
|
||
function LodashWrapper(value, chainAll) {
|
||
this.__wrapped__ = value;
|
||
this.__actions__ = [];
|
||
this.__chain__ = !!chainAll;
|
||
this.__index__ = 0;
|
||
this.__values__ = undefined;
|
||
}
|
||
|
||
/**
|
||
* By default, the template delimiters used by lodash are like those in
|
||
* embedded Ruby (ERB). Change the following template settings to use
|
||
* alternative delimiters.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @type {Object}
|
||
*/
|
||
lodash.templateSettings = {
|
||
|
||
/**
|
||
* Used to detect `data` property values to be HTML-escaped.
|
||
*
|
||
* @memberOf _.templateSettings
|
||
* @type {RegExp}
|
||
*/
|
||
'escape': reEscape,
|
||
|
||
/**
|
||
* Used to detect code to be evaluated.
|
||
*
|
||
* @memberOf _.templateSettings
|
||
* @type {RegExp}
|
||
*/
|
||
'evaluate': reEvaluate,
|
||
|
||
/**
|
||
* Used to detect `data` property values to inject.
|
||
*
|
||
* @memberOf _.templateSettings
|
||
* @type {RegExp}
|
||
*/
|
||
'interpolate': reInterpolate,
|
||
|
||
/**
|
||
* Used to reference the data object in the template text.
|
||
*
|
||
* @memberOf _.templateSettings
|
||
* @type {string}
|
||
*/
|
||
'variable': '',
|
||
|
||
/**
|
||
* Used to import variables into the compiled template.
|
||
*
|
||
* @memberOf _.templateSettings
|
||
* @type {Object}
|
||
*/
|
||
'imports': {
|
||
|
||
/**
|
||
* A reference to the `lodash` function.
|
||
*
|
||
* @memberOf _.templateSettings.imports
|
||
* @type {Function}
|
||
*/
|
||
'_': lodash
|
||
}
|
||
};
|
||
|
||
// Ensure wrappers are instances of `baseLodash`.
|
||
lodash.prototype = baseLodash.prototype;
|
||
lodash.prototype.constructor = lodash;
|
||
|
||
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
|
||
LodashWrapper.prototype.constructor = LodashWrapper;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {*} value The value to wrap.
|
||
*/
|
||
function LazyWrapper(value) {
|
||
this.__wrapped__ = value;
|
||
this.__actions__ = [];
|
||
this.__dir__ = 1;
|
||
this.__filtered__ = false;
|
||
this.__iteratees__ = [];
|
||
this.__takeCount__ = MAX_ARRAY_LENGTH;
|
||
this.__views__ = [];
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of the lazy wrapper object.
|
||
*
|
||
* @private
|
||
* @name clone
|
||
* @memberOf LazyWrapper
|
||
* @returns {Object} Returns the cloned `LazyWrapper` object.
|
||
*/
|
||
function lazyClone() {
|
||
var result = new LazyWrapper(this.__wrapped__);
|
||
result.__actions__ = copyArray(this.__actions__);
|
||
result.__dir__ = this.__dir__;
|
||
result.__filtered__ = this.__filtered__;
|
||
result.__iteratees__ = copyArray(this.__iteratees__);
|
||
result.__takeCount__ = this.__takeCount__;
|
||
result.__views__ = copyArray(this.__views__);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Reverses the direction of lazy iteration.
|
||
*
|
||
* @private
|
||
* @name reverse
|
||
* @memberOf LazyWrapper
|
||
* @returns {Object} Returns the new reversed `LazyWrapper` object.
|
||
*/
|
||
function lazyReverse() {
|
||
if (this.__filtered__) {
|
||
var result = new LazyWrapper(this);
|
||
result.__dir__ = -1;
|
||
result.__filtered__ = true;
|
||
} else {
|
||
result = this.clone();
|
||
result.__dir__ *= -1;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Extracts the unwrapped value from its lazy wrapper.
|
||
*
|
||
* @private
|
||
* @name value
|
||
* @memberOf LazyWrapper
|
||
* @returns {*} Returns the unwrapped value.
|
||
*/
|
||
function lazyValue() {
|
||
var array = this.__wrapped__.value(),
|
||
dir = this.__dir__,
|
||
isArr = isArray(array),
|
||
isRight = dir < 0,
|
||
arrLength = isArr ? array.length : 0,
|
||
view = getView(0, arrLength, this.__views__),
|
||
start = view.start,
|
||
end = view.end,
|
||
length = end - start,
|
||
index = isRight ? end : (start - 1),
|
||
iteratees = this.__iteratees__,
|
||
iterLength = iteratees.length,
|
||
resIndex = 0,
|
||
takeCount = nativeMin(length, this.__takeCount__);
|
||
|
||
if (!isArr || arrLength < LARGE_ARRAY_SIZE ||
|
||
(arrLength == length && takeCount == length)) {
|
||
return baseWrapperValue(array, this.__actions__);
|
||
}
|
||
var result = [];
|
||
|
||
outer:
|
||
while (length-- && resIndex < takeCount) {
|
||
index += dir;
|
||
|
||
var iterIndex = -1,
|
||
value = array[index];
|
||
|
||
while (++iterIndex < iterLength) {
|
||
var data = iteratees[iterIndex],
|
||
iteratee = data.iteratee,
|
||
type = data.type,
|
||
computed = iteratee(value);
|
||
|
||
if (type == LAZY_MAP_FLAG) {
|
||
value = computed;
|
||
} else if (!computed) {
|
||
if (type == LAZY_FILTER_FLAG) {
|
||
continue outer;
|
||
} else {
|
||
break outer;
|
||
}
|
||
}
|
||
}
|
||
result[resIndex++] = value;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
// Ensure `LazyWrapper` is an instance of `baseLodash`.
|
||
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
|
||
LazyWrapper.prototype.constructor = LazyWrapper;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a hash object.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {Array} [entries] The key-value pairs to cache.
|
||
*/
|
||
function Hash(entries) {
|
||
var index = -1,
|
||
length = entries ? entries.length : 0;
|
||
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes all key-value entries from the hash.
|
||
*
|
||
* @private
|
||
* @name clear
|
||
* @memberOf Hash
|
||
*/
|
||
function hashClear() {
|
||
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
||
}
|
||
|
||
/**
|
||
* Removes `key` and its value from the hash.
|
||
*
|
||
* @private
|
||
* @name delete
|
||
* @memberOf Hash
|
||
* @param {Object} hash The hash to modify.
|
||
* @param {string} key The key of the value to remove.
|
||
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
||
*/
|
||
function hashDelete(key) {
|
||
return this.has(key) && delete this.__data__[key];
|
||
}
|
||
|
||
/**
|
||
* Gets the hash value for `key`.
|
||
*
|
||
* @private
|
||
* @name get
|
||
* @memberOf Hash
|
||
* @param {string} key The key of the value to get.
|
||
* @returns {*} Returns the entry value.
|
||
*/
|
||
function hashGet(key) {
|
||
var data = this.__data__;
|
||
if (nativeCreate) {
|
||
var result = data[key];
|
||
return result === HASH_UNDEFINED ? undefined : result;
|
||
}
|
||
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
||
}
|
||
|
||
/**
|
||
* Checks if a hash value for `key` exists.
|
||
*
|
||
* @private
|
||
* @name has
|
||
* @memberOf Hash
|
||
* @param {string} key The key of the entry to check.
|
||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||
*/
|
||
function hashHas(key) {
|
||
var data = this.__data__;
|
||
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
||
}
|
||
|
||
/**
|
||
* Sets the hash `key` to `value`.
|
||
*
|
||
* @private
|
||
* @name set
|
||
* @memberOf Hash
|
||
* @param {string} key The key of the value to set.
|
||
* @param {*} value The value to set.
|
||
* @returns {Object} Returns the hash instance.
|
||
*/
|
||
function hashSet(key, value) {
|
||
var data = this.__data__;
|
||
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
||
return this;
|
||
}
|
||
|
||
// Add methods to `Hash`.
|
||
Hash.prototype.clear = hashClear;
|
||
Hash.prototype['delete'] = hashDelete;
|
||
Hash.prototype.get = hashGet;
|
||
Hash.prototype.has = hashHas;
|
||
Hash.prototype.set = hashSet;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates an list cache object.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {Array} [entries] The key-value pairs to cache.
|
||
*/
|
||
function ListCache(entries) {
|
||
var index = -1,
|
||
length = entries ? entries.length : 0;
|
||
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes all key-value entries from the list cache.
|
||
*
|
||
* @private
|
||
* @name clear
|
||
* @memberOf ListCache
|
||
*/
|
||
function listCacheClear() {
|
||
this.__data__ = [];
|
||
}
|
||
|
||
/**
|
||
* Removes `key` and its value from the list cache.
|
||
*
|
||
* @private
|
||
* @name delete
|
||
* @memberOf ListCache
|
||
* @param {string} key The key of the value to remove.
|
||
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
||
*/
|
||
function listCacheDelete(key) {
|
||
var data = this.__data__,
|
||
index = assocIndexOf(data, key);
|
||
|
||
if (index < 0) {
|
||
return false;
|
||
}
|
||
var lastIndex = data.length - 1;
|
||
if (index == lastIndex) {
|
||
data.pop();
|
||
} else {
|
||
splice.call(data, index, 1);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Gets the list cache value for `key`.
|
||
*
|
||
* @private
|
||
* @name get
|
||
* @memberOf ListCache
|
||
* @param {string} key The key of the value to get.
|
||
* @returns {*} Returns the entry value.
|
||
*/
|
||
function listCacheGet(key) {
|
||
var data = this.__data__,
|
||
index = assocIndexOf(data, key);
|
||
|
||
return index < 0 ? undefined : data[index][1];
|
||
}
|
||
|
||
/**
|
||
* Checks if a list cache value for `key` exists.
|
||
*
|
||
* @private
|
||
* @name has
|
||
* @memberOf ListCache
|
||
* @param {string} key The key of the entry to check.
|
||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||
*/
|
||
function listCacheHas(key) {
|
||
return assocIndexOf(this.__data__, key) > -1;
|
||
}
|
||
|
||
/**
|
||
* Sets the list cache `key` to `value`.
|
||
*
|
||
* @private
|
||
* @name set
|
||
* @memberOf ListCache
|
||
* @param {string} key The key of the value to set.
|
||
* @param {*} value The value to set.
|
||
* @returns {Object} Returns the list cache instance.
|
||
*/
|
||
function listCacheSet(key, value) {
|
||
var data = this.__data__,
|
||
index = assocIndexOf(data, key);
|
||
|
||
if (index < 0) {
|
||
data.push([key, value]);
|
||
} else {
|
||
data[index][1] = value;
|
||
}
|
||
return this;
|
||
}
|
||
|
||
// Add methods to `ListCache`.
|
||
ListCache.prototype.clear = listCacheClear;
|
||
ListCache.prototype['delete'] = listCacheDelete;
|
||
ListCache.prototype.get = listCacheGet;
|
||
ListCache.prototype.has = listCacheHas;
|
||
ListCache.prototype.set = listCacheSet;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a map cache object to store key-value pairs.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {Array} [entries] The key-value pairs to cache.
|
||
*/
|
||
function MapCache(entries) {
|
||
var index = -1,
|
||
length = entries ? entries.length : 0;
|
||
|
||
this.clear();
|
||
while (++index < length) {
|
||
var entry = entries[index];
|
||
this.set(entry[0], entry[1]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes all key-value entries from the map.
|
||
*
|
||
* @private
|
||
* @name clear
|
||
* @memberOf MapCache
|
||
*/
|
||
function mapCacheClear() {
|
||
this.__data__ = {
|
||
'hash': new Hash,
|
||
'map': new (Map || ListCache),
|
||
'string': new Hash
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Removes `key` and its value from the map.
|
||
*
|
||
* @private
|
||
* @name delete
|
||
* @memberOf MapCache
|
||
* @param {string} key The key of the value to remove.
|
||
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
||
*/
|
||
function mapCacheDelete(key) {
|
||
return getMapData(this, key)['delete'](key);
|
||
}
|
||
|
||
/**
|
||
* Gets the map value for `key`.
|
||
*
|
||
* @private
|
||
* @name get
|
||
* @memberOf MapCache
|
||
* @param {string} key The key of the value to get.
|
||
* @returns {*} Returns the entry value.
|
||
*/
|
||
function mapCacheGet(key) {
|
||
return getMapData(this, key).get(key);
|
||
}
|
||
|
||
/**
|
||
* Checks if a map value for `key` exists.
|
||
*
|
||
* @private
|
||
* @name has
|
||
* @memberOf MapCache
|
||
* @param {string} key The key of the entry to check.
|
||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||
*/
|
||
function mapCacheHas(key) {
|
||
return getMapData(this, key).has(key);
|
||
}
|
||
|
||
/**
|
||
* Sets the map `key` to `value`.
|
||
*
|
||
* @private
|
||
* @name set
|
||
* @memberOf MapCache
|
||
* @param {string} key The key of the value to set.
|
||
* @param {*} value The value to set.
|
||
* @returns {Object} Returns the map cache instance.
|
||
*/
|
||
function mapCacheSet(key, value) {
|
||
getMapData(this, key).set(key, value);
|
||
return this;
|
||
}
|
||
|
||
// Add methods to `MapCache`.
|
||
MapCache.prototype.clear = mapCacheClear;
|
||
MapCache.prototype['delete'] = mapCacheDelete;
|
||
MapCache.prototype.get = mapCacheGet;
|
||
MapCache.prototype.has = mapCacheHas;
|
||
MapCache.prototype.set = mapCacheSet;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
*
|
||
* Creates an array cache object to store unique values.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {Array} [values] The values to cache.
|
||
*/
|
||
function SetCache(values) {
|
||
var index = -1,
|
||
length = values ? values.length : 0;
|
||
|
||
this.__data__ = new MapCache;
|
||
while (++index < length) {
|
||
this.add(values[index]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Adds `value` to the array cache.
|
||
*
|
||
* @private
|
||
* @name add
|
||
* @memberOf SetCache
|
||
* @alias push
|
||
* @param {*} value The value to cache.
|
||
* @returns {Object} Returns the cache instance.
|
||
*/
|
||
function setCacheAdd(value) {
|
||
this.__data__.set(value, HASH_UNDEFINED);
|
||
return this;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is in the array cache.
|
||
*
|
||
* @private
|
||
* @name has
|
||
* @memberOf SetCache
|
||
* @param {*} value The value to search for.
|
||
* @returns {number} Returns `true` if `value` is found, else `false`.
|
||
*/
|
||
function setCacheHas(value) {
|
||
return this.__data__.has(value);
|
||
}
|
||
|
||
// Add methods to `SetCache`.
|
||
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
||
SetCache.prototype.has = setCacheHas;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a stack cache object to store key-value pairs.
|
||
*
|
||
* @private
|
||
* @constructor
|
||
* @param {Array} [entries] The key-value pairs to cache.
|
||
*/
|
||
function Stack(entries) {
|
||
this.__data__ = new ListCache(entries);
|
||
}
|
||
|
||
/**
|
||
* Removes all key-value entries from the stack.
|
||
*
|
||
* @private
|
||
* @name clear
|
||
* @memberOf Stack
|
||
*/
|
||
function stackClear() {
|
||
this.__data__ = new ListCache;
|
||
}
|
||
|
||
/**
|
||
* Removes `key` and its value from the stack.
|
||
*
|
||
* @private
|
||
* @name delete
|
||
* @memberOf Stack
|
||
* @param {string} key The key of the value to remove.
|
||
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
||
*/
|
||
function stackDelete(key) {
|
||
return this.__data__['delete'](key);
|
||
}
|
||
|
||
/**
|
||
* Gets the stack value for `key`.
|
||
*
|
||
* @private
|
||
* @name get
|
||
* @memberOf Stack
|
||
* @param {string} key The key of the value to get.
|
||
* @returns {*} Returns the entry value.
|
||
*/
|
||
function stackGet(key) {
|
||
return this.__data__.get(key);
|
||
}
|
||
|
||
/**
|
||
* Checks if a stack value for `key` exists.
|
||
*
|
||
* @private
|
||
* @name has
|
||
* @memberOf Stack
|
||
* @param {string} key The key of the entry to check.
|
||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||
*/
|
||
function stackHas(key) {
|
||
return this.__data__.has(key);
|
||
}
|
||
|
||
/**
|
||
* Sets the stack `key` to `value`.
|
||
*
|
||
* @private
|
||
* @name set
|
||
* @memberOf Stack
|
||
* @param {string} key The key of the value to set.
|
||
* @param {*} value The value to set.
|
||
* @returns {Object} Returns the stack cache instance.
|
||
*/
|
||
function stackSet(key, value) {
|
||
var cache = this.__data__;
|
||
if (cache instanceof ListCache) {
|
||
var pairs = cache.__data__;
|
||
if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
|
||
pairs.push([key, value]);
|
||
return this;
|
||
}
|
||
cache = this.__data__ = new MapCache(pairs);
|
||
}
|
||
cache.set(key, value);
|
||
return this;
|
||
}
|
||
|
||
// Add methods to `Stack`.
|
||
Stack.prototype.clear = stackClear;
|
||
Stack.prototype['delete'] = stackDelete;
|
||
Stack.prototype.get = stackGet;
|
||
Stack.prototype.has = stackHas;
|
||
Stack.prototype.set = stackSet;
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Used by `_.defaults` to customize its `_.assignIn` use.
|
||
*
|
||
* @private
|
||
* @param {*} objValue The destination value.
|
||
* @param {*} srcValue The source value.
|
||
* @param {string} key The key of the property to assign.
|
||
* @param {Object} object The parent object of `objValue`.
|
||
* @returns {*} Returns the value to assign.
|
||
*/
|
||
function assignInDefaults(objValue, srcValue, key, object) {
|
||
if (objValue === undefined ||
|
||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
|
||
return srcValue;
|
||
}
|
||
return objValue;
|
||
}
|
||
|
||
/**
|
||
* This function is like `assignValue` except that it doesn't assign
|
||
* `undefined` values.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to modify.
|
||
* @param {string} key The key of the property to assign.
|
||
* @param {*} value The value to assign.
|
||
*/
|
||
function assignMergeValue(object, key, value) {
|
||
if ((value !== undefined && !eq(object[key], value)) ||
|
||
(typeof key == 'number' && value === undefined && !(key in object))) {
|
||
object[key] = value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Assigns `value` to `key` of `object` if the existing value is not equivalent
|
||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to modify.
|
||
* @param {string} key The key of the property to assign.
|
||
* @param {*} value The value to assign.
|
||
*/
|
||
function assignValue(object, key, value) {
|
||
var objValue = object[key];
|
||
if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
|
||
(value === undefined && !(key in object))) {
|
||
object[key] = value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to search.
|
||
* @param {*} key The key to search for.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
*/
|
||
function assocIndexOf(array, key) {
|
||
var length = array.length;
|
||
while (length--) {
|
||
if (eq(array[length][0], key)) {
|
||
return length;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* Aggregates elements of `collection` on `accumulator` with keys transformed
|
||
* by `iteratee` and values set by `setter`.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} setter The function to set `accumulator` values.
|
||
* @param {Function} iteratee The iteratee to transform keys.
|
||
* @param {Object} accumulator The initial aggregated object.
|
||
* @returns {Function} Returns `accumulator`.
|
||
*/
|
||
function baseAggregator(collection, setter, iteratee, accumulator) {
|
||
baseEach(collection, function(value, key, collection) {
|
||
setter(accumulator, value, iteratee(value), collection);
|
||
});
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.assign` without support for multiple sources
|
||
* or `customizer` functions.
|
||
*
|
||
* @private
|
||
* @param {Object} object The destination object.
|
||
* @param {Object} source The source object.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function baseAssign(object, source) {
|
||
return object && copyObject(source, keys(source), object);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.at` without support for individual paths.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {string[]} paths The property paths of elements to pick.
|
||
* @returns {Array} Returns the picked elements.
|
||
*/
|
||
function baseAt(object, paths) {
|
||
var index = -1,
|
||
isNil = object == null,
|
||
length = paths.length,
|
||
result = Array(length);
|
||
|
||
while (++index < length) {
|
||
result[index] = isNil ? undefined : get(object, paths[index]);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.clamp` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {number} number The number to clamp.
|
||
* @param {number} [lower] The lower bound.
|
||
* @param {number} upper The upper bound.
|
||
* @returns {number} Returns the clamped number.
|
||
*/
|
||
function baseClamp(number, lower, upper) {
|
||
if (number === number) {
|
||
if (upper !== undefined) {
|
||
number = number <= upper ? number : upper;
|
||
}
|
||
if (lower !== undefined) {
|
||
number = number >= lower ? number : lower;
|
||
}
|
||
}
|
||
return number;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.clone` and `_.cloneDeep` which tracks
|
||
* traversed objects.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to clone.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @param {boolean} [isFull] Specify a clone including symbols.
|
||
* @param {Function} [customizer] The function to customize cloning.
|
||
* @param {string} [key] The key of `value`.
|
||
* @param {Object} [object] The parent object of `value`.
|
||
* @param {Object} [stack] Tracks traversed objects and their clone counterparts.
|
||
* @returns {*} Returns the cloned value.
|
||
*/
|
||
function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
|
||
var result;
|
||
if (customizer) {
|
||
result = object ? customizer(value, key, object, stack) : customizer(value);
|
||
}
|
||
if (result !== undefined) {
|
||
return result;
|
||
}
|
||
if (!isObject(value)) {
|
||
return value;
|
||
}
|
||
var isArr = isArray(value);
|
||
if (isArr) {
|
||
result = initCloneArray(value);
|
||
if (!isDeep) {
|
||
return copyArray(value, result);
|
||
}
|
||
} else {
|
||
var tag = getTag(value),
|
||
isFunc = tag == funcTag || tag == genTag;
|
||
|
||
if (isBuffer(value)) {
|
||
return cloneBuffer(value, isDeep);
|
||
}
|
||
if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
|
||
if (isHostObject(value)) {
|
||
return object ? value : {};
|
||
}
|
||
result = initCloneObject(isFunc ? {} : value);
|
||
if (!isDeep) {
|
||
return copySymbols(value, baseAssign(result, value));
|
||
}
|
||
} else {
|
||
if (!cloneableTags[tag]) {
|
||
return object ? value : {};
|
||
}
|
||
result = initCloneByTag(value, tag, baseClone, isDeep);
|
||
}
|
||
}
|
||
// Check for circular references and return its corresponding clone.
|
||
stack || (stack = new Stack);
|
||
var stacked = stack.get(value);
|
||
if (stacked) {
|
||
return stacked;
|
||
}
|
||
stack.set(value, result);
|
||
|
||
if (!isArr) {
|
||
var props = isFull ? getAllKeys(value) : keys(value);
|
||
}
|
||
arrayEach(props || value, function(subValue, key) {
|
||
if (props) {
|
||
key = subValue;
|
||
subValue = value[key];
|
||
}
|
||
// Recursively populate clone (susceptible to call stack limits).
|
||
assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.conforms` which doesn't clone `source`.
|
||
*
|
||
* @private
|
||
* @param {Object} source The object of property predicates to conform to.
|
||
* @returns {Function} Returns the new spec function.
|
||
*/
|
||
function baseConforms(source) {
|
||
var props = keys(source);
|
||
return function(object) {
|
||
return baseConformsTo(object, source, props);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.conformsTo` which accepts `props` to check.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Object} source The object of property predicates to conform to.
|
||
* @returns {boolean} Returns `true` if `object` conforms, else `false`.
|
||
*/
|
||
function baseConformsTo(object, source, props) {
|
||
var length = props.length;
|
||
if (object == null) {
|
||
return !length;
|
||
}
|
||
var index = length;
|
||
while (index--) {
|
||
var key = props[index],
|
||
predicate = source[key],
|
||
value = object[key];
|
||
|
||
if ((value === undefined &&
|
||
!(key in Object(object))) || !predicate(value)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.create` without support for assigning
|
||
* properties to the created object.
|
||
*
|
||
* @private
|
||
* @param {Object} prototype The object to inherit from.
|
||
* @returns {Object} Returns the new object.
|
||
*/
|
||
function baseCreate(proto) {
|
||
return isObject(proto) ? objectCreate(proto) : {};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.delay` and `_.defer` which accepts `args`
|
||
* to provide to `func`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to delay.
|
||
* @param {number} wait The number of milliseconds to delay invocation.
|
||
* @param {Array} args The arguments to provide to `func`.
|
||
* @returns {number} Returns the timer id.
|
||
*/
|
||
function baseDelay(func, wait, args) {
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
return setTimeout(function() { func.apply(undefined, args); }, wait);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.difference` without support
|
||
* for excluding multiple arrays or iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Array} values The values to exclude.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
*/
|
||
function baseDifference(array, values, iteratee, comparator) {
|
||
var index = -1,
|
||
includes = arrayIncludes,
|
||
isCommon = true,
|
||
length = array.length,
|
||
result = [],
|
||
valuesLength = values.length;
|
||
|
||
if (!length) {
|
||
return result;
|
||
}
|
||
if (iteratee) {
|
||
values = arrayMap(values, baseUnary(iteratee));
|
||
}
|
||
if (comparator) {
|
||
includes = arrayIncludesWith;
|
||
isCommon = false;
|
||
}
|
||
else if (values.length >= LARGE_ARRAY_SIZE) {
|
||
includes = cacheHas;
|
||
isCommon = false;
|
||
values = new SetCache(values);
|
||
}
|
||
outer:
|
||
while (++index < length) {
|
||
var value = array[index],
|
||
computed = iteratee ? iteratee(value) : value;
|
||
|
||
value = (comparator || value !== 0) ? value : 0;
|
||
if (isCommon && computed === computed) {
|
||
var valuesIndex = valuesLength;
|
||
while (valuesIndex--) {
|
||
if (values[valuesIndex] === computed) {
|
||
continue outer;
|
||
}
|
||
}
|
||
result.push(value);
|
||
}
|
||
else if (!includes(values, computed, comparator)) {
|
||
result.push(value);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.forEach` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array|Object} Returns `collection`.
|
||
*/
|
||
var baseEach = createBaseEach(baseForOwn);
|
||
|
||
/**
|
||
* The base implementation of `_.forEachRight` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array|Object} Returns `collection`.
|
||
*/
|
||
var baseEachRight = createBaseEach(baseForOwnRight, true);
|
||
|
||
/**
|
||
* The base implementation of `_.every` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||
* else `false`
|
||
*/
|
||
function baseEvery(collection, predicate) {
|
||
var result = true;
|
||
baseEach(collection, function(value, index, collection) {
|
||
result = !!predicate(value, index, collection);
|
||
return result;
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.max` and `_.min` which accepts a
|
||
* `comparator` to determine the extremum value.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} iteratee The iteratee invoked per iteration.
|
||
* @param {Function} comparator The comparator used to compare values.
|
||
* @returns {*} Returns the extremum value.
|
||
*/
|
||
function baseExtremum(array, iteratee, comparator) {
|
||
var index = -1,
|
||
length = array.length;
|
||
|
||
while (++index < length) {
|
||
var value = array[index],
|
||
current = iteratee(value);
|
||
|
||
if (current != null && (computed === undefined
|
||
? (current === current && !isSymbol(current))
|
||
: comparator(current, computed)
|
||
)) {
|
||
var computed = current,
|
||
result = value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.fill` without an iteratee call guard.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to fill.
|
||
* @param {*} value The value to fill `array` with.
|
||
* @param {number} [start=0] The start position.
|
||
* @param {number} [end=array.length] The end position.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function baseFill(array, value, start, end) {
|
||
var length = array.length;
|
||
|
||
start = toInteger(start);
|
||
if (start < 0) {
|
||
start = -start > length ? 0 : (length + start);
|
||
}
|
||
end = (end === undefined || end > length) ? length : toInteger(end);
|
||
if (end < 0) {
|
||
end += length;
|
||
}
|
||
end = start > end ? 0 : toLength(end);
|
||
while (start < end) {
|
||
array[start++] = value;
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.filter` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {Array} Returns the new filtered array.
|
||
*/
|
||
function baseFilter(collection, predicate) {
|
||
var result = [];
|
||
baseEach(collection, function(value, index, collection) {
|
||
if (predicate(value, index, collection)) {
|
||
result.push(value);
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.flatten` with support for restricting flattening.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to flatten.
|
||
* @param {number} depth The maximum recursion depth.
|
||
* @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
|
||
* @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
|
||
* @param {Array} [result=[]] The initial result value.
|
||
* @returns {Array} Returns the new flattened array.
|
||
*/
|
||
function baseFlatten(array, depth, predicate, isStrict, result) {
|
||
var index = -1,
|
||
length = array.length;
|
||
|
||
predicate || (predicate = isFlattenable);
|
||
result || (result = []);
|
||
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
if (depth > 0 && predicate(value)) {
|
||
if (depth > 1) {
|
||
// Recursively flatten arrays (susceptible to call stack limits).
|
||
baseFlatten(value, depth - 1, predicate, isStrict, result);
|
||
} else {
|
||
arrayPush(result, value);
|
||
}
|
||
} else if (!isStrict) {
|
||
result[result.length] = value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `baseForOwn` which iterates over `object`
|
||
* properties returned by `keysFunc` and invokes `iteratee` for each property.
|
||
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @param {Function} keysFunc The function to get the keys of `object`.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
var baseFor = createBaseFor();
|
||
|
||
/**
|
||
* This function is like `baseFor` except that it iterates over properties
|
||
* in the opposite order.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @param {Function} keysFunc The function to get the keys of `object`.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
var baseForRight = createBaseFor(true);
|
||
|
||
/**
|
||
* The base implementation of `_.forOwn` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function baseForOwn(object, iteratee) {
|
||
return object && baseFor(object, iteratee, keys);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.forOwnRight` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function baseForOwnRight(object, iteratee) {
|
||
return object && baseForRight(object, iteratee, keys);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.functions` which creates an array of
|
||
* `object` function property names filtered from `props`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Array} props The property names to filter.
|
||
* @returns {Array} Returns the function names.
|
||
*/
|
||
function baseFunctions(object, props) {
|
||
return arrayFilter(props, function(key) {
|
||
return isFunction(object[key]);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.get` without support for default values.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the property to get.
|
||
* @returns {*} Returns the resolved value.
|
||
*/
|
||
function baseGet(object, path) {
|
||
path = isKey(path, object) ? [path] : castPath(path);
|
||
|
||
var index = 0,
|
||
length = path.length;
|
||
|
||
while (object != null && index < length) {
|
||
object = object[toKey(path[index++])];
|
||
}
|
||
return (index && index == length) ? object : undefined;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
|
||
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
|
||
* symbols of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Function} keysFunc The function to get the keys of `object`.
|
||
* @param {Function} symbolsFunc The function to get the symbols of `object`.
|
||
* @returns {Array} Returns the array of property names and symbols.
|
||
*/
|
||
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
|
||
var result = keysFunc(object);
|
||
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `getTag`.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to query.
|
||
* @returns {string} Returns the `toStringTag`.
|
||
*/
|
||
function baseGetTag(value) {
|
||
return objectToString.call(value);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.gt` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is greater than `other`,
|
||
* else `false`.
|
||
*/
|
||
function baseGt(value, other) {
|
||
return value > other;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.has` without support for deep paths.
|
||
*
|
||
* @private
|
||
* @param {Object} [object] The object to query.
|
||
* @param {Array|string} key The key to check.
|
||
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||
*/
|
||
function baseHas(object, key) {
|
||
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
|
||
// that are composed entirely of index properties, return `false` for
|
||
// `hasOwnProperty` checks of them.
|
||
return object != null &&
|
||
(hasOwnProperty.call(object, key) ||
|
||
(typeof object == 'object' && key in object && getPrototype(object) === null));
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.hasIn` without support for deep paths.
|
||
*
|
||
* @private
|
||
* @param {Object} [object] The object to query.
|
||
* @param {Array|string} key The key to check.
|
||
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||
*/
|
||
function baseHasIn(object, key) {
|
||
return object != null && key in Object(object);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.inRange` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {number} number The number to check.
|
||
* @param {number} start The start of the range.
|
||
* @param {number} end The end of the range.
|
||
* @returns {boolean} Returns `true` if `number` is in the range, else `false`.
|
||
*/
|
||
function baseInRange(number, start, end) {
|
||
return number >= nativeMin(start, end) && number < nativeMax(start, end);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.intersection`, without support
|
||
* for iteratee shorthands, that accepts an array of arrays to inspect.
|
||
*
|
||
* @private
|
||
* @param {Array} arrays The arrays to inspect.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of shared values.
|
||
*/
|
||
function baseIntersection(arrays, iteratee, comparator) {
|
||
var includes = comparator ? arrayIncludesWith : arrayIncludes,
|
||
length = arrays[0].length,
|
||
othLength = arrays.length,
|
||
othIndex = othLength,
|
||
caches = Array(othLength),
|
||
maxLength = Infinity,
|
||
result = [];
|
||
|
||
while (othIndex--) {
|
||
var array = arrays[othIndex];
|
||
if (othIndex && iteratee) {
|
||
array = arrayMap(array, baseUnary(iteratee));
|
||
}
|
||
maxLength = nativeMin(array.length, maxLength);
|
||
caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
|
||
? new SetCache(othIndex && array)
|
||
: undefined;
|
||
}
|
||
array = arrays[0];
|
||
|
||
var index = -1,
|
||
seen = caches[0];
|
||
|
||
outer:
|
||
while (++index < length && result.length < maxLength) {
|
||
var value = array[index],
|
||
computed = iteratee ? iteratee(value) : value;
|
||
|
||
value = (comparator || value !== 0) ? value : 0;
|
||
if (!(seen
|
||
? cacheHas(seen, computed)
|
||
: includes(result, computed, comparator)
|
||
)) {
|
||
othIndex = othLength;
|
||
while (--othIndex) {
|
||
var cache = caches[othIndex];
|
||
if (!(cache
|
||
? cacheHas(cache, computed)
|
||
: includes(arrays[othIndex], computed, comparator))
|
||
) {
|
||
continue outer;
|
||
}
|
||
}
|
||
if (seen) {
|
||
seen.push(computed);
|
||
}
|
||
result.push(value);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.invert` and `_.invertBy` which inverts
|
||
* `object` with values transformed by `iteratee` and set by `setter`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} setter The function to set `accumulator` values.
|
||
* @param {Function} iteratee The iteratee to transform values.
|
||
* @param {Object} accumulator The initial inverted object.
|
||
* @returns {Function} Returns `accumulator`.
|
||
*/
|
||
function baseInverter(object, setter, iteratee, accumulator) {
|
||
baseForOwn(object, function(value, key, object) {
|
||
setter(accumulator, iteratee(value), key, object);
|
||
});
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.invoke` without support for individual
|
||
* method arguments.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the method to invoke.
|
||
* @param {Array} args The arguments to invoke the method with.
|
||
* @returns {*} Returns the result of the invoked method.
|
||
*/
|
||
function baseInvoke(object, path, args) {
|
||
if (!isKey(path, object)) {
|
||
path = castPath(path);
|
||
object = parent(object, path);
|
||
path = last(path);
|
||
}
|
||
var func = object == null ? object : object[toKey(path)];
|
||
return func == null ? undefined : apply(func, object, args);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isArrayBuffer` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
|
||
*/
|
||
function baseIsArrayBuffer(value) {
|
||
return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isDate` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a date object, else `false`.
|
||
*/
|
||
function baseIsDate(value) {
|
||
return isObjectLike(value) && objectToString.call(value) == dateTag;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isEqual` which supports partial comparisons
|
||
* and tracks traversed objects.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @param {Function} [customizer] The function to customize comparisons.
|
||
* @param {boolean} [bitmask] The bitmask of comparison flags.
|
||
* The bitmask may be composed of the following flags:
|
||
* 1 - Unordered comparison
|
||
* 2 - Partial comparison
|
||
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
|
||
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
||
*/
|
||
function baseIsEqual(value, other, customizer, bitmask, stack) {
|
||
if (value === other) {
|
||
return true;
|
||
}
|
||
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
|
||
return value !== value && other !== other;
|
||
}
|
||
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseIsEqual` for arrays and objects which performs
|
||
* deep comparisons and tracks traversed objects enabling objects with circular
|
||
* references to be compared.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to compare.
|
||
* @param {Object} other The other object to compare.
|
||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||
* @param {Function} [customizer] The function to customize comparisons.
|
||
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`
|
||
* for more details.
|
||
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
|
||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||
*/
|
||
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
|
||
var objIsArr = isArray(object),
|
||
othIsArr = isArray(other),
|
||
objTag = arrayTag,
|
||
othTag = arrayTag;
|
||
|
||
if (!objIsArr) {
|
||
objTag = getTag(object);
|
||
objTag = objTag == argsTag ? objectTag : objTag;
|
||
}
|
||
if (!othIsArr) {
|
||
othTag = getTag(other);
|
||
othTag = othTag == argsTag ? objectTag : othTag;
|
||
}
|
||
var objIsObj = objTag == objectTag && !isHostObject(object),
|
||
othIsObj = othTag == objectTag && !isHostObject(other),
|
||
isSameTag = objTag == othTag;
|
||
|
||
if (isSameTag && !objIsObj) {
|
||
stack || (stack = new Stack);
|
||
return (objIsArr || isTypedArray(object))
|
||
? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
|
||
: equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
|
||
}
|
||
if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
|
||
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
||
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
||
|
||
if (objIsWrapped || othIsWrapped) {
|
||
var objUnwrapped = objIsWrapped ? object.value() : object,
|
||
othUnwrapped = othIsWrapped ? other.value() : other;
|
||
|
||
stack || (stack = new Stack);
|
||
return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
|
||
}
|
||
}
|
||
if (!isSameTag) {
|
||
return false;
|
||
}
|
||
stack || (stack = new Stack);
|
||
return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isMap` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a map, else `false`.
|
||
*/
|
||
function baseIsMap(value) {
|
||
return isObjectLike(value) && getTag(value) == mapTag;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isMatch` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Object} source The object of property values to match.
|
||
* @param {Array} matchData The property names, values, and compare flags to match.
|
||
* @param {Function} [customizer] The function to customize comparisons.
|
||
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||
*/
|
||
function baseIsMatch(object, source, matchData, customizer) {
|
||
var index = matchData.length,
|
||
length = index,
|
||
noCustomizer = !customizer;
|
||
|
||
if (object == null) {
|
||
return !length;
|
||
}
|
||
object = Object(object);
|
||
while (index--) {
|
||
var data = matchData[index];
|
||
if ((noCustomizer && data[2])
|
||
? data[1] !== object[data[0]]
|
||
: !(data[0] in object)
|
||
) {
|
||
return false;
|
||
}
|
||
}
|
||
while (++index < length) {
|
||
data = matchData[index];
|
||
var key = data[0],
|
||
objValue = object[key],
|
||
srcValue = data[1];
|
||
|
||
if (noCustomizer && data[2]) {
|
||
if (objValue === undefined && !(key in object)) {
|
||
return false;
|
||
}
|
||
} else {
|
||
var stack = new Stack;
|
||
if (customizer) {
|
||
var result = customizer(objValue, srcValue, key, object, source, stack);
|
||
}
|
||
if (!(result === undefined
|
||
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
|
||
: result
|
||
)) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isNative` without bad shim checks.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a native function,
|
||
* else `false`.
|
||
*/
|
||
function baseIsNative(value) {
|
||
if (!isObject(value) || isMasked(value)) {
|
||
return false;
|
||
}
|
||
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
|
||
return pattern.test(toSource(value));
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isRegExp` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
|
||
*/
|
||
function baseIsRegExp(value) {
|
||
return isObject(value) && objectToString.call(value) == regexpTag;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isSet` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a set, else `false`.
|
||
*/
|
||
function baseIsSet(value) {
|
||
return isObjectLike(value) && getTag(value) == setTag;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.isTypedArray` without Node.js optimizations.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
||
*/
|
||
function baseIsTypedArray(value) {
|
||
return isObjectLike(value) &&
|
||
isLength(value.length) && !!typedArrayTags[objectToString.call(value)];
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.iteratee`.
|
||
*
|
||
* @private
|
||
* @param {*} [value=_.identity] The value to convert to an iteratee.
|
||
* @returns {Function} Returns the iteratee.
|
||
*/
|
||
function baseIteratee(value) {
|
||
// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
|
||
// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
|
||
if (typeof value == 'function') {
|
||
return value;
|
||
}
|
||
if (value == null) {
|
||
return identity;
|
||
}
|
||
if (typeof value == 'object') {
|
||
return isArray(value)
|
||
? baseMatchesProperty(value[0], value[1])
|
||
: baseMatches(value);
|
||
}
|
||
return property(value);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.keys` which doesn't skip the constructor
|
||
* property of prototypes or treat sparse arrays as dense.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names.
|
||
*/
|
||
var baseKeys = overArg(nativeKeys, Object);
|
||
|
||
/**
|
||
* The base implementation of `_.keysIn` which doesn't skip the constructor
|
||
* property of prototypes or treat sparse arrays as dense.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names.
|
||
*/
|
||
function baseKeysIn(object) {
|
||
object = object == null ? object : Object(object);
|
||
|
||
var result = [];
|
||
for (var key in object) {
|
||
result.push(key);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
// Fallback for IE < 9 with es6-shim.
|
||
if (enumerate && !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf')) {
|
||
baseKeysIn = function(object) {
|
||
return iteratorToArray(enumerate(object));
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.lt` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is less than `other`,
|
||
* else `false`.
|
||
*/
|
||
function baseLt(value, other) {
|
||
return value < other;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.map` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} iteratee The function invoked per iteration.
|
||
* @returns {Array} Returns the new mapped array.
|
||
*/
|
||
function baseMap(collection, iteratee) {
|
||
var index = -1,
|
||
result = isArrayLike(collection) ? Array(collection.length) : [];
|
||
|
||
baseEach(collection, function(value, key, collection) {
|
||
result[++index] = iteratee(value, key, collection);
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.matches` which doesn't clone `source`.
|
||
*
|
||
* @private
|
||
* @param {Object} source The object of property values to match.
|
||
* @returns {Function} Returns the new spec function.
|
||
*/
|
||
function baseMatches(source) {
|
||
var matchData = getMatchData(source);
|
||
if (matchData.length == 1 && matchData[0][2]) {
|
||
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
|
||
}
|
||
return function(object) {
|
||
return object === source || baseIsMatch(object, source, matchData);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
|
||
*
|
||
* @private
|
||
* @param {string} path The path of the property to get.
|
||
* @param {*} srcValue The value to match.
|
||
* @returns {Function} Returns the new spec function.
|
||
*/
|
||
function baseMatchesProperty(path, srcValue) {
|
||
if (isKey(path) && isStrictComparable(srcValue)) {
|
||
return matchesStrictComparable(toKey(path), srcValue);
|
||
}
|
||
return function(object) {
|
||
var objValue = get(object, path);
|
||
return (objValue === undefined && objValue === srcValue)
|
||
? hasIn(object, path)
|
||
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.merge` without support for multiple sources.
|
||
*
|
||
* @private
|
||
* @param {Object} object The destination object.
|
||
* @param {Object} source The source object.
|
||
* @param {number} srcIndex The index of `source`.
|
||
* @param {Function} [customizer] The function to customize merged values.
|
||
* @param {Object} [stack] Tracks traversed source values and their merged
|
||
* counterparts.
|
||
*/
|
||
function baseMerge(object, source, srcIndex, customizer, stack) {
|
||
if (object === source) {
|
||
return;
|
||
}
|
||
if (!(isArray(source) || isTypedArray(source))) {
|
||
var props = keysIn(source);
|
||
}
|
||
arrayEach(props || source, function(srcValue, key) {
|
||
if (props) {
|
||
key = srcValue;
|
||
srcValue = source[key];
|
||
}
|
||
if (isObject(srcValue)) {
|
||
stack || (stack = new Stack);
|
||
baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
|
||
}
|
||
else {
|
||
var newValue = customizer
|
||
? customizer(object[key], srcValue, (key + ''), object, source, stack)
|
||
: undefined;
|
||
|
||
if (newValue === undefined) {
|
||
newValue = srcValue;
|
||
}
|
||
assignMergeValue(object, key, newValue);
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseMerge` for arrays and objects which performs
|
||
* deep merges and tracks traversed objects enabling objects with circular
|
||
* references to be merged.
|
||
*
|
||
* @private
|
||
* @param {Object} object The destination object.
|
||
* @param {Object} source The source object.
|
||
* @param {string} key The key of the value to merge.
|
||
* @param {number} srcIndex The index of `source`.
|
||
* @param {Function} mergeFunc The function to merge values.
|
||
* @param {Function} [customizer] The function to customize assigned values.
|
||
* @param {Object} [stack] Tracks traversed source values and their merged
|
||
* counterparts.
|
||
*/
|
||
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
|
||
var objValue = object[key],
|
||
srcValue = source[key],
|
||
stacked = stack.get(srcValue);
|
||
|
||
if (stacked) {
|
||
assignMergeValue(object, key, stacked);
|
||
return;
|
||
}
|
||
var newValue = customizer
|
||
? customizer(objValue, srcValue, (key + ''), object, source, stack)
|
||
: undefined;
|
||
|
||
var isCommon = newValue === undefined;
|
||
|
||
if (isCommon) {
|
||
newValue = srcValue;
|
||
if (isArray(srcValue) || isTypedArray(srcValue)) {
|
||
if (isArray(objValue)) {
|
||
newValue = objValue;
|
||
}
|
||
else if (isArrayLikeObject(objValue)) {
|
||
newValue = copyArray(objValue);
|
||
}
|
||
else {
|
||
isCommon = false;
|
||
newValue = baseClone(srcValue, true);
|
||
}
|
||
}
|
||
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
|
||
if (isArguments(objValue)) {
|
||
newValue = toPlainObject(objValue);
|
||
}
|
||
else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
|
||
isCommon = false;
|
||
newValue = baseClone(srcValue, true);
|
||
}
|
||
else {
|
||
newValue = objValue;
|
||
}
|
||
}
|
||
else {
|
||
isCommon = false;
|
||
}
|
||
}
|
||
if (isCommon) {
|
||
// Recursively merge objects and arrays (susceptible to call stack limits).
|
||
stack.set(srcValue, newValue);
|
||
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
|
||
stack['delete'](srcValue);
|
||
}
|
||
assignMergeValue(object, key, newValue);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.nth` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to query.
|
||
* @param {number} n The index of the element to return.
|
||
* @returns {*} Returns the nth element of `array`.
|
||
*/
|
||
function baseNth(array, n) {
|
||
var length = array.length;
|
||
if (!length) {
|
||
return;
|
||
}
|
||
n += n < 0 ? length : 0;
|
||
return isIndex(n, length) ? array[n] : undefined;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.orderBy` without param guards.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
|
||
* @param {string[]} orders The sort orders of `iteratees`.
|
||
* @returns {Array} Returns the new sorted array.
|
||
*/
|
||
function baseOrderBy(collection, iteratees, orders) {
|
||
var index = -1;
|
||
iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
|
||
|
||
var result = baseMap(collection, function(value, key, collection) {
|
||
var criteria = arrayMap(iteratees, function(iteratee) {
|
||
return iteratee(value);
|
||
});
|
||
return { 'criteria': criteria, 'index': ++index, 'value': value };
|
||
});
|
||
|
||
return baseSortBy(result, function(object, other) {
|
||
return compareMultiple(object, other, orders);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.pick` without support for individual
|
||
* property identifiers.
|
||
*
|
||
* @private
|
||
* @param {Object} object The source object.
|
||
* @param {string[]} props The property identifiers to pick.
|
||
* @returns {Object} Returns the new object.
|
||
*/
|
||
function basePick(object, props) {
|
||
object = Object(object);
|
||
return basePickBy(object, props, function(value, key) {
|
||
return key in object;
|
||
});
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.pickBy` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Object} object The source object.
|
||
* @param {string[]} props The property identifiers to pick from.
|
||
* @param {Function} predicate The function invoked per property.
|
||
* @returns {Object} Returns the new object.
|
||
*/
|
||
function basePickBy(object, props, predicate) {
|
||
var index = -1,
|
||
length = props.length,
|
||
result = {};
|
||
|
||
while (++index < length) {
|
||
var key = props[index],
|
||
value = object[key];
|
||
|
||
if (predicate(value, key)) {
|
||
result[key] = value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseProperty` which supports deep paths.
|
||
*
|
||
* @private
|
||
* @param {Array|string} path The path of the property to get.
|
||
* @returns {Function} Returns the new accessor function.
|
||
*/
|
||
function basePropertyDeep(path) {
|
||
return function(object) {
|
||
return baseGet(object, path);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.pullAllBy` without support for iteratee
|
||
* shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to modify.
|
||
* @param {Array} values The values to remove.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function basePullAll(array, values, iteratee, comparator) {
|
||
var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
|
||
index = -1,
|
||
length = values.length,
|
||
seen = array;
|
||
|
||
if (array === values) {
|
||
values = copyArray(values);
|
||
}
|
||
if (iteratee) {
|
||
seen = arrayMap(array, baseUnary(iteratee));
|
||
}
|
||
while (++index < length) {
|
||
var fromIndex = 0,
|
||
value = values[index],
|
||
computed = iteratee ? iteratee(value) : value;
|
||
|
||
while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
|
||
if (seen !== array) {
|
||
splice.call(seen, fromIndex, 1);
|
||
}
|
||
splice.call(array, fromIndex, 1);
|
||
}
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.pullAt` without support for individual
|
||
* indexes or capturing the removed elements.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to modify.
|
||
* @param {number[]} indexes The indexes of elements to remove.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function basePullAt(array, indexes) {
|
||
var length = array ? indexes.length : 0,
|
||
lastIndex = length - 1;
|
||
|
||
while (length--) {
|
||
var index = indexes[length];
|
||
if (length == lastIndex || index !== previous) {
|
||
var previous = index;
|
||
if (isIndex(index)) {
|
||
splice.call(array, index, 1);
|
||
}
|
||
else if (!isKey(index, array)) {
|
||
var path = castPath(index),
|
||
object = parent(array, path);
|
||
|
||
if (object != null) {
|
||
delete object[toKey(last(path))];
|
||
}
|
||
}
|
||
else {
|
||
delete array[toKey(index)];
|
||
}
|
||
}
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.random` without support for returning
|
||
* floating-point numbers.
|
||
*
|
||
* @private
|
||
* @param {number} lower The lower bound.
|
||
* @param {number} upper The upper bound.
|
||
* @returns {number} Returns the random number.
|
||
*/
|
||
function baseRandom(lower, upper) {
|
||
return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.range` and `_.rangeRight` which doesn't
|
||
* coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {number} start The start of the range.
|
||
* @param {number} end The end of the range.
|
||
* @param {number} step The value to increment or decrement by.
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Array} Returns the range of numbers.
|
||
*/
|
||
function baseRange(start, end, step, fromRight) {
|
||
var index = -1,
|
||
length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
|
||
result = Array(length);
|
||
|
||
while (length--) {
|
||
result[fromRight ? length : ++index] = start;
|
||
start += step;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.repeat` which doesn't coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {string} string The string to repeat.
|
||
* @param {number} n The number of times to repeat the string.
|
||
* @returns {string} Returns the repeated string.
|
||
*/
|
||
function baseRepeat(string, n) {
|
||
var result = '';
|
||
if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
|
||
return result;
|
||
}
|
||
// Leverage the exponentiation by squaring algorithm for a faster repeat.
|
||
// See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
|
||
do {
|
||
if (n % 2) {
|
||
result += string;
|
||
}
|
||
n = nativeFloor(n / 2);
|
||
if (n) {
|
||
string += string;
|
||
}
|
||
} while (n);
|
||
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.rest` which doesn't validate or coerce arguments.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to apply a rest parameter to.
|
||
* @param {number} [start=func.length-1] The start position of the rest parameter.
|
||
* @returns {Function} Returns the new function.
|
||
*/
|
||
function baseRest(func, start) {
|
||
start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
|
||
return function() {
|
||
var args = arguments,
|
||
index = -1,
|
||
length = nativeMax(args.length - start, 0),
|
||
array = Array(length);
|
||
|
||
while (++index < length) {
|
||
array[index] = args[start + index];
|
||
}
|
||
index = -1;
|
||
var otherArgs = Array(start + 1);
|
||
while (++index < start) {
|
||
otherArgs[index] = args[index];
|
||
}
|
||
otherArgs[start] = array;
|
||
return apply(func, this, otherArgs);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.set`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the property to set.
|
||
* @param {*} value The value to set.
|
||
* @param {Function} [customizer] The function to customize path creation.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function baseSet(object, path, value, customizer) {
|
||
path = isKey(path, object) ? [path] : castPath(path);
|
||
|
||
var index = -1,
|
||
length = path.length,
|
||
lastIndex = length - 1,
|
||
nested = object;
|
||
|
||
while (nested != null && ++index < length) {
|
||
var key = toKey(path[index]);
|
||
if (isObject(nested)) {
|
||
var newValue = value;
|
||
if (index != lastIndex) {
|
||
var objValue = nested[key];
|
||
newValue = customizer ? customizer(objValue, key, nested) : undefined;
|
||
if (newValue === undefined) {
|
||
newValue = objValue == null
|
||
? (isIndex(path[index + 1]) ? [] : {})
|
||
: objValue;
|
||
}
|
||
}
|
||
assignValue(nested, key, newValue);
|
||
}
|
||
nested = nested[key];
|
||
}
|
||
return object;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `setData` without support for hot loop detection.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to associate metadata with.
|
||
* @param {*} data The metadata.
|
||
* @returns {Function} Returns `func`.
|
||
*/
|
||
var baseSetData = !metaMap ? identity : function(func, data) {
|
||
metaMap.set(func, data);
|
||
return func;
|
||
};
|
||
|
||
/**
|
||
* The base implementation of `_.slice` without an iteratee call guard.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to slice.
|
||
* @param {number} [start=0] The start position.
|
||
* @param {number} [end=array.length] The end position.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
*/
|
||
function baseSlice(array, start, end) {
|
||
var index = -1,
|
||
length = array.length;
|
||
|
||
if (start < 0) {
|
||
start = -start > length ? 0 : (length + start);
|
||
}
|
||
end = end > length ? length : end;
|
||
if (end < 0) {
|
||
end += length;
|
||
}
|
||
length = start > end ? 0 : ((end - start) >>> 0);
|
||
start >>>= 0;
|
||
|
||
var result = Array(length);
|
||
while (++index < length) {
|
||
result[index] = array[index + start];
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.some` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||
* else `false`.
|
||
*/
|
||
function baseSome(collection, predicate) {
|
||
var result;
|
||
|
||
baseEach(collection, function(value, index, collection) {
|
||
result = predicate(value, index, collection);
|
||
return !result;
|
||
});
|
||
return !!result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
|
||
* performs a binary search of `array` to determine the index at which `value`
|
||
* should be inserted into `array` in order to maintain its sort order.
|
||
*
|
||
* @private
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @param {boolean} [retHighest] Specify returning the highest qualified index.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
*/
|
||
function baseSortedIndex(array, value, retHighest) {
|
||
var low = 0,
|
||
high = array ? array.length : low;
|
||
|
||
if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
|
||
while (low < high) {
|
||
var mid = (low + high) >>> 1,
|
||
computed = array[mid];
|
||
|
||
if (computed !== null && !isSymbol(computed) &&
|
||
(retHighest ? (computed <= value) : (computed < value))) {
|
||
low = mid + 1;
|
||
} else {
|
||
high = mid;
|
||
}
|
||
}
|
||
return high;
|
||
}
|
||
return baseSortedIndexBy(array, value, identity, retHighest);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
|
||
* which invokes `iteratee` for `value` and each element of `array` to compute
|
||
* their sort ranking. The iteratee is invoked with one argument; (value).
|
||
*
|
||
* @private
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @param {Function} iteratee The iteratee invoked per element.
|
||
* @param {boolean} [retHighest] Specify returning the highest qualified index.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
*/
|
||
function baseSortedIndexBy(array, value, iteratee, retHighest) {
|
||
value = iteratee(value);
|
||
|
||
var low = 0,
|
||
high = array ? array.length : 0,
|
||
valIsNaN = value !== value,
|
||
valIsNull = value === null,
|
||
valIsSymbol = isSymbol(value),
|
||
valIsUndefined = value === undefined;
|
||
|
||
while (low < high) {
|
||
var mid = nativeFloor((low + high) / 2),
|
||
computed = iteratee(array[mid]),
|
||
othIsDefined = computed !== undefined,
|
||
othIsNull = computed === null,
|
||
othIsReflexive = computed === computed,
|
||
othIsSymbol = isSymbol(computed);
|
||
|
||
if (valIsNaN) {
|
||
var setLow = retHighest || othIsReflexive;
|
||
} else if (valIsUndefined) {
|
||
setLow = othIsReflexive && (retHighest || othIsDefined);
|
||
} else if (valIsNull) {
|
||
setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
|
||
} else if (valIsSymbol) {
|
||
setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
|
||
} else if (othIsNull || othIsSymbol) {
|
||
setLow = false;
|
||
} else {
|
||
setLow = retHighest ? (computed <= value) : (computed < value);
|
||
}
|
||
if (setLow) {
|
||
low = mid + 1;
|
||
} else {
|
||
high = mid;
|
||
}
|
||
}
|
||
return nativeMin(high, MAX_ARRAY_INDEX);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
|
||
* support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
*/
|
||
function baseSortedUniq(array, iteratee) {
|
||
var index = -1,
|
||
length = array.length,
|
||
resIndex = 0,
|
||
result = [];
|
||
|
||
while (++index < length) {
|
||
var value = array[index],
|
||
computed = iteratee ? iteratee(value) : value;
|
||
|
||
if (!index || !eq(computed, seen)) {
|
||
var seen = computed;
|
||
result[resIndex++] = value === 0 ? 0 : value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.toNumber` which doesn't ensure correct
|
||
* conversions of binary, hexadecimal, or octal string values.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to process.
|
||
* @returns {number} Returns the number.
|
||
*/
|
||
function baseToNumber(value) {
|
||
if (typeof value == 'number') {
|
||
return value;
|
||
}
|
||
if (isSymbol(value)) {
|
||
return NAN;
|
||
}
|
||
return +value;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.toString` which doesn't convert nullish
|
||
* values to empty strings.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to process.
|
||
* @returns {string} Returns the string.
|
||
*/
|
||
function baseToString(value) {
|
||
// Exit early for strings to avoid a performance hit in some environments.
|
||
if (typeof value == 'string') {
|
||
return value;
|
||
}
|
||
if (isSymbol(value)) {
|
||
return symbolToString ? symbolToString.call(value) : '';
|
||
}
|
||
var result = (value + '');
|
||
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.uniqBy` without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
*/
|
||
function baseUniq(array, iteratee, comparator) {
|
||
var index = -1,
|
||
includes = arrayIncludes,
|
||
length = array.length,
|
||
isCommon = true,
|
||
result = [],
|
||
seen = result;
|
||
|
||
if (comparator) {
|
||
isCommon = false;
|
||
includes = arrayIncludesWith;
|
||
}
|
||
else if (length >= LARGE_ARRAY_SIZE) {
|
||
var set = iteratee ? null : createSet(array);
|
||
if (set) {
|
||
return setToArray(set);
|
||
}
|
||
isCommon = false;
|
||
includes = cacheHas;
|
||
seen = new SetCache;
|
||
}
|
||
else {
|
||
seen = iteratee ? [] : result;
|
||
}
|
||
outer:
|
||
while (++index < length) {
|
||
var value = array[index],
|
||
computed = iteratee ? iteratee(value) : value;
|
||
|
||
value = (comparator || value !== 0) ? value : 0;
|
||
if (isCommon && computed === computed) {
|
||
var seenIndex = seen.length;
|
||
while (seenIndex--) {
|
||
if (seen[seenIndex] === computed) {
|
||
continue outer;
|
||
}
|
||
}
|
||
if (iteratee) {
|
||
seen.push(computed);
|
||
}
|
||
result.push(value);
|
||
}
|
||
else if (!includes(seen, computed, comparator)) {
|
||
if (seen !== result) {
|
||
seen.push(computed);
|
||
}
|
||
result.push(value);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.unset`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to unset.
|
||
* @returns {boolean} Returns `true` if the property is deleted, else `false`.
|
||
*/
|
||
function baseUnset(object, path) {
|
||
path = isKey(path, object) ? [path] : castPath(path);
|
||
object = parent(object, path);
|
||
|
||
var key = toKey(last(path));
|
||
return !(object != null && baseHas(object, key)) || delete object[key];
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `_.update`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the property to update.
|
||
* @param {Function} updater The function to produce the updated value.
|
||
* @param {Function} [customizer] The function to customize path creation.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function baseUpdate(object, path, updater, customizer) {
|
||
return baseSet(object, path, updater(baseGet(object, path)), customizer);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.dropWhile` and `_.takeWhile`
|
||
* without support for iteratee shorthands.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to query.
|
||
* @param {Function} predicate The function invoked per iteration.
|
||
* @param {boolean} [isDrop] Specify dropping elements instead of taking them.
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
*/
|
||
function baseWhile(array, predicate, isDrop, fromRight) {
|
||
var length = array.length,
|
||
index = fromRight ? length : -1;
|
||
|
||
while ((fromRight ? index-- : ++index < length) &&
|
||
predicate(array[index], index, array)) {}
|
||
|
||
return isDrop
|
||
? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
|
||
: baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
|
||
}
|
||
|
||
/**
|
||
* The base implementation of `wrapperValue` which returns the result of
|
||
* performing a sequence of actions on the unwrapped `value`, where each
|
||
* successive action is supplied the return value of the previous.
|
||
*
|
||
* @private
|
||
* @param {*} value The unwrapped value.
|
||
* @param {Array} actions Actions to perform to resolve the unwrapped value.
|
||
* @returns {*} Returns the resolved value.
|
||
*/
|
||
function baseWrapperValue(value, actions) {
|
||
var result = value;
|
||
if (result instanceof LazyWrapper) {
|
||
result = result.value();
|
||
}
|
||
return arrayReduce(actions, function(result, action) {
|
||
return action.func.apply(action.thisArg, arrayPush([result], action.args));
|
||
}, result);
|
||
}
|
||
|
||
/**
|
||
* The base implementation of methods like `_.xor`, without support for
|
||
* iteratee shorthands, that accepts an array of arrays to inspect.
|
||
*
|
||
* @private
|
||
* @param {Array} arrays The arrays to inspect.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of values.
|
||
*/
|
||
function baseXor(arrays, iteratee, comparator) {
|
||
var index = -1,
|
||
length = arrays.length;
|
||
|
||
while (++index < length) {
|
||
var result = result
|
||
? arrayPush(
|
||
baseDifference(result, arrays[index], iteratee, comparator),
|
||
baseDifference(arrays[index], result, iteratee, comparator)
|
||
)
|
||
: arrays[index];
|
||
}
|
||
return (result && result.length) ? baseUniq(result, iteratee, comparator) : [];
|
||
}
|
||
|
||
/**
|
||
* This base implementation of `_.zipObject` which assigns values using `assignFunc`.
|
||
*
|
||
* @private
|
||
* @param {Array} props The property identifiers.
|
||
* @param {Array} values The property values.
|
||
* @param {Function} assignFunc The function to assign values.
|
||
* @returns {Object} Returns the new object.
|
||
*/
|
||
function baseZipObject(props, values, assignFunc) {
|
||
var index = -1,
|
||
length = props.length,
|
||
valsLength = values.length,
|
||
result = {};
|
||
|
||
while (++index < length) {
|
||
var value = index < valsLength ? values[index] : undefined;
|
||
assignFunc(result, props[index], value);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Casts `value` to an empty array if it's not an array like object.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to inspect.
|
||
* @returns {Array|Object} Returns the cast array-like object.
|
||
*/
|
||
function castArrayLikeObject(value) {
|
||
return isArrayLikeObject(value) ? value : [];
|
||
}
|
||
|
||
/**
|
||
* Casts `value` to `identity` if it's not a function.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to inspect.
|
||
* @returns {Function} Returns cast function.
|
||
*/
|
||
function castFunction(value) {
|
||
return typeof value == 'function' ? value : identity;
|
||
}
|
||
|
||
/**
|
||
* Casts `value` to a path array if it's not one.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to inspect.
|
||
* @returns {Array} Returns the cast property path array.
|
||
*/
|
||
function castPath(value) {
|
||
return isArray(value) ? value : stringToPath(value);
|
||
}
|
||
|
||
/**
|
||
* Casts `array` to a slice if it's needed.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to inspect.
|
||
* @param {number} start The start position.
|
||
* @param {number} [end=array.length] The end position.
|
||
* @returns {Array} Returns the cast slice.
|
||
*/
|
||
function castSlice(array, start, end) {
|
||
var length = array.length;
|
||
end = end === undefined ? length : end;
|
||
return (!start && end >= length) ? array : baseSlice(array, start, end);
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `buffer`.
|
||
*
|
||
* @private
|
||
* @param {Buffer} buffer The buffer to clone.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Buffer} Returns the cloned buffer.
|
||
*/
|
||
function cloneBuffer(buffer, isDeep) {
|
||
if (isDeep) {
|
||
return buffer.slice();
|
||
}
|
||
var result = new buffer.constructor(buffer.length);
|
||
buffer.copy(result);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `arrayBuffer`.
|
||
*
|
||
* @private
|
||
* @param {ArrayBuffer} arrayBuffer The array buffer to clone.
|
||
* @returns {ArrayBuffer} Returns the cloned array buffer.
|
||
*/
|
||
function cloneArrayBuffer(arrayBuffer) {
|
||
var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
|
||
new Uint8Array(result).set(new Uint8Array(arrayBuffer));
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `dataView`.
|
||
*
|
||
* @private
|
||
* @param {Object} dataView The data view to clone.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Object} Returns the cloned data view.
|
||
*/
|
||
function cloneDataView(dataView, isDeep) {
|
||
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
|
||
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `map`.
|
||
*
|
||
* @private
|
||
* @param {Object} map The map to clone.
|
||
* @param {Function} cloneFunc The function to clone values.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Object} Returns the cloned map.
|
||
*/
|
||
function cloneMap(map, isDeep, cloneFunc) {
|
||
var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
|
||
return arrayReduce(array, addMapEntry, new map.constructor);
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `regexp`.
|
||
*
|
||
* @private
|
||
* @param {Object} regexp The regexp to clone.
|
||
* @returns {Object} Returns the cloned regexp.
|
||
*/
|
||
function cloneRegExp(regexp) {
|
||
var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
|
||
result.lastIndex = regexp.lastIndex;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `set`.
|
||
*
|
||
* @private
|
||
* @param {Object} set The set to clone.
|
||
* @param {Function} cloneFunc The function to clone values.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Object} Returns the cloned set.
|
||
*/
|
||
function cloneSet(set, isDeep, cloneFunc) {
|
||
var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
|
||
return arrayReduce(array, addSetEntry, new set.constructor);
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of the `symbol` object.
|
||
*
|
||
* @private
|
||
* @param {Object} symbol The symbol object to clone.
|
||
* @returns {Object} Returns the cloned symbol object.
|
||
*/
|
||
function cloneSymbol(symbol) {
|
||
return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `typedArray`.
|
||
*
|
||
* @private
|
||
* @param {Object} typedArray The typed array to clone.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Object} Returns the cloned typed array.
|
||
*/
|
||
function cloneTypedArray(typedArray, isDeep) {
|
||
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
|
||
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
|
||
}
|
||
|
||
/**
|
||
* Compares values to sort them in ascending order.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {number} Returns the sort order indicator for `value`.
|
||
*/
|
||
function compareAscending(value, other) {
|
||
if (value !== other) {
|
||
var valIsDefined = value !== undefined,
|
||
valIsNull = value === null,
|
||
valIsReflexive = value === value,
|
||
valIsSymbol = isSymbol(value);
|
||
|
||
var othIsDefined = other !== undefined,
|
||
othIsNull = other === null,
|
||
othIsReflexive = other === other,
|
||
othIsSymbol = isSymbol(other);
|
||
|
||
if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
|
||
(valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
|
||
(valIsNull && othIsDefined && othIsReflexive) ||
|
||
(!valIsDefined && othIsReflexive) ||
|
||
!valIsReflexive) {
|
||
return 1;
|
||
}
|
||
if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
|
||
(othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
|
||
(othIsNull && valIsDefined && valIsReflexive) ||
|
||
(!othIsDefined && valIsReflexive) ||
|
||
!othIsReflexive) {
|
||
return -1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* Used by `_.orderBy` to compare multiple properties of a value to another
|
||
* and stable sort them.
|
||
*
|
||
* If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
|
||
* specify an order of "desc" for descending or "asc" for ascending sort order
|
||
* of corresponding values.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to compare.
|
||
* @param {Object} other The other object to compare.
|
||
* @param {boolean[]|string[]} orders The order to sort by for each property.
|
||
* @returns {number} Returns the sort order indicator for `object`.
|
||
*/
|
||
function compareMultiple(object, other, orders) {
|
||
var index = -1,
|
||
objCriteria = object.criteria,
|
||
othCriteria = other.criteria,
|
||
length = objCriteria.length,
|
||
ordersLength = orders.length;
|
||
|
||
while (++index < length) {
|
||
var result = compareAscending(objCriteria[index], othCriteria[index]);
|
||
if (result) {
|
||
if (index >= ordersLength) {
|
||
return result;
|
||
}
|
||
var order = orders[index];
|
||
return result * (order == 'desc' ? -1 : 1);
|
||
}
|
||
}
|
||
// Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
|
||
// that causes it, under certain circumstances, to provide the same value for
|
||
// `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
|
||
// for more details.
|
||
//
|
||
// This also ensures a stable sort in V8 and other engines.
|
||
// See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
|
||
return object.index - other.index;
|
||
}
|
||
|
||
/**
|
||
* Creates an array that is the composition of partially applied arguments,
|
||
* placeholders, and provided arguments into a single array of arguments.
|
||
*
|
||
* @private
|
||
* @param {Array} args The provided arguments.
|
||
* @param {Array} partials The arguments to prepend to those provided.
|
||
* @param {Array} holders The `partials` placeholder indexes.
|
||
* @params {boolean} [isCurried] Specify composing for a curried function.
|
||
* @returns {Array} Returns the new array of composed arguments.
|
||
*/
|
||
function composeArgs(args, partials, holders, isCurried) {
|
||
var argsIndex = -1,
|
||
argsLength = args.length,
|
||
holdersLength = holders.length,
|
||
leftIndex = -1,
|
||
leftLength = partials.length,
|
||
rangeLength = nativeMax(argsLength - holdersLength, 0),
|
||
result = Array(leftLength + rangeLength),
|
||
isUncurried = !isCurried;
|
||
|
||
while (++leftIndex < leftLength) {
|
||
result[leftIndex] = partials[leftIndex];
|
||
}
|
||
while (++argsIndex < holdersLength) {
|
||
if (isUncurried || argsIndex < argsLength) {
|
||
result[holders[argsIndex]] = args[argsIndex];
|
||
}
|
||
}
|
||
while (rangeLength--) {
|
||
result[leftIndex++] = args[argsIndex++];
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* This function is like `composeArgs` except that the arguments composition
|
||
* is tailored for `_.partialRight`.
|
||
*
|
||
* @private
|
||
* @param {Array} args The provided arguments.
|
||
* @param {Array} partials The arguments to append to those provided.
|
||
* @param {Array} holders The `partials` placeholder indexes.
|
||
* @params {boolean} [isCurried] Specify composing for a curried function.
|
||
* @returns {Array} Returns the new array of composed arguments.
|
||
*/
|
||
function composeArgsRight(args, partials, holders, isCurried) {
|
||
var argsIndex = -1,
|
||
argsLength = args.length,
|
||
holdersIndex = -1,
|
||
holdersLength = holders.length,
|
||
rightIndex = -1,
|
||
rightLength = partials.length,
|
||
rangeLength = nativeMax(argsLength - holdersLength, 0),
|
||
result = Array(rangeLength + rightLength),
|
||
isUncurried = !isCurried;
|
||
|
||
while (++argsIndex < rangeLength) {
|
||
result[argsIndex] = args[argsIndex];
|
||
}
|
||
var offset = argsIndex;
|
||
while (++rightIndex < rightLength) {
|
||
result[offset + rightIndex] = partials[rightIndex];
|
||
}
|
||
while (++holdersIndex < holdersLength) {
|
||
if (isUncurried || argsIndex < argsLength) {
|
||
result[offset + holders[holdersIndex]] = args[argsIndex++];
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Copies the values of `source` to `array`.
|
||
*
|
||
* @private
|
||
* @param {Array} source The array to copy values from.
|
||
* @param {Array} [array=[]] The array to copy values to.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function copyArray(source, array) {
|
||
var index = -1,
|
||
length = source.length;
|
||
|
||
array || (array = Array(length));
|
||
while (++index < length) {
|
||
array[index] = source[index];
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* Copies properties of `source` to `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} source The object to copy properties from.
|
||
* @param {Array} props The property identifiers to copy.
|
||
* @param {Object} [object={}] The object to copy properties to.
|
||
* @param {Function} [customizer] The function to customize copied values.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function copyObject(source, props, object, customizer) {
|
||
object || (object = {});
|
||
|
||
var index = -1,
|
||
length = props.length;
|
||
|
||
while (++index < length) {
|
||
var key = props[index];
|
||
|
||
var newValue = customizer
|
||
? customizer(object[key], source[key], key, object, source)
|
||
: undefined;
|
||
|
||
assignValue(object, key, newValue === undefined ? source[key] : newValue);
|
||
}
|
||
return object;
|
||
}
|
||
|
||
/**
|
||
* Copies own symbol properties of `source` to `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} source The object to copy symbols from.
|
||
* @param {Object} [object={}] The object to copy symbols to.
|
||
* @returns {Object} Returns `object`.
|
||
*/
|
||
function copySymbols(source, object) {
|
||
return copyObject(source, getSymbols(source), object);
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.groupBy`.
|
||
*
|
||
* @private
|
||
* @param {Function} setter The function to set accumulator values.
|
||
* @param {Function} [initializer] The accumulator object initializer.
|
||
* @returns {Function} Returns the new aggregator function.
|
||
*/
|
||
function createAggregator(setter, initializer) {
|
||
return function(collection, iteratee) {
|
||
var func = isArray(collection) ? arrayAggregator : baseAggregator,
|
||
accumulator = initializer ? initializer() : {};
|
||
|
||
return func(collection, setter, getIteratee(iteratee, 2), accumulator);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.assign`.
|
||
*
|
||
* @private
|
||
* @param {Function} assigner The function to assign values.
|
||
* @returns {Function} Returns the new assigner function.
|
||
*/
|
||
function createAssigner(assigner) {
|
||
return baseRest(function(object, sources) {
|
||
var index = -1,
|
||
length = sources.length,
|
||
customizer = length > 1 ? sources[length - 1] : undefined,
|
||
guard = length > 2 ? sources[2] : undefined;
|
||
|
||
customizer = (assigner.length > 3 && typeof customizer == 'function')
|
||
? (length--, customizer)
|
||
: undefined;
|
||
|
||
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
|
||
customizer = length < 3 ? undefined : customizer;
|
||
length = 1;
|
||
}
|
||
object = Object(object);
|
||
while (++index < length) {
|
||
var source = sources[index];
|
||
if (source) {
|
||
assigner(object, source, index, customizer);
|
||
}
|
||
}
|
||
return object;
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a `baseEach` or `baseEachRight` function.
|
||
*
|
||
* @private
|
||
* @param {Function} eachFunc The function to iterate over a collection.
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Function} Returns the new base function.
|
||
*/
|
||
function createBaseEach(eachFunc, fromRight) {
|
||
return function(collection, iteratee) {
|
||
if (collection == null) {
|
||
return collection;
|
||
}
|
||
if (!isArrayLike(collection)) {
|
||
return eachFunc(collection, iteratee);
|
||
}
|
||
var length = collection.length,
|
||
index = fromRight ? length : -1,
|
||
iterable = Object(collection);
|
||
|
||
while ((fromRight ? index-- : ++index < length)) {
|
||
if (iteratee(iterable[index], index, iterable) === false) {
|
||
break;
|
||
}
|
||
}
|
||
return collection;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a base function for methods like `_.forIn` and `_.forOwn`.
|
||
*
|
||
* @private
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Function} Returns the new base function.
|
||
*/
|
||
function createBaseFor(fromRight) {
|
||
return function(object, iteratee, keysFunc) {
|
||
var index = -1,
|
||
iterable = Object(object),
|
||
props = keysFunc(object),
|
||
length = props.length;
|
||
|
||
while (length--) {
|
||
var key = props[fromRight ? length : ++index];
|
||
if (iteratee(iterable[key], key, iterable) === false) {
|
||
break;
|
||
}
|
||
}
|
||
return object;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that wraps `func` to invoke it with the optional `this`
|
||
* binding of `thisArg`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to wrap.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @param {*} [thisArg] The `this` binding of `func`.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createBind(func, bitmask, thisArg) {
|
||
var isBind = bitmask & BIND_FLAG,
|
||
Ctor = createCtor(func);
|
||
|
||
function wrapper() {
|
||
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
||
return fn.apply(isBind ? thisArg : this, arguments);
|
||
}
|
||
return wrapper;
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.lowerFirst`.
|
||
*
|
||
* @private
|
||
* @param {string} methodName The name of the `String` case method to use.
|
||
* @returns {Function} Returns the new case function.
|
||
*/
|
||
function createCaseFirst(methodName) {
|
||
return function(string) {
|
||
string = toString(string);
|
||
|
||
var strSymbols = reHasComplexSymbol.test(string)
|
||
? stringToArray(string)
|
||
: undefined;
|
||
|
||
var chr = strSymbols
|
||
? strSymbols[0]
|
||
: string.charAt(0);
|
||
|
||
var trailing = strSymbols
|
||
? castSlice(strSymbols, 1).join('')
|
||
: string.slice(1);
|
||
|
||
return chr[methodName]() + trailing;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.camelCase`.
|
||
*
|
||
* @private
|
||
* @param {Function} callback The function to combine each word.
|
||
* @returns {Function} Returns the new compounder function.
|
||
*/
|
||
function createCompounder(callback) {
|
||
return function(string) {
|
||
return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that produces an instance of `Ctor` regardless of
|
||
* whether it was invoked as part of a `new` expression or by `call` or `apply`.
|
||
*
|
||
* @private
|
||
* @param {Function} Ctor The constructor to wrap.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createCtor(Ctor) {
|
||
return function() {
|
||
// Use a `switch` statement to work with class constructors. See
|
||
// http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
|
||
// for more details.
|
||
var args = arguments;
|
||
switch (args.length) {
|
||
case 0: return new Ctor;
|
||
case 1: return new Ctor(args[0]);
|
||
case 2: return new Ctor(args[0], args[1]);
|
||
case 3: return new Ctor(args[0], args[1], args[2]);
|
||
case 4: return new Ctor(args[0], args[1], args[2], args[3]);
|
||
case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
|
||
case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
|
||
case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
||
}
|
||
var thisBinding = baseCreate(Ctor.prototype),
|
||
result = Ctor.apply(thisBinding, args);
|
||
|
||
// Mimic the constructor's `return` behavior.
|
||
// See https://es5.github.io/#x13.2.2 for more details.
|
||
return isObject(result) ? result : thisBinding;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that wraps `func` to enable currying.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to wrap.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @param {number} arity The arity of `func`.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createCurry(func, bitmask, arity) {
|
||
var Ctor = createCtor(func);
|
||
|
||
function wrapper() {
|
||
var length = arguments.length,
|
||
args = Array(length),
|
||
index = length,
|
||
placeholder = getHolder(wrapper);
|
||
|
||
while (index--) {
|
||
args[index] = arguments[index];
|
||
}
|
||
var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
|
||
? []
|
||
: replaceHolders(args, placeholder);
|
||
|
||
length -= holders.length;
|
||
if (length < arity) {
|
||
return createRecurry(
|
||
func, bitmask, createHybrid, wrapper.placeholder, undefined,
|
||
args, holders, undefined, undefined, arity - length);
|
||
}
|
||
var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
||
return apply(fn, this, args);
|
||
}
|
||
return wrapper;
|
||
}
|
||
|
||
/**
|
||
* Creates a `_.find` or `_.findLast` function.
|
||
*
|
||
* @private
|
||
* @param {Function} findIndexFunc The function to find the collection index.
|
||
* @returns {Function} Returns the new find function.
|
||
*/
|
||
function createFind(findIndexFunc) {
|
||
return function(collection, predicate, fromIndex) {
|
||
var iterable = Object(collection);
|
||
if (!isArrayLike(collection)) {
|
||
var iteratee = getIteratee(predicate, 3);
|
||
collection = keys(collection);
|
||
predicate = function(key) { return iteratee(iterable[key], key, iterable); };
|
||
}
|
||
var index = findIndexFunc(collection, predicate, fromIndex);
|
||
return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a `_.flow` or `_.flowRight` function.
|
||
*
|
||
* @private
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Function} Returns the new flow function.
|
||
*/
|
||
function createFlow(fromRight) {
|
||
return baseRest(function(funcs) {
|
||
funcs = baseFlatten(funcs, 1);
|
||
|
||
var length = funcs.length,
|
||
index = length,
|
||
prereq = LodashWrapper.prototype.thru;
|
||
|
||
if (fromRight) {
|
||
funcs.reverse();
|
||
}
|
||
while (index--) {
|
||
var func = funcs[index];
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
|
||
var wrapper = new LodashWrapper([], true);
|
||
}
|
||
}
|
||
index = wrapper ? index : length;
|
||
while (++index < length) {
|
||
func = funcs[index];
|
||
|
||
var funcName = getFuncName(func),
|
||
data = funcName == 'wrapper' ? getData(func) : undefined;
|
||
|
||
if (data && isLaziable(data[0]) &&
|
||
data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) &&
|
||
!data[4].length && data[9] == 1
|
||
) {
|
||
wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
|
||
} else {
|
||
wrapper = (func.length == 1 && isLaziable(func))
|
||
? wrapper[funcName]()
|
||
: wrapper.thru(func);
|
||
}
|
||
}
|
||
return function() {
|
||
var args = arguments,
|
||
value = args[0];
|
||
|
||
if (wrapper && args.length == 1 &&
|
||
isArray(value) && value.length >= LARGE_ARRAY_SIZE) {
|
||
return wrapper.plant(value).value();
|
||
}
|
||
var index = 0,
|
||
result = length ? funcs[index].apply(this, args) : value;
|
||
|
||
while (++index < length) {
|
||
result = funcs[index].call(this, result);
|
||
}
|
||
return result;
|
||
};
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a function that wraps `func` to invoke it with optional `this`
|
||
* binding of `thisArg`, partial application, and currying.
|
||
*
|
||
* @private
|
||
* @param {Function|string} func The function or method name to wrap.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @param {*} [thisArg] The `this` binding of `func`.
|
||
* @param {Array} [partials] The arguments to prepend to those provided to
|
||
* the new function.
|
||
* @param {Array} [holders] The `partials` placeholder indexes.
|
||
* @param {Array} [partialsRight] The arguments to append to those provided
|
||
* to the new function.
|
||
* @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
|
||
* @param {Array} [argPos] The argument positions of the new function.
|
||
* @param {number} [ary] The arity cap of `func`.
|
||
* @param {number} [arity] The arity of `func`.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
|
||
var isAry = bitmask & ARY_FLAG,
|
||
isBind = bitmask & BIND_FLAG,
|
||
isBindKey = bitmask & BIND_KEY_FLAG,
|
||
isCurried = bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG),
|
||
isFlip = bitmask & FLIP_FLAG,
|
||
Ctor = isBindKey ? undefined : createCtor(func);
|
||
|
||
function wrapper() {
|
||
var length = arguments.length,
|
||
args = Array(length),
|
||
index = length;
|
||
|
||
while (index--) {
|
||
args[index] = arguments[index];
|
||
}
|
||
if (isCurried) {
|
||
var placeholder = getHolder(wrapper),
|
||
holdersCount = countHolders(args, placeholder);
|
||
}
|
||
if (partials) {
|
||
args = composeArgs(args, partials, holders, isCurried);
|
||
}
|
||
if (partialsRight) {
|
||
args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
|
||
}
|
||
length -= holdersCount;
|
||
if (isCurried && length < arity) {
|
||
var newHolders = replaceHolders(args, placeholder);
|
||
return createRecurry(
|
||
func, bitmask, createHybrid, wrapper.placeholder, thisArg,
|
||
args, newHolders, argPos, ary, arity - length
|
||
);
|
||
}
|
||
var thisBinding = isBind ? thisArg : this,
|
||
fn = isBindKey ? thisBinding[func] : func;
|
||
|
||
length = args.length;
|
||
if (argPos) {
|
||
args = reorder(args, argPos);
|
||
} else if (isFlip && length > 1) {
|
||
args.reverse();
|
||
}
|
||
if (isAry && ary < length) {
|
||
args.length = ary;
|
||
}
|
||
if (this && this !== root && this instanceof wrapper) {
|
||
fn = Ctor || createCtor(fn);
|
||
}
|
||
return fn.apply(thisBinding, args);
|
||
}
|
||
return wrapper;
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.invertBy`.
|
||
*
|
||
* @private
|
||
* @param {Function} setter The function to set accumulator values.
|
||
* @param {Function} toIteratee The function to resolve iteratees.
|
||
* @returns {Function} Returns the new inverter function.
|
||
*/
|
||
function createInverter(setter, toIteratee) {
|
||
return function(object, iteratee) {
|
||
return baseInverter(object, setter, toIteratee(iteratee), {});
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that performs a mathematical operation on two values.
|
||
*
|
||
* @private
|
||
* @param {Function} operator The function to perform the operation.
|
||
* @param {number} [defaultValue] The value used for `undefined` arguments.
|
||
* @returns {Function} Returns the new mathematical operation function.
|
||
*/
|
||
function createMathOperation(operator, defaultValue) {
|
||
return function(value, other) {
|
||
var result;
|
||
if (value === undefined && other === undefined) {
|
||
return defaultValue;
|
||
}
|
||
if (value !== undefined) {
|
||
result = value;
|
||
}
|
||
if (other !== undefined) {
|
||
if (result === undefined) {
|
||
return other;
|
||
}
|
||
if (typeof value == 'string' || typeof other == 'string') {
|
||
value = baseToString(value);
|
||
other = baseToString(other);
|
||
} else {
|
||
value = baseToNumber(value);
|
||
other = baseToNumber(other);
|
||
}
|
||
result = operator(value, other);
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.over`.
|
||
*
|
||
* @private
|
||
* @param {Function} arrayFunc The function to iterate over iteratees.
|
||
* @returns {Function} Returns the new over function.
|
||
*/
|
||
function createOver(arrayFunc) {
|
||
return baseRest(function(iteratees) {
|
||
iteratees = (iteratees.length == 1 && isArray(iteratees[0]))
|
||
? arrayMap(iteratees[0], baseUnary(getIteratee()))
|
||
: arrayMap(baseFlatten(iteratees, 1), baseUnary(getIteratee()));
|
||
|
||
return baseRest(function(args) {
|
||
var thisArg = this;
|
||
return arrayFunc(iteratees, function(iteratee) {
|
||
return apply(iteratee, thisArg, args);
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates the padding for `string` based on `length`. The `chars` string
|
||
* is truncated if the number of characters exceeds `length`.
|
||
*
|
||
* @private
|
||
* @param {number} length The padding length.
|
||
* @param {string} [chars=' '] The string used as padding.
|
||
* @returns {string} Returns the padding for `string`.
|
||
*/
|
||
function createPadding(length, chars) {
|
||
chars = chars === undefined ? ' ' : baseToString(chars);
|
||
|
||
var charsLength = chars.length;
|
||
if (charsLength < 2) {
|
||
return charsLength ? baseRepeat(chars, length) : chars;
|
||
}
|
||
var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
|
||
return reHasComplexSymbol.test(chars)
|
||
? castSlice(stringToArray(result), 0, length).join('')
|
||
: result.slice(0, length);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that wraps `func` to invoke it with the `this` binding
|
||
* of `thisArg` and `partials` prepended to the arguments it receives.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to wrap.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @param {*} thisArg The `this` binding of `func`.
|
||
* @param {Array} partials The arguments to prepend to those provided to
|
||
* the new function.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createPartial(func, bitmask, thisArg, partials) {
|
||
var isBind = bitmask & BIND_FLAG,
|
||
Ctor = createCtor(func);
|
||
|
||
function wrapper() {
|
||
var argsIndex = -1,
|
||
argsLength = arguments.length,
|
||
leftIndex = -1,
|
||
leftLength = partials.length,
|
||
args = Array(leftLength + argsLength),
|
||
fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
|
||
|
||
while (++leftIndex < leftLength) {
|
||
args[leftIndex] = partials[leftIndex];
|
||
}
|
||
while (argsLength--) {
|
||
args[leftIndex++] = arguments[++argsIndex];
|
||
}
|
||
return apply(fn, isBind ? thisArg : this, args);
|
||
}
|
||
return wrapper;
|
||
}
|
||
|
||
/**
|
||
* Creates a `_.range` or `_.rangeRight` function.
|
||
*
|
||
* @private
|
||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||
* @returns {Function} Returns the new range function.
|
||
*/
|
||
function createRange(fromRight) {
|
||
return function(start, end, step) {
|
||
if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
|
||
end = step = undefined;
|
||
}
|
||
// Ensure the sign of `-0` is preserved.
|
||
start = toFinite(start);
|
||
if (end === undefined) {
|
||
end = start;
|
||
start = 0;
|
||
} else {
|
||
end = toFinite(end);
|
||
}
|
||
step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
|
||
return baseRange(start, end, step, fromRight);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that performs a relational operation on two values.
|
||
*
|
||
* @private
|
||
* @param {Function} operator The function to perform the operation.
|
||
* @returns {Function} Returns the new relational operation function.
|
||
*/
|
||
function createRelationalOperation(operator) {
|
||
return function(value, other) {
|
||
if (!(typeof value == 'string' && typeof other == 'string')) {
|
||
value = toNumber(value);
|
||
other = toNumber(other);
|
||
}
|
||
return operator(value, other);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that wraps `func` to continue currying.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to wrap.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @param {Function} wrapFunc The function to create the `func` wrapper.
|
||
* @param {*} placeholder The placeholder value.
|
||
* @param {*} [thisArg] The `this` binding of `func`.
|
||
* @param {Array} [partials] The arguments to prepend to those provided to
|
||
* the new function.
|
||
* @param {Array} [holders] The `partials` placeholder indexes.
|
||
* @param {Array} [argPos] The argument positions of the new function.
|
||
* @param {number} [ary] The arity cap of `func`.
|
||
* @param {number} [arity] The arity of `func`.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
|
||
var isCurry = bitmask & CURRY_FLAG,
|
||
newHolders = isCurry ? holders : undefined,
|
||
newHoldersRight = isCurry ? undefined : holders,
|
||
newPartials = isCurry ? partials : undefined,
|
||
newPartialsRight = isCurry ? undefined : partials;
|
||
|
||
bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
|
||
bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
|
||
|
||
if (!(bitmask & CURRY_BOUND_FLAG)) {
|
||
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
|
||
}
|
||
var newData = [
|
||
func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
|
||
newHoldersRight, argPos, ary, arity
|
||
];
|
||
|
||
var result = wrapFunc.apply(undefined, newData);
|
||
if (isLaziable(func)) {
|
||
setData(result, newData);
|
||
}
|
||
result.placeholder = placeholder;
|
||
return setWrapToString(result, func, bitmask);
|
||
}
|
||
|
||
/**
|
||
* Creates a function like `_.round`.
|
||
*
|
||
* @private
|
||
* @param {string} methodName The name of the `Math` method to use when rounding.
|
||
* @returns {Function} Returns the new round function.
|
||
*/
|
||
function createRound(methodName) {
|
||
var func = Math[methodName];
|
||
return function(number, precision) {
|
||
number = toNumber(number);
|
||
precision = nativeMin(toInteger(precision), 292);
|
||
if (precision) {
|
||
// Shift with exponential notation to avoid floating-point issues.
|
||
// See [MDN](https://mdn.io/round#Examples) for more details.
|
||
var pair = (toString(number) + 'e').split('e'),
|
||
value = func(pair[0] + 'e' + (+pair[1] + precision));
|
||
|
||
pair = (toString(value) + 'e').split('e');
|
||
return +(pair[0] + 'e' + (+pair[1] - precision));
|
||
}
|
||
return func(number);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a set object of `values`.
|
||
*
|
||
* @private
|
||
* @param {Array} values The values to add to the set.
|
||
* @returns {Object} Returns the new set.
|
||
*/
|
||
var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
|
||
return new Set(values);
|
||
};
|
||
|
||
/**
|
||
* Creates a `_.toPairs` or `_.toPairsIn` function.
|
||
*
|
||
* @private
|
||
* @param {Function} keysFunc The function to get the keys of a given object.
|
||
* @returns {Function} Returns the new pairs function.
|
||
*/
|
||
function createToPairs(keysFunc) {
|
||
return function(object) {
|
||
var tag = getTag(object);
|
||
if (tag == mapTag) {
|
||
return mapToArray(object);
|
||
}
|
||
if (tag == setTag) {
|
||
return setToPairs(object);
|
||
}
|
||
return baseToPairs(object, keysFunc(object));
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that either curries or invokes `func` with optional
|
||
* `this` binding and partially applied arguments.
|
||
*
|
||
* @private
|
||
* @param {Function|string} func The function or method name to wrap.
|
||
* @param {number} bitmask The bitmask flags.
|
||
* The bitmask may be composed of the following flags:
|
||
* 1 - `_.bind`
|
||
* 2 - `_.bindKey`
|
||
* 4 - `_.curry` or `_.curryRight` of a bound function
|
||
* 8 - `_.curry`
|
||
* 16 - `_.curryRight`
|
||
* 32 - `_.partial`
|
||
* 64 - `_.partialRight`
|
||
* 128 - `_.rearg`
|
||
* 256 - `_.ary`
|
||
* 512 - `_.flip`
|
||
* @param {*} [thisArg] The `this` binding of `func`.
|
||
* @param {Array} [partials] The arguments to be partially applied.
|
||
* @param {Array} [holders] The `partials` placeholder indexes.
|
||
* @param {Array} [argPos] The argument positions of the new function.
|
||
* @param {number} [ary] The arity cap of `func`.
|
||
* @param {number} [arity] The arity of `func`.
|
||
* @returns {Function} Returns the new wrapped function.
|
||
*/
|
||
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
|
||
var isBindKey = bitmask & BIND_KEY_FLAG;
|
||
if (!isBindKey && typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
var length = partials ? partials.length : 0;
|
||
if (!length) {
|
||
bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
|
||
partials = holders = undefined;
|
||
}
|
||
ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
|
||
arity = arity === undefined ? arity : toInteger(arity);
|
||
length -= holders ? holders.length : 0;
|
||
|
||
if (bitmask & PARTIAL_RIGHT_FLAG) {
|
||
var partialsRight = partials,
|
||
holdersRight = holders;
|
||
|
||
partials = holders = undefined;
|
||
}
|
||
var data = isBindKey ? undefined : getData(func);
|
||
|
||
var newData = [
|
||
func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
|
||
argPos, ary, arity
|
||
];
|
||
|
||
if (data) {
|
||
mergeData(newData, data);
|
||
}
|
||
func = newData[0];
|
||
bitmask = newData[1];
|
||
thisArg = newData[2];
|
||
partials = newData[3];
|
||
holders = newData[4];
|
||
arity = newData[9] = newData[9] == null
|
||
? (isBindKey ? 0 : func.length)
|
||
: nativeMax(newData[9] - length, 0);
|
||
|
||
if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) {
|
||
bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);
|
||
}
|
||
if (!bitmask || bitmask == BIND_FLAG) {
|
||
var result = createBind(func, bitmask, thisArg);
|
||
} else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {
|
||
result = createCurry(func, bitmask, arity);
|
||
} else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {
|
||
result = createPartial(func, bitmask, thisArg, partials);
|
||
} else {
|
||
result = createHybrid.apply(undefined, newData);
|
||
}
|
||
var setter = data ? baseSetData : setData;
|
||
return setWrapToString(setter(result, newData), func, bitmask);
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseIsEqualDeep` for arrays with support for
|
||
* partial deep comparisons.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to compare.
|
||
* @param {Array} other The other array to compare.
|
||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||
* @param {Function} customizer The function to customize comparisons.
|
||
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
|
||
* for more details.
|
||
* @param {Object} stack Tracks traversed `array` and `other` objects.
|
||
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
|
||
*/
|
||
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
|
||
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
|
||
arrLength = array.length,
|
||
othLength = other.length;
|
||
|
||
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
|
||
return false;
|
||
}
|
||
// Assume cyclic values are equal.
|
||
var stacked = stack.get(array);
|
||
if (stacked && stack.get(other)) {
|
||
return stacked == other;
|
||
}
|
||
var index = -1,
|
||
result = true,
|
||
seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;
|
||
|
||
stack.set(array, other);
|
||
stack.set(other, array);
|
||
|
||
// Ignore non-index properties.
|
||
while (++index < arrLength) {
|
||
var arrValue = array[index],
|
||
othValue = other[index];
|
||
|
||
if (customizer) {
|
||
var compared = isPartial
|
||
? customizer(othValue, arrValue, index, other, array, stack)
|
||
: customizer(arrValue, othValue, index, array, other, stack);
|
||
}
|
||
if (compared !== undefined) {
|
||
if (compared) {
|
||
continue;
|
||
}
|
||
result = false;
|
||
break;
|
||
}
|
||
// Recursively compare arrays (susceptible to call stack limits).
|
||
if (seen) {
|
||
if (!arraySome(other, function(othValue, othIndex) {
|
||
if (!seen.has(othIndex) &&
|
||
(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
|
||
return seen.add(othIndex);
|
||
}
|
||
})) {
|
||
result = false;
|
||
break;
|
||
}
|
||
} else if (!(
|
||
arrValue === othValue ||
|
||
equalFunc(arrValue, othValue, customizer, bitmask, stack)
|
||
)) {
|
||
result = false;
|
||
break;
|
||
}
|
||
}
|
||
stack['delete'](array);
|
||
stack['delete'](other);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseIsEqualDeep` for comparing objects of
|
||
* the same `toStringTag`.
|
||
*
|
||
* **Note:** This function only supports comparing values with tags of
|
||
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to compare.
|
||
* @param {Object} other The other object to compare.
|
||
* @param {string} tag The `toStringTag` of the objects to compare.
|
||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||
* @param {Function} customizer The function to customize comparisons.
|
||
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
|
||
* for more details.
|
||
* @param {Object} stack Tracks traversed `object` and `other` objects.
|
||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||
*/
|
||
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
|
||
switch (tag) {
|
||
case dataViewTag:
|
||
if ((object.byteLength != other.byteLength) ||
|
||
(object.byteOffset != other.byteOffset)) {
|
||
return false;
|
||
}
|
||
object = object.buffer;
|
||
other = other.buffer;
|
||
|
||
case arrayBufferTag:
|
||
if ((object.byteLength != other.byteLength) ||
|
||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
|
||
return false;
|
||
}
|
||
return true;
|
||
|
||
case boolTag:
|
||
case dateTag:
|
||
case numberTag:
|
||
// Coerce booleans to `1` or `0` and dates to milliseconds.
|
||
// Invalid dates are coerced to `NaN`.
|
||
return eq(+object, +other);
|
||
|
||
case errorTag:
|
||
return object.name == other.name && object.message == other.message;
|
||
|
||
case regexpTag:
|
||
case stringTag:
|
||
// Coerce regexes to strings and treat strings, primitives and objects,
|
||
// as equal. See http://www.ecma-international.org/ecma-262/6.0/#sec-regexp.prototype.tostring
|
||
// for more details.
|
||
return object == (other + '');
|
||
|
||
case mapTag:
|
||
var convert = mapToArray;
|
||
|
||
case setTag:
|
||
var isPartial = bitmask & PARTIAL_COMPARE_FLAG;
|
||
convert || (convert = setToArray);
|
||
|
||
if (object.size != other.size && !isPartial) {
|
||
return false;
|
||
}
|
||
// Assume cyclic values are equal.
|
||
var stacked = stack.get(object);
|
||
if (stacked) {
|
||
return stacked == other;
|
||
}
|
||
bitmask |= UNORDERED_COMPARE_FLAG;
|
||
|
||
// Recursively compare objects (susceptible to call stack limits).
|
||
stack.set(object, other);
|
||
var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
|
||
stack['delete'](object);
|
||
return result;
|
||
|
||
case symbolTag:
|
||
if (symbolValueOf) {
|
||
return symbolValueOf.call(object) == symbolValueOf.call(other);
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `baseIsEqualDeep` for objects with support for
|
||
* partial deep comparisons.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to compare.
|
||
* @param {Object} other The other object to compare.
|
||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||
* @param {Function} customizer The function to customize comparisons.
|
||
* @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`
|
||
* for more details.
|
||
* @param {Object} stack Tracks traversed `object` and `other` objects.
|
||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||
*/
|
||
function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
|
||
var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
|
||
objProps = keys(object),
|
||
objLength = objProps.length,
|
||
othProps = keys(other),
|
||
othLength = othProps.length;
|
||
|
||
if (objLength != othLength && !isPartial) {
|
||
return false;
|
||
}
|
||
var index = objLength;
|
||
while (index--) {
|
||
var key = objProps[index];
|
||
if (!(isPartial ? key in other : baseHas(other, key))) {
|
||
return false;
|
||
}
|
||
}
|
||
// Assume cyclic values are equal.
|
||
var stacked = stack.get(object);
|
||
if (stacked && stack.get(other)) {
|
||
return stacked == other;
|
||
}
|
||
var result = true;
|
||
stack.set(object, other);
|
||
stack.set(other, object);
|
||
|
||
var skipCtor = isPartial;
|
||
while (++index < objLength) {
|
||
key = objProps[index];
|
||
var objValue = object[key],
|
||
othValue = other[key];
|
||
|
||
if (customizer) {
|
||
var compared = isPartial
|
||
? customizer(othValue, objValue, key, other, object, stack)
|
||
: customizer(objValue, othValue, key, object, other, stack);
|
||
}
|
||
// Recursively compare objects (susceptible to call stack limits).
|
||
if (!(compared === undefined
|
||
? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))
|
||
: compared
|
||
)) {
|
||
result = false;
|
||
break;
|
||
}
|
||
skipCtor || (skipCtor = key == 'constructor');
|
||
}
|
||
if (result && !skipCtor) {
|
||
var objCtor = object.constructor,
|
||
othCtor = other.constructor;
|
||
|
||
// Non `Object` object instances with different constructors are not equal.
|
||
if (objCtor != othCtor &&
|
||
('constructor' in object && 'constructor' in other) &&
|
||
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
|
||
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
|
||
result = false;
|
||
}
|
||
}
|
||
stack['delete'](object);
|
||
stack['delete'](other);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates an array of own enumerable property names and symbols of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names and symbols.
|
||
*/
|
||
function getAllKeys(object) {
|
||
return baseGetAllKeys(object, keys, getSymbols);
|
||
}
|
||
|
||
/**
|
||
* Creates an array of own and inherited enumerable property names and
|
||
* symbols of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names and symbols.
|
||
*/
|
||
function getAllKeysIn(object) {
|
||
return baseGetAllKeys(object, keysIn, getSymbolsIn);
|
||
}
|
||
|
||
/**
|
||
* Gets metadata for `func`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to query.
|
||
* @returns {*} Returns the metadata for `func`.
|
||
*/
|
||
var getData = !metaMap ? noop : function(func) {
|
||
return metaMap.get(func);
|
||
};
|
||
|
||
/**
|
||
* Gets the name of `func`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to query.
|
||
* @returns {string} Returns the function name.
|
||
*/
|
||
function getFuncName(func) {
|
||
var result = (func.name + ''),
|
||
array = realNames[result],
|
||
length = hasOwnProperty.call(realNames, result) ? array.length : 0;
|
||
|
||
while (length--) {
|
||
var data = array[length],
|
||
otherFunc = data.func;
|
||
if (otherFunc == null || otherFunc == func) {
|
||
return data.name;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Gets the argument placeholder value for `func`.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to inspect.
|
||
* @returns {*} Returns the placeholder value.
|
||
*/
|
||
function getHolder(func) {
|
||
var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
|
||
return object.placeholder;
|
||
}
|
||
|
||
/**
|
||
* Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
|
||
* this function returns the custom method, otherwise it returns `baseIteratee`.
|
||
* If arguments are provided, the chosen function is invoked with them and
|
||
* its result is returned.
|
||
*
|
||
* @private
|
||
* @param {*} [value] The value to convert to an iteratee.
|
||
* @param {number} [arity] The arity of the created iteratee.
|
||
* @returns {Function} Returns the chosen function or its result.
|
||
*/
|
||
function getIteratee() {
|
||
var result = lodash.iteratee || iteratee;
|
||
result = result === iteratee ? baseIteratee : result;
|
||
return arguments.length ? result(arguments[0], arguments[1]) : result;
|
||
}
|
||
|
||
/**
|
||
* Gets the "length" property value of `object`.
|
||
*
|
||
* **Note:** This function is used to avoid a
|
||
* [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects
|
||
* Safari on at least iOS 8.1-8.3 ARM64.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {*} Returns the "length" value.
|
||
*/
|
||
var getLength = baseProperty('length');
|
||
|
||
/**
|
||
* Gets the data for `map`.
|
||
*
|
||
* @private
|
||
* @param {Object} map The map to query.
|
||
* @param {string} key The reference key.
|
||
* @returns {*} Returns the map data.
|
||
*/
|
||
function getMapData(map, key) {
|
||
var data = map.__data__;
|
||
return isKeyable(key)
|
||
? data[typeof key == 'string' ? 'string' : 'hash']
|
||
: data.map;
|
||
}
|
||
|
||
/**
|
||
* Gets the property names, values, and compare flags of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the match data of `object`.
|
||
*/
|
||
function getMatchData(object) {
|
||
var result = keys(object),
|
||
length = result.length;
|
||
|
||
while (length--) {
|
||
var key = result[length],
|
||
value = object[key];
|
||
|
||
result[length] = [key, value, isStrictComparable(value)];
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Gets the native function at `key` of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {string} key The key of the method to get.
|
||
* @returns {*} Returns the function if it's native, else `undefined`.
|
||
*/
|
||
function getNative(object, key) {
|
||
var value = getValue(object, key);
|
||
return baseIsNative(value) ? value : undefined;
|
||
}
|
||
|
||
/**
|
||
* Gets the `[[Prototype]]` of `value`.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to query.
|
||
* @returns {null|Object} Returns the `[[Prototype]]`.
|
||
*/
|
||
var getPrototype = overArg(nativeGetPrototype, Object);
|
||
|
||
/**
|
||
* Creates an array of the own enumerable symbol properties of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of symbols.
|
||
*/
|
||
var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
|
||
|
||
/**
|
||
* Creates an array of the own and inherited enumerable symbol properties
|
||
* of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of symbols.
|
||
*/
|
||
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
|
||
var result = [];
|
||
while (object) {
|
||
arrayPush(result, getSymbols(object));
|
||
object = getPrototype(object);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
/**
|
||
* Gets the `toStringTag` of `value`.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to query.
|
||
* @returns {string} Returns the `toStringTag`.
|
||
*/
|
||
var getTag = baseGetTag;
|
||
|
||
// Fallback for data views, maps, sets, and weak maps in IE 11,
|
||
// for data views in Edge, and promises in Node.js.
|
||
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
|
||
(Map && getTag(new Map) != mapTag) ||
|
||
(Promise && getTag(Promise.resolve()) != promiseTag) ||
|
||
(Set && getTag(new Set) != setTag) ||
|
||
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
|
||
getTag = function(value) {
|
||
var result = objectToString.call(value),
|
||
Ctor = result == objectTag ? value.constructor : undefined,
|
||
ctorString = Ctor ? toSource(Ctor) : undefined;
|
||
|
||
if (ctorString) {
|
||
switch (ctorString) {
|
||
case dataViewCtorString: return dataViewTag;
|
||
case mapCtorString: return mapTag;
|
||
case promiseCtorString: return promiseTag;
|
||
case setCtorString: return setTag;
|
||
case weakMapCtorString: return weakMapTag;
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Gets the view, applying any `transforms` to the `start` and `end` positions.
|
||
*
|
||
* @private
|
||
* @param {number} start The start of the view.
|
||
* @param {number} end The end of the view.
|
||
* @param {Array} transforms The transformations to apply to the view.
|
||
* @returns {Object} Returns an object containing the `start` and `end`
|
||
* positions of the view.
|
||
*/
|
||
function getView(start, end, transforms) {
|
||
var index = -1,
|
||
length = transforms.length;
|
||
|
||
while (++index < length) {
|
||
var data = transforms[index],
|
||
size = data.size;
|
||
|
||
switch (data.type) {
|
||
case 'drop': start += size; break;
|
||
case 'dropRight': end -= size; break;
|
||
case 'take': end = nativeMin(end, start + size); break;
|
||
case 'takeRight': start = nativeMax(start, end - size); break;
|
||
}
|
||
}
|
||
return { 'start': start, 'end': end };
|
||
}
|
||
|
||
/**
|
||
* Extracts wrapper details from the `source` body comment.
|
||
*
|
||
* @private
|
||
* @param {string} source The source to inspect.
|
||
* @returns {Array} Returns the wrapper details.
|
||
*/
|
||
function getWrapDetails(source) {
|
||
var match = source.match(reWrapDetails);
|
||
return match ? match[1].split(reSplitDetails) : [];
|
||
}
|
||
|
||
/**
|
||
* Checks if `path` exists on `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path to check.
|
||
* @param {Function} hasFunc The function to check properties.
|
||
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
||
*/
|
||
function hasPath(object, path, hasFunc) {
|
||
path = isKey(path, object) ? [path] : castPath(path);
|
||
|
||
var result,
|
||
index = -1,
|
||
length = path.length;
|
||
|
||
while (++index < length) {
|
||
var key = toKey(path[index]);
|
||
if (!(result = object != null && hasFunc(object, key))) {
|
||
break;
|
||
}
|
||
object = object[key];
|
||
}
|
||
if (result) {
|
||
return result;
|
||
}
|
||
var length = object ? object.length : 0;
|
||
return !!length && isLength(length) && isIndex(key, length) &&
|
||
(isArray(object) || isString(object) || isArguments(object));
|
||
}
|
||
|
||
/**
|
||
* Initializes an array clone.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to clone.
|
||
* @returns {Array} Returns the initialized clone.
|
||
*/
|
||
function initCloneArray(array) {
|
||
var length = array.length,
|
||
result = array.constructor(length);
|
||
|
||
// Add properties assigned by `RegExp#exec`.
|
||
if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
|
||
result.index = array.index;
|
||
result.input = array.input;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Initializes an object clone.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to clone.
|
||
* @returns {Object} Returns the initialized clone.
|
||
*/
|
||
function initCloneObject(object) {
|
||
return (typeof object.constructor == 'function' && !isPrototype(object))
|
||
? baseCreate(getPrototype(object))
|
||
: {};
|
||
}
|
||
|
||
/**
|
||
* Initializes an object clone based on its `toStringTag`.
|
||
*
|
||
* **Note:** This function only supports cloning values with tags of
|
||
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to clone.
|
||
* @param {string} tag The `toStringTag` of the object to clone.
|
||
* @param {Function} cloneFunc The function to clone values.
|
||
* @param {boolean} [isDeep] Specify a deep clone.
|
||
* @returns {Object} Returns the initialized clone.
|
||
*/
|
||
function initCloneByTag(object, tag, cloneFunc, isDeep) {
|
||
var Ctor = object.constructor;
|
||
switch (tag) {
|
||
case arrayBufferTag:
|
||
return cloneArrayBuffer(object);
|
||
|
||
case boolTag:
|
||
case dateTag:
|
||
return new Ctor(+object);
|
||
|
||
case dataViewTag:
|
||
return cloneDataView(object, isDeep);
|
||
|
||
case float32Tag: case float64Tag:
|
||
case int8Tag: case int16Tag: case int32Tag:
|
||
case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
|
||
return cloneTypedArray(object, isDeep);
|
||
|
||
case mapTag:
|
||
return cloneMap(object, isDeep, cloneFunc);
|
||
|
||
case numberTag:
|
||
case stringTag:
|
||
return new Ctor(object);
|
||
|
||
case regexpTag:
|
||
return cloneRegExp(object);
|
||
|
||
case setTag:
|
||
return cloneSet(object, isDeep, cloneFunc);
|
||
|
||
case symbolTag:
|
||
return cloneSymbol(object);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Creates an array of index keys for `object` values of arrays,
|
||
* `arguments` objects, and strings, otherwise `null` is returned.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array|null} Returns index keys, else `null`.
|
||
*/
|
||
function indexKeys(object) {
|
||
var length = object ? object.length : undefined;
|
||
if (isLength(length) &&
|
||
(isArray(object) || isString(object) || isArguments(object))) {
|
||
return baseTimes(length, String);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Inserts wrapper `details` in a comment at the top of the `source` body.
|
||
*
|
||
* @private
|
||
* @param {string} source The source to modify.
|
||
* @returns {Array} details The details to insert.
|
||
* @returns {string} Returns the modified source.
|
||
*/
|
||
function insertWrapDetails(source, details) {
|
||
var length = details.length,
|
||
lastIndex = length - 1;
|
||
|
||
details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
|
||
details = details.join(length > 2 ? ', ' : ' ');
|
||
return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a flattenable `arguments` object or array.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
|
||
*/
|
||
function isFlattenable(value) {
|
||
return isArray(value) || isArguments(value) ||
|
||
!!(spreadableSymbol && value && value[spreadableSymbol]);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a valid array-like index.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
||
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
||
*/
|
||
function isIndex(value, length) {
|
||
length = length == null ? MAX_SAFE_INTEGER : length;
|
||
return !!length &&
|
||
(typeof value == 'number' || reIsUint.test(value)) &&
|
||
(value > -1 && value % 1 == 0 && value < length);
|
||
}
|
||
|
||
/**
|
||
* Checks if the given arguments are from an iteratee call.
|
||
*
|
||
* @private
|
||
* @param {*} value The potential iteratee value argument.
|
||
* @param {*} index The potential iteratee index or key argument.
|
||
* @param {*} object The potential iteratee object argument.
|
||
* @returns {boolean} Returns `true` if the arguments are from an iteratee call,
|
||
* else `false`.
|
||
*/
|
||
function isIterateeCall(value, index, object) {
|
||
if (!isObject(object)) {
|
||
return false;
|
||
}
|
||
var type = typeof index;
|
||
if (type == 'number'
|
||
? (isArrayLike(object) && isIndex(index, object.length))
|
||
: (type == 'string' && index in object)
|
||
) {
|
||
return eq(object[index], value);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a property name and not a property path.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @param {Object} [object] The object to query keys on.
|
||
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
||
*/
|
||
function isKey(value, object) {
|
||
if (isArray(value)) {
|
||
return false;
|
||
}
|
||
var type = typeof value;
|
||
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
||
value == null || isSymbol(value)) {
|
||
return true;
|
||
}
|
||
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
||
(object != null && value in Object(object));
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is suitable for use as unique object key.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
||
*/
|
||
function isKeyable(value) {
|
||
var type = typeof value;
|
||
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
||
? (value !== '__proto__')
|
||
: (value === null);
|
||
}
|
||
|
||
/**
|
||
* Checks if `func` has a lazy counterpart.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to check.
|
||
* @returns {boolean} Returns `true` if `func` has a lazy counterpart,
|
||
* else `false`.
|
||
*/
|
||
function isLaziable(func) {
|
||
var funcName = getFuncName(func),
|
||
other = lodash[funcName];
|
||
|
||
if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
|
||
return false;
|
||
}
|
||
if (func === other) {
|
||
return true;
|
||
}
|
||
var data = getData(other);
|
||
return !!data && func === data[0];
|
||
}
|
||
|
||
/**
|
||
* Checks if `func` has its source masked.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to check.
|
||
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
||
*/
|
||
function isMasked(func) {
|
||
return !!maskSrcKey && (maskSrcKey in func);
|
||
}
|
||
|
||
/**
|
||
* Checks if `func` is capable of being masked.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `func` is maskable, else `false`.
|
||
*/
|
||
var isMaskable = coreJsData ? isFunction : stubFalse;
|
||
|
||
/**
|
||
* Checks if `value` is likely a prototype object.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
|
||
*/
|
||
function isPrototype(value) {
|
||
var Ctor = value && value.constructor,
|
||
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
|
||
|
||
return value === proto;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` if suitable for strict
|
||
* equality comparisons, else `false`.
|
||
*/
|
||
function isStrictComparable(value) {
|
||
return value === value && !isObject(value);
|
||
}
|
||
|
||
/**
|
||
* A specialized version of `matchesProperty` for source values suitable
|
||
* for strict equality comparisons, i.e. `===`.
|
||
*
|
||
* @private
|
||
* @param {string} key The key of the property to get.
|
||
* @param {*} srcValue The value to match.
|
||
* @returns {Function} Returns the new spec function.
|
||
*/
|
||
function matchesStrictComparable(key, srcValue) {
|
||
return function(object) {
|
||
if (object == null) {
|
||
return false;
|
||
}
|
||
return object[key] === srcValue &&
|
||
(srcValue !== undefined || (key in Object(object)));
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Merges the function metadata of `source` into `data`.
|
||
*
|
||
* Merging metadata reduces the number of wrappers used to invoke a function.
|
||
* This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
|
||
* may be applied regardless of execution order. Methods like `_.ary` and
|
||
* `_.rearg` modify function arguments, making the order in which they are
|
||
* executed important, preventing the merging of metadata. However, we make
|
||
* an exception for a safe combined case where curried functions have `_.ary`
|
||
* and or `_.rearg` applied.
|
||
*
|
||
* @private
|
||
* @param {Array} data The destination metadata.
|
||
* @param {Array} source The source metadata.
|
||
* @returns {Array} Returns `data`.
|
||
*/
|
||
function mergeData(data, source) {
|
||
var bitmask = data[1],
|
||
srcBitmask = source[1],
|
||
newBitmask = bitmask | srcBitmask,
|
||
isCommon = newBitmask < (BIND_FLAG | BIND_KEY_FLAG | ARY_FLAG);
|
||
|
||
var isCombo =
|
||
((srcBitmask == ARY_FLAG) && (bitmask == CURRY_FLAG)) ||
|
||
((srcBitmask == ARY_FLAG) && (bitmask == REARG_FLAG) && (data[7].length <= source[8])) ||
|
||
((srcBitmask == (ARY_FLAG | REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == CURRY_FLAG));
|
||
|
||
// Exit early if metadata can't be merged.
|
||
if (!(isCommon || isCombo)) {
|
||
return data;
|
||
}
|
||
// Use source `thisArg` if available.
|
||
if (srcBitmask & BIND_FLAG) {
|
||
data[2] = source[2];
|
||
// Set when currying a bound function.
|
||
newBitmask |= bitmask & BIND_FLAG ? 0 : CURRY_BOUND_FLAG;
|
||
}
|
||
// Compose partial arguments.
|
||
var value = source[3];
|
||
if (value) {
|
||
var partials = data[3];
|
||
data[3] = partials ? composeArgs(partials, value, source[4]) : value;
|
||
data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
|
||
}
|
||
// Compose partial right arguments.
|
||
value = source[5];
|
||
if (value) {
|
||
partials = data[5];
|
||
data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
|
||
data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
|
||
}
|
||
// Use source `argPos` if available.
|
||
value = source[7];
|
||
if (value) {
|
||
data[7] = value;
|
||
}
|
||
// Use source `ary` if it's smaller.
|
||
if (srcBitmask & ARY_FLAG) {
|
||
data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
|
||
}
|
||
// Use source `arity` if one is not provided.
|
||
if (data[9] == null) {
|
||
data[9] = source[9];
|
||
}
|
||
// Use source `func` and merge bitmasks.
|
||
data[0] = source[0];
|
||
data[1] = newBitmask;
|
||
|
||
return data;
|
||
}
|
||
|
||
/**
|
||
* Used by `_.defaultsDeep` to customize its `_.merge` use.
|
||
*
|
||
* @private
|
||
* @param {*} objValue The destination value.
|
||
* @param {*} srcValue The source value.
|
||
* @param {string} key The key of the property to merge.
|
||
* @param {Object} object The parent object of `objValue`.
|
||
* @param {Object} source The parent object of `srcValue`.
|
||
* @param {Object} [stack] Tracks traversed source values and their merged
|
||
* counterparts.
|
||
* @returns {*} Returns the value to assign.
|
||
*/
|
||
function mergeDefaults(objValue, srcValue, key, object, source, stack) {
|
||
if (isObject(objValue) && isObject(srcValue)) {
|
||
// Recursively merge objects and arrays (susceptible to call stack limits).
|
||
stack.set(srcValue, objValue);
|
||
baseMerge(objValue, srcValue, undefined, mergeDefaults, stack);
|
||
stack['delete'](srcValue);
|
||
}
|
||
return objValue;
|
||
}
|
||
|
||
/**
|
||
* Gets the parent value at `path` of `object`.
|
||
*
|
||
* @private
|
||
* @param {Object} object The object to query.
|
||
* @param {Array} path The path to get the parent value of.
|
||
* @returns {*} Returns the parent value.
|
||
*/
|
||
function parent(object, path) {
|
||
return path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
|
||
}
|
||
|
||
/**
|
||
* Reorder `array` according to the specified indexes where the element at
|
||
* the first index is assigned as the first element, the element at
|
||
* the second index is assigned as the second element, and so on.
|
||
*
|
||
* @private
|
||
* @param {Array} array The array to reorder.
|
||
* @param {Array} indexes The arranged array indexes.
|
||
* @returns {Array} Returns `array`.
|
||
*/
|
||
function reorder(array, indexes) {
|
||
var arrLength = array.length,
|
||
length = nativeMin(indexes.length, arrLength),
|
||
oldArray = copyArray(array);
|
||
|
||
while (length--) {
|
||
var index = indexes[length];
|
||
array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
|
||
}
|
||
return array;
|
||
}
|
||
|
||
/**
|
||
* Sets metadata for `func`.
|
||
*
|
||
* **Note:** If this function becomes hot, i.e. is invoked a lot in a short
|
||
* period of time, it will trip its breaker and transition to an identity
|
||
* function to avoid garbage collection pauses in V8. See
|
||
* [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
|
||
* for more details.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to associate metadata with.
|
||
* @param {*} data The metadata.
|
||
* @returns {Function} Returns `func`.
|
||
*/
|
||
var setData = (function() {
|
||
var count = 0,
|
||
lastCalled = 0;
|
||
|
||
return function(key, value) {
|
||
var stamp = now(),
|
||
remaining = HOT_SPAN - (stamp - lastCalled);
|
||
|
||
lastCalled = stamp;
|
||
if (remaining > 0) {
|
||
if (++count >= HOT_COUNT) {
|
||
return key;
|
||
}
|
||
} else {
|
||
count = 0;
|
||
}
|
||
return baseSetData(key, value);
|
||
};
|
||
}());
|
||
|
||
/**
|
||
* Sets the `toString` method of `wrapper` to mimic the source of `reference`
|
||
* with wrapper details in a comment at the top of the source body.
|
||
*
|
||
* @private
|
||
* @param {Function} wrapper The function to modify.
|
||
* @param {Function} reference The reference function.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @returns {Function} Returns `wrapper`.
|
||
*/
|
||
var setWrapToString = !defineProperty ? identity : function(wrapper, reference, bitmask) {
|
||
var source = (reference + '');
|
||
return defineProperty(wrapper, 'toString', {
|
||
'configurable': true,
|
||
'enumerable': false,
|
||
'value': constant(insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)))
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Converts `string` to a property path array.
|
||
*
|
||
* @private
|
||
* @param {string} string The string to convert.
|
||
* @returns {Array} Returns the property path array.
|
||
*/
|
||
var stringToPath = memoize(function(string) {
|
||
string = toString(string);
|
||
|
||
var result = [];
|
||
if (reLeadingDot.test(string)) {
|
||
result.push('');
|
||
}
|
||
string.replace(rePropName, function(match, number, quote, string) {
|
||
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
|
||
});
|
||
return result;
|
||
});
|
||
|
||
/**
|
||
* Converts `value` to a string key if it's not a string or symbol.
|
||
*
|
||
* @private
|
||
* @param {*} value The value to inspect.
|
||
* @returns {string|symbol} Returns the key.
|
||
*/
|
||
function toKey(value) {
|
||
if (typeof value == 'string' || isSymbol(value)) {
|
||
return value;
|
||
}
|
||
var result = (value + '');
|
||
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
||
}
|
||
|
||
/**
|
||
* Converts `func` to its source code.
|
||
*
|
||
* @private
|
||
* @param {Function} func The function to process.
|
||
* @returns {string} Returns the source code.
|
||
*/
|
||
function toSource(func) {
|
||
if (func != null) {
|
||
try {
|
||
return funcToString.call(func);
|
||
} catch (e) {}
|
||
try {
|
||
return (func + '');
|
||
} catch (e) {}
|
||
}
|
||
return '';
|
||
}
|
||
|
||
/**
|
||
* Updates wrapper `details` based on `bitmask` flags.
|
||
*
|
||
* @private
|
||
* @returns {Array} details The details to modify.
|
||
* @param {number} bitmask The bitmask flags. See `createWrap` for more details.
|
||
* @returns {Array} Returns `details`.
|
||
*/
|
||
function updateWrapDetails(details, bitmask) {
|
||
arrayEach(wrapFlags, function(pair) {
|
||
var value = '_.' + pair[0];
|
||
if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
|
||
details.push(value);
|
||
}
|
||
});
|
||
return details.sort();
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of `wrapper`.
|
||
*
|
||
* @private
|
||
* @param {Object} wrapper The wrapper to clone.
|
||
* @returns {Object} Returns the cloned wrapper.
|
||
*/
|
||
function wrapperClone(wrapper) {
|
||
if (wrapper instanceof LazyWrapper) {
|
||
return wrapper.clone();
|
||
}
|
||
var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
|
||
result.__actions__ = copyArray(wrapper.__actions__);
|
||
result.__index__ = wrapper.__index__;
|
||
result.__values__ = wrapper.__values__;
|
||
return result;
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates an array of elements split into groups the length of `size`.
|
||
* If `array` can't be split evenly, the final chunk will be the remaining
|
||
* elements.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to process.
|
||
* @param {number} [size=1] The length of each chunk
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the new array of chunks.
|
||
* @example
|
||
*
|
||
* _.chunk(['a', 'b', 'c', 'd'], 2);
|
||
* // => [['a', 'b'], ['c', 'd']]
|
||
*
|
||
* _.chunk(['a', 'b', 'c', 'd'], 3);
|
||
* // => [['a', 'b', 'c'], ['d']]
|
||
*/
|
||
function chunk(array, size, guard) {
|
||
if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
|
||
size = 1;
|
||
} else {
|
||
size = nativeMax(toInteger(size), 0);
|
||
}
|
||
var length = array ? array.length : 0;
|
||
if (!length || size < 1) {
|
||
return [];
|
||
}
|
||
var index = 0,
|
||
resIndex = 0,
|
||
result = Array(nativeCeil(length / size));
|
||
|
||
while (index < length) {
|
||
result[resIndex++] = baseSlice(array, index, (index += size));
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates an array with all falsey values removed. The values `false`, `null`,
|
||
* `0`, `""`, `undefined`, and `NaN` are falsey.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to compact.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @example
|
||
*
|
||
* _.compact([0, 1, false, 2, '', 3]);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function compact(array) {
|
||
var index = -1,
|
||
length = array ? array.length : 0,
|
||
resIndex = 0,
|
||
result = [];
|
||
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
if (value) {
|
||
result[resIndex++] = value;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a new array concatenating `array` with any additional arrays
|
||
* and/or values.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to concatenate.
|
||
* @param {...*} [values] The values to concatenate.
|
||
* @returns {Array} Returns the new concatenated array.
|
||
* @example
|
||
*
|
||
* var array = [1];
|
||
* var other = _.concat(array, 2, [3], [[4]]);
|
||
*
|
||
* console.log(other);
|
||
* // => [1, 2, 3, [4]]
|
||
*
|
||
* console.log(array);
|
||
* // => [1]
|
||
*/
|
||
function concat() {
|
||
var length = arguments.length,
|
||
args = Array(length ? length - 1 : 0),
|
||
array = arguments[0],
|
||
index = length;
|
||
|
||
while (index--) {
|
||
args[index - 1] = arguments[index];
|
||
}
|
||
return length
|
||
? arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1))
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Creates an array of `array` values not included in the other given arrays
|
||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons. The order of result values is determined by the
|
||
* order they occur in the first array.
|
||
*
|
||
* **Note:** Unlike `_.pullAll`, this method returns a new array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {...Array} [values] The values to exclude.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @see _.without, _.xor
|
||
* @example
|
||
*
|
||
* _.difference([2, 1], [2, 3]);
|
||
* // => [1]
|
||
*/
|
||
var difference = baseRest(function(array, values) {
|
||
return isArrayLikeObject(array)
|
||
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.difference` except that it accepts `iteratee` which
|
||
* is invoked for each element of `array` and `values` to generate the criterion
|
||
* by which they're compared. Result values are chosen from the first array.
|
||
* The iteratee is invoked with one argument: (value).
|
||
*
|
||
* **Note:** Unlike `_.pullAllBy`, this method returns a new array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {...Array} [values] The values to exclude.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @example
|
||
*
|
||
* _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
||
* // => [1.2]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
|
||
* // => [{ 'x': 2 }]
|
||
*/
|
||
var differenceBy = baseRest(function(array, values) {
|
||
var iteratee = last(values);
|
||
if (isArrayLikeObject(iteratee)) {
|
||
iteratee = undefined;
|
||
}
|
||
return isArrayLikeObject(array)
|
||
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.difference` except that it accepts `comparator`
|
||
* which is invoked to compare elements of `array` to `values`. Result values
|
||
* are chosen from the first array. The comparator is invoked with two arguments:
|
||
* (arrVal, othVal).
|
||
*
|
||
* **Note:** Unlike `_.pullAllWith`, this method returns a new array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {...Array} [values] The values to exclude.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
||
*
|
||
* _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
|
||
* // => [{ 'x': 2, 'y': 1 }]
|
||
*/
|
||
var differenceWith = baseRest(function(array, values) {
|
||
var comparator = last(values);
|
||
if (isArrayLikeObject(comparator)) {
|
||
comparator = undefined;
|
||
}
|
||
return isArrayLikeObject(array)
|
||
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* Creates a slice of `array` with `n` elements dropped from the beginning.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.5.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {number} [n=1] The number of elements to drop.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.drop([1, 2, 3]);
|
||
* // => [2, 3]
|
||
*
|
||
* _.drop([1, 2, 3], 2);
|
||
* // => [3]
|
||
*
|
||
* _.drop([1, 2, 3], 5);
|
||
* // => []
|
||
*
|
||
* _.drop([1, 2, 3], 0);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function drop(array, n, guard) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
n = (guard || n === undefined) ? 1 : toInteger(n);
|
||
return baseSlice(array, n < 0 ? 0 : n, length);
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` with `n` elements dropped from the end.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {number} [n=1] The number of elements to drop.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.dropRight([1, 2, 3]);
|
||
* // => [1, 2]
|
||
*
|
||
* _.dropRight([1, 2, 3], 2);
|
||
* // => [1]
|
||
*
|
||
* _.dropRight([1, 2, 3], 5);
|
||
* // => []
|
||
*
|
||
* _.dropRight([1, 2, 3], 0);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function dropRight(array, n, guard) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
n = (guard || n === undefined) ? 1 : toInteger(n);
|
||
n = length - n;
|
||
return baseSlice(array, 0, n < 0 ? 0 : n);
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` excluding elements dropped from the end.
|
||
* Elements are dropped until `predicate` returns falsey. The predicate is
|
||
* invoked with three arguments: (value, index, array).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': true },
|
||
* { 'user': 'fred', 'active': false },
|
||
* { 'user': 'pebbles', 'active': false }
|
||
* ];
|
||
*
|
||
* _.dropRightWhile(users, function(o) { return !o.active; });
|
||
* // => objects for ['barney']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
|
||
* // => objects for ['barney', 'fred']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.dropRightWhile(users, ['active', false]);
|
||
* // => objects for ['barney']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.dropRightWhile(users, 'active');
|
||
* // => objects for ['barney', 'fred', 'pebbles']
|
||
*/
|
||
function dropRightWhile(array, predicate) {
|
||
return (array && array.length)
|
||
? baseWhile(array, getIteratee(predicate, 3), true, true)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` excluding elements dropped from the beginning.
|
||
* Elements are dropped until `predicate` returns falsey. The predicate is
|
||
* invoked with three arguments: (value, index, array).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': false },
|
||
* { 'user': 'fred', 'active': false },
|
||
* { 'user': 'pebbles', 'active': true }
|
||
* ];
|
||
*
|
||
* _.dropWhile(users, function(o) { return !o.active; });
|
||
* // => objects for ['pebbles']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.dropWhile(users, { 'user': 'barney', 'active': false });
|
||
* // => objects for ['fred', 'pebbles']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.dropWhile(users, ['active', false]);
|
||
* // => objects for ['pebbles']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.dropWhile(users, 'active');
|
||
* // => objects for ['barney', 'fred', 'pebbles']
|
||
*/
|
||
function dropWhile(array, predicate) {
|
||
return (array && array.length)
|
||
? baseWhile(array, getIteratee(predicate, 3), true)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Fills elements of `array` with `value` from `start` up to, but not
|
||
* including, `end`.
|
||
*
|
||
* **Note:** This method mutates `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.2.0
|
||
* @category Array
|
||
* @param {Array} array The array to fill.
|
||
* @param {*} value The value to fill `array` with.
|
||
* @param {number} [start=0] The start position.
|
||
* @param {number} [end=array.length] The end position.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = [1, 2, 3];
|
||
*
|
||
* _.fill(array, 'a');
|
||
* console.log(array);
|
||
* // => ['a', 'a', 'a']
|
||
*
|
||
* _.fill(Array(3), 2);
|
||
* // => [2, 2, 2]
|
||
*
|
||
* _.fill([4, 6, 8, 10], '*', 1, 3);
|
||
* // => [4, '*', '*', 10]
|
||
*/
|
||
function fill(array, value, start, end) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
|
||
start = 0;
|
||
end = length;
|
||
}
|
||
return baseFill(array, value, start, end);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.find` except that it returns the index of the first
|
||
* element `predicate` returns truthy for instead of the element itself.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param {number} [fromIndex=0] The index to search from.
|
||
* @returns {number} Returns the index of the found element, else `-1`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': false },
|
||
* { 'user': 'fred', 'active': false },
|
||
* { 'user': 'pebbles', 'active': true }
|
||
* ];
|
||
*
|
||
* _.findIndex(users, function(o) { return o.user == 'barney'; });
|
||
* // => 0
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.findIndex(users, { 'user': 'fred', 'active': false });
|
||
* // => 1
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.findIndex(users, ['active', false]);
|
||
* // => 0
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.findIndex(users, 'active');
|
||
* // => 2
|
||
*/
|
||
function findIndex(array, predicate, fromIndex) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
var index = fromIndex == null ? 0 : toInteger(fromIndex);
|
||
if (index < 0) {
|
||
index = nativeMax(length + index, 0);
|
||
}
|
||
return baseFindIndex(array, getIteratee(predicate, 3), index);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.findIndex` except that it iterates over elements
|
||
* of `collection` from right to left.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param {number} [fromIndex=array.length-1] The index to search from.
|
||
* @returns {number} Returns the index of the found element, else `-1`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': true },
|
||
* { 'user': 'fred', 'active': false },
|
||
* { 'user': 'pebbles', 'active': false }
|
||
* ];
|
||
*
|
||
* _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
|
||
* // => 2
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.findLastIndex(users, { 'user': 'barney', 'active': true });
|
||
* // => 0
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.findLastIndex(users, ['active', false]);
|
||
* // => 2
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.findLastIndex(users, 'active');
|
||
* // => 0
|
||
*/
|
||
function findLastIndex(array, predicate, fromIndex) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
var index = length - 1;
|
||
if (fromIndex !== undefined) {
|
||
index = toInteger(fromIndex);
|
||
index = fromIndex < 0
|
||
? nativeMax(length + index, 0)
|
||
: nativeMin(index, length - 1);
|
||
}
|
||
return baseFindIndex(array, getIteratee(predicate, 3), index, true);
|
||
}
|
||
|
||
/**
|
||
* Flattens `array` a single level deep.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to flatten.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* _.flatten([1, [2, [3, [4]], 5]]);
|
||
* // => [1, 2, [3, [4]], 5]
|
||
*/
|
||
function flatten(array) {
|
||
var length = array ? array.length : 0;
|
||
return length ? baseFlatten(array, 1) : [];
|
||
}
|
||
|
||
/**
|
||
* Recursively flattens `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to flatten.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* _.flattenDeep([1, [2, [3, [4]], 5]]);
|
||
* // => [1, 2, 3, 4, 5]
|
||
*/
|
||
function flattenDeep(array) {
|
||
var length = array ? array.length : 0;
|
||
return length ? baseFlatten(array, INFINITY) : [];
|
||
}
|
||
|
||
/**
|
||
* Recursively flatten `array` up to `depth` times.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.4.0
|
||
* @category Array
|
||
* @param {Array} array The array to flatten.
|
||
* @param {number} [depth=1] The maximum recursion depth.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* var array = [1, [2, [3, [4]], 5]];
|
||
*
|
||
* _.flattenDepth(array, 1);
|
||
* // => [1, 2, [3, [4]], 5]
|
||
*
|
||
* _.flattenDepth(array, 2);
|
||
* // => [1, 2, 3, [4], 5]
|
||
*/
|
||
function flattenDepth(array, depth) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
depth = depth === undefined ? 1 : toInteger(depth);
|
||
return baseFlatten(array, depth);
|
||
}
|
||
|
||
/**
|
||
* The inverse of `_.toPairs`; this method returns an object composed
|
||
* from key-value `pairs`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} pairs The key-value pairs.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* _.fromPairs([['a', 1], ['b', 2]]);
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*/
|
||
function fromPairs(pairs) {
|
||
var index = -1,
|
||
length = pairs ? pairs.length : 0,
|
||
result = {};
|
||
|
||
while (++index < length) {
|
||
var pair = pairs[index];
|
||
result[pair[0]] = pair[1];
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Gets the first element of `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @alias first
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @returns {*} Returns the first element of `array`.
|
||
* @example
|
||
*
|
||
* _.head([1, 2, 3]);
|
||
* // => 1
|
||
*
|
||
* _.head([]);
|
||
* // => undefined
|
||
*/
|
||
function head(array) {
|
||
return (array && array.length) ? array[0] : undefined;
|
||
}
|
||
|
||
/**
|
||
* Gets the index at which the first occurrence of `value` is found in `array`
|
||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons. If `fromIndex` is negative, it's used as the
|
||
* offset from the end of `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @param {number} [fromIndex=0] The index to search from.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
* @example
|
||
*
|
||
* _.indexOf([1, 2, 1, 2], 2);
|
||
* // => 1
|
||
*
|
||
* // Search from the `fromIndex`.
|
||
* _.indexOf([1, 2, 1, 2], 2, 2);
|
||
* // => 3
|
||
*/
|
||
function indexOf(array, value, fromIndex) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
var index = fromIndex == null ? 0 : toInteger(fromIndex);
|
||
if (index < 0) {
|
||
index = nativeMax(length + index, 0);
|
||
}
|
||
return baseIndexOf(array, value, index);
|
||
}
|
||
|
||
/**
|
||
* Gets all but the last element of `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.initial([1, 2, 3]);
|
||
* // => [1, 2]
|
||
*/
|
||
function initial(array) {
|
||
return dropRight(array, 1);
|
||
}
|
||
|
||
/**
|
||
* Creates an array of unique values that are included in all given arrays
|
||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons. The order of result values is determined by the
|
||
* order they occur in the first array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @returns {Array} Returns the new array of intersecting values.
|
||
* @example
|
||
*
|
||
* _.intersection([2, 1], [2, 3]);
|
||
* // => [2]
|
||
*/
|
||
var intersection = baseRest(function(arrays) {
|
||
var mapped = arrayMap(arrays, castArrayLikeObject);
|
||
return (mapped.length && mapped[0] === arrays[0])
|
||
? baseIntersection(mapped)
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.intersection` except that it accepts `iteratee`
|
||
* which is invoked for each element of each `arrays` to generate the criterion
|
||
* by which they're compared. Result values are chosen from the first array.
|
||
* The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {Array} Returns the new array of intersecting values.
|
||
* @example
|
||
*
|
||
* _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
||
* // => [2.1]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
||
* // => [{ 'x': 1 }]
|
||
*/
|
||
var intersectionBy = baseRest(function(arrays) {
|
||
var iteratee = last(arrays),
|
||
mapped = arrayMap(arrays, castArrayLikeObject);
|
||
|
||
if (iteratee === last(mapped)) {
|
||
iteratee = undefined;
|
||
} else {
|
||
mapped.pop();
|
||
}
|
||
return (mapped.length && mapped[0] === arrays[0])
|
||
? baseIntersection(mapped, getIteratee(iteratee, 2))
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.intersection` except that it accepts `comparator`
|
||
* which is invoked to compare elements of `arrays`. Result values are chosen
|
||
* from the first array. The comparator is invoked with two arguments:
|
||
* (arrVal, othVal).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of intersecting values.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
||
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
||
*
|
||
* _.intersectionWith(objects, others, _.isEqual);
|
||
* // => [{ 'x': 1, 'y': 2 }]
|
||
*/
|
||
var intersectionWith = baseRest(function(arrays) {
|
||
var comparator = last(arrays),
|
||
mapped = arrayMap(arrays, castArrayLikeObject);
|
||
|
||
if (comparator === last(mapped)) {
|
||
comparator = undefined;
|
||
} else {
|
||
mapped.pop();
|
||
}
|
||
return (mapped.length && mapped[0] === arrays[0])
|
||
? baseIntersection(mapped, undefined, comparator)
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* Converts all elements in `array` into a string separated by `separator`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to convert.
|
||
* @param {string} [separator=','] The element separator.
|
||
* @returns {string} Returns the joined string.
|
||
* @example
|
||
*
|
||
* _.join(['a', 'b', 'c'], '~');
|
||
* // => 'a~b~c'
|
||
*/
|
||
function join(array, separator) {
|
||
return array ? nativeJoin.call(array, separator) : '';
|
||
}
|
||
|
||
/**
|
||
* Gets the last element of `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @returns {*} Returns the last element of `array`.
|
||
* @example
|
||
*
|
||
* _.last([1, 2, 3]);
|
||
* // => 3
|
||
*/
|
||
function last(array) {
|
||
var length = array ? array.length : 0;
|
||
return length ? array[length - 1] : undefined;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.indexOf` except that it iterates over elements of
|
||
* `array` from right to left.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @param {number} [fromIndex=array.length-1] The index to search from.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
* @example
|
||
*
|
||
* _.lastIndexOf([1, 2, 1, 2], 2);
|
||
* // => 3
|
||
*
|
||
* // Search from the `fromIndex`.
|
||
* _.lastIndexOf([1, 2, 1, 2], 2, 2);
|
||
* // => 1
|
||
*/
|
||
function lastIndexOf(array, value, fromIndex) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return -1;
|
||
}
|
||
var index = length;
|
||
if (fromIndex !== undefined) {
|
||
index = toInteger(fromIndex);
|
||
index = (
|
||
index < 0
|
||
? nativeMax(length + index, 0)
|
||
: nativeMin(index, length - 1)
|
||
) + 1;
|
||
}
|
||
if (value !== value) {
|
||
return baseFindIndex(array, baseIsNaN, index - 1, true);
|
||
}
|
||
while (index--) {
|
||
if (array[index] === value) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* Gets the element at index `n` of `array`. If `n` is negative, the nth
|
||
* element from the end is returned.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.11.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {number} [n=0] The index of the element to return.
|
||
* @returns {*} Returns the nth element of `array`.
|
||
* @example
|
||
*
|
||
* var array = ['a', 'b', 'c', 'd'];
|
||
*
|
||
* _.nth(array, 1);
|
||
* // => 'b'
|
||
*
|
||
* _.nth(array, -2);
|
||
* // => 'c';
|
||
*/
|
||
function nth(array, n) {
|
||
return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
|
||
}
|
||
|
||
/**
|
||
* Removes all given values from `array` using
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons.
|
||
*
|
||
* **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
|
||
* to remove elements from an array by predicate.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {...*} [values] The values to remove.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = ['a', 'b', 'c', 'a', 'b', 'c'];
|
||
*
|
||
* _.pull(array, 'a', 'c');
|
||
* console.log(array);
|
||
* // => ['b', 'b']
|
||
*/
|
||
var pull = baseRest(pullAll);
|
||
|
||
/**
|
||
* This method is like `_.pull` except that it accepts an array of values to remove.
|
||
*
|
||
* **Note:** Unlike `_.difference`, this method mutates `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {Array} values The values to remove.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = ['a', 'b', 'c', 'a', 'b', 'c'];
|
||
*
|
||
* _.pullAll(array, ['a', 'c']);
|
||
* console.log(array);
|
||
* // => ['b', 'b']
|
||
*/
|
||
function pullAll(array, values) {
|
||
return (array && array.length && values && values.length)
|
||
? basePullAll(array, values)
|
||
: array;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.pullAll` except that it accepts `iteratee` which is
|
||
* invoked for each element of `array` and `values` to generate the criterion
|
||
* by which they're compared. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* **Note:** Unlike `_.differenceBy`, this method mutates `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {Array} values The values to remove.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
|
||
*
|
||
* _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
|
||
* console.log(array);
|
||
* // => [{ 'x': 2 }]
|
||
*/
|
||
function pullAllBy(array, values, iteratee) {
|
||
return (array && array.length && values && values.length)
|
||
? basePullAll(array, values, getIteratee(iteratee, 2))
|
||
: array;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.pullAll` except that it accepts `comparator` which
|
||
* is invoked to compare elements of `array` to `values`. The comparator is
|
||
* invoked with two arguments: (arrVal, othVal).
|
||
*
|
||
* **Note:** Unlike `_.differenceWith`, this method mutates `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.6.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {Array} values The values to remove.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
|
||
*
|
||
* _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
|
||
* console.log(array);
|
||
* // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
|
||
*/
|
||
function pullAllWith(array, values, comparator) {
|
||
return (array && array.length && values && values.length)
|
||
? basePullAll(array, values, undefined, comparator)
|
||
: array;
|
||
}
|
||
|
||
/**
|
||
* Removes elements from `array` corresponding to `indexes` and returns an
|
||
* array of removed elements.
|
||
*
|
||
* **Note:** Unlike `_.at`, this method mutates `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {...(number|number[])} [indexes] The indexes of elements to remove.
|
||
* @returns {Array} Returns the new array of removed elements.
|
||
* @example
|
||
*
|
||
* var array = ['a', 'b', 'c', 'd'];
|
||
* var pulled = _.pullAt(array, [1, 3]);
|
||
*
|
||
* console.log(array);
|
||
* // => ['a', 'c']
|
||
*
|
||
* console.log(pulled);
|
||
* // => ['b', 'd']
|
||
*/
|
||
var pullAt = baseRest(function(array, indexes) {
|
||
indexes = baseFlatten(indexes, 1);
|
||
|
||
var length = array ? array.length : 0,
|
||
result = baseAt(array, indexes);
|
||
|
||
basePullAt(array, arrayMap(indexes, function(index) {
|
||
return isIndex(index, length) ? +index : index;
|
||
}).sort(compareAscending));
|
||
|
||
return result;
|
||
});
|
||
|
||
/**
|
||
* Removes all elements from `array` that `predicate` returns truthy for
|
||
* and returns an array of the removed elements. The predicate is invoked
|
||
* with three arguments: (value, index, array).
|
||
*
|
||
* **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
|
||
* to pull elements from an array by value.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the new array of removed elements.
|
||
* @example
|
||
*
|
||
* var array = [1, 2, 3, 4];
|
||
* var evens = _.remove(array, function(n) {
|
||
* return n % 2 == 0;
|
||
* });
|
||
*
|
||
* console.log(array);
|
||
* // => [1, 3]
|
||
*
|
||
* console.log(evens);
|
||
* // => [2, 4]
|
||
*/
|
||
function remove(array, predicate) {
|
||
var result = [];
|
||
if (!(array && array.length)) {
|
||
return result;
|
||
}
|
||
var index = -1,
|
||
indexes = [],
|
||
length = array.length;
|
||
|
||
predicate = getIteratee(predicate, 3);
|
||
while (++index < length) {
|
||
var value = array[index];
|
||
if (predicate(value, index, array)) {
|
||
result.push(value);
|
||
indexes.push(index);
|
||
}
|
||
}
|
||
basePullAt(array, indexes);
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Reverses `array` so that the first element becomes the last, the second
|
||
* element becomes the second to last, and so on.
|
||
*
|
||
* **Note:** This method mutates `array` and is based on
|
||
* [`Array#reverse`](https://mdn.io/Array/reverse).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to modify.
|
||
* @returns {Array} Returns `array`.
|
||
* @example
|
||
*
|
||
* var array = [1, 2, 3];
|
||
*
|
||
* _.reverse(array);
|
||
* // => [3, 2, 1]
|
||
*
|
||
* console.log(array);
|
||
* // => [3, 2, 1]
|
||
*/
|
||
function reverse(array) {
|
||
return array ? nativeReverse.call(array) : array;
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` from `start` up to, but not including, `end`.
|
||
*
|
||
* **Note:** This method is used instead of
|
||
* [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
|
||
* returned.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to slice.
|
||
* @param {number} [start=0] The start position.
|
||
* @param {number} [end=array.length] The end position.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
*/
|
||
function slice(array, start, end) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
|
||
start = 0;
|
||
end = length;
|
||
}
|
||
else {
|
||
start = start == null ? 0 : toInteger(start);
|
||
end = end === undefined ? length : toInteger(end);
|
||
}
|
||
return baseSlice(array, start, end);
|
||
}
|
||
|
||
/**
|
||
* Uses a binary search to determine the lowest index at which `value`
|
||
* should be inserted into `array` in order to maintain its sort order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
* @example
|
||
*
|
||
* _.sortedIndex([30, 50], 40);
|
||
* // => 1
|
||
*/
|
||
function sortedIndex(array, value) {
|
||
return baseSortedIndex(array, value);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.sortedIndex` except that it accepts `iteratee`
|
||
* which is invoked for `value` and each element of `array` to compute their
|
||
* sort ranking. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 4 }, { 'x': 5 }];
|
||
*
|
||
* _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
|
||
* // => 0
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.sortedIndexBy(objects, { 'x': 4 }, 'x');
|
||
* // => 0
|
||
*/
|
||
function sortedIndexBy(array, value, iteratee) {
|
||
return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.indexOf` except that it performs a binary
|
||
* search on a sorted `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
* @example
|
||
*
|
||
* _.sortedIndexOf([4, 5, 5, 5, 6], 5);
|
||
* // => 1
|
||
*/
|
||
function sortedIndexOf(array, value) {
|
||
var length = array ? array.length : 0;
|
||
if (length) {
|
||
var index = baseSortedIndex(array, value);
|
||
if (index < length && eq(array[index], value)) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.sortedIndex` except that it returns the highest
|
||
* index at which `value` should be inserted into `array` in order to
|
||
* maintain its sort order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
* @example
|
||
*
|
||
* _.sortedLastIndex([4, 5, 5, 5, 6], 5);
|
||
* // => 4
|
||
*/
|
||
function sortedLastIndex(array, value) {
|
||
return baseSortedIndex(array, value, true);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.sortedLastIndex` except that it accepts `iteratee`
|
||
* which is invoked for `value` and each element of `array` to compute their
|
||
* sort ranking. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The sorted array to inspect.
|
||
* @param {*} value The value to evaluate.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {number} Returns the index at which `value` should be inserted
|
||
* into `array`.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 4 }, { 'x': 5 }];
|
||
*
|
||
* _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
|
||
* // => 1
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
|
||
* // => 1
|
||
*/
|
||
function sortedLastIndexBy(array, value, iteratee) {
|
||
return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.lastIndexOf` except that it performs a binary
|
||
* search on a sorted `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to search.
|
||
* @param {*} value The value to search for.
|
||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||
* @example
|
||
*
|
||
* _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
|
||
* // => 3
|
||
*/
|
||
function sortedLastIndexOf(array, value) {
|
||
var length = array ? array.length : 0;
|
||
if (length) {
|
||
var index = baseSortedIndex(array, value, true) - 1;
|
||
if (eq(array[index], value)) {
|
||
return index;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.uniq` except that it's designed and optimized
|
||
* for sorted arrays.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
* @example
|
||
*
|
||
* _.sortedUniq([1, 1, 2]);
|
||
* // => [1, 2]
|
||
*/
|
||
function sortedUniq(array) {
|
||
return (array && array.length)
|
||
? baseSortedUniq(array)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.uniqBy` except that it's designed and optimized
|
||
* for sorted arrays.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
* @example
|
||
*
|
||
* _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
|
||
* // => [1.1, 2.3]
|
||
*/
|
||
function sortedUniqBy(array, iteratee) {
|
||
return (array && array.length)
|
||
? baseSortedUniq(array, getIteratee(iteratee, 2))
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Gets all but the first element of `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.tail([1, 2, 3]);
|
||
* // => [2, 3]
|
||
*/
|
||
function tail(array) {
|
||
return drop(array, 1);
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` with `n` elements taken from the beginning.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {number} [n=1] The number of elements to take.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.take([1, 2, 3]);
|
||
* // => [1]
|
||
*
|
||
* _.take([1, 2, 3], 2);
|
||
* // => [1, 2]
|
||
*
|
||
* _.take([1, 2, 3], 5);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* _.take([1, 2, 3], 0);
|
||
* // => []
|
||
*/
|
||
function take(array, n, guard) {
|
||
if (!(array && array.length)) {
|
||
return [];
|
||
}
|
||
n = (guard || n === undefined) ? 1 : toInteger(n);
|
||
return baseSlice(array, 0, n < 0 ? 0 : n);
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` with `n` elements taken from the end.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {number} [n=1] The number of elements to take.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* _.takeRight([1, 2, 3]);
|
||
* // => [3]
|
||
*
|
||
* _.takeRight([1, 2, 3], 2);
|
||
* // => [2, 3]
|
||
*
|
||
* _.takeRight([1, 2, 3], 5);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* _.takeRight([1, 2, 3], 0);
|
||
* // => []
|
||
*/
|
||
function takeRight(array, n, guard) {
|
||
var length = array ? array.length : 0;
|
||
if (!length) {
|
||
return [];
|
||
}
|
||
n = (guard || n === undefined) ? 1 : toInteger(n);
|
||
n = length - n;
|
||
return baseSlice(array, n < 0 ? 0 : n, length);
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` with elements taken from the end. Elements are
|
||
* taken until `predicate` returns falsey. The predicate is invoked with
|
||
* three arguments: (value, index, array).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': true },
|
||
* { 'user': 'fred', 'active': false },
|
||
* { 'user': 'pebbles', 'active': false }
|
||
* ];
|
||
*
|
||
* _.takeRightWhile(users, function(o) { return !o.active; });
|
||
* // => objects for ['fred', 'pebbles']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
|
||
* // => objects for ['pebbles']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.takeRightWhile(users, ['active', false]);
|
||
* // => objects for ['fred', 'pebbles']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.takeRightWhile(users, 'active');
|
||
* // => []
|
||
*/
|
||
function takeRightWhile(array, predicate) {
|
||
return (array && array.length)
|
||
? baseWhile(array, getIteratee(predicate, 3), false, true)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Creates a slice of `array` with elements taken from the beginning. Elements
|
||
* are taken until `predicate` returns falsey. The predicate is invoked with
|
||
* three arguments: (value, index, array).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to query.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the slice of `array`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': false },
|
||
* { 'user': 'fred', 'active': false},
|
||
* { 'user': 'pebbles', 'active': true }
|
||
* ];
|
||
*
|
||
* _.takeWhile(users, function(o) { return !o.active; });
|
||
* // => objects for ['barney', 'fred']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.takeWhile(users, { 'user': 'barney', 'active': false });
|
||
* // => objects for ['barney']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.takeWhile(users, ['active', false]);
|
||
* // => objects for ['barney', 'fred']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.takeWhile(users, 'active');
|
||
* // => []
|
||
*/
|
||
function takeWhile(array, predicate) {
|
||
return (array && array.length)
|
||
? baseWhile(array, getIteratee(predicate, 3))
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* Creates an array of unique values, in order, from all given arrays using
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @returns {Array} Returns the new array of combined values.
|
||
* @example
|
||
*
|
||
* _.union([2], [1, 2]);
|
||
* // => [2, 1]
|
||
*/
|
||
var union = baseRest(function(arrays) {
|
||
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.union` except that it accepts `iteratee` which is
|
||
* invoked for each element of each `arrays` to generate the criterion by
|
||
* which uniqueness is computed. Result values are chosen from the first
|
||
* array in which the value occurs. The iteratee is invoked with one argument:
|
||
* (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {Array} Returns the new array of combined values.
|
||
* @example
|
||
*
|
||
* _.unionBy([2.1], [1.2, 2.3], Math.floor);
|
||
* // => [2.1, 1.2]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
||
* // => [{ 'x': 1 }, { 'x': 2 }]
|
||
*/
|
||
var unionBy = baseRest(function(arrays) {
|
||
var iteratee = last(arrays);
|
||
if (isArrayLikeObject(iteratee)) {
|
||
iteratee = undefined;
|
||
}
|
||
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.union` except that it accepts `comparator` which
|
||
* is invoked to compare elements of `arrays`. Result values are chosen from
|
||
* the first array in which the value occurs. The comparator is invoked
|
||
* with two arguments: (arrVal, othVal).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of combined values.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
||
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
||
*
|
||
* _.unionWith(objects, others, _.isEqual);
|
||
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
|
||
*/
|
||
var unionWith = baseRest(function(arrays) {
|
||
var comparator = last(arrays);
|
||
if (isArrayLikeObject(comparator)) {
|
||
comparator = undefined;
|
||
}
|
||
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
|
||
});
|
||
|
||
/**
|
||
* Creates a duplicate-free version of an array, using
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons, in which only the first occurrence of each
|
||
* element is kept.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
* @example
|
||
*
|
||
* _.uniq([2, 1, 2]);
|
||
* // => [2, 1]
|
||
*/
|
||
function uniq(array) {
|
||
return (array && array.length)
|
||
? baseUniq(array)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.uniq` except that it accepts `iteratee` which is
|
||
* invoked for each element in `array` to generate the criterion by which
|
||
* uniqueness is computed. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
* @example
|
||
*
|
||
* _.uniqBy([2.1, 1.2, 2.3], Math.floor);
|
||
* // => [2.1, 1.2]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
|
||
* // => [{ 'x': 1 }, { 'x': 2 }]
|
||
*/
|
||
function uniqBy(array, iteratee) {
|
||
return (array && array.length)
|
||
? baseUniq(array, getIteratee(iteratee, 2))
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.uniq` except that it accepts `comparator` which
|
||
* is invoked to compare elements of `array`. The comparator is invoked with
|
||
* two arguments: (arrVal, othVal).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new duplicate free array.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
||
*
|
||
* _.uniqWith(objects, _.isEqual);
|
||
* // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
|
||
*/
|
||
function uniqWith(array, comparator) {
|
||
return (array && array.length)
|
||
? baseUniq(array, undefined, comparator)
|
||
: [];
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.zip` except that it accepts an array of grouped
|
||
* elements and creates an array regrouping the elements to their pre-zip
|
||
* configuration.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.2.0
|
||
* @category Array
|
||
* @param {Array} array The array of grouped elements to process.
|
||
* @returns {Array} Returns the new array of regrouped elements.
|
||
* @example
|
||
*
|
||
* var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
|
||
* // => [['a', 1, true], ['b', 2, false]]
|
||
*
|
||
* _.unzip(zipped);
|
||
* // => [['a', 'b'], [1, 2], [true, false]]
|
||
*/
|
||
function unzip(array) {
|
||
if (!(array && array.length)) {
|
||
return [];
|
||
}
|
||
var length = 0;
|
||
array = arrayFilter(array, function(group) {
|
||
if (isArrayLikeObject(group)) {
|
||
length = nativeMax(group.length, length);
|
||
return true;
|
||
}
|
||
});
|
||
return baseTimes(length, function(index) {
|
||
return arrayMap(array, baseProperty(index));
|
||
});
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.unzip` except that it accepts `iteratee` to specify
|
||
* how regrouped values should be combined. The iteratee is invoked with the
|
||
* elements of each group: (...group).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.8.0
|
||
* @category Array
|
||
* @param {Array} array The array of grouped elements to process.
|
||
* @param {Function} [iteratee=_.identity] The function to combine
|
||
* regrouped values.
|
||
* @returns {Array} Returns the new array of regrouped elements.
|
||
* @example
|
||
*
|
||
* var zipped = _.zip([1, 2], [10, 20], [100, 200]);
|
||
* // => [[1, 10, 100], [2, 20, 200]]
|
||
*
|
||
* _.unzipWith(zipped, _.add);
|
||
* // => [3, 30, 300]
|
||
*/
|
||
function unzipWith(array, iteratee) {
|
||
if (!(array && array.length)) {
|
||
return [];
|
||
}
|
||
var result = unzip(array);
|
||
if (iteratee == null) {
|
||
return result;
|
||
}
|
||
return arrayMap(result, function(group) {
|
||
return apply(iteratee, undefined, group);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates an array excluding all given values using
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* for equality comparisons.
|
||
*
|
||
* **Note:** Unlike `_.pull`, this method returns a new array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {Array} array The array to inspect.
|
||
* @param {...*} [values] The values to exclude.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @see _.difference, _.xor
|
||
* @example
|
||
*
|
||
* _.without([2, 1, 2, 3], 1, 2);
|
||
* // => [3]
|
||
*/
|
||
var without = baseRest(function(array, values) {
|
||
return isArrayLikeObject(array)
|
||
? baseDifference(array, values)
|
||
: [];
|
||
});
|
||
|
||
/**
|
||
* Creates an array of unique values that is the
|
||
* [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
|
||
* of the given arrays. The order of result values is determined by the order
|
||
* they occur in the arrays.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.4.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @see _.difference, _.without
|
||
* @example
|
||
*
|
||
* _.xor([2, 1], [2, 3]);
|
||
* // => [1, 3]
|
||
*/
|
||
var xor = baseRest(function(arrays) {
|
||
return baseXor(arrayFilter(arrays, isArrayLikeObject));
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.xor` except that it accepts `iteratee` which is
|
||
* invoked for each element of each `arrays` to generate the criterion by
|
||
* which by which they're compared. The iteratee is invoked with one argument:
|
||
* (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee invoked per element.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @example
|
||
*
|
||
* _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
|
||
* // => [1.2, 3.4]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
|
||
* // => [{ 'x': 2 }]
|
||
*/
|
||
var xorBy = baseRest(function(arrays) {
|
||
var iteratee = last(arrays);
|
||
if (isArrayLikeObject(iteratee)) {
|
||
iteratee = undefined;
|
||
}
|
||
return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.xor` except that it accepts `comparator` which is
|
||
* invoked to compare elements of `arrays`. The comparator is invoked with
|
||
* two arguments: (arrVal, othVal).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to inspect.
|
||
* @param {Function} [comparator] The comparator invoked per element.
|
||
* @returns {Array} Returns the new array of filtered values.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
|
||
* var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
|
||
*
|
||
* _.xorWith(objects, others, _.isEqual);
|
||
* // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
|
||
*/
|
||
var xorWith = baseRest(function(arrays) {
|
||
var comparator = last(arrays);
|
||
if (isArrayLikeObject(comparator)) {
|
||
comparator = undefined;
|
||
}
|
||
return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
|
||
});
|
||
|
||
/**
|
||
* Creates an array of grouped elements, the first of which contains the
|
||
* first elements of the given arrays, the second of which contains the
|
||
* second elements of the given arrays, and so on.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to process.
|
||
* @returns {Array} Returns the new array of grouped elements.
|
||
* @example
|
||
*
|
||
* _.zip(['a', 'b'], [1, 2], [true, false]);
|
||
* // => [['a', 1, true], ['b', 2, false]]
|
||
*/
|
||
var zip = baseRest(unzip);
|
||
|
||
/**
|
||
* This method is like `_.fromPairs` except that it accepts two arrays,
|
||
* one of property identifiers and one of corresponding values.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.4.0
|
||
* @category Array
|
||
* @param {Array} [props=[]] The property identifiers.
|
||
* @param {Array} [values=[]] The property values.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* _.zipObject(['a', 'b'], [1, 2]);
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*/
|
||
function zipObject(props, values) {
|
||
return baseZipObject(props || [], values || [], assignValue);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.zipObject` except that it supports property paths.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.1.0
|
||
* @category Array
|
||
* @param {Array} [props=[]] The property identifiers.
|
||
* @param {Array} [values=[]] The property values.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
|
||
* // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
|
||
*/
|
||
function zipObjectDeep(props, values) {
|
||
return baseZipObject(props || [], values || [], baseSet);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.zip` except that it accepts `iteratee` to specify
|
||
* how grouped values should be combined. The iteratee is invoked with the
|
||
* elements of each group: (...group).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.8.0
|
||
* @category Array
|
||
* @param {...Array} [arrays] The arrays to process.
|
||
* @param {Function} [iteratee=_.identity] The function to combine grouped values.
|
||
* @returns {Array} Returns the new array of grouped elements.
|
||
* @example
|
||
*
|
||
* _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
|
||
* return a + b + c;
|
||
* });
|
||
* // => [111, 222]
|
||
*/
|
||
var zipWith = baseRest(function(arrays) {
|
||
var length = arrays.length,
|
||
iteratee = length > 1 ? arrays[length - 1] : undefined;
|
||
|
||
iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
|
||
return unzipWith(arrays, iteratee);
|
||
});
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates a `lodash` wrapper instance that wraps `value` with explicit method
|
||
* chain sequences enabled. The result of such sequences must be unwrapped
|
||
* with `_#value`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.3.0
|
||
* @category Seq
|
||
* @param {*} value The value to wrap.
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36 },
|
||
* { 'user': 'fred', 'age': 40 },
|
||
* { 'user': 'pebbles', 'age': 1 }
|
||
* ];
|
||
*
|
||
* var youngest = _
|
||
* .chain(users)
|
||
* .sortBy('age')
|
||
* .map(function(o) {
|
||
* return o.user + ' is ' + o.age;
|
||
* })
|
||
* .head()
|
||
* .value();
|
||
* // => 'pebbles is 1'
|
||
*/
|
||
function chain(value) {
|
||
var result = lodash(value);
|
||
result.__chain__ = true;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* This method invokes `interceptor` and returns `value`. The interceptor
|
||
* is invoked with one argument; (value). The purpose of this method is to
|
||
* "tap into" a method chain sequence in order to modify intermediate results.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Seq
|
||
* @param {*} value The value to provide to `interceptor`.
|
||
* @param {Function} interceptor The function to invoke.
|
||
* @returns {*} Returns `value`.
|
||
* @example
|
||
*
|
||
* _([1, 2, 3])
|
||
* .tap(function(array) {
|
||
* // Mutate input array.
|
||
* array.pop();
|
||
* })
|
||
* .reverse()
|
||
* .value();
|
||
* // => [2, 1]
|
||
*/
|
||
function tap(value, interceptor) {
|
||
interceptor(value);
|
||
return value;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.tap` except that it returns the result of `interceptor`.
|
||
* The purpose of this method is to "pass thru" values replacing intermediate
|
||
* results in a method chain sequence.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Seq
|
||
* @param {*} value The value to provide to `interceptor`.
|
||
* @param {Function} interceptor The function to invoke.
|
||
* @returns {*} Returns the result of `interceptor`.
|
||
* @example
|
||
*
|
||
* _(' abc ')
|
||
* .chain()
|
||
* .trim()
|
||
* .thru(function(value) {
|
||
* return [value];
|
||
* })
|
||
* .value();
|
||
* // => ['abc']
|
||
*/
|
||
function thru(value, interceptor) {
|
||
return interceptor(value);
|
||
}
|
||
|
||
/**
|
||
* This method is the wrapper version of `_.at`.
|
||
*
|
||
* @name at
|
||
* @memberOf _
|
||
* @since 1.0.0
|
||
* @category Seq
|
||
* @param {...(string|string[])} [paths] The property paths of elements to pick.
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
|
||
*
|
||
* _(object).at(['a[0].b.c', 'a[1]']).value();
|
||
* // => [3, 4]
|
||
*/
|
||
var wrapperAt = baseRest(function(paths) {
|
||
paths = baseFlatten(paths, 1);
|
||
var length = paths.length,
|
||
start = length ? paths[0] : 0,
|
||
value = this.__wrapped__,
|
||
interceptor = function(object) { return baseAt(object, paths); };
|
||
|
||
if (length > 1 || this.__actions__.length ||
|
||
!(value instanceof LazyWrapper) || !isIndex(start)) {
|
||
return this.thru(interceptor);
|
||
}
|
||
value = value.slice(start, +start + (length ? 1 : 0));
|
||
value.__actions__.push({
|
||
'func': thru,
|
||
'args': [interceptor],
|
||
'thisArg': undefined
|
||
});
|
||
return new LodashWrapper(value, this.__chain__).thru(function(array) {
|
||
if (length && !array.length) {
|
||
array.push(undefined);
|
||
}
|
||
return array;
|
||
});
|
||
});
|
||
|
||
/**
|
||
* Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
|
||
*
|
||
* @name chain
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Seq
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36 },
|
||
* { 'user': 'fred', 'age': 40 }
|
||
* ];
|
||
*
|
||
* // A sequence without explicit chaining.
|
||
* _(users).head();
|
||
* // => { 'user': 'barney', 'age': 36 }
|
||
*
|
||
* // A sequence with explicit chaining.
|
||
* _(users)
|
||
* .chain()
|
||
* .head()
|
||
* .pick('user')
|
||
* .value();
|
||
* // => { 'user': 'barney' }
|
||
*/
|
||
function wrapperChain() {
|
||
return chain(this);
|
||
}
|
||
|
||
/**
|
||
* Executes the chain sequence and returns the wrapped result.
|
||
*
|
||
* @name commit
|
||
* @memberOf _
|
||
* @since 3.2.0
|
||
* @category Seq
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* var array = [1, 2];
|
||
* var wrapped = _(array).push(3);
|
||
*
|
||
* console.log(array);
|
||
* // => [1, 2]
|
||
*
|
||
* wrapped = wrapped.commit();
|
||
* console.log(array);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* wrapped.last();
|
||
* // => 3
|
||
*
|
||
* console.log(array);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function wrapperCommit() {
|
||
return new LodashWrapper(this.value(), this.__chain__);
|
||
}
|
||
|
||
/**
|
||
* Gets the next value on a wrapped object following the
|
||
* [iterator protocol](https://mdn.io/iteration_protocols#iterator).
|
||
*
|
||
* @name next
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Seq
|
||
* @returns {Object} Returns the next iterator value.
|
||
* @example
|
||
*
|
||
* var wrapped = _([1, 2]);
|
||
*
|
||
* wrapped.next();
|
||
* // => { 'done': false, 'value': 1 }
|
||
*
|
||
* wrapped.next();
|
||
* // => { 'done': false, 'value': 2 }
|
||
*
|
||
* wrapped.next();
|
||
* // => { 'done': true, 'value': undefined }
|
||
*/
|
||
function wrapperNext() {
|
||
if (this.__values__ === undefined) {
|
||
this.__values__ = toArray(this.value());
|
||
}
|
||
var done = this.__index__ >= this.__values__.length,
|
||
value = done ? undefined : this.__values__[this.__index__++];
|
||
|
||
return { 'done': done, 'value': value };
|
||
}
|
||
|
||
/**
|
||
* Enables the wrapper to be iterable.
|
||
*
|
||
* @name Symbol.iterator
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Seq
|
||
* @returns {Object} Returns the wrapper object.
|
||
* @example
|
||
*
|
||
* var wrapped = _([1, 2]);
|
||
*
|
||
* wrapped[Symbol.iterator]() === wrapped;
|
||
* // => true
|
||
*
|
||
* Array.from(wrapped);
|
||
* // => [1, 2]
|
||
*/
|
||
function wrapperToIterator() {
|
||
return this;
|
||
}
|
||
|
||
/**
|
||
* Creates a clone of the chain sequence planting `value` as the wrapped value.
|
||
*
|
||
* @name plant
|
||
* @memberOf _
|
||
* @since 3.2.0
|
||
* @category Seq
|
||
* @param {*} value The value to plant.
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* var wrapped = _([1, 2]).map(square);
|
||
* var other = wrapped.plant([3, 4]);
|
||
*
|
||
* other.value();
|
||
* // => [9, 16]
|
||
*
|
||
* wrapped.value();
|
||
* // => [1, 4]
|
||
*/
|
||
function wrapperPlant(value) {
|
||
var result,
|
||
parent = this;
|
||
|
||
while (parent instanceof baseLodash) {
|
||
var clone = wrapperClone(parent);
|
||
clone.__index__ = 0;
|
||
clone.__values__ = undefined;
|
||
if (result) {
|
||
previous.__wrapped__ = clone;
|
||
} else {
|
||
result = clone;
|
||
}
|
||
var previous = clone;
|
||
parent = parent.__wrapped__;
|
||
}
|
||
previous.__wrapped__ = value;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* This method is the wrapper version of `_.reverse`.
|
||
*
|
||
* **Note:** This method mutates the wrapped array.
|
||
*
|
||
* @name reverse
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Seq
|
||
* @returns {Object} Returns the new `lodash` wrapper instance.
|
||
* @example
|
||
*
|
||
* var array = [1, 2, 3];
|
||
*
|
||
* _(array).reverse().value()
|
||
* // => [3, 2, 1]
|
||
*
|
||
* console.log(array);
|
||
* // => [3, 2, 1]
|
||
*/
|
||
function wrapperReverse() {
|
||
var value = this.__wrapped__;
|
||
if (value instanceof LazyWrapper) {
|
||
var wrapped = value;
|
||
if (this.__actions__.length) {
|
||
wrapped = new LazyWrapper(this);
|
||
}
|
||
wrapped = wrapped.reverse();
|
||
wrapped.__actions__.push({
|
||
'func': thru,
|
||
'args': [reverse],
|
||
'thisArg': undefined
|
||
});
|
||
return new LodashWrapper(wrapped, this.__chain__);
|
||
}
|
||
return this.thru(reverse);
|
||
}
|
||
|
||
/**
|
||
* Executes the chain sequence to resolve the unwrapped value.
|
||
*
|
||
* @name value
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @alias toJSON, valueOf
|
||
* @category Seq
|
||
* @returns {*} Returns the resolved unwrapped value.
|
||
* @example
|
||
*
|
||
* _([1, 2, 3]).value();
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function wrapperValue() {
|
||
return baseWrapperValue(this.__wrapped__, this.__actions__);
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Creates an object composed of keys generated from the results of running
|
||
* each element of `collection` thru `iteratee`. The corresponding value of
|
||
* each key is the number of times the key was returned by `iteratee`. The
|
||
* iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.5.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee to transform keys.
|
||
* @returns {Object} Returns the composed aggregate object.
|
||
* @example
|
||
*
|
||
* _.countBy([6.1, 4.2, 6.3], Math.floor);
|
||
* // => { '4': 1, '6': 2 }
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.countBy(['one', 'two', 'three'], 'length');
|
||
* // => { '3': 2, '5': 1 }
|
||
*/
|
||
var countBy = createAggregator(function(result, value, key) {
|
||
hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
|
||
});
|
||
|
||
/**
|
||
* Checks if `predicate` returns truthy for **all** elements of `collection`.
|
||
* Iteration is stopped once `predicate` returns falsey. The predicate is
|
||
* invoked with three arguments: (value, index|key, collection).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.every([true, 1, null, 'yes'], Boolean);
|
||
* // => false
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': false },
|
||
* { 'user': 'fred', 'age': 40, 'active': false }
|
||
* ];
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.every(users, { 'user': 'barney', 'active': false });
|
||
* // => false
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.every(users, ['active', false]);
|
||
* // => true
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.every(users, 'active');
|
||
* // => false
|
||
*/
|
||
function every(collection, predicate, guard) {
|
||
var func = isArray(collection) ? arrayEvery : baseEvery;
|
||
if (guard && isIterateeCall(collection, predicate, guard)) {
|
||
predicate = undefined;
|
||
}
|
||
return func(collection, getIteratee(predicate, 3));
|
||
}
|
||
|
||
/**
|
||
* Iterates over elements of `collection`, returning an array of all elements
|
||
* `predicate` returns truthy for. The predicate is invoked with three
|
||
* arguments: (value, index|key, collection).
|
||
*
|
||
* **Note:** Unlike `_.remove`, this method returns a new array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the new filtered array.
|
||
* @see _.reject
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': true },
|
||
* { 'user': 'fred', 'age': 40, 'active': false }
|
||
* ];
|
||
*
|
||
* _.filter(users, function(o) { return !o.active; });
|
||
* // => objects for ['fred']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.filter(users, { 'age': 36, 'active': true });
|
||
* // => objects for ['barney']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.filter(users, ['active', false]);
|
||
* // => objects for ['fred']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.filter(users, 'active');
|
||
* // => objects for ['barney']
|
||
*/
|
||
function filter(collection, predicate) {
|
||
var func = isArray(collection) ? arrayFilter : baseFilter;
|
||
return func(collection, getIteratee(predicate, 3));
|
||
}
|
||
|
||
/**
|
||
* Iterates over elements of `collection`, returning the first element
|
||
* `predicate` returns truthy for. The predicate is invoked with three
|
||
* arguments: (value, index|key, collection).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to search.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param {number} [fromIndex=0] The index to search from.
|
||
* @returns {*} Returns the matched element, else `undefined`.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': true },
|
||
* { 'user': 'fred', 'age': 40, 'active': false },
|
||
* { 'user': 'pebbles', 'age': 1, 'active': true }
|
||
* ];
|
||
*
|
||
* _.find(users, function(o) { return o.age < 40; });
|
||
* // => object for 'barney'
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.find(users, { 'age': 1, 'active': true });
|
||
* // => object for 'pebbles'
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.find(users, ['active', false]);
|
||
* // => object for 'fred'
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.find(users, 'active');
|
||
* // => object for 'barney'
|
||
*/
|
||
var find = createFind(findIndex);
|
||
|
||
/**
|
||
* This method is like `_.find` except that it iterates over elements of
|
||
* `collection` from right to left.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to search.
|
||
* @param {Function} [predicate=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param {number} [fromIndex=collection.length-1] The index to search from.
|
||
* @returns {*} Returns the matched element, else `undefined`.
|
||
* @example
|
||
*
|
||
* _.findLast([1, 2, 3, 4], function(n) {
|
||
* return n % 2 == 1;
|
||
* });
|
||
* // => 3
|
||
*/
|
||
var findLast = createFind(findLastIndex);
|
||
|
||
/**
|
||
* Creates a flattened array of values by running each element in `collection`
|
||
* thru `iteratee` and flattening the mapped results. The iteratee is invoked
|
||
* with three arguments: (value, index|key, collection).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* function duplicate(n) {
|
||
* return [n, n];
|
||
* }
|
||
*
|
||
* _.flatMap([1, 2], duplicate);
|
||
* // => [1, 1, 2, 2]
|
||
*/
|
||
function flatMap(collection, iteratee) {
|
||
return baseFlatten(map(collection, iteratee), 1);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.flatMap` except that it recursively flattens the
|
||
* mapped results.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.7.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The function invoked per iteration.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* function duplicate(n) {
|
||
* return [[[n, n]]];
|
||
* }
|
||
*
|
||
* _.flatMapDeep([1, 2], duplicate);
|
||
* // => [1, 1, 2, 2]
|
||
*/
|
||
function flatMapDeep(collection, iteratee) {
|
||
return baseFlatten(map(collection, iteratee), INFINITY);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.flatMap` except that it recursively flattens the
|
||
* mapped results up to `depth` times.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.7.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The function invoked per iteration.
|
||
* @param {number} [depth=1] The maximum recursion depth.
|
||
* @returns {Array} Returns the new flattened array.
|
||
* @example
|
||
*
|
||
* function duplicate(n) {
|
||
* return [[[n, n]]];
|
||
* }
|
||
*
|
||
* _.flatMapDepth([1, 2], duplicate, 2);
|
||
* // => [[1, 1], [2, 2]]
|
||
*/
|
||
function flatMapDepth(collection, iteratee, depth) {
|
||
depth = depth === undefined ? 1 : toInteger(depth);
|
||
return baseFlatten(map(collection, iteratee), depth);
|
||
}
|
||
|
||
/**
|
||
* Iterates over elements of `collection` and invokes `iteratee` for each element.
|
||
* The iteratee is invoked with three arguments: (value, index|key, collection).
|
||
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
||
*
|
||
* **Note:** As with other "Collections" methods, objects with a "length"
|
||
* property are iterated like arrays. To avoid this behavior use `_.forIn`
|
||
* or `_.forOwn` for object iteration.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @alias each
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Array|Object} Returns `collection`.
|
||
* @see _.forEachRight
|
||
* @example
|
||
*
|
||
* _([1, 2]).forEach(function(value) {
|
||
* console.log(value);
|
||
* });
|
||
* // => Logs `1` then `2`.
|
||
*
|
||
* _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
|
||
* console.log(key);
|
||
* });
|
||
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
|
||
*/
|
||
function forEach(collection, iteratee) {
|
||
var func = isArray(collection) ? arrayEach : baseEach;
|
||
return func(collection, getIteratee(iteratee, 3));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.forEach` except that it iterates over elements of
|
||
* `collection` from right to left.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @alias eachRight
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Array|Object} Returns `collection`.
|
||
* @see _.forEach
|
||
* @example
|
||
*
|
||
* _.forEachRight([1, 2], function(value) {
|
||
* console.log(value);
|
||
* });
|
||
* // => Logs `2` then `1`.
|
||
*/
|
||
function forEachRight(collection, iteratee) {
|
||
var func = isArray(collection) ? arrayEachRight : baseEachRight;
|
||
return func(collection, getIteratee(iteratee, 3));
|
||
}
|
||
|
||
/**
|
||
* Creates an object composed of keys generated from the results of running
|
||
* each element of `collection` thru `iteratee`. The order of grouped values
|
||
* is determined by the order they occur in `collection`. The corresponding
|
||
* value of each key is an array of elements responsible for generating the
|
||
* key. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee to transform keys.
|
||
* @returns {Object} Returns the composed aggregate object.
|
||
* @example
|
||
*
|
||
* _.groupBy([6.1, 4.2, 6.3], Math.floor);
|
||
* // => { '4': [4.2], '6': [6.1, 6.3] }
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.groupBy(['one', 'two', 'three'], 'length');
|
||
* // => { '3': ['one', 'two'], '5': ['three'] }
|
||
*/
|
||
var groupBy = createAggregator(function(result, value, key) {
|
||
if (hasOwnProperty.call(result, key)) {
|
||
result[key].push(value);
|
||
} else {
|
||
result[key] = [value];
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Checks if `value` is in `collection`. If `collection` is a string, it's
|
||
* checked for a substring of `value`, otherwise
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* is used for equality comparisons. If `fromIndex` is negative, it's used as
|
||
* the offset from the end of `collection`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object|string} collection The collection to search.
|
||
* @param {*} value The value to search for.
|
||
* @param {number} [fromIndex=0] The index to search from.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
|
||
* @returns {boolean} Returns `true` if `value` is found, else `false`.
|
||
* @example
|
||
*
|
||
* _.includes([1, 2, 3], 1);
|
||
* // => true
|
||
*
|
||
* _.includes([1, 2, 3], 1, 2);
|
||
* // => false
|
||
*
|
||
* _.includes({ 'a': 1, 'b': 2 }, 1);
|
||
* // => true
|
||
*
|
||
* _.includes('abcd', 'bc');
|
||
* // => true
|
||
*/
|
||
function includes(collection, value, fromIndex, guard) {
|
||
collection = isArrayLike(collection) ? collection : values(collection);
|
||
fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
|
||
|
||
var length = collection.length;
|
||
if (fromIndex < 0) {
|
||
fromIndex = nativeMax(length + fromIndex, 0);
|
||
}
|
||
return isString(collection)
|
||
? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
|
||
: (!!length && baseIndexOf(collection, value, fromIndex) > -1);
|
||
}
|
||
|
||
/**
|
||
* Invokes the method at `path` of each element in `collection`, returning
|
||
* an array of the results of each invoked method. Any additional arguments
|
||
* are provided to each invoked method. If `path` is a function, it's invoked
|
||
* for, and `this` bound to, each element in `collection`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Array|Function|string} path The path of the method to invoke or
|
||
* the function invoked per iteration.
|
||
* @param {...*} [args] The arguments to invoke each method with.
|
||
* @returns {Array} Returns the array of results.
|
||
* @example
|
||
*
|
||
* _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
|
||
* // => [[1, 5, 7], [1, 2, 3]]
|
||
*
|
||
* _.invokeMap([123, 456], String.prototype.split, '');
|
||
* // => [['1', '2', '3'], ['4', '5', '6']]
|
||
*/
|
||
var invokeMap = baseRest(function(collection, path, args) {
|
||
var index = -1,
|
||
isFunc = typeof path == 'function',
|
||
isProp = isKey(path),
|
||
result = isArrayLike(collection) ? Array(collection.length) : [];
|
||
|
||
baseEach(collection, function(value) {
|
||
var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);
|
||
result[++index] = func ? apply(func, value, args) : baseInvoke(value, path, args);
|
||
});
|
||
return result;
|
||
});
|
||
|
||
/**
|
||
* Creates an object composed of keys generated from the results of running
|
||
* each element of `collection` thru `iteratee`. The corresponding value of
|
||
* each key is the last element responsible for generating the key. The
|
||
* iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity]
|
||
* The iteratee to transform keys.
|
||
* @returns {Object} Returns the composed aggregate object.
|
||
* @example
|
||
*
|
||
* var array = [
|
||
* { 'dir': 'left', 'code': 97 },
|
||
* { 'dir': 'right', 'code': 100 }
|
||
* ];
|
||
*
|
||
* _.keyBy(array, function(o) {
|
||
* return String.fromCharCode(o.code);
|
||
* });
|
||
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
|
||
*
|
||
* _.keyBy(array, 'dir');
|
||
* // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
|
||
*/
|
||
var keyBy = createAggregator(function(result, value, key) {
|
||
result[key] = value;
|
||
});
|
||
|
||
/**
|
||
* Creates an array of values by running each element in `collection` thru
|
||
* `iteratee`. The iteratee is invoked with three arguments:
|
||
* (value, index|key, collection).
|
||
*
|
||
* Many lodash methods are guarded to work as iteratees for methods like
|
||
* `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
|
||
*
|
||
* The guarded methods are:
|
||
* `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
|
||
* `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
|
||
* `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
|
||
* `template`, `trim`, `trimEnd`, `trimStart`, and `words`
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Array} Returns the new mapped array.
|
||
* @example
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* _.map([4, 8], square);
|
||
* // => [16, 64]
|
||
*
|
||
* _.map({ 'a': 4, 'b': 8 }, square);
|
||
* // => [16, 64] (iteration order is not guaranteed)
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney' },
|
||
* { 'user': 'fred' }
|
||
* ];
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.map(users, 'user');
|
||
* // => ['barney', 'fred']
|
||
*/
|
||
function map(collection, iteratee) {
|
||
var func = isArray(collection) ? arrayMap : baseMap;
|
||
return func(collection, getIteratee(iteratee, 3));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.sortBy` except that it allows specifying the sort
|
||
* orders of the iteratees to sort by. If `orders` is unspecified, all values
|
||
* are sorted in ascending order. Otherwise, specify an order of "desc" for
|
||
* descending or "asc" for ascending sort order of corresponding values.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
|
||
* The iteratees to sort by.
|
||
* @param {string[]} [orders] The sort orders of `iteratees`.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
|
||
* @returns {Array} Returns the new sorted array.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'fred', 'age': 48 },
|
||
* { 'user': 'barney', 'age': 34 },
|
||
* { 'user': 'fred', 'age': 40 },
|
||
* { 'user': 'barney', 'age': 36 }
|
||
* ];
|
||
*
|
||
* // Sort by `user` in ascending order and by `age` in descending order.
|
||
* _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
|
||
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
|
||
*/
|
||
function orderBy(collection, iteratees, orders, guard) {
|
||
if (collection == null) {
|
||
return [];
|
||
}
|
||
if (!isArray(iteratees)) {
|
||
iteratees = iteratees == null ? [] : [iteratees];
|
||
}
|
||
orders = guard ? undefined : orders;
|
||
if (!isArray(orders)) {
|
||
orders = orders == null ? [] : [orders];
|
||
}
|
||
return baseOrderBy(collection, iteratees, orders);
|
||
}
|
||
|
||
/**
|
||
* Creates an array of elements split into two groups, the first of which
|
||
* contains elements `predicate` returns truthy for, the second of which
|
||
* contains elements `predicate` returns falsey for. The predicate is
|
||
* invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @returns {Array} Returns the array of grouped elements.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': false },
|
||
* { 'user': 'fred', 'age': 40, 'active': true },
|
||
* { 'user': 'pebbles', 'age': 1, 'active': false }
|
||
* ];
|
||
*
|
||
* _.partition(users, function(o) { return o.active; });
|
||
* // => objects for [['fred'], ['barney', 'pebbles']]
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.partition(users, { 'age': 1, 'active': false });
|
||
* // => objects for [['pebbles'], ['barney', 'fred']]
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.partition(users, ['active', false]);
|
||
* // => objects for [['barney', 'pebbles'], ['fred']]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.partition(users, 'active');
|
||
* // => objects for [['fred'], ['barney', 'pebbles']]
|
||
*/
|
||
var partition = createAggregator(function(result, value, key) {
|
||
result[key ? 0 : 1].push(value);
|
||
}, function() { return [[], []]; });
|
||
|
||
/**
|
||
* Reduces `collection` to a value which is the accumulated result of running
|
||
* each element in `collection` thru `iteratee`, where each successive
|
||
* invocation is supplied the return value of the previous. If `accumulator`
|
||
* is not given, the first element of `collection` is used as the initial
|
||
* value. The iteratee is invoked with four arguments:
|
||
* (accumulator, value, index|key, collection).
|
||
*
|
||
* Many lodash methods are guarded to work as iteratees for methods like
|
||
* `_.reduce`, `_.reduceRight`, and `_.transform`.
|
||
*
|
||
* The guarded methods are:
|
||
* `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
|
||
* and `sortBy`
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @param {*} [accumulator] The initial value.
|
||
* @returns {*} Returns the accumulated value.
|
||
* @see _.reduceRight
|
||
* @example
|
||
*
|
||
* _.reduce([1, 2], function(sum, n) {
|
||
* return sum + n;
|
||
* }, 0);
|
||
* // => 3
|
||
*
|
||
* _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
|
||
* (result[value] || (result[value] = [])).push(key);
|
||
* return result;
|
||
* }, {});
|
||
* // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
|
||
*/
|
||
function reduce(collection, iteratee, accumulator) {
|
||
var func = isArray(collection) ? arrayReduce : baseReduce,
|
||
initAccum = arguments.length < 3;
|
||
|
||
return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.reduce` except that it iterates over elements of
|
||
* `collection` from right to left.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @param {*} [accumulator] The initial value.
|
||
* @returns {*} Returns the accumulated value.
|
||
* @see _.reduce
|
||
* @example
|
||
*
|
||
* var array = [[0, 1], [2, 3], [4, 5]];
|
||
*
|
||
* _.reduceRight(array, function(flattened, other) {
|
||
* return flattened.concat(other);
|
||
* }, []);
|
||
* // => [4, 5, 2, 3, 0, 1]
|
||
*/
|
||
function reduceRight(collection, iteratee, accumulator) {
|
||
var func = isArray(collection) ? arrayReduceRight : baseReduce,
|
||
initAccum = arguments.length < 3;
|
||
|
||
return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
|
||
}
|
||
|
||
/**
|
||
* The opposite of `_.filter`; this method returns the elements of `collection`
|
||
* that `predicate` does **not** return truthy for.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @returns {Array} Returns the new filtered array.
|
||
* @see _.filter
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': false },
|
||
* { 'user': 'fred', 'age': 40, 'active': true }
|
||
* ];
|
||
*
|
||
* _.reject(users, function(o) { return !o.active; });
|
||
* // => objects for ['fred']
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.reject(users, { 'age': 40, 'active': true });
|
||
* // => objects for ['barney']
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.reject(users, ['active', false]);
|
||
* // => objects for ['fred']
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.reject(users, 'active');
|
||
* // => objects for ['barney']
|
||
*/
|
||
function reject(collection, predicate) {
|
||
var func = isArray(collection) ? arrayFilter : baseFilter;
|
||
return func(collection, negate(getIteratee(predicate, 3)));
|
||
}
|
||
|
||
/**
|
||
* Gets a random element from `collection`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to sample.
|
||
* @returns {*} Returns the random element.
|
||
* @example
|
||
*
|
||
* _.sample([1, 2, 3, 4]);
|
||
* // => 2
|
||
*/
|
||
function sample(collection) {
|
||
var array = isArrayLike(collection) ? collection : values(collection),
|
||
length = array.length;
|
||
|
||
return length > 0 ? array[baseRandom(0, length - 1)] : undefined;
|
||
}
|
||
|
||
/**
|
||
* Gets `n` random elements at unique keys from `collection` up to the
|
||
* size of `collection`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to sample.
|
||
* @param {number} [n=1] The number of elements to sample.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the random elements.
|
||
* @example
|
||
*
|
||
* _.sampleSize([1, 2, 3], 2);
|
||
* // => [3, 1]
|
||
*
|
||
* _.sampleSize([1, 2, 3], 4);
|
||
* // => [2, 3, 1]
|
||
*/
|
||
function sampleSize(collection, n, guard) {
|
||
var index = -1,
|
||
result = toArray(collection),
|
||
length = result.length,
|
||
lastIndex = length - 1;
|
||
|
||
if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
|
||
n = 1;
|
||
} else {
|
||
n = baseClamp(toInteger(n), 0, length);
|
||
}
|
||
while (++index < n) {
|
||
var rand = baseRandom(index, lastIndex),
|
||
value = result[rand];
|
||
|
||
result[rand] = result[index];
|
||
result[index] = value;
|
||
}
|
||
result.length = n;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates an array of shuffled values, using a version of the
|
||
* [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to shuffle.
|
||
* @returns {Array} Returns the new shuffled array.
|
||
* @example
|
||
*
|
||
* _.shuffle([1, 2, 3, 4]);
|
||
* // => [4, 1, 3, 2]
|
||
*/
|
||
function shuffle(collection) {
|
||
return sampleSize(collection, MAX_ARRAY_LENGTH);
|
||
}
|
||
|
||
/**
|
||
* Gets the size of `collection` by returning its length for array-like
|
||
* values or the number of own enumerable string keyed properties for objects.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to inspect.
|
||
* @returns {number} Returns the collection size.
|
||
* @example
|
||
*
|
||
* _.size([1, 2, 3]);
|
||
* // => 3
|
||
*
|
||
* _.size({ 'a': 1, 'b': 2 });
|
||
* // => 2
|
||
*
|
||
* _.size('pebbles');
|
||
* // => 7
|
||
*/
|
||
function size(collection) {
|
||
if (collection == null) {
|
||
return 0;
|
||
}
|
||
if (isArrayLike(collection)) {
|
||
var result = collection.length;
|
||
return (result && isString(collection)) ? stringSize(collection) : result;
|
||
}
|
||
if (isObjectLike(collection)) {
|
||
var tag = getTag(collection);
|
||
if (tag == mapTag || tag == setTag) {
|
||
return collection.size;
|
||
}
|
||
}
|
||
return keys(collection).length;
|
||
}
|
||
|
||
/**
|
||
* Checks if `predicate` returns truthy for **any** element of `collection`.
|
||
* Iteration is stopped once `predicate` returns truthy. The predicate is
|
||
* invoked with three arguments: (value, index|key, collection).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.some([null, 0, 'yes', false], Boolean);
|
||
* // => true
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'active': true },
|
||
* { 'user': 'fred', 'active': false }
|
||
* ];
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.some(users, { 'user': 'barney', 'active': false });
|
||
* // => false
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.some(users, ['active', false]);
|
||
* // => true
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.some(users, 'active');
|
||
* // => true
|
||
*/
|
||
function some(collection, predicate, guard) {
|
||
var func = isArray(collection) ? arraySome : baseSome;
|
||
if (guard && isIterateeCall(collection, predicate, guard)) {
|
||
predicate = undefined;
|
||
}
|
||
return func(collection, getIteratee(predicate, 3));
|
||
}
|
||
|
||
/**
|
||
* Creates an array of elements, sorted in ascending order by the results of
|
||
* running each element in a collection thru each iteratee. This method
|
||
* performs a stable sort, that is, it preserves the original sort order of
|
||
* equal elements. The iteratees are invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Collection
|
||
* @param {Array|Object} collection The collection to iterate over.
|
||
* @param {...(Function|Function[])} [iteratees=[_.identity]]
|
||
* The iteratees to sort by.
|
||
* @returns {Array} Returns the new sorted array.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'fred', 'age': 48 },
|
||
* { 'user': 'barney', 'age': 36 },
|
||
* { 'user': 'fred', 'age': 40 },
|
||
* { 'user': 'barney', 'age': 34 }
|
||
* ];
|
||
*
|
||
* _.sortBy(users, function(o) { return o.user; });
|
||
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
|
||
*
|
||
* _.sortBy(users, ['user', 'age']);
|
||
* // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
|
||
*
|
||
* _.sortBy(users, 'user', function(o) {
|
||
* return Math.floor(o.age / 10);
|
||
* });
|
||
* // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
|
||
*/
|
||
var sortBy = baseRest(function(collection, iteratees) {
|
||
if (collection == null) {
|
||
return [];
|
||
}
|
||
var length = iteratees.length;
|
||
if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
|
||
iteratees = [];
|
||
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
|
||
iteratees = [iteratees[0]];
|
||
}
|
||
return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
|
||
});
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Gets the timestamp of the number of milliseconds that have elapsed since
|
||
* the Unix epoch (1 January 1970 00:00:00 UTC).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.4.0
|
||
* @category Date
|
||
* @returns {number} Returns the timestamp.
|
||
* @example
|
||
*
|
||
* _.defer(function(stamp) {
|
||
* console.log(_.now() - stamp);
|
||
* }, _.now());
|
||
* // => Logs the number of milliseconds it took for the deferred invocation.
|
||
*/
|
||
function now() {
|
||
return Date.now();
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* The opposite of `_.before`; this method creates a function that invokes
|
||
* `func` once it's called `n` or more times.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {number} n The number of calls before `func` is invoked.
|
||
* @param {Function} func The function to restrict.
|
||
* @returns {Function} Returns the new restricted function.
|
||
* @example
|
||
*
|
||
* var saves = ['profile', 'settings'];
|
||
*
|
||
* var done = _.after(saves.length, function() {
|
||
* console.log('done saving!');
|
||
* });
|
||
*
|
||
* _.forEach(saves, function(type) {
|
||
* asyncSave({ 'type': type, 'complete': done });
|
||
* });
|
||
* // => Logs 'done saving!' after the two async saves have completed.
|
||
*/
|
||
function after(n, func) {
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
n = toInteger(n);
|
||
return function() {
|
||
if (--n < 1) {
|
||
return func.apply(this, arguments);
|
||
}
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func`, with up to `n` arguments,
|
||
* ignoring any additional arguments.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to cap arguments for.
|
||
* @param {number} [n=func.length] The arity cap.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Function} Returns the new capped function.
|
||
* @example
|
||
*
|
||
* _.map(['6', '8', '10'], _.ary(parseInt, 1));
|
||
* // => [6, 8, 10]
|
||
*/
|
||
function ary(func, n, guard) {
|
||
n = guard ? undefined : n;
|
||
n = (func && n == null) ? func.length : n;
|
||
return createWrap(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func`, with the `this` binding and arguments
|
||
* of the created function, while it's called less than `n` times. Subsequent
|
||
* calls to the created function return the result of the last `func` invocation.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Function
|
||
* @param {number} n The number of calls at which `func` is no longer invoked.
|
||
* @param {Function} func The function to restrict.
|
||
* @returns {Function} Returns the new restricted function.
|
||
* @example
|
||
*
|
||
* jQuery(element).on('click', _.before(5, addContactToList));
|
||
* // => Allows adding up to 4 contacts to the list.
|
||
*/
|
||
function before(n, func) {
|
||
var result;
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
n = toInteger(n);
|
||
return function() {
|
||
if (--n > 0) {
|
||
result = func.apply(this, arguments);
|
||
}
|
||
if (n <= 1) {
|
||
func = undefined;
|
||
}
|
||
return result;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with the `this` binding of `thisArg`
|
||
* and `partials` prepended to the arguments it receives.
|
||
*
|
||
* The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
|
||
* may be used as a placeholder for partially applied arguments.
|
||
*
|
||
* **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
|
||
* property of bound functions.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to bind.
|
||
* @param {*} thisArg The `this` binding of `func`.
|
||
* @param {...*} [partials] The arguments to be partially applied.
|
||
* @returns {Function} Returns the new bound function.
|
||
* @example
|
||
*
|
||
* function greet(greeting, punctuation) {
|
||
* return greeting + ' ' + this.user + punctuation;
|
||
* }
|
||
*
|
||
* var object = { 'user': 'fred' };
|
||
*
|
||
* var bound = _.bind(greet, object, 'hi');
|
||
* bound('!');
|
||
* // => 'hi fred!'
|
||
*
|
||
* // Bound with placeholders.
|
||
* var bound = _.bind(greet, object, _, '!');
|
||
* bound('hi');
|
||
* // => 'hi fred!'
|
||
*/
|
||
var bind = baseRest(function(func, thisArg, partials) {
|
||
var bitmask = BIND_FLAG;
|
||
if (partials.length) {
|
||
var holders = replaceHolders(partials, getHolder(bind));
|
||
bitmask |= PARTIAL_FLAG;
|
||
}
|
||
return createWrap(func, bitmask, thisArg, partials, holders);
|
||
});
|
||
|
||
/**
|
||
* Creates a function that invokes the method at `object[key]` with `partials`
|
||
* prepended to the arguments it receives.
|
||
*
|
||
* This method differs from `_.bind` by allowing bound functions to reference
|
||
* methods that may be redefined or don't yet exist. See
|
||
* [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
|
||
* for more details.
|
||
*
|
||
* The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
|
||
* builds, may be used as a placeholder for partially applied arguments.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.10.0
|
||
* @category Function
|
||
* @param {Object} object The object to invoke the method on.
|
||
* @param {string} key The key of the method.
|
||
* @param {...*} [partials] The arguments to be partially applied.
|
||
* @returns {Function} Returns the new bound function.
|
||
* @example
|
||
*
|
||
* var object = {
|
||
* 'user': 'fred',
|
||
* 'greet': function(greeting, punctuation) {
|
||
* return greeting + ' ' + this.user + punctuation;
|
||
* }
|
||
* };
|
||
*
|
||
* var bound = _.bindKey(object, 'greet', 'hi');
|
||
* bound('!');
|
||
* // => 'hi fred!'
|
||
*
|
||
* object.greet = function(greeting, punctuation) {
|
||
* return greeting + 'ya ' + this.user + punctuation;
|
||
* };
|
||
*
|
||
* bound('!');
|
||
* // => 'hiya fred!'
|
||
*
|
||
* // Bound with placeholders.
|
||
* var bound = _.bindKey(object, 'greet', _, '!');
|
||
* bound('hi');
|
||
* // => 'hiya fred!'
|
||
*/
|
||
var bindKey = baseRest(function(object, key, partials) {
|
||
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
|
||
if (partials.length) {
|
||
var holders = replaceHolders(partials, getHolder(bindKey));
|
||
bitmask |= PARTIAL_FLAG;
|
||
}
|
||
return createWrap(key, bitmask, object, partials, holders);
|
||
});
|
||
|
||
/**
|
||
* Creates a function that accepts arguments of `func` and either invokes
|
||
* `func` returning its result, if at least `arity` number of arguments have
|
||
* been provided, or returns a function that accepts the remaining `func`
|
||
* arguments, and so on. The arity of `func` may be specified if `func.length`
|
||
* is not sufficient.
|
||
*
|
||
* The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
|
||
* may be used as a placeholder for provided arguments.
|
||
*
|
||
* **Note:** This method doesn't set the "length" property of curried functions.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to curry.
|
||
* @param {number} [arity=func.length] The arity of `func`.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Function} Returns the new curried function.
|
||
* @example
|
||
*
|
||
* var abc = function(a, b, c) {
|
||
* return [a, b, c];
|
||
* };
|
||
*
|
||
* var curried = _.curry(abc);
|
||
*
|
||
* curried(1)(2)(3);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* curried(1, 2)(3);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* curried(1, 2, 3);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* // Curried with placeholders.
|
||
* curried(1)(_, 3)(2);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function curry(func, arity, guard) {
|
||
arity = guard ? undefined : arity;
|
||
var result = createWrap(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
|
||
result.placeholder = curry.placeholder;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.curry` except that arguments are applied to `func`
|
||
* in the manner of `_.partialRight` instead of `_.partial`.
|
||
*
|
||
* The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
|
||
* builds, may be used as a placeholder for provided arguments.
|
||
*
|
||
* **Note:** This method doesn't set the "length" property of curried functions.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to curry.
|
||
* @param {number} [arity=func.length] The arity of `func`.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Function} Returns the new curried function.
|
||
* @example
|
||
*
|
||
* var abc = function(a, b, c) {
|
||
* return [a, b, c];
|
||
* };
|
||
*
|
||
* var curried = _.curryRight(abc);
|
||
*
|
||
* curried(3)(2)(1);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* curried(2, 3)(1);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* curried(1, 2, 3);
|
||
* // => [1, 2, 3]
|
||
*
|
||
* // Curried with placeholders.
|
||
* curried(3)(1, _)(2);
|
||
* // => [1, 2, 3]
|
||
*/
|
||
function curryRight(func, arity, guard) {
|
||
arity = guard ? undefined : arity;
|
||
var result = createWrap(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
|
||
result.placeholder = curryRight.placeholder;
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates a debounced function that delays invoking `func` until after `wait`
|
||
* milliseconds have elapsed since the last time the debounced function was
|
||
* invoked. The debounced function comes with a `cancel` method to cancel
|
||
* delayed `func` invocations and a `flush` method to immediately invoke them.
|
||
* Provide `options` to indicate whether `func` should be invoked on the
|
||
* leading and/or trailing edge of the `wait` timeout. The `func` is invoked
|
||
* with the last arguments provided to the debounced function. Subsequent
|
||
* calls to the debounced function return the result of the last `func`
|
||
* invocation.
|
||
*
|
||
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
||
* invoked on the trailing edge of the timeout only if the debounced function
|
||
* is invoked more than once during the `wait` timeout.
|
||
*
|
||
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
||
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
|
||
*
|
||
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
||
* for details over the differences between `_.debounce` and `_.throttle`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to debounce.
|
||
* @param {number} [wait=0] The number of milliseconds to delay.
|
||
* @param {Object} [options={}] The options object.
|
||
* @param {boolean} [options.leading=false]
|
||
* Specify invoking on the leading edge of the timeout.
|
||
* @param {number} [options.maxWait]
|
||
* The maximum time `func` is allowed to be delayed before it's invoked.
|
||
* @param {boolean} [options.trailing=true]
|
||
* Specify invoking on the trailing edge of the timeout.
|
||
* @returns {Function} Returns the new debounced function.
|
||
* @example
|
||
*
|
||
* // Avoid costly calculations while the window size is in flux.
|
||
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
|
||
*
|
||
* // Invoke `sendMail` when clicked, debouncing subsequent calls.
|
||
* jQuery(element).on('click', _.debounce(sendMail, 300, {
|
||
* 'leading': true,
|
||
* 'trailing': false
|
||
* }));
|
||
*
|
||
* // Ensure `batchLog` is invoked once after 1 second of debounced calls.
|
||
* var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
|
||
* var source = new EventSource('/stream');
|
||
* jQuery(source).on('message', debounced);
|
||
*
|
||
* // Cancel the trailing debounced invocation.
|
||
* jQuery(window).on('popstate', debounced.cancel);
|
||
*/
|
||
function debounce(func, wait, options) {
|
||
var lastArgs,
|
||
lastThis,
|
||
maxWait,
|
||
result,
|
||
timerId,
|
||
lastCallTime,
|
||
lastInvokeTime = 0,
|
||
leading = false,
|
||
maxing = false,
|
||
trailing = true;
|
||
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
wait = toNumber(wait) || 0;
|
||
if (isObject(options)) {
|
||
leading = !!options.leading;
|
||
maxing = 'maxWait' in options;
|
||
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
|
||
trailing = 'trailing' in options ? !!options.trailing : trailing;
|
||
}
|
||
|
||
function invokeFunc(time) {
|
||
var args = lastArgs,
|
||
thisArg = lastThis;
|
||
|
||
lastArgs = lastThis = undefined;
|
||
lastInvokeTime = time;
|
||
result = func.apply(thisArg, args);
|
||
return result;
|
||
}
|
||
|
||
function leadingEdge(time) {
|
||
// Reset any `maxWait` timer.
|
||
lastInvokeTime = time;
|
||
// Start the timer for the trailing edge.
|
||
timerId = setTimeout(timerExpired, wait);
|
||
// Invoke the leading edge.
|
||
return leading ? invokeFunc(time) : result;
|
||
}
|
||
|
||
function remainingWait(time) {
|
||
var timeSinceLastCall = time - lastCallTime,
|
||
timeSinceLastInvoke = time - lastInvokeTime,
|
||
result = wait - timeSinceLastCall;
|
||
|
||
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
|
||
}
|
||
|
||
function shouldInvoke(time) {
|
||
var timeSinceLastCall = time - lastCallTime,
|
||
timeSinceLastInvoke = time - lastInvokeTime;
|
||
|
||
// Either this is the first call, activity has stopped and we're at the
|
||
// trailing edge, the system time has gone backwards and we're treating
|
||
// it as the trailing edge, or we've hit the `maxWait` limit.
|
||
return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
|
||
(timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
|
||
}
|
||
|
||
function timerExpired() {
|
||
var time = now();
|
||
if (shouldInvoke(time)) {
|
||
return trailingEdge(time);
|
||
}
|
||
// Restart the timer.
|
||
timerId = setTimeout(timerExpired, remainingWait(time));
|
||
}
|
||
|
||
function trailingEdge(time) {
|
||
timerId = undefined;
|
||
|
||
// Only invoke if we have `lastArgs` which means `func` has been
|
||
// debounced at least once.
|
||
if (trailing && lastArgs) {
|
||
return invokeFunc(time);
|
||
}
|
||
lastArgs = lastThis = undefined;
|
||
return result;
|
||
}
|
||
|
||
function cancel() {
|
||
if (timerId !== undefined) {
|
||
clearTimeout(timerId);
|
||
}
|
||
lastInvokeTime = 0;
|
||
lastArgs = lastCallTime = lastThis = timerId = undefined;
|
||
}
|
||
|
||
function flush() {
|
||
return timerId === undefined ? result : trailingEdge(now());
|
||
}
|
||
|
||
function debounced() {
|
||
var time = now(),
|
||
isInvoking = shouldInvoke(time);
|
||
|
||
lastArgs = arguments;
|
||
lastThis = this;
|
||
lastCallTime = time;
|
||
|
||
if (isInvoking) {
|
||
if (timerId === undefined) {
|
||
return leadingEdge(lastCallTime);
|
||
}
|
||
if (maxing) {
|
||
// Handle invocations in a tight loop.
|
||
timerId = setTimeout(timerExpired, wait);
|
||
return invokeFunc(lastCallTime);
|
||
}
|
||
}
|
||
if (timerId === undefined) {
|
||
timerId = setTimeout(timerExpired, wait);
|
||
}
|
||
return result;
|
||
}
|
||
debounced.cancel = cancel;
|
||
debounced.flush = flush;
|
||
return debounced;
|
||
}
|
||
|
||
/**
|
||
* Defers invoking the `func` until the current call stack has cleared. Any
|
||
* additional arguments are provided to `func` when it's invoked.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to defer.
|
||
* @param {...*} [args] The arguments to invoke `func` with.
|
||
* @returns {number} Returns the timer id.
|
||
* @example
|
||
*
|
||
* _.defer(function(text) {
|
||
* console.log(text);
|
||
* }, 'deferred');
|
||
* // => Logs 'deferred' after one or more milliseconds.
|
||
*/
|
||
var defer = baseRest(function(func, args) {
|
||
return baseDelay(func, 1, args);
|
||
});
|
||
|
||
/**
|
||
* Invokes `func` after `wait` milliseconds. Any additional arguments are
|
||
* provided to `func` when it's invoked.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to delay.
|
||
* @param {number} wait The number of milliseconds to delay invocation.
|
||
* @param {...*} [args] The arguments to invoke `func` with.
|
||
* @returns {number} Returns the timer id.
|
||
* @example
|
||
*
|
||
* _.delay(function(text) {
|
||
* console.log(text);
|
||
* }, 1000, 'later');
|
||
* // => Logs 'later' after one second.
|
||
*/
|
||
var delay = baseRest(function(func, wait, args) {
|
||
return baseDelay(func, toNumber(wait) || 0, args);
|
||
});
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with arguments reversed.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to flip arguments for.
|
||
* @returns {Function} Returns the new flipped function.
|
||
* @example
|
||
*
|
||
* var flipped = _.flip(function() {
|
||
* return _.toArray(arguments);
|
||
* });
|
||
*
|
||
* flipped('a', 'b', 'c', 'd');
|
||
* // => ['d', 'c', 'b', 'a']
|
||
*/
|
||
function flip(func) {
|
||
return createWrap(func, FLIP_FLAG);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that memoizes the result of `func`. If `resolver` is
|
||
* provided, it determines the cache key for storing the result based on the
|
||
* arguments provided to the memoized function. By default, the first argument
|
||
* provided to the memoized function is used as the map cache key. The `func`
|
||
* is invoked with the `this` binding of the memoized function.
|
||
*
|
||
* **Note:** The cache is exposed as the `cache` property on the memoized
|
||
* function. Its creation may be customized by replacing the `_.memoize.Cache`
|
||
* constructor with one whose instances implement the
|
||
* [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
|
||
* method interface of `delete`, `get`, `has`, and `set`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to have its output memoized.
|
||
* @param {Function} [resolver] The function to resolve the cache key.
|
||
* @returns {Function} Returns the new memoized function.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': 2 };
|
||
* var other = { 'c': 3, 'd': 4 };
|
||
*
|
||
* var values = _.memoize(_.values);
|
||
* values(object);
|
||
* // => [1, 2]
|
||
*
|
||
* values(other);
|
||
* // => [3, 4]
|
||
*
|
||
* object.a = 2;
|
||
* values(object);
|
||
* // => [1, 2]
|
||
*
|
||
* // Modify the result cache.
|
||
* values.cache.set(object, ['a', 'b']);
|
||
* values(object);
|
||
* // => ['a', 'b']
|
||
*
|
||
* // Replace `_.memoize.Cache`.
|
||
* _.memoize.Cache = WeakMap;
|
||
*/
|
||
function memoize(func, resolver) {
|
||
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
var memoized = function() {
|
||
var args = arguments,
|
||
key = resolver ? resolver.apply(this, args) : args[0],
|
||
cache = memoized.cache;
|
||
|
||
if (cache.has(key)) {
|
||
return cache.get(key);
|
||
}
|
||
var result = func.apply(this, args);
|
||
memoized.cache = cache.set(key, result);
|
||
return result;
|
||
};
|
||
memoized.cache = new (memoize.Cache || MapCache);
|
||
return memoized;
|
||
}
|
||
|
||
// Assign cache to `_.memoize`.
|
||
memoize.Cache = MapCache;
|
||
|
||
/**
|
||
* Creates a function that negates the result of the predicate `func`. The
|
||
* `func` predicate is invoked with the `this` binding and arguments of the
|
||
* created function.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Function
|
||
* @param {Function} predicate The predicate to negate.
|
||
* @returns {Function} Returns the new negated function.
|
||
* @example
|
||
*
|
||
* function isEven(n) {
|
||
* return n % 2 == 0;
|
||
* }
|
||
*
|
||
* _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
|
||
* // => [1, 3, 5]
|
||
*/
|
||
function negate(predicate) {
|
||
if (typeof predicate != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
return function() {
|
||
var args = arguments;
|
||
switch (args.length) {
|
||
case 0: return !predicate.call(this);
|
||
case 1: return !predicate.call(this, args[0]);
|
||
case 2: return !predicate.call(this, args[0], args[1]);
|
||
case 3: return !predicate.call(this, args[0], args[1], args[2]);
|
||
}
|
||
return !predicate.apply(this, args);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates a function that is restricted to invoking `func` once. Repeat calls
|
||
* to the function return the value of the first invocation. The `func` is
|
||
* invoked with the `this` binding and arguments of the created function.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to restrict.
|
||
* @returns {Function} Returns the new restricted function.
|
||
* @example
|
||
*
|
||
* var initialize = _.once(createApplication);
|
||
* initialize();
|
||
* initialize();
|
||
* // => `createApplication` is invoked once
|
||
*/
|
||
function once(func) {
|
||
return before(2, func);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with its arguments transformed.
|
||
*
|
||
* @static
|
||
* @since 4.0.0
|
||
* @memberOf _
|
||
* @category Function
|
||
* @param {Function} func The function to wrap.
|
||
* @param {...(Function|Function[])} [transforms=[_.identity]]
|
||
* The argument transforms.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* function doubled(n) {
|
||
* return n * 2;
|
||
* }
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* var func = _.overArgs(function(x, y) {
|
||
* return [x, y];
|
||
* }, [square, doubled]);
|
||
*
|
||
* func(9, 3);
|
||
* // => [81, 6]
|
||
*
|
||
* func(10, 5);
|
||
* // => [100, 10]
|
||
*/
|
||
var overArgs = baseRest(function(func, transforms) {
|
||
transforms = (transforms.length == 1 && isArray(transforms[0]))
|
||
? arrayMap(transforms[0], baseUnary(getIteratee()))
|
||
: arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
|
||
|
||
var funcsLength = transforms.length;
|
||
return baseRest(function(args) {
|
||
var index = -1,
|
||
length = nativeMin(args.length, funcsLength);
|
||
|
||
while (++index < length) {
|
||
args[index] = transforms[index].call(this, args[index]);
|
||
}
|
||
return apply(func, this, args);
|
||
});
|
||
});
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with `partials` prepended to the
|
||
* arguments it receives. This method is like `_.bind` except it does **not**
|
||
* alter the `this` binding.
|
||
*
|
||
* The `_.partial.placeholder` value, which defaults to `_` in monolithic
|
||
* builds, may be used as a placeholder for partially applied arguments.
|
||
*
|
||
* **Note:** This method doesn't set the "length" property of partially
|
||
* applied functions.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.2.0
|
||
* @category Function
|
||
* @param {Function} func The function to partially apply arguments to.
|
||
* @param {...*} [partials] The arguments to be partially applied.
|
||
* @returns {Function} Returns the new partially applied function.
|
||
* @example
|
||
*
|
||
* function greet(greeting, name) {
|
||
* return greeting + ' ' + name;
|
||
* }
|
||
*
|
||
* var sayHelloTo = _.partial(greet, 'hello');
|
||
* sayHelloTo('fred');
|
||
* // => 'hello fred'
|
||
*
|
||
* // Partially applied with placeholders.
|
||
* var greetFred = _.partial(greet, _, 'fred');
|
||
* greetFred('hi');
|
||
* // => 'hi fred'
|
||
*/
|
||
var partial = baseRest(function(func, partials) {
|
||
var holders = replaceHolders(partials, getHolder(partial));
|
||
return createWrap(func, PARTIAL_FLAG, undefined, partials, holders);
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.partial` except that partially applied arguments
|
||
* are appended to the arguments it receives.
|
||
*
|
||
* The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
|
||
* builds, may be used as a placeholder for partially applied arguments.
|
||
*
|
||
* **Note:** This method doesn't set the "length" property of partially
|
||
* applied functions.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to partially apply arguments to.
|
||
* @param {...*} [partials] The arguments to be partially applied.
|
||
* @returns {Function} Returns the new partially applied function.
|
||
* @example
|
||
*
|
||
* function greet(greeting, name) {
|
||
* return greeting + ' ' + name;
|
||
* }
|
||
*
|
||
* var greetFred = _.partialRight(greet, 'fred');
|
||
* greetFred('hi');
|
||
* // => 'hi fred'
|
||
*
|
||
* // Partially applied with placeholders.
|
||
* var sayHelloTo = _.partialRight(greet, 'hello', _);
|
||
* sayHelloTo('fred');
|
||
* // => 'hello fred'
|
||
*/
|
||
var partialRight = baseRest(function(func, partials) {
|
||
var holders = replaceHolders(partials, getHolder(partialRight));
|
||
return createWrap(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
|
||
});
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with arguments arranged according
|
||
* to the specified `indexes` where the argument value at the first index is
|
||
* provided as the first argument, the argument value at the second index is
|
||
* provided as the second argument, and so on.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to rearrange arguments for.
|
||
* @param {...(number|number[])} indexes The arranged argument indexes.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var rearged = _.rearg(function(a, b, c) {
|
||
* return [a, b, c];
|
||
* }, [2, 0, 1]);
|
||
*
|
||
* rearged('b', 'c', 'a')
|
||
* // => ['a', 'b', 'c']
|
||
*/
|
||
var rearg = baseRest(function(func, indexes) {
|
||
return createWrap(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes, 1));
|
||
});
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with the `this` binding of the
|
||
* created function and arguments from `start` and beyond provided as
|
||
* an array.
|
||
*
|
||
* **Note:** This method is based on the
|
||
* [rest parameter](https://mdn.io/rest_parameters).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to apply a rest parameter to.
|
||
* @param {number} [start=func.length-1] The start position of the rest parameter.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var say = _.rest(function(what, names) {
|
||
* return what + ' ' + _.initial(names).join(', ') +
|
||
* (_.size(names) > 1 ? ', & ' : '') + _.last(names);
|
||
* });
|
||
*
|
||
* say('hello', 'fred', 'barney', 'pebbles');
|
||
* // => 'hello fred, barney, & pebbles'
|
||
*/
|
||
function rest(func, start) {
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
start = start === undefined ? start : toInteger(start);
|
||
return baseRest(func, start);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with the `this` binding of the
|
||
* create function and an array of arguments much like
|
||
* [`Function#apply`](http://www.ecma-international.org/ecma-262/6.0/#sec-function.prototype.apply).
|
||
*
|
||
* **Note:** This method is based on the
|
||
* [spread operator](https://mdn.io/spread_operator).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.2.0
|
||
* @category Function
|
||
* @param {Function} func The function to spread arguments over.
|
||
* @param {number} [start=0] The start position of the spread.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var say = _.spread(function(who, what) {
|
||
* return who + ' says ' + what;
|
||
* });
|
||
*
|
||
* say(['fred', 'hello']);
|
||
* // => 'fred says hello'
|
||
*
|
||
* var numbers = Promise.all([
|
||
* Promise.resolve(40),
|
||
* Promise.resolve(36)
|
||
* ]);
|
||
*
|
||
* numbers.then(_.spread(function(x, y) {
|
||
* return x + y;
|
||
* }));
|
||
* // => a Promise of 76
|
||
*/
|
||
function spread(func, start) {
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
start = start === undefined ? 0 : nativeMax(toInteger(start), 0);
|
||
return baseRest(function(args) {
|
||
var array = args[start],
|
||
otherArgs = castSlice(args, 0, start);
|
||
|
||
if (array) {
|
||
arrayPush(otherArgs, array);
|
||
}
|
||
return apply(func, this, otherArgs);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a throttled function that only invokes `func` at most once per
|
||
* every `wait` milliseconds. The throttled function comes with a `cancel`
|
||
* method to cancel delayed `func` invocations and a `flush` method to
|
||
* immediately invoke them. Provide `options` to indicate whether `func`
|
||
* should be invoked on the leading and/or trailing edge of the `wait`
|
||
* timeout. The `func` is invoked with the last arguments provided to the
|
||
* throttled function. Subsequent calls to the throttled function return the
|
||
* result of the last `func` invocation.
|
||
*
|
||
* **Note:** If `leading` and `trailing` options are `true`, `func` is
|
||
* invoked on the trailing edge of the timeout only if the throttled function
|
||
* is invoked more than once during the `wait` timeout.
|
||
*
|
||
* If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
|
||
* until to the next tick, similar to `setTimeout` with a timeout of `0`.
|
||
*
|
||
* See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
|
||
* for details over the differences between `_.throttle` and `_.debounce`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {Function} func The function to throttle.
|
||
* @param {number} [wait=0] The number of milliseconds to throttle invocations to.
|
||
* @param {Object} [options={}] The options object.
|
||
* @param {boolean} [options.leading=true]
|
||
* Specify invoking on the leading edge of the timeout.
|
||
* @param {boolean} [options.trailing=true]
|
||
* Specify invoking on the trailing edge of the timeout.
|
||
* @returns {Function} Returns the new throttled function.
|
||
* @example
|
||
*
|
||
* // Avoid excessively updating the position while scrolling.
|
||
* jQuery(window).on('scroll', _.throttle(updatePosition, 100));
|
||
*
|
||
* // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
|
||
* var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
|
||
* jQuery(element).on('click', throttled);
|
||
*
|
||
* // Cancel the trailing throttled invocation.
|
||
* jQuery(window).on('popstate', throttled.cancel);
|
||
*/
|
||
function throttle(func, wait, options) {
|
||
var leading = true,
|
||
trailing = true;
|
||
|
||
if (typeof func != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
if (isObject(options)) {
|
||
leading = 'leading' in options ? !!options.leading : leading;
|
||
trailing = 'trailing' in options ? !!options.trailing : trailing;
|
||
}
|
||
return debounce(func, wait, {
|
||
'leading': leading,
|
||
'maxWait': wait,
|
||
'trailing': trailing
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a function that accepts up to one argument, ignoring any
|
||
* additional arguments.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Function
|
||
* @param {Function} func The function to cap arguments for.
|
||
* @returns {Function} Returns the new capped function.
|
||
* @example
|
||
*
|
||
* _.map(['6', '8', '10'], _.unary(parseInt));
|
||
* // => [6, 8, 10]
|
||
*/
|
||
function unary(func) {
|
||
return ary(func, 1);
|
||
}
|
||
|
||
/**
|
||
* Creates a function that provides `value` to `wrapper` as its first
|
||
* argument. Any additional arguments provided to the function are appended
|
||
* to those provided to the `wrapper`. The wrapper is invoked with the `this`
|
||
* binding of the created function.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Function
|
||
* @param {*} value The value to wrap.
|
||
* @param {Function} [wrapper=identity] The wrapper function.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var p = _.wrap(_.escape, function(func, text) {
|
||
* return '<p>' + func(text) + '</p>';
|
||
* });
|
||
*
|
||
* p('fred, barney, & pebbles');
|
||
* // => '<p>fred, barney, & pebbles</p>'
|
||
*/
|
||
function wrap(value, wrapper) {
|
||
wrapper = wrapper == null ? identity : wrapper;
|
||
return partial(wrapper, value);
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Casts `value` as an array if it's not one.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.4.0
|
||
* @category Lang
|
||
* @param {*} value The value to inspect.
|
||
* @returns {Array} Returns the cast array.
|
||
* @example
|
||
*
|
||
* _.castArray(1);
|
||
* // => [1]
|
||
*
|
||
* _.castArray({ 'a': 1 });
|
||
* // => [{ 'a': 1 }]
|
||
*
|
||
* _.castArray('abc');
|
||
* // => ['abc']
|
||
*
|
||
* _.castArray(null);
|
||
* // => [null]
|
||
*
|
||
* _.castArray(undefined);
|
||
* // => [undefined]
|
||
*
|
||
* _.castArray();
|
||
* // => []
|
||
*
|
||
* var array = [1, 2, 3];
|
||
* console.log(_.castArray(array) === array);
|
||
* // => true
|
||
*/
|
||
function castArray() {
|
||
if (!arguments.length) {
|
||
return [];
|
||
}
|
||
var value = arguments[0];
|
||
return isArray(value) ? value : [value];
|
||
}
|
||
|
||
/**
|
||
* Creates a shallow clone of `value`.
|
||
*
|
||
* **Note:** This method is loosely based on the
|
||
* [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
|
||
* and supports cloning arrays, array buffers, booleans, date objects, maps,
|
||
* numbers, `Object` objects, regexes, sets, strings, symbols, and typed
|
||
* arrays. The own enumerable properties of `arguments` objects are cloned
|
||
* as plain objects. An empty object is returned for uncloneable values such
|
||
* as error objects, functions, DOM nodes, and WeakMaps.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to clone.
|
||
* @returns {*} Returns the cloned value.
|
||
* @see _.cloneDeep
|
||
* @example
|
||
*
|
||
* var objects = [{ 'a': 1 }, { 'b': 2 }];
|
||
*
|
||
* var shallow = _.clone(objects);
|
||
* console.log(shallow[0] === objects[0]);
|
||
* // => true
|
||
*/
|
||
function clone(value) {
|
||
return baseClone(value, false, true);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.clone` except that it accepts `customizer` which
|
||
* is invoked to produce the cloned value. If `customizer` returns `undefined`,
|
||
* cloning is handled by the method instead. The `customizer` is invoked with
|
||
* up to four arguments; (value [, index|key, object, stack]).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to clone.
|
||
* @param {Function} [customizer] The function to customize cloning.
|
||
* @returns {*} Returns the cloned value.
|
||
* @see _.cloneDeepWith
|
||
* @example
|
||
*
|
||
* function customizer(value) {
|
||
* if (_.isElement(value)) {
|
||
* return value.cloneNode(false);
|
||
* }
|
||
* }
|
||
*
|
||
* var el = _.cloneWith(document.body, customizer);
|
||
*
|
||
* console.log(el === document.body);
|
||
* // => false
|
||
* console.log(el.nodeName);
|
||
* // => 'BODY'
|
||
* console.log(el.childNodes.length);
|
||
* // => 0
|
||
*/
|
||
function cloneWith(value, customizer) {
|
||
return baseClone(value, false, true, customizer);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.clone` except that it recursively clones `value`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to recursively clone.
|
||
* @returns {*} Returns the deep cloned value.
|
||
* @see _.clone
|
||
* @example
|
||
*
|
||
* var objects = [{ 'a': 1 }, { 'b': 2 }];
|
||
*
|
||
* var deep = _.cloneDeep(objects);
|
||
* console.log(deep[0] === objects[0]);
|
||
* // => false
|
||
*/
|
||
function cloneDeep(value) {
|
||
return baseClone(value, true, true);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.cloneWith` except that it recursively clones `value`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to recursively clone.
|
||
* @param {Function} [customizer] The function to customize cloning.
|
||
* @returns {*} Returns the deep cloned value.
|
||
* @see _.cloneWith
|
||
* @example
|
||
*
|
||
* function customizer(value) {
|
||
* if (_.isElement(value)) {
|
||
* return value.cloneNode(true);
|
||
* }
|
||
* }
|
||
*
|
||
* var el = _.cloneDeepWith(document.body, customizer);
|
||
*
|
||
* console.log(el === document.body);
|
||
* // => false
|
||
* console.log(el.nodeName);
|
||
* // => 'BODY'
|
||
* console.log(el.childNodes.length);
|
||
* // => 20
|
||
*/
|
||
function cloneDeepWith(value, customizer) {
|
||
return baseClone(value, true, true, customizer);
|
||
}
|
||
|
||
/**
|
||
* Checks if `object` conforms to `source` by invoking the predicate
|
||
* properties of `source` with the corresponding property values of `object`.
|
||
*
|
||
* **Note:** This method is equivalent to `_.conforms` when `source` is
|
||
* partially applied.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.14.0
|
||
* @category Lang
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Object} source The object of property predicates to conform to.
|
||
* @returns {boolean} Returns `true` if `object` conforms, else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': 2 };
|
||
*
|
||
* _.conformsTo(object, { 'b': function(n) { return n > 1; } });
|
||
* // => true
|
||
*
|
||
* _.conformsTo(object, { 'b': function(n) { return n > 2; } });
|
||
* // => false
|
||
*/
|
||
function conformsTo(object, source) {
|
||
return source == null || baseConformsTo(object, source, keys(source));
|
||
}
|
||
|
||
/**
|
||
* Performs a
|
||
* [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||
* comparison between two values to determine if they are equivalent.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1 };
|
||
* var other = { 'a': 1 };
|
||
*
|
||
* _.eq(object, object);
|
||
* // => true
|
||
*
|
||
* _.eq(object, other);
|
||
* // => false
|
||
*
|
||
* _.eq('a', 'a');
|
||
* // => true
|
||
*
|
||
* _.eq('a', Object('a'));
|
||
* // => false
|
||
*
|
||
* _.eq(NaN, NaN);
|
||
* // => true
|
||
*/
|
||
function eq(value, other) {
|
||
return value === other || (value !== value && other !== other);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is greater than `other`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.9.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is greater than `other`,
|
||
* else `false`.
|
||
* @see _.lt
|
||
* @example
|
||
*
|
||
* _.gt(3, 1);
|
||
* // => true
|
||
*
|
||
* _.gt(3, 3);
|
||
* // => false
|
||
*
|
||
* _.gt(1, 3);
|
||
* // => false
|
||
*/
|
||
var gt = createRelationalOperation(baseGt);
|
||
|
||
/**
|
||
* Checks if `value` is greater than or equal to `other`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.9.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is greater than or equal to
|
||
* `other`, else `false`.
|
||
* @see _.lte
|
||
* @example
|
||
*
|
||
* _.gte(3, 1);
|
||
* // => true
|
||
*
|
||
* _.gte(3, 3);
|
||
* // => true
|
||
*
|
||
* _.gte(1, 3);
|
||
* // => false
|
||
*/
|
||
var gte = createRelationalOperation(function(value, other) {
|
||
return value >= other;
|
||
});
|
||
|
||
/**
|
||
* Checks if `value` is likely an `arguments` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isArguments(function() { return arguments; }());
|
||
* // => true
|
||
*
|
||
* _.isArguments([1, 2, 3]);
|
||
* // => false
|
||
*/
|
||
function isArguments(value) {
|
||
// Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.
|
||
return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
|
||
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as an `Array` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
||
* @example
|
||
*
|
||
* _.isArray([1, 2, 3]);
|
||
* // => true
|
||
*
|
||
* _.isArray(document.body.children);
|
||
* // => false
|
||
*
|
||
* _.isArray('abc');
|
||
* // => false
|
||
*
|
||
* _.isArray(_.noop);
|
||
* // => false
|
||
*/
|
||
var isArray = Array.isArray;
|
||
|
||
/**
|
||
* Checks if `value` is classified as an `ArrayBuffer` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
|
||
* @example
|
||
*
|
||
* _.isArrayBuffer(new ArrayBuffer(2));
|
||
* // => true
|
||
*
|
||
* _.isArrayBuffer(new Array(2));
|
||
* // => false
|
||
*/
|
||
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
|
||
|
||
/**
|
||
* Checks if `value` is array-like. A value is considered array-like if it's
|
||
* not a function and has a `value.length` that's an integer greater than or
|
||
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
|
||
* @example
|
||
*
|
||
* _.isArrayLike([1, 2, 3]);
|
||
* // => true
|
||
*
|
||
* _.isArrayLike(document.body.children);
|
||
* // => true
|
||
*
|
||
* _.isArrayLike('abc');
|
||
* // => true
|
||
*
|
||
* _.isArrayLike(_.noop);
|
||
* // => false
|
||
*/
|
||
function isArrayLike(value) {
|
||
return value != null && isLength(getLength(value)) && !isFunction(value);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.isArrayLike` except that it also checks if `value`
|
||
* is an object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an array-like object,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isArrayLikeObject([1, 2, 3]);
|
||
* // => true
|
||
*
|
||
* _.isArrayLikeObject(document.body.children);
|
||
* // => true
|
||
*
|
||
* _.isArrayLikeObject('abc');
|
||
* // => false
|
||
*
|
||
* _.isArrayLikeObject(_.noop);
|
||
* // => false
|
||
*/
|
||
function isArrayLikeObject(value) {
|
||
return isObjectLike(value) && isArrayLike(value);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a boolean primitive or object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
|
||
* @example
|
||
*
|
||
* _.isBoolean(false);
|
||
* // => true
|
||
*
|
||
* _.isBoolean(null);
|
||
* // => false
|
||
*/
|
||
function isBoolean(value) {
|
||
return value === true || value === false ||
|
||
(isObjectLike(value) && objectToString.call(value) == boolTag);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a buffer.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
|
||
* @example
|
||
*
|
||
* _.isBuffer(new Buffer(2));
|
||
* // => true
|
||
*
|
||
* _.isBuffer(new Uint8Array(2));
|
||
* // => false
|
||
*/
|
||
var isBuffer = nativeIsBuffer || stubFalse;
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Date` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a date object, else `false`.
|
||
* @example
|
||
*
|
||
* _.isDate(new Date);
|
||
* // => true
|
||
*
|
||
* _.isDate('Mon April 23 2012');
|
||
* // => false
|
||
*/
|
||
var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
|
||
|
||
/**
|
||
* Checks if `value` is likely a DOM element.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a DOM element,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isElement(document.body);
|
||
* // => true
|
||
*
|
||
* _.isElement('<body>');
|
||
* // => false
|
||
*/
|
||
function isElement(value) {
|
||
return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is an empty object, collection, map, or set.
|
||
*
|
||
* Objects are considered empty if they have no own enumerable string keyed
|
||
* properties.
|
||
*
|
||
* Array-like values such as `arguments` objects, arrays, buffers, strings, or
|
||
* jQuery-like collections are considered empty if they have a `length` of `0`.
|
||
* Similarly, maps and sets are considered empty if they have a `size` of `0`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is empty, else `false`.
|
||
* @example
|
||
*
|
||
* _.isEmpty(null);
|
||
* // => true
|
||
*
|
||
* _.isEmpty(true);
|
||
* // => true
|
||
*
|
||
* _.isEmpty(1);
|
||
* // => true
|
||
*
|
||
* _.isEmpty([1, 2, 3]);
|
||
* // => false
|
||
*
|
||
* _.isEmpty({ 'a': 1 });
|
||
* // => false
|
||
*/
|
||
function isEmpty(value) {
|
||
if (isArrayLike(value) &&
|
||
(isArray(value) || isString(value) || isFunction(value.splice) ||
|
||
isArguments(value) || isBuffer(value))) {
|
||
return !value.length;
|
||
}
|
||
if (isObjectLike(value)) {
|
||
var tag = getTag(value);
|
||
if (tag == mapTag || tag == setTag) {
|
||
return !value.size;
|
||
}
|
||
}
|
||
for (var key in value) {
|
||
if (hasOwnProperty.call(value, key)) {
|
||
return false;
|
||
}
|
||
}
|
||
return !(nonEnumShadows && keys(value).length);
|
||
}
|
||
|
||
/**
|
||
* Performs a deep comparison between two values to determine if they are
|
||
* equivalent.
|
||
*
|
||
* **Note:** This method supports comparing arrays, array buffers, booleans,
|
||
* date objects, error objects, maps, numbers, `Object` objects, regexes,
|
||
* sets, strings, symbols, and typed arrays. `Object` objects are compared
|
||
* by their own, not inherited, enumerable properties. Functions and DOM
|
||
* nodes are **not** supported.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if the values are equivalent,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1 };
|
||
* var other = { 'a': 1 };
|
||
*
|
||
* _.isEqual(object, other);
|
||
* // => true
|
||
*
|
||
* object === other;
|
||
* // => false
|
||
*/
|
||
function isEqual(value, other) {
|
||
return baseIsEqual(value, other);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.isEqual` except that it accepts `customizer` which
|
||
* is invoked to compare values. If `customizer` returns `undefined`, comparisons
|
||
* are handled by the method instead. The `customizer` is invoked with up to
|
||
* six arguments: (objValue, othValue [, index|key, object, other, stack]).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @param {Function} [customizer] The function to customize comparisons.
|
||
* @returns {boolean} Returns `true` if the values are equivalent,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* function isGreeting(value) {
|
||
* return /^h(?:i|ello)$/.test(value);
|
||
* }
|
||
*
|
||
* function customizer(objValue, othValue) {
|
||
* if (isGreeting(objValue) && isGreeting(othValue)) {
|
||
* return true;
|
||
* }
|
||
* }
|
||
*
|
||
* var array = ['hello', 'goodbye'];
|
||
* var other = ['hi', 'goodbye'];
|
||
*
|
||
* _.isEqualWith(array, other, customizer);
|
||
* // => true
|
||
*/
|
||
function isEqualWith(value, other, customizer) {
|
||
customizer = typeof customizer == 'function' ? customizer : undefined;
|
||
var result = customizer ? customizer(value, other) : undefined;
|
||
return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
|
||
* `SyntaxError`, `TypeError`, or `URIError` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an error object,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isError(new Error);
|
||
* // => true
|
||
*
|
||
* _.isError(Error);
|
||
* // => false
|
||
*/
|
||
function isError(value) {
|
||
if (!isObjectLike(value)) {
|
||
return false;
|
||
}
|
||
return (objectToString.call(value) == errorTag) ||
|
||
(typeof value.message == 'string' && typeof value.name == 'string');
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a finite primitive number.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`Number.isFinite`](https://mdn.io/Number/isFinite).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a finite number,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isFinite(3);
|
||
* // => true
|
||
*
|
||
* _.isFinite(Number.MIN_VALUE);
|
||
* // => true
|
||
*
|
||
* _.isFinite(Infinity);
|
||
* // => false
|
||
*
|
||
* _.isFinite('3');
|
||
* // => false
|
||
*/
|
||
function isFinite(value) {
|
||
return typeof value == 'number' && nativeIsFinite(value);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Function` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
||
* @example
|
||
*
|
||
* _.isFunction(_);
|
||
* // => true
|
||
*
|
||
* _.isFunction(/abc/);
|
||
* // => false
|
||
*/
|
||
function isFunction(value) {
|
||
// The use of `Object#toString` avoids issues with the `typeof` operator
|
||
// in Safari 8 which returns 'object' for typed array and weak map constructors,
|
||
// and PhantomJS 1.9 which returns 'function' for `NodeList` instances.
|
||
var tag = isObject(value) ? objectToString.call(value) : '';
|
||
return tag == funcTag || tag == genTag;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is an integer.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`Number.isInteger`](https://mdn.io/Number/isInteger).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an integer, else `false`.
|
||
* @example
|
||
*
|
||
* _.isInteger(3);
|
||
* // => true
|
||
*
|
||
* _.isInteger(Number.MIN_VALUE);
|
||
* // => false
|
||
*
|
||
* _.isInteger(Infinity);
|
||
* // => false
|
||
*
|
||
* _.isInteger('3');
|
||
* // => false
|
||
*/
|
||
function isInteger(value) {
|
||
return typeof value == 'number' && value == toInteger(value);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a valid array-like length.
|
||
*
|
||
* **Note:** This function is loosely based on
|
||
* [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a valid length,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isLength(3);
|
||
* // => true
|
||
*
|
||
* _.isLength(Number.MIN_VALUE);
|
||
* // => false
|
||
*
|
||
* _.isLength(Infinity);
|
||
* // => false
|
||
*
|
||
* _.isLength('3');
|
||
* // => false
|
||
*/
|
||
function isLength(value) {
|
||
return typeof value == 'number' &&
|
||
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is the
|
||
* [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)
|
||
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
||
* @example
|
||
*
|
||
* _.isObject({});
|
||
* // => true
|
||
*
|
||
* _.isObject([1, 2, 3]);
|
||
* // => true
|
||
*
|
||
* _.isObject(_.noop);
|
||
* // => true
|
||
*
|
||
* _.isObject(null);
|
||
* // => false
|
||
*/
|
||
function isObject(value) {
|
||
var type = typeof value;
|
||
return !!value && (type == 'object' || type == 'function');
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
||
* and has a `typeof` result of "object".
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
||
* @example
|
||
*
|
||
* _.isObjectLike({});
|
||
* // => true
|
||
*
|
||
* _.isObjectLike([1, 2, 3]);
|
||
* // => true
|
||
*
|
||
* _.isObjectLike(_.noop);
|
||
* // => false
|
||
*
|
||
* _.isObjectLike(null);
|
||
* // => false
|
||
*/
|
||
function isObjectLike(value) {
|
||
return !!value && typeof value == 'object';
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Map` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a map, else `false`.
|
||
* @example
|
||
*
|
||
* _.isMap(new Map);
|
||
* // => true
|
||
*
|
||
* _.isMap(new WeakMap);
|
||
* // => false
|
||
*/
|
||
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
|
||
|
||
/**
|
||
* Performs a partial deep comparison between `object` and `source` to
|
||
* determine if `object` contains equivalent property values.
|
||
*
|
||
* **Note:** This method supports comparing the same values as `_.isEqual`
|
||
* and is equivalent to `_.matches` when `source` is partially applied.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Lang
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Object} source The object of property values to match.
|
||
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': 2 };
|
||
*
|
||
* _.isMatch(object, { 'b': 2 });
|
||
* // => true
|
||
*
|
||
* _.isMatch(object, { 'b': 1 });
|
||
* // => false
|
||
*/
|
||
function isMatch(object, source) {
|
||
return object === source || baseIsMatch(object, source, getMatchData(source));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.isMatch` except that it accepts `customizer` which
|
||
* is invoked to compare values. If `customizer` returns `undefined`, comparisons
|
||
* are handled by the method instead. The `customizer` is invoked with five
|
||
* arguments: (objValue, srcValue, index|key, object, source).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {Object} object The object to inspect.
|
||
* @param {Object} source The object of property values to match.
|
||
* @param {Function} [customizer] The function to customize comparisons.
|
||
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||
* @example
|
||
*
|
||
* function isGreeting(value) {
|
||
* return /^h(?:i|ello)$/.test(value);
|
||
* }
|
||
*
|
||
* function customizer(objValue, srcValue) {
|
||
* if (isGreeting(objValue) && isGreeting(srcValue)) {
|
||
* return true;
|
||
* }
|
||
* }
|
||
*
|
||
* var object = { 'greeting': 'hello' };
|
||
* var source = { 'greeting': 'hi' };
|
||
*
|
||
* _.isMatchWith(object, source, customizer);
|
||
* // => true
|
||
*/
|
||
function isMatchWith(object, source, customizer) {
|
||
customizer = typeof customizer == 'function' ? customizer : undefined;
|
||
return baseIsMatch(object, source, getMatchData(source), customizer);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is `NaN`.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
|
||
* global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
|
||
* `undefined` and other non-number values.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
|
||
* @example
|
||
*
|
||
* _.isNaN(NaN);
|
||
* // => true
|
||
*
|
||
* _.isNaN(new Number(NaN));
|
||
* // => true
|
||
*
|
||
* isNaN(undefined);
|
||
* // => true
|
||
*
|
||
* _.isNaN(undefined);
|
||
* // => false
|
||
*/
|
||
function isNaN(value) {
|
||
// An `NaN` primitive is the only value that is not equal to itself.
|
||
// Perform the `toStringTag` check first to avoid errors with some
|
||
// ActiveX objects in IE.
|
||
return isNumber(value) && value != +value;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a pristine native function.
|
||
*
|
||
* **Note:** This method can't reliably detect native functions in the presence
|
||
* of the core-js package because core-js circumvents this kind of detection.
|
||
* Despite multiple requests, the core-js maintainer has made it clear: any
|
||
* attempt to fix the detection will be obstructed. As a result, we're left
|
||
* with little choice but to throw an error. Unfortunately, this also affects
|
||
* packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
|
||
* which rely on core-js.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a native function,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isNative(Array.prototype.push);
|
||
* // => true
|
||
*
|
||
* _.isNative(_);
|
||
* // => false
|
||
*/
|
||
function isNative(value) {
|
||
if (isMaskable(value)) {
|
||
throw new Error('This method is not supported with core-js. Try https://github.com/es-shims.');
|
||
}
|
||
return baseIsNative(value);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is `null`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is `null`, else `false`.
|
||
* @example
|
||
*
|
||
* _.isNull(null);
|
||
* // => true
|
||
*
|
||
* _.isNull(void 0);
|
||
* // => false
|
||
*/
|
||
function isNull(value) {
|
||
return value === null;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is `null` or `undefined`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is nullish, else `false`.
|
||
* @example
|
||
*
|
||
* _.isNil(null);
|
||
* // => true
|
||
*
|
||
* _.isNil(void 0);
|
||
* // => true
|
||
*
|
||
* _.isNil(NaN);
|
||
* // => false
|
||
*/
|
||
function isNil(value) {
|
||
return value == null;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Number` primitive or object.
|
||
*
|
||
* **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
|
||
* classified as numbers, use the `_.isFinite` method.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a number, else `false`.
|
||
* @example
|
||
*
|
||
* _.isNumber(3);
|
||
* // => true
|
||
*
|
||
* _.isNumber(Number.MIN_VALUE);
|
||
* // => true
|
||
*
|
||
* _.isNumber(Infinity);
|
||
* // => true
|
||
*
|
||
* _.isNumber('3');
|
||
* // => false
|
||
*/
|
||
function isNumber(value) {
|
||
return typeof value == 'number' ||
|
||
(isObjectLike(value) && objectToString.call(value) == numberTag);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is a plain object, that is, an object created by the
|
||
* `Object` constructor or one with a `[[Prototype]]` of `null`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.8.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a plain object,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* }
|
||
*
|
||
* _.isPlainObject(new Foo);
|
||
* // => false
|
||
*
|
||
* _.isPlainObject([1, 2, 3]);
|
||
* // => false
|
||
*
|
||
* _.isPlainObject({ 'x': 0, 'y': 0 });
|
||
* // => true
|
||
*
|
||
* _.isPlainObject(Object.create(null));
|
||
* // => true
|
||
*/
|
||
function isPlainObject(value) {
|
||
if (!isObjectLike(value) ||
|
||
objectToString.call(value) != objectTag || isHostObject(value)) {
|
||
return false;
|
||
}
|
||
var proto = getPrototype(value);
|
||
if (proto === null) {
|
||
return true;
|
||
}
|
||
var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
|
||
return (typeof Ctor == 'function' &&
|
||
Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `RegExp` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.1.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
|
||
* @example
|
||
*
|
||
* _.isRegExp(/abc/);
|
||
* // => true
|
||
*
|
||
* _.isRegExp('/abc/');
|
||
* // => false
|
||
*/
|
||
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
|
||
|
||
/**
|
||
* Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
|
||
* double precision number which isn't the result of a rounded unsafe integer.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a safe integer,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.isSafeInteger(3);
|
||
* // => true
|
||
*
|
||
* _.isSafeInteger(Number.MIN_VALUE);
|
||
* // => false
|
||
*
|
||
* _.isSafeInteger(Infinity);
|
||
* // => false
|
||
*
|
||
* _.isSafeInteger('3');
|
||
* // => false
|
||
*/
|
||
function isSafeInteger(value) {
|
||
return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Set` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a set, else `false`.
|
||
* @example
|
||
*
|
||
* _.isSet(new Set);
|
||
* // => true
|
||
*
|
||
* _.isSet(new WeakSet);
|
||
* // => false
|
||
*/
|
||
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `String` primitive or object.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a string, else `false`.
|
||
* @example
|
||
*
|
||
* _.isString('abc');
|
||
* // => true
|
||
*
|
||
* _.isString(1);
|
||
* // => false
|
||
*/
|
||
function isString(value) {
|
||
return typeof value == 'string' ||
|
||
(!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `Symbol` primitive or object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
||
* @example
|
||
*
|
||
* _.isSymbol(Symbol.iterator);
|
||
* // => true
|
||
*
|
||
* _.isSymbol('abc');
|
||
* // => false
|
||
*/
|
||
function isSymbol(value) {
|
||
return typeof value == 'symbol' ||
|
||
(isObjectLike(value) && objectToString.call(value) == symbolTag);
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a typed array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
|
||
* @example
|
||
*
|
||
* _.isTypedArray(new Uint8Array);
|
||
* // => true
|
||
*
|
||
* _.isTypedArray([]);
|
||
* // => false
|
||
*/
|
||
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
|
||
|
||
/**
|
||
* Checks if `value` is `undefined`.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
|
||
* @example
|
||
*
|
||
* _.isUndefined(void 0);
|
||
* // => true
|
||
*
|
||
* _.isUndefined(null);
|
||
* // => false
|
||
*/
|
||
function isUndefined(value) {
|
||
return value === undefined;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `WeakMap` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
|
||
* @example
|
||
*
|
||
* _.isWeakMap(new WeakMap);
|
||
* // => true
|
||
*
|
||
* _.isWeakMap(new Map);
|
||
* // => false
|
||
*/
|
||
function isWeakMap(value) {
|
||
return isObjectLike(value) && getTag(value) == weakMapTag;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is classified as a `WeakSet` object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.3.0
|
||
* @category Lang
|
||
* @param {*} value The value to check.
|
||
* @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
|
||
* @example
|
||
*
|
||
* _.isWeakSet(new WeakSet);
|
||
* // => true
|
||
*
|
||
* _.isWeakSet(new Set);
|
||
* // => false
|
||
*/
|
||
function isWeakSet(value) {
|
||
return isObjectLike(value) && objectToString.call(value) == weakSetTag;
|
||
}
|
||
|
||
/**
|
||
* Checks if `value` is less than `other`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.9.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is less than `other`,
|
||
* else `false`.
|
||
* @see _.gt
|
||
* @example
|
||
*
|
||
* _.lt(1, 3);
|
||
* // => true
|
||
*
|
||
* _.lt(3, 3);
|
||
* // => false
|
||
*
|
||
* _.lt(3, 1);
|
||
* // => false
|
||
*/
|
||
var lt = createRelationalOperation(baseLt);
|
||
|
||
/**
|
||
* Checks if `value` is less than or equal to `other`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.9.0
|
||
* @category Lang
|
||
* @param {*} value The value to compare.
|
||
* @param {*} other The other value to compare.
|
||
* @returns {boolean} Returns `true` if `value` is less than or equal to
|
||
* `other`, else `false`.
|
||
* @see _.gte
|
||
* @example
|
||
*
|
||
* _.lte(1, 3);
|
||
* // => true
|
||
*
|
||
* _.lte(3, 3);
|
||
* // => true
|
||
*
|
||
* _.lte(3, 1);
|
||
* // => false
|
||
*/
|
||
var lte = createRelationalOperation(function(value, other) {
|
||
return value <= other;
|
||
});
|
||
|
||
/**
|
||
* Converts `value` to an array.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {Array} Returns the converted array.
|
||
* @example
|
||
*
|
||
* _.toArray({ 'a': 1, 'b': 2 });
|
||
* // => [1, 2]
|
||
*
|
||
* _.toArray('abc');
|
||
* // => ['a', 'b', 'c']
|
||
*
|
||
* _.toArray(1);
|
||
* // => []
|
||
*
|
||
* _.toArray(null);
|
||
* // => []
|
||
*/
|
||
function toArray(value) {
|
||
if (!value) {
|
||
return [];
|
||
}
|
||
if (isArrayLike(value)) {
|
||
return isString(value) ? stringToArray(value) : copyArray(value);
|
||
}
|
||
if (iteratorSymbol && value[iteratorSymbol]) {
|
||
return iteratorToArray(value[iteratorSymbol]());
|
||
}
|
||
var tag = getTag(value),
|
||
func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
|
||
|
||
return func(value);
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a finite number.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.12.0
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {number} Returns the converted number.
|
||
* @example
|
||
*
|
||
* _.toFinite(3.2);
|
||
* // => 3.2
|
||
*
|
||
* _.toFinite(Number.MIN_VALUE);
|
||
* // => 5e-324
|
||
*
|
||
* _.toFinite(Infinity);
|
||
* // => 1.7976931348623157e+308
|
||
*
|
||
* _.toFinite('3.2');
|
||
* // => 3.2
|
||
*/
|
||
function toFinite(value) {
|
||
if (!value) {
|
||
return value === 0 ? value : 0;
|
||
}
|
||
value = toNumber(value);
|
||
if (value === INFINITY || value === -INFINITY) {
|
||
var sign = (value < 0 ? -1 : 1);
|
||
return sign * MAX_INTEGER;
|
||
}
|
||
return value === value ? value : 0;
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to an integer.
|
||
*
|
||
* **Note:** This method is loosely based on
|
||
* [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {number} Returns the converted integer.
|
||
* @example
|
||
*
|
||
* _.toInteger(3.2);
|
||
* // => 3
|
||
*
|
||
* _.toInteger(Number.MIN_VALUE);
|
||
* // => 0
|
||
*
|
||
* _.toInteger(Infinity);
|
||
* // => 1.7976931348623157e+308
|
||
*
|
||
* _.toInteger('3.2');
|
||
* // => 3
|
||
*/
|
||
function toInteger(value) {
|
||
var result = toFinite(value),
|
||
remainder = result % 1;
|
||
|
||
return result === result ? (remainder ? result - remainder : result) : 0;
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to an integer suitable for use as the length of an
|
||
* array-like object.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {number} Returns the converted integer.
|
||
* @example
|
||
*
|
||
* _.toLength(3.2);
|
||
* // => 3
|
||
*
|
||
* _.toLength(Number.MIN_VALUE);
|
||
* // => 0
|
||
*
|
||
* _.toLength(Infinity);
|
||
* // => 4294967295
|
||
*
|
||
* _.toLength('3.2');
|
||
* // => 3
|
||
*/
|
||
function toLength(value) {
|
||
return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a number.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to process.
|
||
* @returns {number} Returns the number.
|
||
* @example
|
||
*
|
||
* _.toNumber(3.2);
|
||
* // => 3.2
|
||
*
|
||
* _.toNumber(Number.MIN_VALUE);
|
||
* // => 5e-324
|
||
*
|
||
* _.toNumber(Infinity);
|
||
* // => Infinity
|
||
*
|
||
* _.toNumber('3.2');
|
||
* // => 3.2
|
||
*/
|
||
function toNumber(value) {
|
||
if (typeof value == 'number') {
|
||
return value;
|
||
}
|
||
if (isSymbol(value)) {
|
||
return NAN;
|
||
}
|
||
if (isObject(value)) {
|
||
var other = isFunction(value.valueOf) ? value.valueOf() : value;
|
||
value = isObject(other) ? (other + '') : other;
|
||
}
|
||
if (typeof value != 'string') {
|
||
return value === 0 ? value : +value;
|
||
}
|
||
value = value.replace(reTrim, '');
|
||
var isBinary = reIsBinary.test(value);
|
||
return (isBinary || reIsOctal.test(value))
|
||
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
|
||
: (reIsBadHex.test(value) ? NAN : +value);
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a plain object flattening inherited enumerable string
|
||
* keyed properties of `value` to own properties of the plain object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {Object} Returns the converted plain object.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.assign({ 'a': 1 }, new Foo);
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*
|
||
* _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
|
||
* // => { 'a': 1, 'b': 2, 'c': 3 }
|
||
*/
|
||
function toPlainObject(value) {
|
||
return copyObject(value, keysIn(value));
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a safe integer. A safe integer can be compared and
|
||
* represented correctly.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to convert.
|
||
* @returns {number} Returns the converted integer.
|
||
* @example
|
||
*
|
||
* _.toSafeInteger(3.2);
|
||
* // => 3
|
||
*
|
||
* _.toSafeInteger(Number.MIN_VALUE);
|
||
* // => 0
|
||
*
|
||
* _.toSafeInteger(Infinity);
|
||
* // => 9007199254740991
|
||
*
|
||
* _.toSafeInteger('3.2');
|
||
* // => 3
|
||
*/
|
||
function toSafeInteger(value) {
|
||
return baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a string. An empty string is returned for `null`
|
||
* and `undefined` values. The sign of `-0` is preserved.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Lang
|
||
* @param {*} value The value to process.
|
||
* @returns {string} Returns the string.
|
||
* @example
|
||
*
|
||
* _.toString(null);
|
||
* // => ''
|
||
*
|
||
* _.toString(-0);
|
||
* // => '-0'
|
||
*
|
||
* _.toString([1, 2, 3]);
|
||
* // => '1,2,3'
|
||
*/
|
||
function toString(value) {
|
||
return value == null ? '' : baseToString(value);
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Assigns own enumerable string keyed properties of source objects to the
|
||
* destination object. Source objects are applied from left to right.
|
||
* Subsequent sources overwrite property assignments of previous sources.
|
||
*
|
||
* **Note:** This method mutates `object` and is loosely based on
|
||
* [`Object.assign`](https://mdn.io/Object/assign).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.10.0
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} [sources] The source objects.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.assignIn
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* }
|
||
*
|
||
* function Bar() {
|
||
* this.c = 3;
|
||
* }
|
||
*
|
||
* Foo.prototype.b = 2;
|
||
* Bar.prototype.d = 4;
|
||
*
|
||
* _.assign({ 'a': 0 }, new Foo, new Bar);
|
||
* // => { 'a': 1, 'c': 3 }
|
||
*/
|
||
var assign = createAssigner(function(object, source) {
|
||
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
|
||
copyObject(source, keys(source), object);
|
||
return;
|
||
}
|
||
for (var key in source) {
|
||
if (hasOwnProperty.call(source, key)) {
|
||
assignValue(object, key, source[key]);
|
||
}
|
||
}
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.assign` except that it iterates over own and
|
||
* inherited source properties.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @alias extend
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} [sources] The source objects.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.assign
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* }
|
||
*
|
||
* function Bar() {
|
||
* this.c = 3;
|
||
* }
|
||
*
|
||
* Foo.prototype.b = 2;
|
||
* Bar.prototype.d = 4;
|
||
*
|
||
* _.assignIn({ 'a': 0 }, new Foo, new Bar);
|
||
* // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
|
||
*/
|
||
var assignIn = createAssigner(function(object, source) {
|
||
if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {
|
||
copyObject(source, keysIn(source), object);
|
||
return;
|
||
}
|
||
for (var key in source) {
|
||
assignValue(object, key, source[key]);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.assignIn` except that it accepts `customizer`
|
||
* which is invoked to produce the assigned values. If `customizer` returns
|
||
* `undefined`, assignment is handled by the method instead. The `customizer`
|
||
* is invoked with five arguments: (objValue, srcValue, key, object, source).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @alias extendWith
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} sources The source objects.
|
||
* @param {Function} [customizer] The function to customize assigned values.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.assignWith
|
||
* @example
|
||
*
|
||
* function customizer(objValue, srcValue) {
|
||
* return _.isUndefined(objValue) ? srcValue : objValue;
|
||
* }
|
||
*
|
||
* var defaults = _.partialRight(_.assignInWith, customizer);
|
||
*
|
||
* defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*/
|
||
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
|
||
copyObject(source, keysIn(source), object, customizer);
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.assign` except that it accepts `customizer`
|
||
* which is invoked to produce the assigned values. If `customizer` returns
|
||
* `undefined`, assignment is handled by the method instead. The `customizer`
|
||
* is invoked with five arguments: (objValue, srcValue, key, object, source).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} sources The source objects.
|
||
* @param {Function} [customizer] The function to customize assigned values.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.assignInWith
|
||
* @example
|
||
*
|
||
* function customizer(objValue, srcValue) {
|
||
* return _.isUndefined(objValue) ? srcValue : objValue;
|
||
* }
|
||
*
|
||
* var defaults = _.partialRight(_.assignWith, customizer);
|
||
*
|
||
* defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*/
|
||
var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
|
||
copyObject(source, keys(source), object, customizer);
|
||
});
|
||
|
||
/**
|
||
* Creates an array of values corresponding to `paths` of `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {...(string|string[])} [paths] The property paths of elements to pick.
|
||
* @returns {Array} Returns the picked values.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
|
||
*
|
||
* _.at(object, ['a[0].b.c', 'a[1]']);
|
||
* // => [3, 4]
|
||
*/
|
||
var at = baseRest(function(object, paths) {
|
||
return baseAt(object, baseFlatten(paths, 1));
|
||
});
|
||
|
||
/**
|
||
* Creates an object that inherits from the `prototype` object. If a
|
||
* `properties` object is given, its own enumerable string keyed properties
|
||
* are assigned to the created object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.3.0
|
||
* @category Object
|
||
* @param {Object} prototype The object to inherit from.
|
||
* @param {Object} [properties] The properties to assign to the object.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* function Shape() {
|
||
* this.x = 0;
|
||
* this.y = 0;
|
||
* }
|
||
*
|
||
* function Circle() {
|
||
* Shape.call(this);
|
||
* }
|
||
*
|
||
* Circle.prototype = _.create(Shape.prototype, {
|
||
* 'constructor': Circle
|
||
* });
|
||
*
|
||
* var circle = new Circle;
|
||
* circle instanceof Circle;
|
||
* // => true
|
||
*
|
||
* circle instanceof Shape;
|
||
* // => true
|
||
*/
|
||
function create(prototype, properties) {
|
||
var result = baseCreate(prototype);
|
||
return properties ? baseAssign(result, properties) : result;
|
||
}
|
||
|
||
/**
|
||
* Assigns own and inherited enumerable string keyed properties of source
|
||
* objects to the destination object for all destination properties that
|
||
* resolve to `undefined`. Source objects are applied from left to right.
|
||
* Once a property is set, additional values of the same property are ignored.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} [sources] The source objects.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.defaultsDeep
|
||
* @example
|
||
*
|
||
* _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
|
||
* // => { 'a': 1, 'b': 2 }
|
||
*/
|
||
var defaults = baseRest(function(args) {
|
||
args.push(undefined, assignInDefaults);
|
||
return apply(assignInWith, undefined, args);
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.defaults` except that it recursively assigns
|
||
* default properties.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.10.0
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} [sources] The source objects.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.defaults
|
||
* @example
|
||
*
|
||
* _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
|
||
* // => { 'a': { 'b': 2, 'c': 3 } }
|
||
*/
|
||
var defaultsDeep = baseRest(function(args) {
|
||
args.push(undefined, mergeDefaults);
|
||
return apply(mergeWith, undefined, args);
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.find` except that it returns the key of the first
|
||
* element `predicate` returns truthy for instead of the element itself.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.1.0
|
||
* @category Object
|
||
* @param {Object} object The object to search.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @returns {string|undefined} Returns the key of the matched element,
|
||
* else `undefined`.
|
||
* @example
|
||
*
|
||
* var users = {
|
||
* 'barney': { 'age': 36, 'active': true },
|
||
* 'fred': { 'age': 40, 'active': false },
|
||
* 'pebbles': { 'age': 1, 'active': true }
|
||
* };
|
||
*
|
||
* _.findKey(users, function(o) { return o.age < 40; });
|
||
* // => 'barney' (iteration order is not guaranteed)
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.findKey(users, { 'age': 1, 'active': true });
|
||
* // => 'pebbles'
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.findKey(users, ['active', false]);
|
||
* // => 'fred'
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.findKey(users, 'active');
|
||
* // => 'barney'
|
||
*/
|
||
function findKey(object, predicate) {
|
||
return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.findKey` except that it iterates over elements of
|
||
* a collection in the opposite order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to search.
|
||
* @param {Function} [predicate=_.identity] The function invoked per iteration.
|
||
* @returns {string|undefined} Returns the key of the matched element,
|
||
* else `undefined`.
|
||
* @example
|
||
*
|
||
* var users = {
|
||
* 'barney': { 'age': 36, 'active': true },
|
||
* 'fred': { 'age': 40, 'active': false },
|
||
* 'pebbles': { 'age': 1, 'active': true }
|
||
* };
|
||
*
|
||
* _.findLastKey(users, function(o) { return o.age < 40; });
|
||
* // => returns 'pebbles' assuming `_.findKey` returns 'barney'
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.findLastKey(users, { 'age': 36, 'active': true });
|
||
* // => 'barney'
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.findLastKey(users, ['active', false]);
|
||
* // => 'fred'
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.findLastKey(users, 'active');
|
||
* // => 'pebbles'
|
||
*/
|
||
function findLastKey(object, predicate) {
|
||
return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
|
||
}
|
||
|
||
/**
|
||
* Iterates over own and inherited enumerable string keyed properties of an
|
||
* object and invokes `iteratee` for each property. The iteratee is invoked
|
||
* with three arguments: (value, key, object). Iteratee functions may exit
|
||
* iteration early by explicitly returning `false`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.3.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.forInRight
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.forIn(new Foo, function(value, key) {
|
||
* console.log(key);
|
||
* });
|
||
* // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
|
||
*/
|
||
function forIn(object, iteratee) {
|
||
return object == null
|
||
? object
|
||
: baseFor(object, getIteratee(iteratee, 3), keysIn);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.forIn` except that it iterates over properties of
|
||
* `object` in the opposite order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.forIn
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.forInRight(new Foo, function(value, key) {
|
||
* console.log(key);
|
||
* });
|
||
* // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
|
||
*/
|
||
function forInRight(object, iteratee) {
|
||
return object == null
|
||
? object
|
||
: baseForRight(object, getIteratee(iteratee, 3), keysIn);
|
||
}
|
||
|
||
/**
|
||
* Iterates over own enumerable string keyed properties of an object and
|
||
* invokes `iteratee` for each property. The iteratee is invoked with three
|
||
* arguments: (value, key, object). Iteratee functions may exit iteration
|
||
* early by explicitly returning `false`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.3.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.forOwnRight
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.forOwn(new Foo, function(value, key) {
|
||
* console.log(key);
|
||
* });
|
||
* // => Logs 'a' then 'b' (iteration order is not guaranteed).
|
||
*/
|
||
function forOwn(object, iteratee) {
|
||
return object && baseForOwn(object, getIteratee(iteratee, 3));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.forOwn` except that it iterates over properties of
|
||
* `object` in the opposite order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns `object`.
|
||
* @see _.forOwn
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.forOwnRight(new Foo, function(value, key) {
|
||
* console.log(key);
|
||
* });
|
||
* // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
|
||
*/
|
||
function forOwnRight(object, iteratee) {
|
||
return object && baseForOwnRight(object, getIteratee(iteratee, 3));
|
||
}
|
||
|
||
/**
|
||
* Creates an array of function property names from own enumerable properties
|
||
* of `object`.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The object to inspect.
|
||
* @returns {Array} Returns the function names.
|
||
* @see _.functionsIn
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = _.constant('a');
|
||
* this.b = _.constant('b');
|
||
* }
|
||
*
|
||
* Foo.prototype.c = _.constant('c');
|
||
*
|
||
* _.functions(new Foo);
|
||
* // => ['a', 'b']
|
||
*/
|
||
function functions(object) {
|
||
return object == null ? [] : baseFunctions(object, keys(object));
|
||
}
|
||
|
||
/**
|
||
* Creates an array of function property names from own and inherited
|
||
* enumerable properties of `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to inspect.
|
||
* @returns {Array} Returns the function names.
|
||
* @see _.functions
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = _.constant('a');
|
||
* this.b = _.constant('b');
|
||
* }
|
||
*
|
||
* Foo.prototype.c = _.constant('c');
|
||
*
|
||
* _.functionsIn(new Foo);
|
||
* // => ['a', 'b', 'c']
|
||
*/
|
||
function functionsIn(object) {
|
||
return object == null ? [] : baseFunctions(object, keysIn(object));
|
||
}
|
||
|
||
/**
|
||
* Gets the value at `path` of `object`. If the resolved value is
|
||
* `undefined`, the `defaultValue` is returned in its place.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.7.0
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the property to get.
|
||
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
||
* @returns {*} Returns the resolved value.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
||
*
|
||
* _.get(object, 'a[0].b.c');
|
||
* // => 3
|
||
*
|
||
* _.get(object, ['a', '0', 'b', 'c']);
|
||
* // => 3
|
||
*
|
||
* _.get(object, 'a.b.c', 'default');
|
||
* // => 'default'
|
||
*/
|
||
function get(object, path, defaultValue) {
|
||
var result = object == null ? undefined : baseGet(object, path);
|
||
return result === undefined ? defaultValue : result;
|
||
}
|
||
|
||
/**
|
||
* Checks if `path` is a direct property of `object`.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path to check.
|
||
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': { 'b': 2 } };
|
||
* var other = _.create({ 'a': _.create({ 'b': 2 }) });
|
||
*
|
||
* _.has(object, 'a');
|
||
* // => true
|
||
*
|
||
* _.has(object, 'a.b');
|
||
* // => true
|
||
*
|
||
* _.has(object, ['a', 'b']);
|
||
* // => true
|
||
*
|
||
* _.has(other, 'a');
|
||
* // => false
|
||
*/
|
||
function has(object, path) {
|
||
return object != null && hasPath(object, path, baseHas);
|
||
}
|
||
|
||
/**
|
||
* Checks if `path` is a direct or inherited property of `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path to check.
|
||
* @returns {boolean} Returns `true` if `path` exists, else `false`.
|
||
* @example
|
||
*
|
||
* var object = _.create({ 'a': _.create({ 'b': 2 }) });
|
||
*
|
||
* _.hasIn(object, 'a');
|
||
* // => true
|
||
*
|
||
* _.hasIn(object, 'a.b');
|
||
* // => true
|
||
*
|
||
* _.hasIn(object, ['a', 'b']);
|
||
* // => true
|
||
*
|
||
* _.hasIn(object, 'b');
|
||
* // => false
|
||
*/
|
||
function hasIn(object, path) {
|
||
return object != null && hasPath(object, path, baseHasIn);
|
||
}
|
||
|
||
/**
|
||
* Creates an object composed of the inverted keys and values of `object`.
|
||
* If `object` contains duplicate values, subsequent values overwrite
|
||
* property assignments of previous values.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.7.0
|
||
* @category Object
|
||
* @param {Object} object The object to invert.
|
||
* @returns {Object} Returns the new inverted object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': 2, 'c': 1 };
|
||
*
|
||
* _.invert(object);
|
||
* // => { '1': 'c', '2': 'b' }
|
||
*/
|
||
var invert = createInverter(function(result, value, key) {
|
||
result[value] = key;
|
||
}, constant(identity));
|
||
|
||
/**
|
||
* This method is like `_.invert` except that the inverted object is generated
|
||
* from the results of running each element of `object` thru `iteratee`. The
|
||
* corresponding inverted value of each inverted key is an array of keys
|
||
* responsible for generating the inverted value. The iteratee is invoked
|
||
* with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.1.0
|
||
* @category Object
|
||
* @param {Object} object The object to invert.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {Object} Returns the new inverted object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': 2, 'c': 1 };
|
||
*
|
||
* _.invertBy(object);
|
||
* // => { '1': ['a', 'c'], '2': ['b'] }
|
||
*
|
||
* _.invertBy(object, function(value) {
|
||
* return 'group' + value;
|
||
* });
|
||
* // => { 'group1': ['a', 'c'], 'group2': ['b'] }
|
||
*/
|
||
var invertBy = createInverter(function(result, value, key) {
|
||
if (hasOwnProperty.call(result, value)) {
|
||
result[value].push(key);
|
||
} else {
|
||
result[value] = [key];
|
||
}
|
||
}, getIteratee);
|
||
|
||
/**
|
||
* Invokes the method at `path` of `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the method to invoke.
|
||
* @param {...*} [args] The arguments to invoke the method with.
|
||
* @returns {*} Returns the result of the invoked method.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
|
||
*
|
||
* _.invoke(object, 'a[0].b.c.slice', 1, 3);
|
||
* // => [2, 3]
|
||
*/
|
||
var invoke = baseRest(baseInvoke);
|
||
|
||
/**
|
||
* Creates an array of the own enumerable property names of `object`.
|
||
*
|
||
* **Note:** Non-object values are coerced to objects. See the
|
||
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
|
||
* for more details.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.keys(new Foo);
|
||
* // => ['a', 'b'] (iteration order is not guaranteed)
|
||
*
|
||
* _.keys('hi');
|
||
* // => ['0', '1']
|
||
*/
|
||
function keys(object) {
|
||
var isProto = isPrototype(object);
|
||
if (!(isProto || isArrayLike(object))) {
|
||
return baseKeys(object);
|
||
}
|
||
var indexes = indexKeys(object),
|
||
skipIndexes = !!indexes,
|
||
result = indexes || [],
|
||
length = result.length;
|
||
|
||
for (var key in object) {
|
||
if (baseHas(object, key) &&
|
||
!(skipIndexes && (key == 'length' || isIndex(key, length))) &&
|
||
!(isProto && key == 'constructor')) {
|
||
result.push(key);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates an array of the own and inherited enumerable property names of `object`.
|
||
*
|
||
* **Note:** Non-object values are coerced to objects.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property names.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.keysIn(new Foo);
|
||
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
|
||
*/
|
||
function keysIn(object) {
|
||
var index = -1,
|
||
isProto = isPrototype(object),
|
||
props = baseKeysIn(object),
|
||
propsLength = props.length,
|
||
indexes = indexKeys(object),
|
||
skipIndexes = !!indexes,
|
||
result = indexes || [],
|
||
length = result.length;
|
||
|
||
while (++index < propsLength) {
|
||
var key = props[index];
|
||
if (!(skipIndexes && (key == 'length' || isIndex(key, length))) &&
|
||
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
|
||
result.push(key);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* The opposite of `_.mapValues`; this method creates an object with the
|
||
* same values as `object` and keys generated by running each own enumerable
|
||
* string keyed property of `object` thru `iteratee`. The iteratee is invoked
|
||
* with three arguments: (value, key, object).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.8.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns the new mapped object.
|
||
* @see _.mapValues
|
||
* @example
|
||
*
|
||
* _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
|
||
* return key + value;
|
||
* });
|
||
* // => { 'a1': 1, 'b2': 2 }
|
||
*/
|
||
function mapKeys(object, iteratee) {
|
||
var result = {};
|
||
iteratee = getIteratee(iteratee, 3);
|
||
|
||
baseForOwn(object, function(value, key, object) {
|
||
result[iteratee(value, key, object)] = value;
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Creates an object with the same keys as `object` and values generated
|
||
* by running each own enumerable string keyed property of `object` thru
|
||
* `iteratee`. The iteratee is invoked with three arguments:
|
||
* (value, key, object).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.4.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Object} Returns the new mapped object.
|
||
* @see _.mapKeys
|
||
* @example
|
||
*
|
||
* var users = {
|
||
* 'fred': { 'user': 'fred', 'age': 40 },
|
||
* 'pebbles': { 'user': 'pebbles', 'age': 1 }
|
||
* };
|
||
*
|
||
* _.mapValues(users, function(o) { return o.age; });
|
||
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.mapValues(users, 'age');
|
||
* // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
|
||
*/
|
||
function mapValues(object, iteratee) {
|
||
var result = {};
|
||
iteratee = getIteratee(iteratee, 3);
|
||
|
||
baseForOwn(object, function(value, key, object) {
|
||
result[key] = iteratee(value, key, object);
|
||
});
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.assign` except that it recursively merges own and
|
||
* inherited enumerable string keyed properties of source objects into the
|
||
* destination object. Source properties that resolve to `undefined` are
|
||
* skipped if a destination value exists. Array and plain object properties
|
||
* are merged recursively. Other objects and value types are overridden by
|
||
* assignment. Source objects are applied from left to right. Subsequent
|
||
* sources overwrite property assignments of previous sources.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.5.0
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} [sources] The source objects.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var object = {
|
||
* 'a': [{ 'b': 2 }, { 'd': 4 }]
|
||
* };
|
||
*
|
||
* var other = {
|
||
* 'a': [{ 'c': 3 }, { 'e': 5 }]
|
||
* };
|
||
*
|
||
* _.merge(object, other);
|
||
* // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
|
||
*/
|
||
var merge = createAssigner(function(object, source, srcIndex) {
|
||
baseMerge(object, source, srcIndex);
|
||
});
|
||
|
||
/**
|
||
* This method is like `_.merge` except that it accepts `customizer` which
|
||
* is invoked to produce the merged values of the destination and source
|
||
* properties. If `customizer` returns `undefined`, merging is handled by the
|
||
* method instead. The `customizer` is invoked with seven arguments:
|
||
* (objValue, srcValue, key, object, source, stack).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The destination object.
|
||
* @param {...Object} sources The source objects.
|
||
* @param {Function} customizer The function to customize assigned values.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* function customizer(objValue, srcValue) {
|
||
* if (_.isArray(objValue)) {
|
||
* return objValue.concat(srcValue);
|
||
* }
|
||
* }
|
||
*
|
||
* var object = { 'a': [1], 'b': [2] };
|
||
* var other = { 'a': [3], 'b': [4] };
|
||
*
|
||
* _.mergeWith(object, other, customizer);
|
||
* // => { 'a': [1, 3], 'b': [2, 4] }
|
||
*/
|
||
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
|
||
baseMerge(object, source, srcIndex, customizer);
|
||
});
|
||
|
||
/**
|
||
* The opposite of `_.pick`; this method creates an object composed of the
|
||
* own and inherited enumerable string keyed properties of `object` that are
|
||
* not omitted.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The source object.
|
||
* @param {...(string|string[])} [props] The property identifiers to omit.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
||
*
|
||
* _.omit(object, ['a', 'c']);
|
||
* // => { 'b': '2' }
|
||
*/
|
||
var omit = baseRest(function(object, props) {
|
||
if (object == null) {
|
||
return {};
|
||
}
|
||
props = arrayMap(baseFlatten(props, 1), toKey);
|
||
return basePick(object, baseDifference(getAllKeysIn(object), props));
|
||
});
|
||
|
||
/**
|
||
* The opposite of `_.pickBy`; this method creates an object composed of
|
||
* the own and inherited enumerable string keyed properties of `object` that
|
||
* `predicate` doesn't return truthy for. The predicate is invoked with two
|
||
* arguments: (value, key).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The source object.
|
||
* @param {Function} [predicate=_.identity] The function invoked per property.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
||
*
|
||
* _.omitBy(object, _.isNumber);
|
||
* // => { 'b': '2' }
|
||
*/
|
||
function omitBy(object, predicate) {
|
||
return pickBy(object, negate(getIteratee(predicate)));
|
||
}
|
||
|
||
/**
|
||
* Creates an object composed of the picked `object` properties.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The source object.
|
||
* @param {...(string|string[])} [props] The property identifiers to pick.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
||
*
|
||
* _.pick(object, ['a', 'c']);
|
||
* // => { 'a': 1, 'c': 3 }
|
||
*/
|
||
var pick = baseRest(function(object, props) {
|
||
return object == null ? {} : basePick(object, arrayMap(baseFlatten(props, 1), toKey));
|
||
});
|
||
|
||
/**
|
||
* Creates an object composed of the `object` properties `predicate` returns
|
||
* truthy for. The predicate is invoked with two arguments: (value, key).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The source object.
|
||
* @param {Function} [predicate=_.identity] The function invoked per property.
|
||
* @returns {Object} Returns the new object.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1, 'b': '2', 'c': 3 };
|
||
*
|
||
* _.pickBy(object, _.isNumber);
|
||
* // => { 'a': 1, 'c': 3 }
|
||
*/
|
||
function pickBy(object, predicate) {
|
||
return object == null ? {} : basePickBy(object, getAllKeysIn(object), getIteratee(predicate));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.get` except that if the resolved value is a
|
||
* function it's invoked with the `this` binding of its parent object and
|
||
* its result is returned.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @param {Array|string} path The path of the property to resolve.
|
||
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
||
* @returns {*} Returns the resolved value.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
|
||
*
|
||
* _.result(object, 'a[0].b.c1');
|
||
* // => 3
|
||
*
|
||
* _.result(object, 'a[0].b.c2');
|
||
* // => 4
|
||
*
|
||
* _.result(object, 'a[0].b.c3', 'default');
|
||
* // => 'default'
|
||
*
|
||
* _.result(object, 'a[0].b.c3', _.constant('default'));
|
||
* // => 'default'
|
||
*/
|
||
function result(object, path, defaultValue) {
|
||
path = isKey(path, object) ? [path] : castPath(path);
|
||
|
||
var index = -1,
|
||
length = path.length;
|
||
|
||
// Ensure the loop is entered when path is empty.
|
||
if (!length) {
|
||
object = undefined;
|
||
length = 1;
|
||
}
|
||
while (++index < length) {
|
||
var value = object == null ? undefined : object[toKey(path[index])];
|
||
if (value === undefined) {
|
||
index = length;
|
||
value = defaultValue;
|
||
}
|
||
object = isFunction(value) ? value.call(object) : value;
|
||
}
|
||
return object;
|
||
}
|
||
|
||
/**
|
||
* Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
|
||
* it's created. Arrays are created for missing index properties while objects
|
||
* are created for all other missing properties. Use `_.setWith` to customize
|
||
* `path` creation.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.7.0
|
||
* @category Object
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to set.
|
||
* @param {*} value The value to set.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
||
*
|
||
* _.set(object, 'a[0].b.c', 4);
|
||
* console.log(object.a[0].b.c);
|
||
* // => 4
|
||
*
|
||
* _.set(object, ['x', '0', 'y', 'z'], 5);
|
||
* console.log(object.x[0].y.z);
|
||
* // => 5
|
||
*/
|
||
function set(object, path, value) {
|
||
return object == null ? object : baseSet(object, path, value);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.set` except that it accepts `customizer` which is
|
||
* invoked to produce the objects of `path`. If `customizer` returns `undefined`
|
||
* path creation is handled by the method instead. The `customizer` is invoked
|
||
* with three arguments: (nsValue, key, nsObject).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to set.
|
||
* @param {*} value The value to set.
|
||
* @param {Function} [customizer] The function to customize assigned values.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var object = {};
|
||
*
|
||
* _.setWith(object, '[0][1]', 'a', Object);
|
||
* // => { '0': { '1': 'a' } }
|
||
*/
|
||
function setWith(object, path, value, customizer) {
|
||
customizer = typeof customizer == 'function' ? customizer : undefined;
|
||
return object == null ? object : baseSet(object, path, value, customizer);
|
||
}
|
||
|
||
/**
|
||
* Creates an array of own enumerable string keyed-value pairs for `object`
|
||
* which can be consumed by `_.fromPairs`. If `object` is a map or set, its
|
||
* entries are returned.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @alias entries
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the key-value pairs.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.toPairs(new Foo);
|
||
* // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
|
||
*/
|
||
var toPairs = createToPairs(keys);
|
||
|
||
/**
|
||
* Creates an array of own and inherited enumerable string keyed-value pairs
|
||
* for `object` which can be consumed by `_.fromPairs`. If `object` is a map
|
||
* or set, its entries are returned.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @alias entriesIn
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the key-value pairs.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.toPairsIn(new Foo);
|
||
* // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
|
||
*/
|
||
var toPairsIn = createToPairs(keysIn);
|
||
|
||
/**
|
||
* An alternative to `_.reduce`; this method transforms `object` to a new
|
||
* `accumulator` object which is the result of running each of its own
|
||
* enumerable string keyed properties thru `iteratee`, with each invocation
|
||
* potentially mutating the `accumulator` object. If `accumulator` is not
|
||
* provided, a new object with the same `[[Prototype]]` will be used. The
|
||
* iteratee is invoked with four arguments: (accumulator, value, key, object).
|
||
* Iteratee functions may exit iteration early by explicitly returning `false`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.3.0
|
||
* @category Object
|
||
* @param {Object} object The object to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @param {*} [accumulator] The custom accumulator value.
|
||
* @returns {*} Returns the accumulated value.
|
||
* @example
|
||
*
|
||
* _.transform([2, 3, 4], function(result, n) {
|
||
* result.push(n *= n);
|
||
* return n % 2 == 0;
|
||
* }, []);
|
||
* // => [4, 9]
|
||
*
|
||
* _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
|
||
* (result[value] || (result[value] = [])).push(key);
|
||
* }, {});
|
||
* // => { '1': ['a', 'c'], '2': ['b'] }
|
||
*/
|
||
function transform(object, iteratee, accumulator) {
|
||
var isArr = isArray(object) || isTypedArray(object);
|
||
iteratee = getIteratee(iteratee, 4);
|
||
|
||
if (accumulator == null) {
|
||
if (isArr || isObject(object)) {
|
||
var Ctor = object.constructor;
|
||
if (isArr) {
|
||
accumulator = isArray(object) ? new Ctor : [];
|
||
} else {
|
||
accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
|
||
}
|
||
} else {
|
||
accumulator = {};
|
||
}
|
||
}
|
||
(isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
|
||
return iteratee(accumulator, value, index, object);
|
||
});
|
||
return accumulator;
|
||
}
|
||
|
||
/**
|
||
* Removes the property at `path` of `object`.
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to unset.
|
||
* @returns {boolean} Returns `true` if the property is deleted, else `false`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 7 } }] };
|
||
* _.unset(object, 'a[0].b.c');
|
||
* // => true
|
||
*
|
||
* console.log(object);
|
||
* // => { 'a': [{ 'b': {} }] };
|
||
*
|
||
* _.unset(object, ['a', '0', 'b', 'c']);
|
||
* // => true
|
||
*
|
||
* console.log(object);
|
||
* // => { 'a': [{ 'b': {} }] };
|
||
*/
|
||
function unset(object, path) {
|
||
return object == null ? true : baseUnset(object, path);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.set` except that accepts `updater` to produce the
|
||
* value to set. Use `_.updateWith` to customize `path` creation. The `updater`
|
||
* is invoked with one argument: (value).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.6.0
|
||
* @category Object
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to set.
|
||
* @param {Function} updater The function to produce the updated value.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
||
*
|
||
* _.update(object, 'a[0].b.c', function(n) { return n * n; });
|
||
* console.log(object.a[0].b.c);
|
||
* // => 9
|
||
*
|
||
* _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
|
||
* console.log(object.x[0].y.z);
|
||
* // => 0
|
||
*/
|
||
function update(object, path, updater) {
|
||
return object == null ? object : baseUpdate(object, path, castFunction(updater));
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.update` except that it accepts `customizer` which is
|
||
* invoked to produce the objects of `path`. If `customizer` returns `undefined`
|
||
* path creation is handled by the method instead. The `customizer` is invoked
|
||
* with three arguments: (nsValue, key, nsObject).
|
||
*
|
||
* **Note:** This method mutates `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.6.0
|
||
* @category Object
|
||
* @param {Object} object The object to modify.
|
||
* @param {Array|string} path The path of the property to set.
|
||
* @param {Function} updater The function to produce the updated value.
|
||
* @param {Function} [customizer] The function to customize assigned values.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var object = {};
|
||
*
|
||
* _.updateWith(object, '[0][1]', _.constant('a'), Object);
|
||
* // => { '0': { '1': 'a' } }
|
||
*/
|
||
function updateWith(object, path, updater, customizer) {
|
||
customizer = typeof customizer == 'function' ? customizer : undefined;
|
||
return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
|
||
}
|
||
|
||
/**
|
||
* Creates an array of the own enumerable string keyed property values of `object`.
|
||
*
|
||
* **Note:** Non-object values are coerced to objects.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property values.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.values(new Foo);
|
||
* // => [1, 2] (iteration order is not guaranteed)
|
||
*
|
||
* _.values('hi');
|
||
* // => ['h', 'i']
|
||
*/
|
||
function values(object) {
|
||
return object ? baseValues(object, keys(object)) : [];
|
||
}
|
||
|
||
/**
|
||
* Creates an array of the own and inherited enumerable string keyed property
|
||
* values of `object`.
|
||
*
|
||
* **Note:** Non-object values are coerced to objects.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Object
|
||
* @param {Object} object The object to query.
|
||
* @returns {Array} Returns the array of property values.
|
||
* @example
|
||
*
|
||
* function Foo() {
|
||
* this.a = 1;
|
||
* this.b = 2;
|
||
* }
|
||
*
|
||
* Foo.prototype.c = 3;
|
||
*
|
||
* _.valuesIn(new Foo);
|
||
* // => [1, 2, 3] (iteration order is not guaranteed)
|
||
*/
|
||
function valuesIn(object) {
|
||
return object == null ? [] : baseValues(object, keysIn(object));
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Clamps `number` within the inclusive `lower` and `upper` bounds.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Number
|
||
* @param {number} number The number to clamp.
|
||
* @param {number} [lower] The lower bound.
|
||
* @param {number} upper The upper bound.
|
||
* @returns {number} Returns the clamped number.
|
||
* @example
|
||
*
|
||
* _.clamp(-10, -5, 5);
|
||
* // => -5
|
||
*
|
||
* _.clamp(10, -5, 5);
|
||
* // => 5
|
||
*/
|
||
function clamp(number, lower, upper) {
|
||
if (upper === undefined) {
|
||
upper = lower;
|
||
lower = undefined;
|
||
}
|
||
if (upper !== undefined) {
|
||
upper = toNumber(upper);
|
||
upper = upper === upper ? upper : 0;
|
||
}
|
||
if (lower !== undefined) {
|
||
lower = toNumber(lower);
|
||
lower = lower === lower ? lower : 0;
|
||
}
|
||
return baseClamp(toNumber(number), lower, upper);
|
||
}
|
||
|
||
/**
|
||
* Checks if `n` is between `start` and up to, but not including, `end`. If
|
||
* `end` is not specified, it's set to `start` with `start` then set to `0`.
|
||
* If `start` is greater than `end` the params are swapped to support
|
||
* negative ranges.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.3.0
|
||
* @category Number
|
||
* @param {number} number The number to check.
|
||
* @param {number} [start=0] The start of the range.
|
||
* @param {number} end The end of the range.
|
||
* @returns {boolean} Returns `true` if `number` is in the range, else `false`.
|
||
* @see _.range, _.rangeRight
|
||
* @example
|
||
*
|
||
* _.inRange(3, 2, 4);
|
||
* // => true
|
||
*
|
||
* _.inRange(4, 8);
|
||
* // => true
|
||
*
|
||
* _.inRange(4, 2);
|
||
* // => false
|
||
*
|
||
* _.inRange(2, 2);
|
||
* // => false
|
||
*
|
||
* _.inRange(1.2, 2);
|
||
* // => true
|
||
*
|
||
* _.inRange(5.2, 4);
|
||
* // => false
|
||
*
|
||
* _.inRange(-3, -2, -6);
|
||
* // => true
|
||
*/
|
||
function inRange(number, start, end) {
|
||
start = toFinite(start);
|
||
if (end === undefined) {
|
||
end = start;
|
||
start = 0;
|
||
} else {
|
||
end = toFinite(end);
|
||
}
|
||
number = toNumber(number);
|
||
return baseInRange(number, start, end);
|
||
}
|
||
|
||
/**
|
||
* Produces a random number between the inclusive `lower` and `upper` bounds.
|
||
* If only one argument is provided a number between `0` and the given number
|
||
* is returned. If `floating` is `true`, or either `lower` or `upper` are
|
||
* floats, a floating-point number is returned instead of an integer.
|
||
*
|
||
* **Note:** JavaScript follows the IEEE-754 standard for resolving
|
||
* floating-point values which can produce unexpected results.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.7.0
|
||
* @category Number
|
||
* @param {number} [lower=0] The lower bound.
|
||
* @param {number} [upper=1] The upper bound.
|
||
* @param {boolean} [floating] Specify returning a floating-point number.
|
||
* @returns {number} Returns the random number.
|
||
* @example
|
||
*
|
||
* _.random(0, 5);
|
||
* // => an integer between 0 and 5
|
||
*
|
||
* _.random(5);
|
||
* // => also an integer between 0 and 5
|
||
*
|
||
* _.random(5, true);
|
||
* // => a floating-point number between 0 and 5
|
||
*
|
||
* _.random(1.2, 5.2);
|
||
* // => a floating-point number between 1.2 and 5.2
|
||
*/
|
||
function random(lower, upper, floating) {
|
||
if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
|
||
upper = floating = undefined;
|
||
}
|
||
if (floating === undefined) {
|
||
if (typeof upper == 'boolean') {
|
||
floating = upper;
|
||
upper = undefined;
|
||
}
|
||
else if (typeof lower == 'boolean') {
|
||
floating = lower;
|
||
lower = undefined;
|
||
}
|
||
}
|
||
if (lower === undefined && upper === undefined) {
|
||
lower = 0;
|
||
upper = 1;
|
||
}
|
||
else {
|
||
lower = toFinite(lower);
|
||
if (upper === undefined) {
|
||
upper = lower;
|
||
lower = 0;
|
||
} else {
|
||
upper = toFinite(upper);
|
||
}
|
||
}
|
||
if (lower > upper) {
|
||
var temp = lower;
|
||
lower = upper;
|
||
upper = temp;
|
||
}
|
||
if (floating || lower % 1 || upper % 1) {
|
||
var rand = nativeRandom();
|
||
return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
|
||
}
|
||
return baseRandom(lower, upper);
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the camel cased string.
|
||
* @example
|
||
*
|
||
* _.camelCase('Foo Bar');
|
||
* // => 'fooBar'
|
||
*
|
||
* _.camelCase('--foo-bar--');
|
||
* // => 'fooBar'
|
||
*
|
||
* _.camelCase('__FOO_BAR__');
|
||
* // => 'fooBar'
|
||
*/
|
||
var camelCase = createCompounder(function(result, word, index) {
|
||
word = word.toLowerCase();
|
||
return result + (index ? capitalize(word) : word);
|
||
});
|
||
|
||
/**
|
||
* Converts the first character of `string` to upper case and the remaining
|
||
* to lower case.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to capitalize.
|
||
* @returns {string} Returns the capitalized string.
|
||
* @example
|
||
*
|
||
* _.capitalize('FRED');
|
||
* // => 'Fred'
|
||
*/
|
||
function capitalize(string) {
|
||
return upperFirst(toString(string).toLowerCase());
|
||
}
|
||
|
||
/**
|
||
* Deburrs `string` by converting
|
||
* [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
|
||
* to basic latin letters and removing
|
||
* [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to deburr.
|
||
* @returns {string} Returns the deburred string.
|
||
* @example
|
||
*
|
||
* _.deburr('déjà vu');
|
||
* // => 'deja vu'
|
||
*/
|
||
function deburr(string) {
|
||
string = toString(string);
|
||
return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
|
||
}
|
||
|
||
/**
|
||
* Checks if `string` ends with the given target string.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to search.
|
||
* @param {string} [target] The string to search for.
|
||
* @param {number} [position=string.length] The position to search up to.
|
||
* @returns {boolean} Returns `true` if `string` ends with `target`,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.endsWith('abc', 'c');
|
||
* // => true
|
||
*
|
||
* _.endsWith('abc', 'b');
|
||
* // => false
|
||
*
|
||
* _.endsWith('abc', 'b', 2);
|
||
* // => true
|
||
*/
|
||
function endsWith(string, target, position) {
|
||
string = toString(string);
|
||
target = baseToString(target);
|
||
|
||
var length = string.length;
|
||
position = position === undefined
|
||
? length
|
||
: baseClamp(toInteger(position), 0, length);
|
||
|
||
var end = position;
|
||
position -= target.length;
|
||
return position >= 0 && string.slice(position, end) == target;
|
||
}
|
||
|
||
/**
|
||
* Converts the characters "&", "<", ">", '"', "'", and "\`" in `string` to
|
||
* their corresponding HTML entities.
|
||
*
|
||
* **Note:** No other characters are escaped. To escape additional
|
||
* characters use a third-party library like [_he_](https://mths.be/he).
|
||
*
|
||
* Though the ">" character is escaped for symmetry, characters like
|
||
* ">" and "/" don't need escaping in HTML and have no special meaning
|
||
* unless they're part of a tag or unquoted attribute value. See
|
||
* [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
|
||
* (under "semi-related fun fact") for more details.
|
||
*
|
||
* Backticks are escaped because in IE < 9, they can break out of
|
||
* attribute values or HTML comments. See [#59](https://html5sec.org/#59),
|
||
* [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
|
||
* [#133](https://html5sec.org/#133) of the
|
||
* [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.
|
||
*
|
||
* When working with HTML you should always
|
||
* [quote attribute values](http://wonko.com/post/html-escaping) to reduce
|
||
* XSS vectors.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category String
|
||
* @param {string} [string=''] The string to escape.
|
||
* @returns {string} Returns the escaped string.
|
||
* @example
|
||
*
|
||
* _.escape('fred, barney, & pebbles');
|
||
* // => 'fred, barney, & pebbles'
|
||
*/
|
||
function escape(string) {
|
||
string = toString(string);
|
||
return (string && reHasUnescapedHtml.test(string))
|
||
? string.replace(reUnescapedHtml, escapeHtmlChar)
|
||
: string;
|
||
}
|
||
|
||
/**
|
||
* Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
|
||
* "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to escape.
|
||
* @returns {string} Returns the escaped string.
|
||
* @example
|
||
*
|
||
* _.escapeRegExp('[lodash](https://lodash.com/)');
|
||
* // => '\[lodash\]\(https://lodash\.com/\)'
|
||
*/
|
||
function escapeRegExp(string) {
|
||
string = toString(string);
|
||
return (string && reHasRegExpChar.test(string))
|
||
? string.replace(reRegExpChar, '\\$&')
|
||
: string;
|
||
}
|
||
|
||
/**
|
||
* Converts `string` to
|
||
* [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the kebab cased string.
|
||
* @example
|
||
*
|
||
* _.kebabCase('Foo Bar');
|
||
* // => 'foo-bar'
|
||
*
|
||
* _.kebabCase('fooBar');
|
||
* // => 'foo-bar'
|
||
*
|
||
* _.kebabCase('__FOO_BAR__');
|
||
* // => 'foo-bar'
|
||
*/
|
||
var kebabCase = createCompounder(function(result, word, index) {
|
||
return result + (index ? '-' : '') + word.toLowerCase();
|
||
});
|
||
|
||
/**
|
||
* Converts `string`, as space separated words, to lower case.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the lower cased string.
|
||
* @example
|
||
*
|
||
* _.lowerCase('--Foo-Bar--');
|
||
* // => 'foo bar'
|
||
*
|
||
* _.lowerCase('fooBar');
|
||
* // => 'foo bar'
|
||
*
|
||
* _.lowerCase('__FOO_BAR__');
|
||
* // => 'foo bar'
|
||
*/
|
||
var lowerCase = createCompounder(function(result, word, index) {
|
||
return result + (index ? ' ' : '') + word.toLowerCase();
|
||
});
|
||
|
||
/**
|
||
* Converts the first character of `string` to lower case.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the converted string.
|
||
* @example
|
||
*
|
||
* _.lowerFirst('Fred');
|
||
* // => 'fred'
|
||
*
|
||
* _.lowerFirst('FRED');
|
||
* // => 'fRED'
|
||
*/
|
||
var lowerFirst = createCaseFirst('toLowerCase');
|
||
|
||
/**
|
||
* Pads `string` on the left and right sides if it's shorter than `length`.
|
||
* Padding characters are truncated if they can't be evenly divided by `length`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to pad.
|
||
* @param {number} [length=0] The padding length.
|
||
* @param {string} [chars=' '] The string used as padding.
|
||
* @returns {string} Returns the padded string.
|
||
* @example
|
||
*
|
||
* _.pad('abc', 8);
|
||
* // => ' abc '
|
||
*
|
||
* _.pad('abc', 8, '_-');
|
||
* // => '_-abc_-_'
|
||
*
|
||
* _.pad('abc', 3);
|
||
* // => 'abc'
|
||
*/
|
||
function pad(string, length, chars) {
|
||
string = toString(string);
|
||
length = toInteger(length);
|
||
|
||
var strLength = length ? stringSize(string) : 0;
|
||
if (!length || strLength >= length) {
|
||
return string;
|
||
}
|
||
var mid = (length - strLength) / 2;
|
||
return (
|
||
createPadding(nativeFloor(mid), chars) +
|
||
string +
|
||
createPadding(nativeCeil(mid), chars)
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Pads `string` on the right side if it's shorter than `length`. Padding
|
||
* characters are truncated if they exceed `length`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to pad.
|
||
* @param {number} [length=0] The padding length.
|
||
* @param {string} [chars=' '] The string used as padding.
|
||
* @returns {string} Returns the padded string.
|
||
* @example
|
||
*
|
||
* _.padEnd('abc', 6);
|
||
* // => 'abc '
|
||
*
|
||
* _.padEnd('abc', 6, '_-');
|
||
* // => 'abc_-_'
|
||
*
|
||
* _.padEnd('abc', 3);
|
||
* // => 'abc'
|
||
*/
|
||
function padEnd(string, length, chars) {
|
||
string = toString(string);
|
||
length = toInteger(length);
|
||
|
||
var strLength = length ? stringSize(string) : 0;
|
||
return (length && strLength < length)
|
||
? (string + createPadding(length - strLength, chars))
|
||
: string;
|
||
}
|
||
|
||
/**
|
||
* Pads `string` on the left side if it's shorter than `length`. Padding
|
||
* characters are truncated if they exceed `length`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to pad.
|
||
* @param {number} [length=0] The padding length.
|
||
* @param {string} [chars=' '] The string used as padding.
|
||
* @returns {string} Returns the padded string.
|
||
* @example
|
||
*
|
||
* _.padStart('abc', 6);
|
||
* // => ' abc'
|
||
*
|
||
* _.padStart('abc', 6, '_-');
|
||
* // => '_-_abc'
|
||
*
|
||
* _.padStart('abc', 3);
|
||
* // => 'abc'
|
||
*/
|
||
function padStart(string, length, chars) {
|
||
string = toString(string);
|
||
length = toInteger(length);
|
||
|
||
var strLength = length ? stringSize(string) : 0;
|
||
return (length && strLength < length)
|
||
? (createPadding(length - strLength, chars) + string)
|
||
: string;
|
||
}
|
||
|
||
/**
|
||
* Converts `string` to an integer of the specified radix. If `radix` is
|
||
* `undefined` or `0`, a `radix` of `10` is used unless `value` is a
|
||
* hexadecimal, in which case a `radix` of `16` is used.
|
||
*
|
||
* **Note:** This method aligns with the
|
||
* [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 1.1.0
|
||
* @category String
|
||
* @param {string} string The string to convert.
|
||
* @param {number} [radix=10] The radix to interpret `value` by.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {number} Returns the converted integer.
|
||
* @example
|
||
*
|
||
* _.parseInt('08');
|
||
* // => 8
|
||
*
|
||
* _.map(['6', '08', '10'], _.parseInt);
|
||
* // => [6, 8, 10]
|
||
*/
|
||
function parseInt(string, radix, guard) {
|
||
// Chrome fails to trim leading <BOM> whitespace characters.
|
||
// See https://bugs.chromium.org/p/v8/issues/detail?id=3109 for more details.
|
||
if (guard || radix == null) {
|
||
radix = 0;
|
||
} else if (radix) {
|
||
radix = +radix;
|
||
}
|
||
string = toString(string).replace(reTrim, '');
|
||
return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
|
||
}
|
||
|
||
/**
|
||
* Repeats the given string `n` times.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to repeat.
|
||
* @param {number} [n=1] The number of times to repeat the string.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {string} Returns the repeated string.
|
||
* @example
|
||
*
|
||
* _.repeat('*', 3);
|
||
* // => '***'
|
||
*
|
||
* _.repeat('abc', 2);
|
||
* // => 'abcabc'
|
||
*
|
||
* _.repeat('abc', 0);
|
||
* // => ''
|
||
*/
|
||
function repeat(string, n, guard) {
|
||
if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
|
||
n = 1;
|
||
} else {
|
||
n = toInteger(n);
|
||
}
|
||
return baseRepeat(toString(string), n);
|
||
}
|
||
|
||
/**
|
||
* Replaces matches for `pattern` in `string` with `replacement`.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`String#replace`](https://mdn.io/String/replace).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to modify.
|
||
* @param {RegExp|string} pattern The pattern to replace.
|
||
* @param {Function|string} replacement The match replacement.
|
||
* @returns {string} Returns the modified string.
|
||
* @example
|
||
*
|
||
* _.replace('Hi Fred', 'Fred', 'Barney');
|
||
* // => 'Hi Barney'
|
||
*/
|
||
function replace() {
|
||
var args = arguments,
|
||
string = toString(args[0]);
|
||
|
||
return args.length < 3 ? string : nativeReplace.call(string, args[1], args[2]);
|
||
}
|
||
|
||
/**
|
||
* Converts `string` to
|
||
* [snake case](https://en.wikipedia.org/wiki/Snake_case).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the snake cased string.
|
||
* @example
|
||
*
|
||
* _.snakeCase('Foo Bar');
|
||
* // => 'foo_bar'
|
||
*
|
||
* _.snakeCase('fooBar');
|
||
* // => 'foo_bar'
|
||
*
|
||
* _.snakeCase('--FOO-BAR--');
|
||
* // => 'foo_bar'
|
||
*/
|
||
var snakeCase = createCompounder(function(result, word, index) {
|
||
return result + (index ? '_' : '') + word.toLowerCase();
|
||
});
|
||
|
||
/**
|
||
* Splits `string` by `separator`.
|
||
*
|
||
* **Note:** This method is based on
|
||
* [`String#split`](https://mdn.io/String/split).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to split.
|
||
* @param {RegExp|string} separator The separator pattern to split by.
|
||
* @param {number} [limit] The length to truncate results to.
|
||
* @returns {Array} Returns the string segments.
|
||
* @example
|
||
*
|
||
* _.split('a-b-c', '-', 2);
|
||
* // => ['a', 'b']
|
||
*/
|
||
function split(string, separator, limit) {
|
||
if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
|
||
separator = limit = undefined;
|
||
}
|
||
limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
|
||
if (!limit) {
|
||
return [];
|
||
}
|
||
string = toString(string);
|
||
if (string && (
|
||
typeof separator == 'string' ||
|
||
(separator != null && !isRegExp(separator))
|
||
)) {
|
||
separator = baseToString(separator);
|
||
if (separator == '' && reHasComplexSymbol.test(string)) {
|
||
return castSlice(stringToArray(string), 0, limit);
|
||
}
|
||
}
|
||
return nativeSplit.call(string, separator, limit);
|
||
}
|
||
|
||
/**
|
||
* Converts `string` to
|
||
* [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.1.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the start cased string.
|
||
* @example
|
||
*
|
||
* _.startCase('--foo-bar--');
|
||
* // => 'Foo Bar'
|
||
*
|
||
* _.startCase('fooBar');
|
||
* // => 'Foo Bar'
|
||
*
|
||
* _.startCase('__FOO_BAR__');
|
||
* // => 'FOO BAR'
|
||
*/
|
||
var startCase = createCompounder(function(result, word, index) {
|
||
return result + (index ? ' ' : '') + upperFirst(word);
|
||
});
|
||
|
||
/**
|
||
* Checks if `string` starts with the given target string.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to search.
|
||
* @param {string} [target] The string to search for.
|
||
* @param {number} [position=0] The position to search from.
|
||
* @returns {boolean} Returns `true` if `string` starts with `target`,
|
||
* else `false`.
|
||
* @example
|
||
*
|
||
* _.startsWith('abc', 'a');
|
||
* // => true
|
||
*
|
||
* _.startsWith('abc', 'b');
|
||
* // => false
|
||
*
|
||
* _.startsWith('abc', 'b', 1);
|
||
* // => true
|
||
*/
|
||
function startsWith(string, target, position) {
|
||
string = toString(string);
|
||
position = baseClamp(toInteger(position), 0, string.length);
|
||
target = baseToString(target);
|
||
return string.slice(position, position + target.length) == target;
|
||
}
|
||
|
||
/**
|
||
* Creates a compiled template function that can interpolate data properties
|
||
* in "interpolate" delimiters, HTML-escape interpolated data properties in
|
||
* "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
|
||
* properties may be accessed as free variables in the template. If a setting
|
||
* object is given, it takes precedence over `_.templateSettings` values.
|
||
*
|
||
* **Note:** In the development build `_.template` utilizes
|
||
* [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
|
||
* for easier debugging.
|
||
*
|
||
* For more information on precompiling templates see
|
||
* [lodash's custom builds documentation](https://lodash.com/custom-builds).
|
||
*
|
||
* For more information on Chrome extension sandboxes see
|
||
* [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category String
|
||
* @param {string} [string=''] The template string.
|
||
* @param {Object} [options={}] The options object.
|
||
* @param {RegExp} [options.escape=_.templateSettings.escape]
|
||
* The HTML "escape" delimiter.
|
||
* @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
|
||
* The "evaluate" delimiter.
|
||
* @param {Object} [options.imports=_.templateSettings.imports]
|
||
* An object to import into the template as free variables.
|
||
* @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
|
||
* The "interpolate" delimiter.
|
||
* @param {string} [options.sourceURL='lodash.templateSources[n]']
|
||
* The sourceURL of the compiled template.
|
||
* @param {string} [options.variable='obj']
|
||
* The data object variable name.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Function} Returns the compiled template function.
|
||
* @example
|
||
*
|
||
* // Use the "interpolate" delimiter to create a compiled template.
|
||
* var compiled = _.template('hello <%= user %>!');
|
||
* compiled({ 'user': 'fred' });
|
||
* // => 'hello fred!'
|
||
*
|
||
* // Use the HTML "escape" delimiter to escape data property values.
|
||
* var compiled = _.template('<b><%- value %></b>');
|
||
* compiled({ 'value': '<script>' });
|
||
* // => '<b><script></b>'
|
||
*
|
||
* // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
|
||
* var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
|
||
* compiled({ 'users': ['fred', 'barney'] });
|
||
* // => '<li>fred</li><li>barney</li>'
|
||
*
|
||
* // Use the internal `print` function in "evaluate" delimiters.
|
||
* var compiled = _.template('<% print("hello " + user); %>!');
|
||
* compiled({ 'user': 'barney' });
|
||
* // => 'hello barney!'
|
||
*
|
||
* // Use the ES delimiter as an alternative to the default "interpolate" delimiter.
|
||
* var compiled = _.template('hello ${ user }!');
|
||
* compiled({ 'user': 'pebbles' });
|
||
* // => 'hello pebbles!'
|
||
*
|
||
* // Use backslashes to treat delimiters as plain text.
|
||
* var compiled = _.template('<%= "\\<%- value %\\>" %>');
|
||
* compiled({ 'value': 'ignored' });
|
||
* // => '<%- value %>'
|
||
*
|
||
* // Use the `imports` option to import `jQuery` as `jq`.
|
||
* var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
|
||
* var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
|
||
* compiled({ 'users': ['fred', 'barney'] });
|
||
* // => '<li>fred</li><li>barney</li>'
|
||
*
|
||
* // Use the `sourceURL` option to specify a custom sourceURL for the template.
|
||
* var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
|
||
* compiled(data);
|
||
* // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
|
||
*
|
||
* // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
|
||
* var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
|
||
* compiled.source;
|
||
* // => function(data) {
|
||
* // var __t, __p = '';
|
||
* // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
|
||
* // return __p;
|
||
* // }
|
||
*
|
||
* // Use custom template delimiters.
|
||
* _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
|
||
* var compiled = _.template('hello {{ user }}!');
|
||
* compiled({ 'user': 'mustache' });
|
||
* // => 'hello mustache!'
|
||
*
|
||
* // Use the `source` property to inline compiled templates for meaningful
|
||
* // line numbers in error messages and stack traces.
|
||
* fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
|
||
* var JST = {\
|
||
* "main": ' + _.template(mainText).source + '\
|
||
* };\
|
||
* ');
|
||
*/
|
||
function template(string, options, guard) {
|
||
// Based on John Resig's `tmpl` implementation
|
||
// (http://ejohn.org/blog/javascript-micro-templating/)
|
||
// and Laura Doktorova's doT.js (https://github.com/olado/doT).
|
||
var settings = lodash.templateSettings;
|
||
|
||
if (guard && isIterateeCall(string, options, guard)) {
|
||
options = undefined;
|
||
}
|
||
string = toString(string);
|
||
options = assignInWith({}, options, settings, assignInDefaults);
|
||
|
||
var imports = assignInWith({}, options.imports, settings.imports, assignInDefaults),
|
||
importsKeys = keys(imports),
|
||
importsValues = baseValues(imports, importsKeys);
|
||
|
||
var isEscaping,
|
||
isEvaluating,
|
||
index = 0,
|
||
interpolate = options.interpolate || reNoMatch,
|
||
source = "__p += '";
|
||
|
||
// Compile the regexp to match each delimiter.
|
||
var reDelimiters = RegExp(
|
||
(options.escape || reNoMatch).source + '|' +
|
||
interpolate.source + '|' +
|
||
(interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
|
||
(options.evaluate || reNoMatch).source + '|$'
|
||
, 'g');
|
||
|
||
// Use a sourceURL for easier debugging.
|
||
var sourceURL = '//# sourceURL=' +
|
||
('sourceURL' in options
|
||
? options.sourceURL
|
||
: ('lodash.templateSources[' + (++templateCounter) + ']')
|
||
) + '\n';
|
||
|
||
string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
|
||
interpolateValue || (interpolateValue = esTemplateValue);
|
||
|
||
// Escape characters that can't be included in string literals.
|
||
source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
|
||
|
||
// Replace delimiters with snippets.
|
||
if (escapeValue) {
|
||
isEscaping = true;
|
||
source += "' +\n__e(" + escapeValue + ") +\n'";
|
||
}
|
||
if (evaluateValue) {
|
||
isEvaluating = true;
|
||
source += "';\n" + evaluateValue + ";\n__p += '";
|
||
}
|
||
if (interpolateValue) {
|
||
source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
|
||
}
|
||
index = offset + match.length;
|
||
|
||
// The JS engine embedded in Adobe products needs `match` returned in
|
||
// order to produce the correct `offset` value.
|
||
return match;
|
||
});
|
||
|
||
source += "';\n";
|
||
|
||
// If `variable` is not specified wrap a with-statement around the generated
|
||
// code to add the data object to the top of the scope chain.
|
||
var variable = options.variable;
|
||
if (!variable) {
|
||
source = 'with (obj) {\n' + source + '\n}\n';
|
||
}
|
||
// Cleanup code by stripping empty strings.
|
||
source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
|
||
.replace(reEmptyStringMiddle, '$1')
|
||
.replace(reEmptyStringTrailing, '$1;');
|
||
|
||
// Frame code as the function body.
|
||
source = 'function(' + (variable || 'obj') + ') {\n' +
|
||
(variable
|
||
? ''
|
||
: 'obj || (obj = {});\n'
|
||
) +
|
||
"var __t, __p = ''" +
|
||
(isEscaping
|
||
? ', __e = _.escape'
|
||
: ''
|
||
) +
|
||
(isEvaluating
|
||
? ', __j = Array.prototype.join;\n' +
|
||
"function print() { __p += __j.call(arguments, '') }\n"
|
||
: ';\n'
|
||
) +
|
||
source +
|
||
'return __p\n}';
|
||
|
||
var result = attempt(function() {
|
||
return Function(importsKeys, sourceURL + 'return ' + source)
|
||
.apply(undefined, importsValues);
|
||
});
|
||
|
||
// Provide the compiled function's source by its `toString` method or
|
||
// the `source` property as a convenience for inlining compiled templates.
|
||
result.source = source;
|
||
if (isError(result)) {
|
||
throw result;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `string`, as a whole, to lower case just like
|
||
* [String#toLowerCase](https://mdn.io/toLowerCase).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the lower cased string.
|
||
* @example
|
||
*
|
||
* _.toLower('--Foo-Bar--');
|
||
* // => '--foo-bar--'
|
||
*
|
||
* _.toLower('fooBar');
|
||
* // => 'foobar'
|
||
*
|
||
* _.toLower('__FOO_BAR__');
|
||
* // => '__foo_bar__'
|
||
*/
|
||
function toLower(value) {
|
||
return toString(value).toLowerCase();
|
||
}
|
||
|
||
/**
|
||
* Converts `string`, as a whole, to upper case just like
|
||
* [String#toUpperCase](https://mdn.io/toUpperCase).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the upper cased string.
|
||
* @example
|
||
*
|
||
* _.toUpper('--foo-bar--');
|
||
* // => '--FOO-BAR--'
|
||
*
|
||
* _.toUpper('fooBar');
|
||
* // => 'FOOBAR'
|
||
*
|
||
* _.toUpper('__foo_bar__');
|
||
* // => '__FOO_BAR__'
|
||
*/
|
||
function toUpper(value) {
|
||
return toString(value).toUpperCase();
|
||
}
|
||
|
||
/**
|
||
* Removes leading and trailing whitespace or specified characters from `string`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to trim.
|
||
* @param {string} [chars=whitespace] The characters to trim.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {string} Returns the trimmed string.
|
||
* @example
|
||
*
|
||
* _.trim(' abc ');
|
||
* // => 'abc'
|
||
*
|
||
* _.trim('-_-abc-_-', '_-');
|
||
* // => 'abc'
|
||
*
|
||
* _.map([' foo ', ' bar '], _.trim);
|
||
* // => ['foo', 'bar']
|
||
*/
|
||
function trim(string, chars, guard) {
|
||
string = toString(string);
|
||
if (string && (guard || chars === undefined)) {
|
||
return string.replace(reTrim, '');
|
||
}
|
||
if (!string || !(chars = baseToString(chars))) {
|
||
return string;
|
||
}
|
||
var strSymbols = stringToArray(string),
|
||
chrSymbols = stringToArray(chars),
|
||
start = charsStartIndex(strSymbols, chrSymbols),
|
||
end = charsEndIndex(strSymbols, chrSymbols) + 1;
|
||
|
||
return castSlice(strSymbols, start, end).join('');
|
||
}
|
||
|
||
/**
|
||
* Removes trailing whitespace or specified characters from `string`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to trim.
|
||
* @param {string} [chars=whitespace] The characters to trim.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {string} Returns the trimmed string.
|
||
* @example
|
||
*
|
||
* _.trimEnd(' abc ');
|
||
* // => ' abc'
|
||
*
|
||
* _.trimEnd('-_-abc-_-', '_-');
|
||
* // => '-_-abc'
|
||
*/
|
||
function trimEnd(string, chars, guard) {
|
||
string = toString(string);
|
||
if (string && (guard || chars === undefined)) {
|
||
return string.replace(reTrimEnd, '');
|
||
}
|
||
if (!string || !(chars = baseToString(chars))) {
|
||
return string;
|
||
}
|
||
var strSymbols = stringToArray(string),
|
||
end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
|
||
|
||
return castSlice(strSymbols, 0, end).join('');
|
||
}
|
||
|
||
/**
|
||
* Removes leading whitespace or specified characters from `string`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to trim.
|
||
* @param {string} [chars=whitespace] The characters to trim.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {string} Returns the trimmed string.
|
||
* @example
|
||
*
|
||
* _.trimStart(' abc ');
|
||
* // => 'abc '
|
||
*
|
||
* _.trimStart('-_-abc-_-', '_-');
|
||
* // => 'abc-_-'
|
||
*/
|
||
function trimStart(string, chars, guard) {
|
||
string = toString(string);
|
||
if (string && (guard || chars === undefined)) {
|
||
return string.replace(reTrimStart, '');
|
||
}
|
||
if (!string || !(chars = baseToString(chars))) {
|
||
return string;
|
||
}
|
||
var strSymbols = stringToArray(string),
|
||
start = charsStartIndex(strSymbols, stringToArray(chars));
|
||
|
||
return castSlice(strSymbols, start).join('');
|
||
}
|
||
|
||
/**
|
||
* Truncates `string` if it's longer than the given maximum string length.
|
||
* The last characters of the truncated string are replaced with the omission
|
||
* string which defaults to "...".
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to truncate.
|
||
* @param {Object} [options={}] The options object.
|
||
* @param {number} [options.length=30] The maximum string length.
|
||
* @param {string} [options.omission='...'] The string to indicate text is omitted.
|
||
* @param {RegExp|string} [options.separator] The separator pattern to truncate to.
|
||
* @returns {string} Returns the truncated string.
|
||
* @example
|
||
*
|
||
* _.truncate('hi-diddly-ho there, neighborino');
|
||
* // => 'hi-diddly-ho there, neighbo...'
|
||
*
|
||
* _.truncate('hi-diddly-ho there, neighborino', {
|
||
* 'length': 24,
|
||
* 'separator': ' '
|
||
* });
|
||
* // => 'hi-diddly-ho there,...'
|
||
*
|
||
* _.truncate('hi-diddly-ho there, neighborino', {
|
||
* 'length': 24,
|
||
* 'separator': /,? +/
|
||
* });
|
||
* // => 'hi-diddly-ho there...'
|
||
*
|
||
* _.truncate('hi-diddly-ho there, neighborino', {
|
||
* 'omission': ' [...]'
|
||
* });
|
||
* // => 'hi-diddly-ho there, neig [...]'
|
||
*/
|
||
function truncate(string, options) {
|
||
var length = DEFAULT_TRUNC_LENGTH,
|
||
omission = DEFAULT_TRUNC_OMISSION;
|
||
|
||
if (isObject(options)) {
|
||
var separator = 'separator' in options ? options.separator : separator;
|
||
length = 'length' in options ? toInteger(options.length) : length;
|
||
omission = 'omission' in options ? baseToString(options.omission) : omission;
|
||
}
|
||
string = toString(string);
|
||
|
||
var strLength = string.length;
|
||
if (reHasComplexSymbol.test(string)) {
|
||
var strSymbols = stringToArray(string);
|
||
strLength = strSymbols.length;
|
||
}
|
||
if (length >= strLength) {
|
||
return string;
|
||
}
|
||
var end = length - stringSize(omission);
|
||
if (end < 1) {
|
||
return omission;
|
||
}
|
||
var result = strSymbols
|
||
? castSlice(strSymbols, 0, end).join('')
|
||
: string.slice(0, end);
|
||
|
||
if (separator === undefined) {
|
||
return result + omission;
|
||
}
|
||
if (strSymbols) {
|
||
end += (result.length - end);
|
||
}
|
||
if (isRegExp(separator)) {
|
||
if (string.slice(end).search(separator)) {
|
||
var match,
|
||
substring = result;
|
||
|
||
if (!separator.global) {
|
||
separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
|
||
}
|
||
separator.lastIndex = 0;
|
||
while ((match = separator.exec(substring))) {
|
||
var newEnd = match.index;
|
||
}
|
||
result = result.slice(0, newEnd === undefined ? end : newEnd);
|
||
}
|
||
} else if (string.indexOf(baseToString(separator), end) != end) {
|
||
var index = result.lastIndexOf(separator);
|
||
if (index > -1) {
|
||
result = result.slice(0, index);
|
||
}
|
||
}
|
||
return result + omission;
|
||
}
|
||
|
||
/**
|
||
* The inverse of `_.escape`; this method converts the HTML entities
|
||
* `&`, `<`, `>`, `"`, `'`, and ``` in `string` to
|
||
* their corresponding characters.
|
||
*
|
||
* **Note:** No other HTML entities are unescaped. To unescape additional
|
||
* HTML entities use a third-party library like [_he_](https://mths.be/he).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 0.6.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to unescape.
|
||
* @returns {string} Returns the unescaped string.
|
||
* @example
|
||
*
|
||
* _.unescape('fred, barney, & pebbles');
|
||
* // => 'fred, barney, & pebbles'
|
||
*/
|
||
function unescape(string) {
|
||
string = toString(string);
|
||
return (string && reHasEscapedHtml.test(string))
|
||
? string.replace(reEscapedHtml, unescapeHtmlChar)
|
||
: string;
|
||
}
|
||
|
||
/**
|
||
* Converts `string`, as space separated words, to upper case.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the upper cased string.
|
||
* @example
|
||
*
|
||
* _.upperCase('--foo-bar');
|
||
* // => 'FOO BAR'
|
||
*
|
||
* _.upperCase('fooBar');
|
||
* // => 'FOO BAR'
|
||
*
|
||
* _.upperCase('__foo_bar__');
|
||
* // => 'FOO BAR'
|
||
*/
|
||
var upperCase = createCompounder(function(result, word, index) {
|
||
return result + (index ? ' ' : '') + word.toUpperCase();
|
||
});
|
||
|
||
/**
|
||
* Converts the first character of `string` to upper case.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to convert.
|
||
* @returns {string} Returns the converted string.
|
||
* @example
|
||
*
|
||
* _.upperFirst('fred');
|
||
* // => 'Fred'
|
||
*
|
||
* _.upperFirst('FRED');
|
||
* // => 'FRED'
|
||
*/
|
||
var upperFirst = createCaseFirst('toUpperCase');
|
||
|
||
/**
|
||
* Splits `string` into an array of its words.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category String
|
||
* @param {string} [string=''] The string to inspect.
|
||
* @param {RegExp|string} [pattern] The pattern to match words.
|
||
* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
|
||
* @returns {Array} Returns the words of `string`.
|
||
* @example
|
||
*
|
||
* _.words('fred, barney, & pebbles');
|
||
* // => ['fred', 'barney', 'pebbles']
|
||
*
|
||
* _.words('fred, barney, & pebbles', /[^, ]+/g);
|
||
* // => ['fred', 'barney', '&', 'pebbles']
|
||
*/
|
||
function words(string, pattern, guard) {
|
||
string = toString(string);
|
||
pattern = guard ? undefined : pattern;
|
||
|
||
if (pattern === undefined) {
|
||
pattern = reHasComplexWord.test(string) ? reComplexWord : reBasicWord;
|
||
}
|
||
return string.match(pattern) || [];
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Attempts to invoke `func`, returning either the result or the caught error
|
||
* object. Any additional arguments are provided to `func` when it's invoked.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Util
|
||
* @param {Function} func The function to attempt.
|
||
* @param {...*} [args] The arguments to invoke `func` with.
|
||
* @returns {*} Returns the `func` result or error object.
|
||
* @example
|
||
*
|
||
* // Avoid throwing errors for invalid selectors.
|
||
* var elements = _.attempt(function(selector) {
|
||
* return document.querySelectorAll(selector);
|
||
* }, '>_>');
|
||
*
|
||
* if (_.isError(elements)) {
|
||
* elements = [];
|
||
* }
|
||
*/
|
||
var attempt = baseRest(function(func, args) {
|
||
try {
|
||
return apply(func, undefined, args);
|
||
} catch (e) {
|
||
return isError(e) ? e : new Error(e);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Binds methods of an object to the object itself, overwriting the existing
|
||
* method.
|
||
*
|
||
* **Note:** This method doesn't set the "length" property of bound functions.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {Object} object The object to bind and assign the bound methods to.
|
||
* @param {...(string|string[])} methodNames The object method names to bind.
|
||
* @returns {Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* var view = {
|
||
* 'label': 'docs',
|
||
* 'click': function() {
|
||
* console.log('clicked ' + this.label);
|
||
* }
|
||
* };
|
||
*
|
||
* _.bindAll(view, ['click']);
|
||
* jQuery(element).on('click', view.click);
|
||
* // => Logs 'clicked docs' when clicked.
|
||
*/
|
||
var bindAll = baseRest(function(object, methodNames) {
|
||
arrayEach(baseFlatten(methodNames, 1), function(key) {
|
||
key = toKey(key);
|
||
object[key] = bind(object[key], object);
|
||
});
|
||
return object;
|
||
});
|
||
|
||
/**
|
||
* Creates a function that iterates over `pairs` and invokes the corresponding
|
||
* function of the first predicate to return truthy. The predicate-function
|
||
* pairs are invoked with the `this` binding and arguments of the created
|
||
* function.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {Array} pairs The predicate-function pairs.
|
||
* @returns {Function} Returns the new composite function.
|
||
* @example
|
||
*
|
||
* var func = _.cond([
|
||
* [_.matches({ 'a': 1 }), _.constant('matches A')],
|
||
* [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
|
||
* [_.stubTrue, _.constant('no match')]
|
||
* ]);
|
||
*
|
||
* func({ 'a': 1, 'b': 2 });
|
||
* // => 'matches A'
|
||
*
|
||
* func({ 'a': 0, 'b': 1 });
|
||
* // => 'matches B'
|
||
*
|
||
* func({ 'a': '1', 'b': '2' });
|
||
* // => 'no match'
|
||
*/
|
||
function cond(pairs) {
|
||
var length = pairs ? pairs.length : 0,
|
||
toIteratee = getIteratee();
|
||
|
||
pairs = !length ? [] : arrayMap(pairs, function(pair) {
|
||
if (typeof pair[1] != 'function') {
|
||
throw new TypeError(FUNC_ERROR_TEXT);
|
||
}
|
||
return [toIteratee(pair[0]), pair[1]];
|
||
});
|
||
|
||
return baseRest(function(args) {
|
||
var index = -1;
|
||
while (++index < length) {
|
||
var pair = pairs[index];
|
||
if (apply(pair[0], this, args)) {
|
||
return apply(pair[1], this, args);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes the predicate properties of `source` with
|
||
* the corresponding property values of a given object, returning `true` if
|
||
* all predicates return truthy, else `false`.
|
||
*
|
||
* **Note:** The created function is equivalent to `_.conformsTo` with
|
||
* `source` partially applied.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {Object} source The object of property predicates to conform to.
|
||
* @returns {Function} Returns the new spec function.
|
||
* @example
|
||
*
|
||
* var objects = [
|
||
* { 'a': 2, 'b': 1 },
|
||
* { 'a': 1, 'b': 2 }
|
||
* ];
|
||
*
|
||
* _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
|
||
* // => [{ 'a': 1, 'b': 2 }]
|
||
*/
|
||
function conforms(source) {
|
||
return baseConforms(baseClone(source, true));
|
||
}
|
||
|
||
/**
|
||
* Creates a function that returns `value`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.4.0
|
||
* @category Util
|
||
* @param {*} value The value to return from the new function.
|
||
* @returns {Function} Returns the new constant function.
|
||
* @example
|
||
*
|
||
* var objects = _.times(2, _.constant({ 'a': 1 }));
|
||
*
|
||
* console.log(objects);
|
||
* // => [{ 'a': 1 }, { 'a': 1 }]
|
||
*
|
||
* console.log(objects[0] === objects[1]);
|
||
* // => true
|
||
*/
|
||
function constant(value) {
|
||
return function() {
|
||
return value;
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Checks `value` to determine whether a default value should be returned in
|
||
* its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
|
||
* or `undefined`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.14.0
|
||
* @category Util
|
||
* @param {*} value The value to check.
|
||
* @param {*} defaultValue The default value.
|
||
* @returns {*} Returns the resolved value.
|
||
* @example
|
||
*
|
||
* _.defaultTo(1, 10);
|
||
* // => 1
|
||
*
|
||
* _.defaultTo(undefined, 10);
|
||
* // => 10
|
||
*/
|
||
function defaultTo(value, defaultValue) {
|
||
return (value == null || value !== value) ? defaultValue : value;
|
||
}
|
||
|
||
/**
|
||
* Creates a function that returns the result of invoking the given functions
|
||
* with the `this` binding of the created function, where each successive
|
||
* invocation is supplied the return value of the previous.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Util
|
||
* @param {...(Function|Function[])} [funcs] The functions to invoke.
|
||
* @returns {Function} Returns the new composite function.
|
||
* @see _.flowRight
|
||
* @example
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* var addSquare = _.flow([_.add, square]);
|
||
* addSquare(1, 2);
|
||
* // => 9
|
||
*/
|
||
var flow = createFlow();
|
||
|
||
/**
|
||
* This method is like `_.flow` except that it creates a function that
|
||
* invokes the given functions from right to left.
|
||
*
|
||
* @static
|
||
* @since 3.0.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {...(Function|Function[])} [funcs] The functions to invoke.
|
||
* @returns {Function} Returns the new composite function.
|
||
* @see _.flow
|
||
* @example
|
||
*
|
||
* function square(n) {
|
||
* return n * n;
|
||
* }
|
||
*
|
||
* var addSquare = _.flowRight([square, _.add]);
|
||
* addSquare(1, 2);
|
||
* // => 9
|
||
*/
|
||
var flowRight = createFlow(true);
|
||
|
||
/**
|
||
* This method returns the first argument it receives.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {*} value Any value.
|
||
* @returns {*} Returns `value`.
|
||
* @example
|
||
*
|
||
* var object = { 'a': 1 };
|
||
*
|
||
* console.log(_.identity(object) === object);
|
||
* // => true
|
||
*/
|
||
function identity(value) {
|
||
return value;
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `func` with the arguments of the created
|
||
* function. If `func` is a property name, the created function returns the
|
||
* property value for a given element. If `func` is an array or object, the
|
||
* created function returns `true` for elements that contain the equivalent
|
||
* source properties, otherwise it returns `false`.
|
||
*
|
||
* @static
|
||
* @since 4.0.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {*} [func=_.identity] The value to convert to a callback.
|
||
* @returns {Function} Returns the callback.
|
||
* @example
|
||
*
|
||
* var users = [
|
||
* { 'user': 'barney', 'age': 36, 'active': true },
|
||
* { 'user': 'fred', 'age': 40, 'active': false }
|
||
* ];
|
||
*
|
||
* // The `_.matches` iteratee shorthand.
|
||
* _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
|
||
* // => [{ 'user': 'barney', 'age': 36, 'active': true }]
|
||
*
|
||
* // The `_.matchesProperty` iteratee shorthand.
|
||
* _.filter(users, _.iteratee(['user', 'fred']));
|
||
* // => [{ 'user': 'fred', 'age': 40 }]
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.map(users, _.iteratee('user'));
|
||
* // => ['barney', 'fred']
|
||
*
|
||
* // Create custom iteratee shorthands.
|
||
* _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
|
||
* return !_.isRegExp(func) ? iteratee(func) : function(string) {
|
||
* return func.test(string);
|
||
* };
|
||
* });
|
||
*
|
||
* _.filter(['abc', 'def'], /ef/);
|
||
* // => ['def']
|
||
*/
|
||
function iteratee(func) {
|
||
return baseIteratee(typeof func == 'function' ? func : baseClone(func, true));
|
||
}
|
||
|
||
/**
|
||
* Creates a function that performs a partial deep comparison between a given
|
||
* object and `source`, returning `true` if the given object has equivalent
|
||
* property values, else `false`.
|
||
*
|
||
* **Note:** The created function supports comparing the same values as
|
||
* `_.isEqual` is equivalent to `_.isMatch` with `source` partially applied.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Util
|
||
* @param {Object} source The object of property values to match.
|
||
* @returns {Function} Returns the new spec function.
|
||
* @example
|
||
*
|
||
* var objects = [
|
||
* { 'a': 1, 'b': 2, 'c': 3 },
|
||
* { 'a': 4, 'b': 5, 'c': 6 }
|
||
* ];
|
||
*
|
||
* _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
|
||
* // => [{ 'a': 4, 'b': 5, 'c': 6 }]
|
||
*/
|
||
function matches(source) {
|
||
return baseMatches(baseClone(source, true));
|
||
}
|
||
|
||
/**
|
||
* Creates a function that performs a partial deep comparison between the
|
||
* value at `path` of a given object to `srcValue`, returning `true` if the
|
||
* object value is equivalent, else `false`.
|
||
*
|
||
* **Note:** This method supports comparing the same values as `_.isEqual`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.2.0
|
||
* @category Util
|
||
* @param {Array|string} path The path of the property to get.
|
||
* @param {*} srcValue The value to match.
|
||
* @returns {Function} Returns the new spec function.
|
||
* @example
|
||
*
|
||
* var objects = [
|
||
* { 'a': 1, 'b': 2, 'c': 3 },
|
||
* { 'a': 4, 'b': 5, 'c': 6 }
|
||
* ];
|
||
*
|
||
* _.find(objects, _.matchesProperty('a', 4));
|
||
* // => { 'a': 4, 'b': 5, 'c': 6 }
|
||
*/
|
||
function matchesProperty(path, srcValue) {
|
||
return baseMatchesProperty(path, baseClone(srcValue, true));
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes the method at `path` of a given object.
|
||
* Any additional arguments are provided to the invoked method.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.7.0
|
||
* @category Util
|
||
* @param {Array|string} path The path of the method to invoke.
|
||
* @param {...*} [args] The arguments to invoke the method with.
|
||
* @returns {Function} Returns the new invoker function.
|
||
* @example
|
||
*
|
||
* var objects = [
|
||
* { 'a': { 'b': _.constant(2) } },
|
||
* { 'a': { 'b': _.constant(1) } }
|
||
* ];
|
||
*
|
||
* _.map(objects, _.method('a.b'));
|
||
* // => [2, 1]
|
||
*
|
||
* _.map(objects, _.method(['a', 'b']));
|
||
* // => [2, 1]
|
||
*/
|
||
var method = baseRest(function(path, args) {
|
||
return function(object) {
|
||
return baseInvoke(object, path, args);
|
||
};
|
||
});
|
||
|
||
/**
|
||
* The opposite of `_.method`; this method creates a function that invokes
|
||
* the method at a given path of `object`. Any additional arguments are
|
||
* provided to the invoked method.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.7.0
|
||
* @category Util
|
||
* @param {Object} object The object to query.
|
||
* @param {...*} [args] The arguments to invoke the method with.
|
||
* @returns {Function} Returns the new invoker function.
|
||
* @example
|
||
*
|
||
* var array = _.times(3, _.constant),
|
||
* object = { 'a': array, 'b': array, 'c': array };
|
||
*
|
||
* _.map(['a[2]', 'c[0]'], _.methodOf(object));
|
||
* // => [2, 0]
|
||
*
|
||
* _.map([['a', '2'], ['c', '0']], _.methodOf(object));
|
||
* // => [2, 0]
|
||
*/
|
||
var methodOf = baseRest(function(object, args) {
|
||
return function(path) {
|
||
return baseInvoke(object, path, args);
|
||
};
|
||
});
|
||
|
||
/**
|
||
* Adds all own enumerable string keyed function properties of a source
|
||
* object to the destination object. If `object` is a function, then methods
|
||
* are added to its prototype as well.
|
||
*
|
||
* **Note:** Use `_.runInContext` to create a pristine `lodash` function to
|
||
* avoid conflicts caused by modifying the original.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {Function|Object} [object=lodash] The destination object.
|
||
* @param {Object} source The object of functions to add.
|
||
* @param {Object} [options={}] The options object.
|
||
* @param {boolean} [options.chain=true] Specify whether mixins are chainable.
|
||
* @returns {Function|Object} Returns `object`.
|
||
* @example
|
||
*
|
||
* function vowels(string) {
|
||
* return _.filter(string, function(v) {
|
||
* return /[aeiou]/i.test(v);
|
||
* });
|
||
* }
|
||
*
|
||
* _.mixin({ 'vowels': vowels });
|
||
* _.vowels('fred');
|
||
* // => ['e']
|
||
*
|
||
* _('fred').vowels().value();
|
||
* // => ['e']
|
||
*
|
||
* _.mixin({ 'vowels': vowels }, { 'chain': false });
|
||
* _('fred').vowels();
|
||
* // => ['e']
|
||
*/
|
||
function mixin(object, source, options) {
|
||
var props = keys(source),
|
||
methodNames = baseFunctions(source, props);
|
||
|
||
if (options == null &&
|
||
!(isObject(source) && (methodNames.length || !props.length))) {
|
||
options = source;
|
||
source = object;
|
||
object = this;
|
||
methodNames = baseFunctions(source, keys(source));
|
||
}
|
||
var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
|
||
isFunc = isFunction(object);
|
||
|
||
arrayEach(methodNames, function(methodName) {
|
||
var func = source[methodName];
|
||
object[methodName] = func;
|
||
if (isFunc) {
|
||
object.prototype[methodName] = function() {
|
||
var chainAll = this.__chain__;
|
||
if (chain || chainAll) {
|
||
var result = object(this.__wrapped__),
|
||
actions = result.__actions__ = copyArray(this.__actions__);
|
||
|
||
actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
|
||
result.__chain__ = chainAll;
|
||
return result;
|
||
}
|
||
return func.apply(object, arrayPush([this.value()], arguments));
|
||
};
|
||
}
|
||
});
|
||
|
||
return object;
|
||
}
|
||
|
||
/**
|
||
* Reverts the `_` variable to its previous value and returns a reference to
|
||
* the `lodash` function.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @returns {Function} Returns the `lodash` function.
|
||
* @example
|
||
*
|
||
* var lodash = _.noConflict();
|
||
*/
|
||
function noConflict() {
|
||
if (root._ === this) {
|
||
root._ = oldDash;
|
||
}
|
||
return this;
|
||
}
|
||
|
||
/**
|
||
* This method returns `undefined`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.3.0
|
||
* @category Util
|
||
* @example
|
||
*
|
||
* _.times(2, _.noop);
|
||
* // => [undefined, undefined]
|
||
*/
|
||
function noop() {
|
||
// No operation performed.
|
||
}
|
||
|
||
/**
|
||
* Creates a function that gets the argument at index `n`. If `n` is negative,
|
||
* the nth argument from the end is returned.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {number} [n=0] The index of the argument to return.
|
||
* @returns {Function} Returns the new pass-thru function.
|
||
* @example
|
||
*
|
||
* var func = _.nthArg(1);
|
||
* func('a', 'b', 'c', 'd');
|
||
* // => 'b'
|
||
*
|
||
* var func = _.nthArg(-2);
|
||
* func('a', 'b', 'c', 'd');
|
||
* // => 'c'
|
||
*/
|
||
function nthArg(n) {
|
||
n = toInteger(n);
|
||
return baseRest(function(args) {
|
||
return baseNth(args, n);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Creates a function that invokes `iteratees` with the arguments it receives
|
||
* and returns their results.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {...(Function|Function[])} [iteratees=[_.identity]]
|
||
* The iteratees to invoke.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var func = _.over([Math.max, Math.min]);
|
||
*
|
||
* func(1, 2, 3, 4);
|
||
* // => [4, 1]
|
||
*/
|
||
var over = createOver(arrayMap);
|
||
|
||
/**
|
||
* Creates a function that checks if **all** of the `predicates` return
|
||
* truthy when invoked with the arguments it receives.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {...(Function|Function[])} [predicates=[_.identity]]
|
||
* The predicates to check.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var func = _.overEvery([Boolean, isFinite]);
|
||
*
|
||
* func('1');
|
||
* // => true
|
||
*
|
||
* func(null);
|
||
* // => false
|
||
*
|
||
* func(NaN);
|
||
* // => false
|
||
*/
|
||
var overEvery = createOver(arrayEvery);
|
||
|
||
/**
|
||
* Creates a function that checks if **any** of the `predicates` return
|
||
* truthy when invoked with the arguments it receives.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {...(Function|Function[])} [predicates=[_.identity]]
|
||
* The predicates to check.
|
||
* @returns {Function} Returns the new function.
|
||
* @example
|
||
*
|
||
* var func = _.overSome([Boolean, isFinite]);
|
||
*
|
||
* func('1');
|
||
* // => true
|
||
*
|
||
* func(null);
|
||
* // => true
|
||
*
|
||
* func(NaN);
|
||
* // => false
|
||
*/
|
||
var overSome = createOver(arraySome);
|
||
|
||
/**
|
||
* Creates a function that returns the value at `path` of a given object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 2.4.0
|
||
* @category Util
|
||
* @param {Array|string} path The path of the property to get.
|
||
* @returns {Function} Returns the new accessor function.
|
||
* @example
|
||
*
|
||
* var objects = [
|
||
* { 'a': { 'b': 2 } },
|
||
* { 'a': { 'b': 1 } }
|
||
* ];
|
||
*
|
||
* _.map(objects, _.property('a.b'));
|
||
* // => [2, 1]
|
||
*
|
||
* _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
|
||
* // => [1, 2]
|
||
*/
|
||
function property(path) {
|
||
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
|
||
}
|
||
|
||
/**
|
||
* The opposite of `_.property`; this method creates a function that returns
|
||
* the value at a given path of `object`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.0.0
|
||
* @category Util
|
||
* @param {Object} object The object to query.
|
||
* @returns {Function} Returns the new accessor function.
|
||
* @example
|
||
*
|
||
* var array = [0, 1, 2],
|
||
* object = { 'a': array, 'b': array, 'c': array };
|
||
*
|
||
* _.map(['a[2]', 'c[0]'], _.propertyOf(object));
|
||
* // => [2, 0]
|
||
*
|
||
* _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
|
||
* // => [2, 0]
|
||
*/
|
||
function propertyOf(object) {
|
||
return function(path) {
|
||
return object == null ? undefined : baseGet(object, path);
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Creates an array of numbers (positive and/or negative) progressing from
|
||
* `start` up to, but not including, `end`. A step of `-1` is used if a negative
|
||
* `start` is specified without an `end` or `step`. If `end` is not specified,
|
||
* it's set to `start` with `start` then set to `0`.
|
||
*
|
||
* **Note:** JavaScript follows the IEEE-754 standard for resolving
|
||
* floating-point values which can produce unexpected results.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {number} [start=0] The start of the range.
|
||
* @param {number} end The end of the range.
|
||
* @param {number} [step=1] The value to increment or decrement by.
|
||
* @returns {Array} Returns the range of numbers.
|
||
* @see _.inRange, _.rangeRight
|
||
* @example
|
||
*
|
||
* _.range(4);
|
||
* // => [0, 1, 2, 3]
|
||
*
|
||
* _.range(-4);
|
||
* // => [0, -1, -2, -3]
|
||
*
|
||
* _.range(1, 5);
|
||
* // => [1, 2, 3, 4]
|
||
*
|
||
* _.range(0, 20, 5);
|
||
* // => [0, 5, 10, 15]
|
||
*
|
||
* _.range(0, -4, -1);
|
||
* // => [0, -1, -2, -3]
|
||
*
|
||
* _.range(1, 4, 0);
|
||
* // => [1, 1, 1]
|
||
*
|
||
* _.range(0);
|
||
* // => []
|
||
*/
|
||
var range = createRange();
|
||
|
||
/**
|
||
* This method is like `_.range` except that it populates values in
|
||
* descending order.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {number} [start=0] The start of the range.
|
||
* @param {number} end The end of the range.
|
||
* @param {number} [step=1] The value to increment or decrement by.
|
||
* @returns {Array} Returns the range of numbers.
|
||
* @see _.inRange, _.range
|
||
* @example
|
||
*
|
||
* _.rangeRight(4);
|
||
* // => [3, 2, 1, 0]
|
||
*
|
||
* _.rangeRight(-4);
|
||
* // => [-3, -2, -1, 0]
|
||
*
|
||
* _.rangeRight(1, 5);
|
||
* // => [4, 3, 2, 1]
|
||
*
|
||
* _.rangeRight(0, 20, 5);
|
||
* // => [15, 10, 5, 0]
|
||
*
|
||
* _.rangeRight(0, -4, -1);
|
||
* // => [-3, -2, -1, 0]
|
||
*
|
||
* _.rangeRight(1, 4, 0);
|
||
* // => [1, 1, 1]
|
||
*
|
||
* _.rangeRight(0);
|
||
* // => []
|
||
*/
|
||
var rangeRight = createRange(true);
|
||
|
||
/**
|
||
* This method returns a new empty array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.13.0
|
||
* @category Util
|
||
* @returns {Array} Returns the new empty array.
|
||
* @example
|
||
*
|
||
* var arrays = _.times(2, _.stubArray);
|
||
*
|
||
* console.log(arrays);
|
||
* // => [[], []]
|
||
*
|
||
* console.log(arrays[0] === arrays[1]);
|
||
* // => false
|
||
*/
|
||
function stubArray() {
|
||
return [];
|
||
}
|
||
|
||
/**
|
||
* This method returns `false`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.13.0
|
||
* @category Util
|
||
* @returns {boolean} Returns `false`.
|
||
* @example
|
||
*
|
||
* _.times(2, _.stubFalse);
|
||
* // => [false, false]
|
||
*/
|
||
function stubFalse() {
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* This method returns a new empty object.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.13.0
|
||
* @category Util
|
||
* @returns {Object} Returns the new empty object.
|
||
* @example
|
||
*
|
||
* var objects = _.times(2, _.stubObject);
|
||
*
|
||
* console.log(objects);
|
||
* // => [{}, {}]
|
||
*
|
||
* console.log(objects[0] === objects[1]);
|
||
* // => false
|
||
*/
|
||
function stubObject() {
|
||
return {};
|
||
}
|
||
|
||
/**
|
||
* This method returns an empty string.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.13.0
|
||
* @category Util
|
||
* @returns {string} Returns the empty string.
|
||
* @example
|
||
*
|
||
* _.times(2, _.stubString);
|
||
* // => ['', '']
|
||
*/
|
||
function stubString() {
|
||
return '';
|
||
}
|
||
|
||
/**
|
||
* This method returns `true`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.13.0
|
||
* @category Util
|
||
* @returns {boolean} Returns `true`.
|
||
* @example
|
||
*
|
||
* _.times(2, _.stubTrue);
|
||
* // => [true, true]
|
||
*/
|
||
function stubTrue() {
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Invokes the iteratee `n` times, returning an array of the results of
|
||
* each invocation. The iteratee is invoked with one argument; (index).
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {number} n The number of times to invoke `iteratee`.
|
||
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
|
||
* @returns {Array} Returns the array of results.
|
||
* @example
|
||
*
|
||
* _.times(3, String);
|
||
* // => ['0', '1', '2']
|
||
*
|
||
* _.times(4, _.constant(0));
|
||
* // => [0, 0, 0, 0]
|
||
*/
|
||
function times(n, iteratee) {
|
||
n = toInteger(n);
|
||
if (n < 1 || n > MAX_SAFE_INTEGER) {
|
||
return [];
|
||
}
|
||
var index = MAX_ARRAY_LENGTH,
|
||
length = nativeMin(n, MAX_ARRAY_LENGTH);
|
||
|
||
iteratee = getIteratee(iteratee);
|
||
n -= MAX_ARRAY_LENGTH;
|
||
|
||
var result = baseTimes(length, iteratee);
|
||
while (++index < n) {
|
||
iteratee(index);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* Converts `value` to a property path array.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Util
|
||
* @param {*} value The value to convert.
|
||
* @returns {Array} Returns the new property path array.
|
||
* @example
|
||
*
|
||
* _.toPath('a.b.c');
|
||
* // => ['a', 'b', 'c']
|
||
*
|
||
* _.toPath('a[0].b.c');
|
||
* // => ['a', '0', 'b', 'c']
|
||
*/
|
||
function toPath(value) {
|
||
if (isArray(value)) {
|
||
return arrayMap(value, toKey);
|
||
}
|
||
return isSymbol(value) ? [value] : copyArray(stringToPath(value));
|
||
}
|
||
|
||
/**
|
||
* Generates a unique ID. If `prefix` is given, the ID is appended to it.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Util
|
||
* @param {string} [prefix=''] The value to prefix the ID with.
|
||
* @returns {string} Returns the unique ID.
|
||
* @example
|
||
*
|
||
* _.uniqueId('contact_');
|
||
* // => 'contact_104'
|
||
*
|
||
* _.uniqueId();
|
||
* // => '105'
|
||
*/
|
||
function uniqueId(prefix) {
|
||
var id = ++idCounter;
|
||
return toString(prefix) + id;
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Adds two numbers.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.4.0
|
||
* @category Math
|
||
* @param {number} augend The first number in an addition.
|
||
* @param {number} addend The second number in an addition.
|
||
* @returns {number} Returns the total.
|
||
* @example
|
||
*
|
||
* _.add(6, 4);
|
||
* // => 10
|
||
*/
|
||
var add = createMathOperation(function(augend, addend) {
|
||
return augend + addend;
|
||
}, 0);
|
||
|
||
/**
|
||
* Computes `number` rounded up to `precision`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.10.0
|
||
* @category Math
|
||
* @param {number} number The number to round up.
|
||
* @param {number} [precision=0] The precision to round up to.
|
||
* @returns {number} Returns the rounded up number.
|
||
* @example
|
||
*
|
||
* _.ceil(4.006);
|
||
* // => 5
|
||
*
|
||
* _.ceil(6.004, 2);
|
||
* // => 6.01
|
||
*
|
||
* _.ceil(6040, -2);
|
||
* // => 6100
|
||
*/
|
||
var ceil = createRound('ceil');
|
||
|
||
/**
|
||
* Divide two numbers.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.7.0
|
||
* @category Math
|
||
* @param {number} dividend The first number in a division.
|
||
* @param {number} divisor The second number in a division.
|
||
* @returns {number} Returns the quotient.
|
||
* @example
|
||
*
|
||
* _.divide(6, 4);
|
||
* // => 1.5
|
||
*/
|
||
var divide = createMathOperation(function(dividend, divisor) {
|
||
return dividend / divisor;
|
||
}, 1);
|
||
|
||
/**
|
||
* Computes `number` rounded down to `precision`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.10.0
|
||
* @category Math
|
||
* @param {number} number The number to round down.
|
||
* @param {number} [precision=0] The precision to round down to.
|
||
* @returns {number} Returns the rounded down number.
|
||
* @example
|
||
*
|
||
* _.floor(4.006);
|
||
* // => 4
|
||
*
|
||
* _.floor(0.046, 2);
|
||
* // => 0.04
|
||
*
|
||
* _.floor(4060, -2);
|
||
* // => 4000
|
||
*/
|
||
var floor = createRound('floor');
|
||
|
||
/**
|
||
* Computes the maximum value of `array`. If `array` is empty or falsey,
|
||
* `undefined` is returned.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @returns {*} Returns the maximum value.
|
||
* @example
|
||
*
|
||
* _.max([4, 2, 8, 6]);
|
||
* // => 8
|
||
*
|
||
* _.max([]);
|
||
* // => undefined
|
||
*/
|
||
function max(array) {
|
||
return (array && array.length)
|
||
? baseExtremum(array, identity, baseGt)
|
||
: undefined;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.max` except that it accepts `iteratee` which is
|
||
* invoked for each element in `array` to generate the criterion by which
|
||
* the value is ranked. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {*} Returns the maximum value.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'n': 1 }, { 'n': 2 }];
|
||
*
|
||
* _.maxBy(objects, function(o) { return o.n; });
|
||
* // => { 'n': 2 }
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.maxBy(objects, 'n');
|
||
* // => { 'n': 2 }
|
||
*/
|
||
function maxBy(array, iteratee) {
|
||
return (array && array.length)
|
||
? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
|
||
: undefined;
|
||
}
|
||
|
||
/**
|
||
* Computes the mean of the values in `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @returns {number} Returns the mean.
|
||
* @example
|
||
*
|
||
* _.mean([4, 2, 8, 6]);
|
||
* // => 5
|
||
*/
|
||
function mean(array) {
|
||
return baseMean(array, identity);
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.mean` except that it accepts `iteratee` which is
|
||
* invoked for each element in `array` to generate the value to be averaged.
|
||
* The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.7.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {number} Returns the mean.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
|
||
*
|
||
* _.meanBy(objects, function(o) { return o.n; });
|
||
* // => 5
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.meanBy(objects, 'n');
|
||
* // => 5
|
||
*/
|
||
function meanBy(array, iteratee) {
|
||
return baseMean(array, getIteratee(iteratee, 2));
|
||
}
|
||
|
||
/**
|
||
* Computes the minimum value of `array`. If `array` is empty or falsey,
|
||
* `undefined` is returned.
|
||
*
|
||
* @static
|
||
* @since 0.1.0
|
||
* @memberOf _
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @returns {*} Returns the minimum value.
|
||
* @example
|
||
*
|
||
* _.min([4, 2, 8, 6]);
|
||
* // => 2
|
||
*
|
||
* _.min([]);
|
||
* // => undefined
|
||
*/
|
||
function min(array) {
|
||
return (array && array.length)
|
||
? baseExtremum(array, identity, baseLt)
|
||
: undefined;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.min` except that it accepts `iteratee` which is
|
||
* invoked for each element in `array` to generate the criterion by which
|
||
* the value is ranked. The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {*} Returns the minimum value.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'n': 1 }, { 'n': 2 }];
|
||
*
|
||
* _.minBy(objects, function(o) { return o.n; });
|
||
* // => { 'n': 1 }
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.minBy(objects, 'n');
|
||
* // => { 'n': 1 }
|
||
*/
|
||
function minBy(array, iteratee) {
|
||
return (array && array.length)
|
||
? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
|
||
: undefined;
|
||
}
|
||
|
||
/**
|
||
* Multiply two numbers.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.7.0
|
||
* @category Math
|
||
* @param {number} multiplier The first number in a multiplication.
|
||
* @param {number} multiplicand The second number in a multiplication.
|
||
* @returns {number} Returns the product.
|
||
* @example
|
||
*
|
||
* _.multiply(6, 4);
|
||
* // => 24
|
||
*/
|
||
var multiply = createMathOperation(function(multiplier, multiplicand) {
|
||
return multiplier * multiplicand;
|
||
}, 1);
|
||
|
||
/**
|
||
* Computes `number` rounded to `precision`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.10.0
|
||
* @category Math
|
||
* @param {number} number The number to round.
|
||
* @param {number} [precision=0] The precision to round to.
|
||
* @returns {number} Returns the rounded number.
|
||
* @example
|
||
*
|
||
* _.round(4.006);
|
||
* // => 4
|
||
*
|
||
* _.round(4.006, 2);
|
||
* // => 4.01
|
||
*
|
||
* _.round(4060, -2);
|
||
* // => 4100
|
||
*/
|
||
var round = createRound('round');
|
||
|
||
/**
|
||
* Subtract two numbers.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Math
|
||
* @param {number} minuend The first number in a subtraction.
|
||
* @param {number} subtrahend The second number in a subtraction.
|
||
* @returns {number} Returns the difference.
|
||
* @example
|
||
*
|
||
* _.subtract(6, 4);
|
||
* // => 2
|
||
*/
|
||
var subtract = createMathOperation(function(minuend, subtrahend) {
|
||
return minuend - subtrahend;
|
||
}, 0);
|
||
|
||
/**
|
||
* Computes the sum of the values in `array`.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 3.4.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @returns {number} Returns the sum.
|
||
* @example
|
||
*
|
||
* _.sum([4, 2, 8, 6]);
|
||
* // => 20
|
||
*/
|
||
function sum(array) {
|
||
return (array && array.length)
|
||
? baseSum(array, identity)
|
||
: 0;
|
||
}
|
||
|
||
/**
|
||
* This method is like `_.sum` except that it accepts `iteratee` which is
|
||
* invoked for each element in `array` to generate the value to be summed.
|
||
* The iteratee is invoked with one argument: (value).
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @since 4.0.0
|
||
* @category Math
|
||
* @param {Array} array The array to iterate over.
|
||
* @param {Function} [iteratee=_.identity] The iteratee invoked per element.
|
||
* @returns {number} Returns the sum.
|
||
* @example
|
||
*
|
||
* var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
|
||
*
|
||
* _.sumBy(objects, function(o) { return o.n; });
|
||
* // => 20
|
||
*
|
||
* // The `_.property` iteratee shorthand.
|
||
* _.sumBy(objects, 'n');
|
||
* // => 20
|
||
*/
|
||
function sumBy(array, iteratee) {
|
||
return (array && array.length)
|
||
? baseSum(array, getIteratee(iteratee, 2))
|
||
: 0;
|
||
}
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
// Add methods that return wrapped values in chain sequences.
|
||
lodash.after = after;
|
||
lodash.ary = ary;
|
||
lodash.assign = assign;
|
||
lodash.assignIn = assignIn;
|
||
lodash.assignInWith = assignInWith;
|
||
lodash.assignWith = assignWith;
|
||
lodash.at = at;
|
||
lodash.before = before;
|
||
lodash.bind = bind;
|
||
lodash.bindAll = bindAll;
|
||
lodash.bindKey = bindKey;
|
||
lodash.castArray = castArray;
|
||
lodash.chain = chain;
|
||
lodash.chunk = chunk;
|
||
lodash.compact = compact;
|
||
lodash.concat = concat;
|
||
lodash.cond = cond;
|
||
lodash.conforms = conforms;
|
||
lodash.constant = constant;
|
||
lodash.countBy = countBy;
|
||
lodash.create = create;
|
||
lodash.curry = curry;
|
||
lodash.curryRight = curryRight;
|
||
lodash.debounce = debounce;
|
||
lodash.defaults = defaults;
|
||
lodash.defaultsDeep = defaultsDeep;
|
||
lodash.defer = defer;
|
||
lodash.delay = delay;
|
||
lodash.difference = difference;
|
||
lodash.differenceBy = differenceBy;
|
||
lodash.differenceWith = differenceWith;
|
||
lodash.drop = drop;
|
||
lodash.dropRight = dropRight;
|
||
lodash.dropRightWhile = dropRightWhile;
|
||
lodash.dropWhile = dropWhile;
|
||
lodash.fill = fill;
|
||
lodash.filter = filter;
|
||
lodash.flatMap = flatMap;
|
||
lodash.flatMapDeep = flatMapDeep;
|
||
lodash.flatMapDepth = flatMapDepth;
|
||
lodash.flatten = flatten;
|
||
lodash.flattenDeep = flattenDeep;
|
||
lodash.flattenDepth = flattenDepth;
|
||
lodash.flip = flip;
|
||
lodash.flow = flow;
|
||
lodash.flowRight = flowRight;
|
||
lodash.fromPairs = fromPairs;
|
||
lodash.functions = functions;
|
||
lodash.functionsIn = functionsIn;
|
||
lodash.groupBy = groupBy;
|
||
lodash.initial = initial;
|
||
lodash.intersection = intersection;
|
||
lodash.intersectionBy = intersectionBy;
|
||
lodash.intersectionWith = intersectionWith;
|
||
lodash.invert = invert;
|
||
lodash.invertBy = invertBy;
|
||
lodash.invokeMap = invokeMap;
|
||
lodash.iteratee = iteratee;
|
||
lodash.keyBy = keyBy;
|
||
lodash.keys = keys;
|
||
lodash.keysIn = keysIn;
|
||
lodash.map = map;
|
||
lodash.mapKeys = mapKeys;
|
||
lodash.mapValues = mapValues;
|
||
lodash.matches = matches;
|
||
lodash.matchesProperty = matchesProperty;
|
||
lodash.memoize = memoize;
|
||
lodash.merge = merge;
|
||
lodash.mergeWith = mergeWith;
|
||
lodash.method = method;
|
||
lodash.methodOf = methodOf;
|
||
lodash.mixin = mixin;
|
||
lodash.negate = negate;
|
||
lodash.nthArg = nthArg;
|
||
lodash.omit = omit;
|
||
lodash.omitBy = omitBy;
|
||
lodash.once = once;
|
||
lodash.orderBy = orderBy;
|
||
lodash.over = over;
|
||
lodash.overArgs = overArgs;
|
||
lodash.overEvery = overEvery;
|
||
lodash.overSome = overSome;
|
||
lodash.partial = partial;
|
||
lodash.partialRight = partialRight;
|
||
lodash.partition = partition;
|
||
lodash.pick = pick;
|
||
lodash.pickBy = pickBy;
|
||
lodash.property = property;
|
||
lodash.propertyOf = propertyOf;
|
||
lodash.pull = pull;
|
||
lodash.pullAll = pullAll;
|
||
lodash.pullAllBy = pullAllBy;
|
||
lodash.pullAllWith = pullAllWith;
|
||
lodash.pullAt = pullAt;
|
||
lodash.range = range;
|
||
lodash.rangeRight = rangeRight;
|
||
lodash.rearg = rearg;
|
||
lodash.reject = reject;
|
||
lodash.remove = remove;
|
||
lodash.rest = rest;
|
||
lodash.reverse = reverse;
|
||
lodash.sampleSize = sampleSize;
|
||
lodash.set = set;
|
||
lodash.setWith = setWith;
|
||
lodash.shuffle = shuffle;
|
||
lodash.slice = slice;
|
||
lodash.sortBy = sortBy;
|
||
lodash.sortedUniq = sortedUniq;
|
||
lodash.sortedUniqBy = sortedUniqBy;
|
||
lodash.split = split;
|
||
lodash.spread = spread;
|
||
lodash.tail = tail;
|
||
lodash.take = take;
|
||
lodash.takeRight = takeRight;
|
||
lodash.takeRightWhile = takeRightWhile;
|
||
lodash.takeWhile = takeWhile;
|
||
lodash.tap = tap;
|
||
lodash.throttle = throttle;
|
||
lodash.thru = thru;
|
||
lodash.toArray = toArray;
|
||
lodash.toPairs = toPairs;
|
||
lodash.toPairsIn = toPairsIn;
|
||
lodash.toPath = toPath;
|
||
lodash.toPlainObject = toPlainObject;
|
||
lodash.transform = transform;
|
||
lodash.unary = unary;
|
||
lodash.union = union;
|
||
lodash.unionBy = unionBy;
|
||
lodash.unionWith = unionWith;
|
||
lodash.uniq = uniq;
|
||
lodash.uniqBy = uniqBy;
|
||
lodash.uniqWith = uniqWith;
|
||
lodash.unset = unset;
|
||
lodash.unzip = unzip;
|
||
lodash.unzipWith = unzipWith;
|
||
lodash.update = update;
|
||
lodash.updateWith = updateWith;
|
||
lodash.values = values;
|
||
lodash.valuesIn = valuesIn;
|
||
lodash.without = without;
|
||
lodash.words = words;
|
||
lodash.wrap = wrap;
|
||
lodash.xor = xor;
|
||
lodash.xorBy = xorBy;
|
||
lodash.xorWith = xorWith;
|
||
lodash.zip = zip;
|
||
lodash.zipObject = zipObject;
|
||
lodash.zipObjectDeep = zipObjectDeep;
|
||
lodash.zipWith = zipWith;
|
||
|
||
// Add aliases.
|
||
lodash.entries = toPairs;
|
||
lodash.entriesIn = toPairsIn;
|
||
lodash.extend = assignIn;
|
||
lodash.extendWith = assignInWith;
|
||
|
||
// Add methods to `lodash.prototype`.
|
||
mixin(lodash, lodash);
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
// Add methods that return unwrapped values in chain sequences.
|
||
lodash.add = add;
|
||
lodash.attempt = attempt;
|
||
lodash.camelCase = camelCase;
|
||
lodash.capitalize = capitalize;
|
||
lodash.ceil = ceil;
|
||
lodash.clamp = clamp;
|
||
lodash.clone = clone;
|
||
lodash.cloneDeep = cloneDeep;
|
||
lodash.cloneDeepWith = cloneDeepWith;
|
||
lodash.cloneWith = cloneWith;
|
||
lodash.conformsTo = conformsTo;
|
||
lodash.deburr = deburr;
|
||
lodash.defaultTo = defaultTo;
|
||
lodash.divide = divide;
|
||
lodash.endsWith = endsWith;
|
||
lodash.eq = eq;
|
||
lodash.escape = escape;
|
||
lodash.escapeRegExp = escapeRegExp;
|
||
lodash.every = every;
|
||
lodash.find = find;
|
||
lodash.findIndex = findIndex;
|
||
lodash.findKey = findKey;
|
||
lodash.findLast = findLast;
|
||
lodash.findLastIndex = findLastIndex;
|
||
lodash.findLastKey = findLastKey;
|
||
lodash.floor = floor;
|
||
lodash.forEach = forEach;
|
||
lodash.forEachRight = forEachRight;
|
||
lodash.forIn = forIn;
|
||
lodash.forInRight = forInRight;
|
||
lodash.forOwn = forOwn;
|
||
lodash.forOwnRight = forOwnRight;
|
||
lodash.get = get;
|
||
lodash.gt = gt;
|
||
lodash.gte = gte;
|
||
lodash.has = has;
|
||
lodash.hasIn = hasIn;
|
||
lodash.head = head;
|
||
lodash.identity = identity;
|
||
lodash.includes = includes;
|
||
lodash.indexOf = indexOf;
|
||
lodash.inRange = inRange;
|
||
lodash.invoke = invoke;
|
||
lodash.isArguments = isArguments;
|
||
lodash.isArray = isArray;
|
||
lodash.isArrayBuffer = isArrayBuffer;
|
||
lodash.isArrayLike = isArrayLike;
|
||
lodash.isArrayLikeObject = isArrayLikeObject;
|
||
lodash.isBoolean = isBoolean;
|
||
lodash.isBuffer = isBuffer;
|
||
lodash.isDate = isDate;
|
||
lodash.isElement = isElement;
|
||
lodash.isEmpty = isEmpty;
|
||
lodash.isEqual = isEqual;
|
||
lodash.isEqualWith = isEqualWith;
|
||
lodash.isError = isError;
|
||
lodash.isFinite = isFinite;
|
||
lodash.isFunction = isFunction;
|
||
lodash.isInteger = isInteger;
|
||
lodash.isLength = isLength;
|
||
lodash.isMap = isMap;
|
||
lodash.isMatch = isMatch;
|
||
lodash.isMatchWith = isMatchWith;
|
||
lodash.isNaN = isNaN;
|
||
lodash.isNative = isNative;
|
||
lodash.isNil = isNil;
|
||
lodash.isNull = isNull;
|
||
lodash.isNumber = isNumber;
|
||
lodash.isObject = isObject;
|
||
lodash.isObjectLike = isObjectLike;
|
||
lodash.isPlainObject = isPlainObject;
|
||
lodash.isRegExp = isRegExp;
|
||
lodash.isSafeInteger = isSafeInteger;
|
||
lodash.isSet = isSet;
|
||
lodash.isString = isString;
|
||
lodash.isSymbol = isSymbol;
|
||
lodash.isTypedArray = isTypedArray;
|
||
lodash.isUndefined = isUndefined;
|
||
lodash.isWeakMap = isWeakMap;
|
||
lodash.isWeakSet = isWeakSet;
|
||
lodash.join = join;
|
||
lodash.kebabCase = kebabCase;
|
||
lodash.last = last;
|
||
lodash.lastIndexOf = lastIndexOf;
|
||
lodash.lowerCase = lowerCase;
|
||
lodash.lowerFirst = lowerFirst;
|
||
lodash.lt = lt;
|
||
lodash.lte = lte;
|
||
lodash.max = max;
|
||
lodash.maxBy = maxBy;
|
||
lodash.mean = mean;
|
||
lodash.meanBy = meanBy;
|
||
lodash.min = min;
|
||
lodash.minBy = minBy;
|
||
lodash.stubArray = stubArray;
|
||
lodash.stubFalse = stubFalse;
|
||
lodash.stubObject = stubObject;
|
||
lodash.stubString = stubString;
|
||
lodash.stubTrue = stubTrue;
|
||
lodash.multiply = multiply;
|
||
lodash.nth = nth;
|
||
lodash.noConflict = noConflict;
|
||
lodash.noop = noop;
|
||
lodash.now = now;
|
||
lodash.pad = pad;
|
||
lodash.padEnd = padEnd;
|
||
lodash.padStart = padStart;
|
||
lodash.parseInt = parseInt;
|
||
lodash.random = random;
|
||
lodash.reduce = reduce;
|
||
lodash.reduceRight = reduceRight;
|
||
lodash.repeat = repeat;
|
||
lodash.replace = replace;
|
||
lodash.result = result;
|
||
lodash.round = round;
|
||
lodash.runInContext = runInContext;
|
||
lodash.sample = sample;
|
||
lodash.size = size;
|
||
lodash.snakeCase = snakeCase;
|
||
lodash.some = some;
|
||
lodash.sortedIndex = sortedIndex;
|
||
lodash.sortedIndexBy = sortedIndexBy;
|
||
lodash.sortedIndexOf = sortedIndexOf;
|
||
lodash.sortedLastIndex = sortedLastIndex;
|
||
lodash.sortedLastIndexBy = sortedLastIndexBy;
|
||
lodash.sortedLastIndexOf = sortedLastIndexOf;
|
||
lodash.startCase = startCase;
|
||
lodash.startsWith = startsWith;
|
||
lodash.subtract = subtract;
|
||
lodash.sum = sum;
|
||
lodash.sumBy = sumBy;
|
||
lodash.template = template;
|
||
lodash.times = times;
|
||
lodash.toFinite = toFinite;
|
||
lodash.toInteger = toInteger;
|
||
lodash.toLength = toLength;
|
||
lodash.toLower = toLower;
|
||
lodash.toNumber = toNumber;
|
||
lodash.toSafeInteger = toSafeInteger;
|
||
lodash.toString = toString;
|
||
lodash.toUpper = toUpper;
|
||
lodash.trim = trim;
|
||
lodash.trimEnd = trimEnd;
|
||
lodash.trimStart = trimStart;
|
||
lodash.truncate = truncate;
|
||
lodash.unescape = unescape;
|
||
lodash.uniqueId = uniqueId;
|
||
lodash.upperCase = upperCase;
|
||
lodash.upperFirst = upperFirst;
|
||
|
||
// Add aliases.
|
||
lodash.each = forEach;
|
||
lodash.eachRight = forEachRight;
|
||
lodash.first = head;
|
||
|
||
mixin(lodash, (function() {
|
||
var source = {};
|
||
baseForOwn(lodash, function(func, methodName) {
|
||
if (!hasOwnProperty.call(lodash.prototype, methodName)) {
|
||
source[methodName] = func;
|
||
}
|
||
});
|
||
return source;
|
||
}()), { 'chain': false });
|
||
|
||
/*------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* The semantic version number.
|
||
*
|
||
* @static
|
||
* @memberOf _
|
||
* @type {string}
|
||
*/
|
||
lodash.VERSION = VERSION;
|
||
|
||
// Assign default placeholders.
|
||
arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
|
||
lodash[methodName].placeholder = lodash;
|
||
});
|
||
|
||
// Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
|
||
arrayEach(['drop', 'take'], function(methodName, index) {
|
||
LazyWrapper.prototype[methodName] = function(n) {
|
||
var filtered = this.__filtered__;
|
||
if (filtered && !index) {
|
||
return new LazyWrapper(this);
|
||
}
|
||
n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
|
||
|
||
var result = this.clone();
|
||
if (filtered) {
|
||
result.__takeCount__ = nativeMin(n, result.__takeCount__);
|
||
} else {
|
||
result.__views__.push({
|
||
'size': nativeMin(n, MAX_ARRAY_LENGTH),
|
||
'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
|
||
});
|
||
}
|
||
return result;
|
||
};
|
||
|
||
LazyWrapper.prototype[methodName + 'Right'] = function(n) {
|
||
return this.reverse()[methodName](n).reverse();
|
||
};
|
||
});
|
||
|
||
// Add `LazyWrapper` methods that accept an `iteratee` value.
|
||
arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
|
||
var type = index + 1,
|
||
isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
|
||
|
||
LazyWrapper.prototype[methodName] = function(iteratee) {
|
||
var result = this.clone();
|
||
result.__iteratees__.push({
|
||
'iteratee': getIteratee(iteratee, 3),
|
||
'type': type
|
||
});
|
||
result.__filtered__ = result.__filtered__ || isFilter;
|
||
return result;
|
||
};
|
||
});
|
||
|
||
// Add `LazyWrapper` methods for `_.head` and `_.last`.
|
||
arrayEach(['head', 'last'], function(methodName, index) {
|
||
var takeName = 'take' + (index ? 'Right' : '');
|
||
|
||
LazyWrapper.prototype[methodName] = function() {
|
||
return this[takeName](1).value()[0];
|
||
};
|
||
});
|
||
|
||
// Add `LazyWrapper` methods for `_.initial` and `_.tail`.
|
||
arrayEach(['initial', 'tail'], function(methodName, index) {
|
||
var dropName = 'drop' + (index ? '' : 'Right');
|
||
|
||
LazyWrapper.prototype[methodName] = function() {
|
||
return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
|
||
};
|
||
});
|
||
|
||
LazyWrapper.prototype.compact = function() {
|
||
return this.filter(identity);
|
||
};
|
||
|
||
LazyWrapper.prototype.find = function(predicate) {
|
||
return this.filter(predicate).head();
|
||
};
|
||
|
||
LazyWrapper.prototype.findLast = function(predicate) {
|
||
return this.reverse().find(predicate);
|
||
};
|
||
|
||
LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
|
||
if (typeof path == 'function') {
|
||
return new LazyWrapper(this);
|
||
}
|
||
return this.map(function(value) {
|
||
return baseInvoke(value, path, args);
|
||
});
|
||
});
|
||
|
||
LazyWrapper.prototype.reject = function(predicate) {
|
||
return this.filter(negate(getIteratee(predicate)));
|
||
};
|
||
|
||
LazyWrapper.prototype.slice = function(start, end) {
|
||
start = toInteger(start);
|
||
|
||
var result = this;
|
||
if (result.__filtered__ && (start > 0 || end < 0)) {
|
||
return new LazyWrapper(result);
|
||
}
|
||
if (start < 0) {
|
||
result = result.takeRight(-start);
|
||
} else if (start) {
|
||
result = result.drop(start);
|
||
}
|
||
if (end !== undefined) {
|
||
end = toInteger(end);
|
||
result = end < 0 ? result.dropRight(-end) : result.take(end - start);
|
||
}
|
||
return result;
|
||
};
|
||
|
||
LazyWrapper.prototype.takeRightWhile = function(predicate) {
|
||
return this.reverse().takeWhile(predicate).reverse();
|
||
};
|
||
|
||
LazyWrapper.prototype.toArray = function() {
|
||
return this.take(MAX_ARRAY_LENGTH);
|
||
};
|
||
|
||
// Add `LazyWrapper` methods to `lodash.prototype`.
|
||
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
||
var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
|
||
isTaker = /^(?:head|last)$/.test(methodName),
|
||
lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
|
||
retUnwrapped = isTaker || /^find/.test(methodName);
|
||
|
||
if (!lodashFunc) {
|
||
return;
|
||
}
|
||
lodash.prototype[methodName] = function() {
|
||
var value = this.__wrapped__,
|
||
args = isTaker ? [1] : arguments,
|
||
isLazy = value instanceof LazyWrapper,
|
||
iteratee = args[0],
|
||
useLazy = isLazy || isArray(value);
|
||
|
||
var interceptor = function(value) {
|
||
var result = lodashFunc.apply(lodash, arrayPush([value], args));
|
||
return (isTaker && chainAll) ? result[0] : result;
|
||
};
|
||
|
||
if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
|
||
// Avoid lazy use if the iteratee has a "length" value other than `1`.
|
||
isLazy = useLazy = false;
|
||
}
|
||
var chainAll = this.__chain__,
|
||
isHybrid = !!this.__actions__.length,
|
||
isUnwrapped = retUnwrapped && !chainAll,
|
||
onlyLazy = isLazy && !isHybrid;
|
||
|
||
if (!retUnwrapped && useLazy) {
|
||
value = onlyLazy ? value : new LazyWrapper(this);
|
||
var result = func.apply(value, args);
|
||
result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
|
||
return new LodashWrapper(result, chainAll);
|
||
}
|
||
if (isUnwrapped && onlyLazy) {
|
||
return func.apply(this, args);
|
||
}
|
||
result = this.thru(interceptor);
|
||
return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
|
||
};
|
||
});
|
||
|
||
// Add `Array` methods to `lodash.prototype`.
|
||
arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
|
||
var func = arrayProto[methodName],
|
||
chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
|
||
retUnwrapped = /^(?:pop|shift)$/.test(methodName);
|
||
|
||
lodash.prototype[methodName] = function() {
|
||
var args = arguments;
|
||
if (retUnwrapped && !this.__chain__) {
|
||
var value = this.value();
|
||
return func.apply(isArray(value) ? value : [], args);
|
||
}
|
||
return this[chainName](function(value) {
|
||
return func.apply(isArray(value) ? value : [], args);
|
||
});
|
||
};
|
||
});
|
||
|
||
// Map minified method names to their real names.
|
||
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
||
var lodashFunc = lodash[methodName];
|
||
if (lodashFunc) {
|
||
var key = (lodashFunc.name + ''),
|
||
names = realNames[key] || (realNames[key] = []);
|
||
|
||
names.push({ 'name': methodName, 'func': lodashFunc });
|
||
}
|
||
});
|
||
|
||
realNames[createHybrid(undefined, BIND_KEY_FLAG).name] = [{
|
||
'name': 'wrapper',
|
||
'func': undefined
|
||
}];
|
||
|
||
// Add methods to `LazyWrapper`.
|
||
LazyWrapper.prototype.clone = lazyClone;
|
||
LazyWrapper.prototype.reverse = lazyReverse;
|
||
LazyWrapper.prototype.value = lazyValue;
|
||
|
||
// Add chain sequence methods to the `lodash` wrapper.
|
||
lodash.prototype.at = wrapperAt;
|
||
lodash.prototype.chain = wrapperChain;
|
||
lodash.prototype.commit = wrapperCommit;
|
||
lodash.prototype.next = wrapperNext;
|
||
lodash.prototype.plant = wrapperPlant;
|
||
lodash.prototype.reverse = wrapperReverse;
|
||
lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
|
||
|
||
// Add lazy aliases.
|
||
lodash.prototype.first = lodash.prototype.head;
|
||
|
||
if (iteratorSymbol) {
|
||
lodash.prototype[iteratorSymbol] = wrapperToIterator;
|
||
}
|
||
return lodash;
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
// Export lodash.
|
||
var _ = runInContext();
|
||
|
||
// Some AMD build optimizers, like r.js, check for condition patterns like:
|
||
if (true) {
|
||
// Expose Lodash on the global object to prevent errors when Lodash is
|
||
// loaded by a script tag in the presence of an AMD loader.
|
||
// See http://requirejs.org/docs/errors.html#mismatch for more details.
|
||
// Use `_.noConflict` to remove Lodash from the global object.
|
||
root._ = _;
|
||
|
||
// Define as an anonymous module so, through path mapping, it can be
|
||
// referenced as the "underscore" module.
|
||
!(__WEBPACK_AMD_DEFINE_RESULT__ = function() {
|
||
return _;
|
||
}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
||
}
|
||
// Check for `exports` after `define` in case a build optimizer adds it.
|
||
else if (freeModule) {
|
||
// Export for Node.js.
|
||
(freeModule.exports = _)._ = _;
|
||
// Export for CommonJS support.
|
||
freeExports._ = _;
|
||
}
|
||
else {
|
||
// Export to the global object.
|
||
root._ = _;
|
||
}
|
||
}.call(this));
|
||
|
||
/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(78)(module)))
|
||
|
||
/***/ },
|
||
/* 78 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = function(module) {
|
||
if(!module.webpackPolyfill) {
|
||
module.deprecate = function() {};
|
||
module.paths = [];
|
||
// module.parent = undefined by default
|
||
module.children = [];
|
||
module.webpackPolyfill = 1;
|
||
}
|
||
return module;
|
||
}
|
||
|
||
|
||
/***/ },
|
||
/* 79 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div class=\"container\">\n <div class='clearfix'>\n <h3 class='pull-left'> DNSControl </h3>\n <button class='btn btn-success pull-right' @click=\"save\" style='margin-top:15px'>Save</button>\n </div>\n <multiselect name=\"domains\" :options=\"domains\" placeholder=\"jump to domain\" :selected=\"null\" :multiple=\"false\" :searchable=\"true\" :on-change=\"domainSelect\" :show-labels=\"false\" :reset-after=\"true\"></multiselect>\n <br/>\n <multiselect name=\"vars\" :options=\"vars\" placeholder=\"jump to var\" :selected=\"null\" :multiple=\"false\" :searchable=\"true\" :on-change=\"varSelect\" :show-labels=\"false\" :reset-after=\"true\"></multiselect>\n <br/>\n <editor :text.once=\"content\" v-ref:editor :on-change=\"textChanged\"></editor>\n \n <div v-show=\"error\" class=\"alert alert-danger\" role=\"alert\">{{error}}</div>\n <dns-config v-if=\"config\" :data=\"config\" :selected=\"lastSelected\" ></dns-config>\n</div>\n";
|
||
|
||
/***/ },
|
||
/* 80 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
exports.install = function (Vue, opts) {
|
||
|
||
var filter = function(text, length, clamp){
|
||
clamp = clamp || '...';
|
||
var node = document.createElement('div');
|
||
node.innerHTML = text;
|
||
var content = node.textContent;
|
||
return content.length > length ? content.slice(0, length) + clamp : content;
|
||
};
|
||
|
||
Vue.filter('truncate', filter);
|
||
|
||
};
|
||
|
||
|
||
/***/ },
|
||
/* 81 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
module.exports = { "default": __webpack_require__(82), __esModule: true };
|
||
|
||
/***/ },
|
||
/* 82 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var core = __webpack_require__(54)
|
||
, $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify});
|
||
module.exports = function stringify(it){ // eslint-disable-line no-unused-vars
|
||
return $JSON.stringify.apply($JSON, arguments);
|
||
};
|
||
|
||
/***/ },
|
||
/* 83 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(84)
|
||
__vue_script__ = __webpack_require__(86)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/RunResults.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(87)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-397bbaf7/RunResults.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 84 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(85);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./RunResults.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./RunResults.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 85 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 86 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _stringify = __webpack_require__(81);
|
||
|
||
var _stringify2 = _interopRequireDefault(_stringify);
|
||
|
||
var _vueStrap = __webpack_require__(67);
|
||
|
||
var _ScaleLoader = __webpack_require__(128);
|
||
|
||
var _ScaleLoader2 = _interopRequireDefault(_ScaleLoader);
|
||
|
||
var _Correction = __webpack_require__(133);
|
||
|
||
var _Correction2 = _interopRequireDefault(_Correction);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
props: {
|
||
show: {
|
||
required: true,
|
||
type: Boolean,
|
||
twoWay: true
|
||
},
|
||
query: { type: Object, default: {} },
|
||
config: Object
|
||
},
|
||
data: function data() {
|
||
return {
|
||
loading: false,
|
||
error: "",
|
||
corrections: []
|
||
};
|
||
},
|
||
methods: {
|
||
preview: function preview() {
|
||
var self = this;
|
||
fetch('/api/preview', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Accept': 'application/json',
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: (0, _stringify2.default)({ Config: this.config, Query: this.query })
|
||
}).then(function (response) {
|
||
if (response.status != 200) {
|
||
response.text().then(function (txt) {
|
||
self.error = txt;
|
||
self.loading = false;
|
||
});
|
||
return;
|
||
}
|
||
response.json().then(function (j) {
|
||
self.corrections = j;
|
||
self.loading = false;
|
||
});
|
||
});
|
||
}
|
||
},
|
||
created: function created() {
|
||
this.$watch('show', function (newVal) {
|
||
if (newVal && !this.loading) {
|
||
this.loading = true;
|
||
this.error = "";
|
||
this.corrections = [];
|
||
this.preview();
|
||
}
|
||
});
|
||
},
|
||
components: { modal: _vueStrap.modal, alert: _vueStrap.alert, spinner: _ScaleLoader2.default, Correction: _Correction2.default }
|
||
};
|
||
|
||
/***/ },
|
||
/* 87 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<modal :show.sync=\"show\" :title=\"query.Domain\" width=\"75%\">\n <div slot='modal-body'><div style='margin:15px;'>\n <spinner :loading=\"loading\"></spinner>\n <alert v-if=\"error\" type=\"danger\" >\n {{error}}\n </alert>\n <div v-for=\"(provider,list) in corrections\">\n <h3>{{provider}} <span v-show=\"list.length==0\" class='glyphicon glyphicon-ok' style='color:rgb(93, 197, 150);'></span></h3>\n <div v-for=\"correction in list\">\n <correction :correction=\"correction\"></correction>\n </div>\n </div>\n </div></div>\n <div slot=\"modal-footer\" class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-default\" @click=\"show = false\">Close</button>\n </div>\n</modal>\n";
|
||
|
||
/***/ },
|
||
/* 88 */,
|
||
/* 89 */,
|
||
/* 90 */,
|
||
/* 91 */,
|
||
/* 92 */,
|
||
/* 93 */,
|
||
/* 94 */,
|
||
/* 95 */,
|
||
/* 96 */,
|
||
/* 97 */,
|
||
/* 98 */,
|
||
/* 99 */,
|
||
/* 100 */,
|
||
/* 101 */,
|
||
/* 102 */,
|
||
/* 103 */,
|
||
/* 104 */,
|
||
/* 105 */,
|
||
/* 106 */,
|
||
/* 107 */,
|
||
/* 108 */,
|
||
/* 109 */,
|
||
/* 110 */,
|
||
/* 111 */,
|
||
/* 112 */,
|
||
/* 113 */,
|
||
/* 114 */,
|
||
/* 115 */,
|
||
/* 116 */,
|
||
/* 117 */,
|
||
/* 118 */,
|
||
/* 119 */,
|
||
/* 120 */,
|
||
/* 121 */,
|
||
/* 122 */,
|
||
/* 123 */,
|
||
/* 124 */,
|
||
/* 125 */,
|
||
/* 126 */,
|
||
/* 127 */,
|
||
/* 128 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(129)
|
||
__vue_script__ = __webpack_require__(131)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] node_modules/vue-spinner/src/ScaleLoader.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(132)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-2bf10aff/ScaleLoader.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 129 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(130);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../css-loader/index.js!./../../vue-loader/lib/style-rewriter.js!./../../vue-loader/lib/selector.js?type=style&index=0!./ScaleLoader.vue", function() {
|
||
var newContent = require("!!./../../css-loader/index.js!./../../vue-loader/lib/style-rewriter.js!./../../vue-loader/lib/selector.js?type=style&index=0!./ScaleLoader.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 130 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.v-spinner\n{\n/*\t font-size: 10px; \n\n width: 60px;\n height: 40px;*/\n /*margin: 25px auto;*/\n text-align: center;\n \n}\n\n\n@-webkit-keyframes v-scaleStretchDelay\n{\n 0%,\n 100%\n {\n -webkit-transform: scaleY(1);\n transform: scaleY(1);\n }\n 50%\n {\n -webkit-transform: scaleY(0.4);\n transform: scaleY(0.4);\n }\n}\n\n@keyframes v-scaleStretchDelay\n{\n 0%,\n 100%\n {\n -webkit-transform: scaleY(1);\n transform: scaleY(1);\n }\n 50%\n {\n -webkit-transform: scaleY(0.4);\n transform: scaleY(0.4);\n }\n}\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 131 */
|
||
/***/ function(module, exports) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.default = {
|
||
|
||
name: 'ScaleLoader',
|
||
|
||
props: {
|
||
loading: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
color: {
|
||
type: String,
|
||
default: '#5dc596'
|
||
},
|
||
height: {
|
||
type: String,
|
||
default: '35px'
|
||
},
|
||
width: {
|
||
type: String,
|
||
default: '4px'
|
||
},
|
||
margin: {
|
||
type: String,
|
||
default: '2px'
|
||
},
|
||
radius: {
|
||
type: String,
|
||
default: '2px'
|
||
}
|
||
},
|
||
data: function data() {
|
||
return {
|
||
spinnerStyle: {
|
||
backgroundColor: this.color,
|
||
height: this.height,
|
||
width: this.width,
|
||
margin: this.margin,
|
||
borderRadius: this.radius,
|
||
display: 'inline-block',
|
||
animationName: 'v-scaleStretchDelay',
|
||
animationDuration: '1s',
|
||
animationIterationCount: 'infinite',
|
||
animationTimingFunction: 'cubic-bezier(.2,.68,.18,1.08)',
|
||
animationFillMode: 'both'
|
||
},
|
||
spinnerDelay1: {
|
||
animationDelay: '0.1s'
|
||
},
|
||
spinnerDelay2: {
|
||
animationDelay: '0.2s'
|
||
},
|
||
spinnerDelay3: {
|
||
animationDelay: '0.3s'
|
||
},
|
||
spinnerDelay4: {
|
||
animationDelay: '0.4s'
|
||
},
|
||
spinnerDelay5: {
|
||
animationDelay: '0.5s'
|
||
}
|
||
};
|
||
}
|
||
};
|
||
|
||
/***/ },
|
||
/* 132 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div class=\"v-spinner\" v-show=\"loading\">\n <div class=\"v-scale v-scale1\" v-bind:style=\"[spinnerStyle,spinnerDelay1]\">\n </div><div class=\"v-scale v-scale2\" v-bind:style=\"[spinnerStyle,spinnerDelay2]\">\n </div><div class=\"v-scale v-scale3\" v-bind:style=\"[spinnerStyle,spinnerDelay3]\">\n </div><div class=\"v-scale v-scale4\" v-bind:style=\"[spinnerStyle,spinnerDelay4]\">\n </div><div class=\"v-scale v-scale5\" v-bind:style=\"[spinnerStyle,spinnerDelay5]\">\n </div>\n </div>\n";
|
||
|
||
/***/ },
|
||
/* 133 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
var __vue_script__, __vue_template__
|
||
__webpack_require__(134)
|
||
__vue_script__ = __webpack_require__(136)
|
||
if (__vue_script__ &&
|
||
__vue_script__.__esModule &&
|
||
Object.keys(__vue_script__).length > 1) {
|
||
console.warn("[vue-loader] app/components/Correction.vue: named exports in *.vue files are ignored.")}
|
||
__vue_template__ = __webpack_require__(137)
|
||
module.exports = __vue_script__ || {}
|
||
if (module.exports.__esModule) module.exports = module.exports.default
|
||
if (__vue_template__) {
|
||
(typeof module.exports === "function" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__
|
||
}
|
||
if (false) {(function () { module.hot.accept()
|
||
var hotAPI = require("vue-hot-reload-api")
|
||
hotAPI.install(require("vue"), false)
|
||
if (!hotAPI.compatible) return
|
||
var id = "_v-63c39c2c/Correction.vue"
|
||
if (!module.hot.data) {
|
||
hotAPI.createRecord(id, module.exports)
|
||
} else {
|
||
hotAPI.update(id, module.exports, __vue_template__)
|
||
}
|
||
})()}
|
||
|
||
/***/ },
|
||
/* 134 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
// style-loader: Adds some css to the DOM by adding a <style> tag
|
||
|
||
// load the styles
|
||
var content = __webpack_require__(135);
|
||
if(typeof content === 'string') content = [[module.id, content, '']];
|
||
// add the styles to the DOM
|
||
var update = __webpack_require__(10)(content, {});
|
||
if(content.locals) module.exports = content.locals;
|
||
// Hot Module Replacement
|
||
if(false) {
|
||
// When the styles change, update the <style> tags
|
||
if(!content.locals) {
|
||
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Correction.vue", function() {
|
||
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/vue-loader/lib/style-rewriter.js!./../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./Correction.vue");
|
||
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
|
||
update(newContent);
|
||
});
|
||
}
|
||
// When the module is disposed, remove the <style> tags
|
||
module.hot.dispose(function() { update(); });
|
||
}
|
||
|
||
/***/ },
|
||
/* 135 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
exports = module.exports = __webpack_require__(9)();
|
||
// imports
|
||
|
||
|
||
// module
|
||
exports.push([module.id, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
|
||
|
||
// exports
|
||
|
||
|
||
/***/ },
|
||
/* 136 */
|
||
/***/ function(module, exports, __webpack_require__) {
|
||
|
||
'use strict';
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
|
||
var _ScaleLoader = __webpack_require__(128);
|
||
|
||
var _ScaleLoader2 = _interopRequireDefault(_ScaleLoader);
|
||
|
||
var _vueStrap = __webpack_require__(67);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
exports.default = {
|
||
data: function data() {
|
||
return {
|
||
hasRun: false,
|
||
running: false,
|
||
error: "",
|
||
ok: false
|
||
};
|
||
},
|
||
methods: {
|
||
run: function run() {
|
||
if (this.hasRun) {
|
||
return;
|
||
}
|
||
this.hasRun = true;
|
||
this.running = true;
|
||
this.error = "";
|
||
this.ok = false;
|
||
var self = this;
|
||
fetch("/api/run?id=" + this.correction.ID, { method: "POST" }).then(function (response) {
|
||
if (response.status != 200) {
|
||
response.text().then(function (txt) {
|
||
self.error = txt;
|
||
self.running = false;
|
||
self.hasRun = false;
|
||
});
|
||
return;
|
||
}
|
||
self.ok = true;
|
||
self.running = false;
|
||
});
|
||
}
|
||
},
|
||
props: {
|
||
correction: Object
|
||
},
|
||
components: { spinner: _ScaleLoader2.default, alert: _vueStrap.alert }
|
||
};
|
||
|
||
/***/ },
|
||
/* 137 */
|
||
/***/ function(module, exports) {
|
||
|
||
module.exports = "\n<div>\n <div class='clearfix'>\n <div class='pull-left'>{{correction.Msg}} \n <span v-show=\"!hasRun\" class=\"label label-primary noselect\" @click=\"run\">Run!</span>\n <span v-show=\"ok\" class='glyphicon glyphicon-ok' style='color:rgb(93, 197, 150);'></span>\n </div>\n <spinner :loading=\"running\" class='pull-left' height=\"15px\" ></spinner>\n </div>\n <alert v-if=\"error\" type=\"danger\" >\n {{error}}\n </alert>\n</div>\n";
|
||
|
||
/***/ }
|
||
/******/ ]); |