phaser3-rex-plugins
Version:
714 lines (688 loc) • 23.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.rexbracketparserplugin = factory());
})(this, (function () { 'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (typeof call === "object" || typeof call === "function")) {
return call;
} else if (call !== void 0) {
throw new TypeError("Derived constructors may only return object or undefined");
}
return _assertThisInitialized(self);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct();
return function _createSuperInternal() {
var Super = _getPrototypeOf(Derived),
result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
}
function _get() {
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get.bind();
} else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(arguments.length < 3 ? target : receiver);
}
return desc.value;
};
}
return _get.apply(this, arguments);
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
return arr2;
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toPrimitive(input, hint) {
if (typeof input !== "object" || input === null) return input;
var prim = input[Symbol.toPrimitive];
if (prim !== undefined) {
var res = prim.call(input, hint || "default");
if (typeof res !== "object") return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return typeof key === "symbol" ? key : String(key);
}
var EventEmitterMethods = {
setEventEmitter: function setEventEmitter(eventEmitter, EventEmitterClass) {
if (EventEmitterClass === undefined) {
EventEmitterClass = Phaser.Events.EventEmitter; // Use built-in EventEmitter class by default
}
this._privateEE = eventEmitter === true || eventEmitter === undefined;
this._eventEmitter = this._privateEE ? new EventEmitterClass() : eventEmitter;
return this;
},
destroyEventEmitter: function destroyEventEmitter() {
if (this._eventEmitter && this._privateEE) {
this._eventEmitter.shutdown();
}
return this;
},
getEventEmitter: function getEventEmitter() {
return this._eventEmitter;
},
on: function on() {
if (this._eventEmitter) {
this._eventEmitter.on.apply(this._eventEmitter, arguments);
}
return this;
},
once: function once() {
if (this._eventEmitter) {
this._eventEmitter.once.apply(this._eventEmitter, arguments);
}
return this;
},
off: function off() {
if (this._eventEmitter) {
this._eventEmitter.off.apply(this._eventEmitter, arguments);
}
return this;
},
emit: function emit(event) {
if (this._eventEmitter && event) {
this._eventEmitter.emit.apply(this._eventEmitter, arguments);
}
return this;
},
addListener: function addListener() {
if (this._eventEmitter) {
this._eventEmitter.addListener.apply(this._eventEmitter, arguments);
}
return this;
},
removeListener: function removeListener() {
if (this._eventEmitter) {
this._eventEmitter.removeListener.apply(this._eventEmitter, arguments);
}
return this;
},
removeAllListeners: function removeAllListeners() {
if (this._eventEmitter) {
this._eventEmitter.removeAllListeners.apply(this._eventEmitter, arguments);
}
return this;
},
listenerCount: function listenerCount() {
if (this._eventEmitter) {
return this._eventEmitter.listenerCount.apply(this._eventEmitter, arguments);
}
return 0;
},
listeners: function listeners() {
if (this._eventEmitter) {
return this._eventEmitter.listeners.apply(this._eventEmitter, arguments);
}
return [];
},
eventNames: function eventNames() {
if (this._eventEmitter) {
return this._eventEmitter.eventNames.apply(this._eventEmitter, arguments);
}
return [];
}
};
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2019 Photon Storm Ltd.
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
*/
// Source object
// The key as a string, or an array of keys, i.e. 'banner', or 'banner.hideBanner'
// The default value to use if the key doesn't exist
/**
* Retrieves a value from an object.
*
* @function Phaser.Utils.Objects.GetValue
* @since 3.0.0
*
* @param {object} source - The object to retrieve the value from.
* @param {string} key - The name of the property to retrieve from the object. If a property is nested, the names of its preceding properties should be separated by a dot (`.`) - `banner.hideBanner` would return the value of the `hideBanner` property from the object stored in the `banner` property of the `source` object.
* @param {*} defaultValue - The value to return if the `key` isn't found in the `source` object.
*
* @return {*} The value of the requested key.
*/
var GetValue = function GetValue(source, key, defaultValue) {
if (!source || typeof source === 'number') {
return defaultValue;
} else if (source.hasOwnProperty(key)) {
return source[key];
} else if (key.indexOf('.') !== -1) {
var keys = key.split('.');
var parent = source;
var value = defaultValue;
// Use for loop here so we can break early
for (var i = 0; i < keys.length; i++) {
if (parent.hasOwnProperty(keys[i])) {
// Yes it has a key property, let's carry on down
value = parent[keys[i]];
parent = parent[keys[i]];
} else {
// Can't go any further, so reset to default
value = defaultValue;
break;
}
}
return value;
} else {
return defaultValue;
}
};
var FLOAT = /^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i;
var HEX = /^0x[0-9A-F]+$/i;
var TypeConvert = function TypeConvert(s) {
if (typeof s !== 'string') {
return s;
}
if (s === '') {
s = null;
} else if (FLOAT.test(s)) {
s = parseFloat(s);
} else if (HEX.test(s)) {
s = parseInt(s, 16);
} else {
switch (s) {
case 'false':
s = false;
break;
case 'true':
s = true;
break;
case 'null':
s = null;
break;
case 'undefined':
s = undefined;
break;
}
}
return s;
};
// https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js
var EscapeRegex = function EscapeRegex(s) {
return s.replace(re0, '\\$&').replace(re1, '\\x2d');
};
var re0 = /[|\\{}()[\]^$+*?.]/g;
var re1 = /-/g;
var BracketParser$1 = /*#__PURE__*/function () {
function BracketParser(config) {
_classCallCheck(this, BracketParser);
// Event emitter
this.setEventEmitter(GetValue(config, 'eventEmitter', undefined));
// Value convert
this.setValueConverter(GetValue(config, 'valueConvert', true));
// Loop
this.setLoopEnable(GetValue(config, 'loop', false));
// Brackets and generate regex
this.setMultipleLinesTagEnable(GetValue(config, 'multipleLinesTag', false));
var delimiters = GetValue(config, 'delimiters', '<>');
this.setDelimiters(delimiters[0], delimiters[1]);
// Translate tagName callback
this.setTranslateTagNameCallback(GetValue(config, 'translateTagNameCallback'));
this.isRunning = false;
this.isPaused = false;
this.skipEventFlag = false;
this.justCompleted = false;
this.lastTagStart = null;
this.lastTagEnd = null;
this.lastContent = null;
}
_createClass(BracketParser, [{
key: "shutdown",
value: function shutdown() {
this.destroyEventEmitter();
}
}, {
key: "destroy",
value: function destroy() {
this.shutdown();
}
}, {
key: "setMultipleLinesTagEnable",
value: function setMultipleLinesTagEnable(enable) {
if (enable === undefined) {
enable = true;
}
this.multipleLinesTagEnable = enable;
return this;
}
// Override
}, {
key: "setDelimiters",
value: function setDelimiters(delimiterLeft, delimiterRight) {
if (delimiterRight === undefined) {
delimiterRight = delimiterLeft[1];
delimiterLeft = delimiterLeft[0];
}
this.delimiterLeft = delimiterLeft;
this.delimiterRight = delimiterRight;
delimiterLeft = EscapeRegex(this.delimiterLeft);
delimiterRight = EscapeRegex(this.delimiterRight);
var flag = this.multipleLinesTagEnable ? 'gs' : 'gi';
this.reSplit = RegExp("".concat(delimiterLeft, "(.+?)").concat(delimiterRight), flag);
return this;
}
}, {
key: "setTranslateTagNameCallback",
value: function setTranslateTagNameCallback(callback) {
this.translateTagNameCallback = callback;
return this;
}
}, {
key: "setValueConverter",
value: function setValueConverter(converter) {
if (converter === true) {
converter = TypeConvert;
} else if (!converter) {
converter = BypassValueConverter;
}
this.valueConverter = converter;
return this;
}
}, {
key: "setLoopEnable",
value: function setLoopEnable(enable) {
if (enable === undefined) {
enable = true;
}
this.loopEnable = enable;
return this;
}
}, {
key: "setSource",
value: function setSource(source) {
this.source = source;
return this;
}
}, {
key: "resetIndex",
value: function resetIndex(index) {
if (index === undefined) {
index = 0;
}
this.progressIndex = index;
this.reSplit.lastIndex = index;
this.lastTagStart = null;
this.lastTagEnd = null;
this.lastContent = null;
this.justCompleted = false;
this.isRunning = false;
return this;
}
}, {
key: "start",
value: function start(source) {
this.setSource(source).restart();
return this;
}
}, {
key: "restart",
value: function restart() {
this.resetIndex().next();
}
}, {
key: "next",
value: function next() {
if (this.isPaused) {
this.onResume();
}
// Don't re-enter this method
if (this.isRunning) {
return this;
}
this.isRunning = true;
if (this.justCompleted) {
this.isRunning = false;
return this;
}
if (this.reSplit.lastIndex === 0) {
this.onStart();
}
var text = this.source,
lastIndex = text.length;
this.reSplit.lastIndex = this.progressIndex;
while (true) {
var regexResult = this.reSplit.exec(text);
// No tag found, complete
if (!regexResult) {
if (this.progressIndex < lastIndex) {
this.onContent(text.substring(this.progressIndex, lastIndex));
// Might pause here
if (this.isPaused) {
this.progressIndex = lastIndex;
break;
}
}
this.onComplete();
this.isRunning = false;
return;
}
var matchEnd = this.reSplit.lastIndex;
var matchStart = matchEnd - regexResult[0].length;
// Process content between previous tag and current tag
if (this.progressIndex < matchStart) {
this.onContent(text.substring(this.progressIndex, matchStart));
// Might pause here
if (this.isPaused) {
this.progressIndex = matchStart;
break;
}
}
// Process current tag
this.onTag(regexResult[1]);
this.progressIndex = matchEnd;
// Might pause here
if (this.isPaused) {
break;
}
}
this.isRunning = false;
return this;
}
}, {
key: "skipEvent",
value: function skipEvent() {
this.skipEventFlag = true;
return this;
}
}, {
key: "pause",
value: function pause() {
if (!this.isPaused) {
this.onPause();
}
return this;
}
}, {
key: "pauseUntilEvent",
value: function pauseUntilEvent(eventEmitter, eventName) {
if (this.isPaused) {
return this;
}
this.pause();
eventEmitter.once(eventName, function () {
this.next();
}, this);
return this;
}
}, {
key: "onContent",
value: function onContent(content) {
this.skipEventFlag = false;
this.emit('content', content);
this.lastContent = content;
}
// Override
}, {
key: "onTag",
value: function onTag(tagContent) {}
}, {
key: "onStart",
value: function onStart() {
this.isRunning = true;
this.emit('start', this);
}
}, {
key: "onComplete",
value: function onComplete() {
this.isRunning = false;
this.justCompleted = true;
this.emit('complete', this);
if (this.loopEnable) {
this.resetIndex();
}
}
}, {
key: "onPause",
value: function onPause() {
this.isPaused = true;
this.emit('pause', this);
}
}, {
key: "onResume",
value: function onResume() {
this.isPaused = false;
this.emit('resume', this);
}
}]);
return BracketParser;
}();
var BypassValueConverter = function BypassValueConverter(s) {
return s;
};
Object.assign(BracketParser$1.prototype, EventEmitterMethods);
var StringToValues = function StringToValues(text, valueConverter) {
if (text == null) {
return [];
}
if (valueConverter === undefined) {
valueConverter = TypeConvert;
}
var values = text.split(',');
for (var i = 0, cnt = values.length; i < cnt; i++) {
values[i] = valueConverter(values[i]);
}
return values;
};
var BracketParser = /*#__PURE__*/function (_BracketParserBase) {
_inherits(BracketParser, _BracketParserBase);
var _super = _createSuper(BracketParser);
function BracketParser(config) {
var _this;
_classCallCheck(this, BracketParser);
if (config === undefined) {
config = {};
}
if (!config.hasOwnProperty('multipleLinesTag')) {
config.multipleLinesTag = false;
}
_this = _super.call(this, config);
// Parameters for regex
_this.setTagExpression(GetValue(config, 'regex.tag', undefined));
_this.setValueExpression(GetValue(config, 'regex.value', undefined));
// Brackets and generate regex
var delimiters = GetValue(config, 'delimiters', '<>');
_this.setDelimiters(delimiters[0], delimiters[1]);
return _this;
}
_createClass(BracketParser, [{
key: "setTagExpression",
value: function setTagExpression(express) {
if (!express) {
express = DefaultTokenExpression;
}
this.tagExpression = express;
return this;
}
}, {
key: "setValueExpression",
value: function setValueExpression(express) {
if (!express) {
express = DefaultTokenExpression;
}
this.valueExpression = express;
return this;
}
}, {
key: "setDelimiters",
value: function setDelimiters(delimiterLeft, delimiterRight) {
_get(_getPrototypeOf(BracketParser.prototype), "setDelimiters", this).call(this, delimiterLeft, delimiterRight);
var tag = "(".concat(this.tagExpression, ")(=(").concat(this.valueExpression, "))?");
this.reTag = RegExp(tag, 'i');
if (this.tagExpression !== DefaultTokenExpression || this.valueExpression !== DefaultTokenExpression) {
var startTagExpression = "".concat(this.tagExpression, "(=").concat(this.valueExpression, ")?");
var endTagExpression = "/".concat(this.tagExpression);
delimiterLeft = EscapeRegex(this.delimiterLeft);
delimiterRight = EscapeRegex(this.delimiterRight);
var flag = this.multipleLinesTagEnable ? 'gs' : 'gi';
this.reSplit = RegExp("".concat(delimiterLeft, "((").concat(startTagExpression, ")|(").concat(endTagExpression, "))").concat(delimiterRight), flag);
}
return this;
}
}, {
key: "onTag",
value: function onTag(tagContent) {
var regexResult = tagContent.match(this.reTag);
var tagName = regexResult[1];
var isEndTag = tagName.charAt(0) === '/';
if (isEndTag) {
tagName = tagName.substring(1, tagName.length);
}
if (this.translateTagNameCallback) {
tagName = this.translateTagNameCallback(tagName);
}
this.skipEventFlag = false;
if (!isEndTag) {
var values = StringToValues(regexResult[3], this.valueConverter);
this.emit.apply(this, ["+".concat(tagName)].concat(_toConsumableArray(values)));
if (!this.skipEventFlag) {
this.emit.apply(this, ['+', tagName].concat(_toConsumableArray(values)));
}
this.lastTagStart = tagName;
} else {
this.emit("-".concat(tagName));
if (!this.skipEventFlag) {
this.emit('-', tagName);
}
this.lastTagEnd = tagName;
}
}
}]);
return BracketParser;
}(BracketParser$1);
var DefaultTokenExpression = "[^=]+";
var BracketParserPlugin = /*#__PURE__*/function (_Phaser$Plugins$BaseP) {
_inherits(BracketParserPlugin, _Phaser$Plugins$BaseP);
var _super = _createSuper(BracketParserPlugin);
function BracketParserPlugin(pluginManager) {
_classCallCheck(this, BracketParserPlugin);
return _super.call(this, pluginManager);
}
_createClass(BracketParserPlugin, [{
key: "start",
value: function start() {
var eventEmitter = this.game.events;
eventEmitter.on('destroy', this.destroy, this);
}
}, {
key: "add",
value: function add(config) {
return new BracketParser(config);
}
}]);
return BracketParserPlugin;
}(Phaser.Plugins.BasePlugin);
return BracketParserPlugin;
}));