diff --git a/dist/bin/js/bundle.js b/dist/bin/js/bundle.js index c548746..5c8b005 100644 --- a/dist/bin/js/bundle.js +++ b/dist/bin/js/bundle.js @@ -37,7 +37,7 @@ eval("\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.default = void 0;\n\nvar _Utils = _interopRequireDefault(__webpack_require__(/*! ./Utils.es6 */ \"./src/Utils.es6\"));\n\nvar _TimingCalculator = _interopRequireDefault(__webpack_require__(/*! ./TimingCalculator.es6 */ \"./src/TimingCalculator.es6\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n//import Logger from \"./Logger.es6\";\nvar Logger = __webpack_require__(/*! ./Logger.es6 */ \"./src/Logger.es6\").Logger;\n\nvar AdNode = /*#__PURE__*/function () {\n function AdNode(parent, xmlNode, audioContext) {\n _classCallCheck(this, AdNode);\n\n this._xmlNode = xmlNode;\n this.parent = parent;\n this.time = {\n begin: _TimingCalculator[\"default\"].computeBegin(xmlNode),\n end: undefined\n };\n this._name = xmlNode.name;\n this._value = xmlNode.value;\n\n if (xmlNode.attributes) {\n this._pitch = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%pitch\"));\n this._speak = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%speak\"));\n this._id = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_XML_URI, \"%%id\"));\n }\n\n if (audioContext) {\n this.ac = audioContext;\n } // Logger.log(`Constructed an AdNode for ${this.pathString}, value \\\"${this.value}\\\"\n // ${this.begin} --> ${this.end}`); // DEBUG\n\n }\n\n _createClass(AdNode, [{\n key: \"postComputeEnd\",\n value: function postComputeEnd() {\n this.time.end = _TimingCalculator[\"default\"].computeEnd(this._xmlNode); // Logger.log(`postComputeEnd() for ${this.pathString}, value \\\"${this.value}\\\"\n // ${this.begin} --> ${this.end}`); // DEBUG\n\n if (this.children) {\n this.children.forEach(function (c) {\n c.postComputeEnd();\n });\n }\n }\n }, {\n key: \"audioContext\",\n get: function get() {\n if (this.ac) {\n return this.ac;\n }\n\n if (this.parent) {\n return this.parent.audioContext;\n }\n\n return null;\n }\n }, {\n key: \"begin\",\n get: function get() {\n var begin = NaN;\n\n if (this.time) {\n begin = this.time.begin;\n }\n\n return begin;\n }\n }, {\n key: \"end\",\n get: function get() {\n var end = NaN;\n\n if (this.time) {\n end = this.time.end;\n }\n\n return end;\n }\n }, {\n key: \"pitch\",\n get: function get() {\n if (this._pitch || this._pitch === 0) {\n return this._pitch;\n } else if (this.parent) {\n return this.parent.pitch;\n }\n\n return undefined;\n }\n }, {\n key: \"speak\",\n get: function get() {\n if (this._speak) {\n return this._speak;\n } else if (this.parent) {\n return this.parent.speak;\n }\n\n return undefined;\n }\n }, {\n key: \"value\",\n get: function get() {\n return this._value;\n }\n }, {\n key: \"videoMedia\",\n get: function get() {\n return this._videoMedia;\n },\n set: function set(vm) {\n this._videoMedia = vm;\n }\n }, {\n key: \"makeCueObjects\",\n value: function makeCueObjects(arr, videoMedia) {\n var _this = this;\n\n this.videoMedia = videoMedia;\n var b = this.begin;\n var e = !isNaN(this.end) ? this.end : videoMedia.duration;\n var v = this.value;\n\n if (!isNaN(b) && !isNaN(e)) {\n // Logger.log(`Making a cue for ${ this.pathString }, \\\"${ v }\\\",\n // ${b} --> ${e}.`); // DEBUG\n var newCue = new VTTCue(b, e, v);\n\n newCue.onenter = function () {\n return _this.onActive();\n };\n\n newCue.onexit = function () {\n return _this.onInactive();\n };\n\n arr.push(newCue); // } else {\n // Logger.log(`Not making a cue for ${ this.pathString }, \\\"${ v }\\\"\n // because b (${b}) or e (${e}) is NaN.`); // DEBUG\n }\n\n if (this.children) {\n var _iterator = _createForOfIteratorHelper(this.children),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var c = _step.value;\n c.makeCueObjects(arr, videoMedia);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n } //Go down the tree, apply fn(c) to all children\n\n }, {\n key: \"traverse\",\n value: function traverse(fn) {\n fn(this);\n\n if (this.children) {\n var _iterator2 = _createForOfIteratorHelper(this.children),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var c = _step2.value;\n c.traverse(fn);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n }\n }, {\n key: \"name\",\n get: function get() {\n return this._name;\n }\n }, {\n key: \"pathString\",\n get: function get() {\n return (this.parent ? \"\".concat(this.parent.pathString, \" -> \") : \"\") + \"\".concat(this.name).concat(this.idString);\n }\n }, {\n key: \"idString\",\n get: function get() {\n return this._id ? \" id:\\\"\".concat(this._id, \"\\\"\") : \"\";\n }\n }, {\n key: \"onActive\",\n value: function onActive() {\n this.isActive = true;\n Logger.log(\"Active AdNode: \".concat(this.pathString));\n }\n }, {\n key: \"onInactive\",\n value: function onInactive() {\n this.isActive = false;\n Logger.log(\"Inactive AdNode: \".concat(this.pathString));\n }\n }, {\n key: \"onFinalise\",\n value: function onFinalise() {\n if (this.isActive) {\n this.onInactive();\n }\n }\n }]);\n\n return AdNode;\n}();\n\nexports.default = AdNode;\n\n//# sourceURL=webpack://adhere-lib/./src/AdNode.es6?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.default = void 0;\n\nvar _Utils = _interopRequireDefault(__webpack_require__(/*! ./Utils.es6 */ \"./src/Utils.es6\"));\n\nvar _TimingCalculator = _interopRequireDefault(__webpack_require__(/*! ./TimingCalculator.es6 */ \"./src/TimingCalculator.es6\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n//import Logger from \"./Logger.es6\";\nvar Logger = __webpack_require__(/*! ./Logger.es6 */ \"./src/Logger.es6\").Logger;\n\nvar AdNode = /*#__PURE__*/function () {\n function AdNode(parent, xmlNode, audioContext) {\n _classCallCheck(this, AdNode);\n\n this._xmlNode = xmlNode;\n this.parent = parent;\n this.time = {\n begin: _TimingCalculator[\"default\"].computeBegin(xmlNode),\n end: undefined\n };\n this._name = xmlNode.name;\n this._value = xmlNode.value;\n\n if (xmlNode.attributes) {\n this._pitch = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%pitch\"));\n this._speak = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%speak\"));\n this._id = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_XML_URI, \"%%id\"));\n }\n\n if (audioContext) {\n this.ac = audioContext;\n } // Logger.log(`Constructed an AdNode for ${this.pathString}, value \\\"${this.value}\\\"\n // ${this.begin} --> ${this.end}`); // DEBUG\n\n }\n\n _createClass(AdNode, [{\n key: \"postComputeEnd\",\n value: function postComputeEnd() {\n this.time.end = _TimingCalculator[\"default\"].computeEnd(this._xmlNode); // Logger.log(`postComputeEnd() for ${this.pathString}, value \\\"${this.value}\\\"\n // ${this.begin} --> ${this.end}`); // DEBUG\n\n if (this.children) {\n this.children.forEach(function (c) {\n c.postComputeEnd();\n });\n }\n }\n }, {\n key: \"audioContext\",\n get: function get() {\n if (this.ac) {\n return this.ac;\n }\n\n if (this.parent) {\n return this.parent.audioContext;\n }\n\n return null;\n }\n }, {\n key: \"begin\",\n get: function get() {\n var begin = NaN;\n\n if (this.time) {\n begin = this.time.begin;\n }\n\n return begin;\n }\n }, {\n key: \"end\",\n get: function get() {\n var end = NaN;\n\n if (this.time) {\n end = this.time.end;\n }\n\n return end;\n }\n }, {\n key: \"pitch\",\n get: function get() {\n if (this._pitch || this._pitch === 0) {\n return this._pitch;\n } else if (this.parent) {\n return this.parent.pitch;\n }\n\n return undefined;\n }\n }, {\n key: \"speak\",\n get: function get() {\n if (this._speak) {\n return this._speak;\n } else if (this.parent) {\n return this.parent.speak;\n }\n\n return undefined;\n }\n }, {\n key: \"value\",\n get: function get() {\n return this._value;\n }\n }, {\n key: \"videoMedia\",\n get: function get() {\n return this._videoMedia;\n },\n set: function set(vm) {\n this._videoMedia = vm;\n }\n }, {\n key: \"makeCueObjects\",\n value: function makeCueObjects(arr, videoMedia) {\n var _this = this;\n\n this.videoMedia = videoMedia;\n var b = this.begin;\n var e = !isNaN(this.end) ? this.end : videoMedia.duration;\n var v = this.value;\n\n if (!isNaN(b) && !isNaN(e)) {\n // Logger.log(`Making a cue for ${ this.pathString }, \\\"${ v }\\\",\n // ${b} --> ${e}.`); // DEBUG\n var newCue = new VTTCue(b, e, v);\n\n newCue.onenter = function () {\n return _this.onActive();\n };\n\n newCue.onexit = function () {\n return _this.onInactive();\n };\n\n arr.push(newCue); // } else {\n // Logger.log(`Not making a cue for ${ this.pathString }, \\\"${ v }\\\"\n // because b (${b}) or e (${e}) is NaN.`); // DEBUG\n }\n\n if (this.children) {\n var _iterator = _createForOfIteratorHelper(this.children),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var c = _step.value;\n c.makeCueObjects(arr, videoMedia);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n } //Go down the tree, apply fn(c) to all children\n\n }, {\n key: \"traverse\",\n value: function traverse(fn) {\n fn(this);\n\n if (this.children) {\n var _iterator2 = _createForOfIteratorHelper(this.children),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var c = _step2.value;\n c.traverse(fn);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n }\n }, {\n key: \"name\",\n get: function get() {\n return this._name;\n }\n }, {\n key: \"pathString\",\n get: function get() {\n return (this.parent ? \"\".concat(this.parent.pathString, \" -> \") : \"\") + \"\".concat(this.name).concat(this.idString);\n }\n }, {\n key: \"idString\",\n get: function get() {\n return this._id ? \" id:\\\"\".concat(this._id, \"\\\"\") : \"\";\n }\n }, {\n key: \"onActive\",\n value: function onActive() {\n this.isActive = true;\n Logger.log(\"Active AdNode: \".concat(this.pathString));\n }\n }, {\n key: \"onInactive\",\n value: function onInactive() {\n this.isActive = false;\n Logger.log(\"Inactive AdNode: \".concat(this.pathString));\n }\n }, {\n key: \"onFinalise\",\n value: function onFinalise() {\n if (this.isActive) {\n this.onInactive();\n }\n }\n }]);\n\n return AdNode;\n}();\n\nexports.default = AdNode;\n\n//# sourceURL=webpack://adhere-lib/./src/AdNode.es6?"); /***/ }), @@ -103,7 +103,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n})); /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.default = parseTree;\nexports.setAudioCacheStrategy = setAudioCacheStrategy;\nexports.getAudioCacheStrategy = getAudioCacheStrategy;\n\nvar _Utils = _interopRequireDefault(__webpack_require__(/*! ./Utils.es6 */ \"./src/Utils.es6\"));\n\nvar _AdSourceNode = _interopRequireDefault(__webpack_require__(/*! ./AdSourceNode.es6 */ \"./src/AdSourceNode.es6\"));\n\nvar _AdLeafNode = _interopRequireDefault(__webpack_require__(/*! ./AdLeafNode.es6 */ \"./src/AdLeafNode.es6\"));\n\nvar _AdUserControlledSourceNode = _interopRequireDefault(__webpack_require__(/*! ./AdUserControlledSourceNode.es6 */ \"./src/AdUserControlledSourceNode.es6\"));\n\nvar _SpeechSourceNode = _interopRequireDefault(__webpack_require__(/*! ./SpeechSourceNode.es6 */ \"./src/SpeechSourceNode.es6\"));\n\nvar _AudioNub = _interopRequireDefault(__webpack_require__(/*! ./AudioNub.es6 */ \"./src/AudioNub.es6\"));\n\nvar _AnimateNode = _interopRequireDefault(__webpack_require__(/*! ./AnimateNode.es6 */ \"./src/AnimateNode.es6\"));\n\nvar _base64Js = _interopRequireDefault(__webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _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); }\n\nfunction _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; }\n\n// import Logger from \"./Logger.es6\";\nvar Logger = __webpack_require__(/*! ./Logger.es6 */ \"./src/Logger.es6\").Logger;\n\nvar CACHE_STRATEGY_REUSE = true;\nvar CACHE_STRATEGY_NOCACHE = false;\nvar currentUrl = \"\";\nvar audioElements = {};\nvar audioResources = {};\nvar trackPrefix = \";track=\";\nvar defaultVideoGain = 1;\nvar audioCacheStrategy = CACHE_STRATEGY_NOCACHE;\n/*eslint func-style: [\"error\", \"declaration\"]*/\n\n/*eslint no-use-before-define: [\"error\", { \"functions\": false }]*/\n\n/*eslint max-statements: [\"error\", 25]*/\n\nfunction isName(fullyQualifiedName, node) {\n return node.fullyQualifiedName === fullyQualifiedName;\n}\n\nfunction getNamedChildren(fullyQualifiedName, node) {\n return node.children.filter(isName.bind(null, fullyQualifiedName));\n} //For an audio with a element, make a mediaSrc url from the base64.\n\n\nfunction parseEmbeddedSource(node) {\n var source = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%source\"), node)[0];\n var data = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%data\"), source)[0];\n var dataType = data.attributes.type;\n var chunks = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%chunk\"), data);\n var chunk = chunks[0]; //TODO: merge multiple chunks\n\n if (chunk.children.length > 0) {\n chunk.value = chunk.children[0].value;\n }\n\n var wsRegex = /\\s/gi; // eslint-disable-next-line no-undef\n\n var dataChunk = _base64Js[\"default\"].toByteArray(chunk.value.replace(wsRegex, \"\"));\n\n var blob = new Blob([dataChunk], {\n type: dataType\n });\n return URL.createObjectURL(blob);\n}\n\nfunction grabAudioResources(headNode) {\n var ret = {};\n var resources = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%resources\"), headNode)[0];\n\n if (resources) {\n var audios = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\"), resources);\n\n var _iterator = _createForOfIteratorHelper(audios),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var a = _step.value;\n\n var id = _Utils[\"default\"].getAttributeByFullyQualifiedName(a, \"\".concat(_Utils[\"default\"].NS_XML_URI, \"%%id\"));\n\n if (id) {\n audioResources[id] = parseEmbeddedSource(a);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n return ret;\n}\n\nfunction getAudioElement(audioSrc, audioContext) {\n if (audioCacheStrategy === CACHE_STRATEGY_REUSE && audioSrc in audioElements) {\n // Yay reuse this one\n return audioElements[audioSrc];\n } // Need to make one\n\n\n var media = new Audio();\n\n media.onError = function () {\n Logger.error(\"Error \".concat(media.error.code, \"; details: \").concat(media.error.message));\n };\n\n media.src = audioSrc;\n media.preload = \"metadata\";\n var node = audioContext.createMediaElementSource(media);\n var pair = {\n media: media,\n mediaNode: node\n };\n\n if (audioCacheStrategy === CACHE_STRATEGY_REUSE) {\n audioElements[audioSrc] = pair;\n }\n\n return pair;\n}\n\nfunction propagateNamespaces(xmlNode) {\n if (xmlNode.parent === null) {\n xmlNode.namespaces = _Utils[\"default\"].gleanNamespaces(xmlNode);\n xmlNode.fullyQualifiedName = _Utils[\"default\"].getFullyQualifiedName(xmlNode);\n }\n\n if (xmlNode.children) {\n var _iterator2 = _createForOfIteratorHelper(xmlNode.children),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var c = _step2.value;\n\n if (c.parent === null || c.parent.namespaces === {}) {\n c.namespaces = _Utils[\"default\"].gleanNamespaces(c);\n } else {\n c.namespaces = Object.assign(c.parent.namespaces, _Utils[\"default\"].gleanNamespaces(c));\n }\n\n c.fullyQualifiedName = _Utils[\"default\"].getFullyQualifiedName(c);\n propagateNamespaces(c);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n} //The xml parser makes anonymous spans under real spans, let's flatten the two together.\n\n\nfunction flattenSpans(xmlNode) {\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if ((xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\") || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%chunk\")) && c.fullyQualifiedName === \"\") {\n xmlNode.value = c.value; //Take the text inside it\n\n xmlNode.children.splice(i, 1);\n } else {\n flattenSpans(c);\n i++;\n }\n }\n }\n} //remove any nodes that don't fall under the isAudioType definition\n//clear out the unrelated ttml stuff\n\n\nfunction removeOther(xmlNode) {\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if (!_Utils[\"default\"].isAudioType(c.fullyQualifiedName)) {\n xmlNode.children.splice(i, 1);\n } else {\n removeOther(c);\n i++;\n }\n }\n }\n}\n\nfunction siblingsHaveAudio(xmlNode) {\n var siblings = xmlNode.parent.children;\n\n var _iterator3 = _createForOfIteratorHelper(siblings),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var s = _step3.value;\n\n // eslint-disable-next-line eqeqeq\n if (s != xmlNode && s.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\")) {\n return true;\n }\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return false;\n}\n\nfunction markAudio(xmlNode) {\n if (xmlNode.parent) {\n xmlNode.hasAudio = xmlNode.parent.hasAudio;\n }\n\n if (_Utils[\"default\"].isAudioElement(xmlNode) || (xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%p\") || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%div\") || xmlNode.fullyQualifiedName === \"\" || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\")) && siblingsHaveAudio(xmlNode)) {\n xmlNode.hasAudio = true;\n }\n\n if (xmlNode.children) {\n var _iterator4 = _createForOfIteratorHelper(xmlNode.children),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var c = _step4.value;\n markAudio(c);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n xmlNode.hasAudio = xmlNode.hasAudio || xmlNode.children.some(function (c) {\n return c.hasAudio;\n });\n }\n}\n\nfunction markSpeech(xmlNode, parentSpeech) {\n var speechSpecified = false;\n\n if (xmlNode.attributes) {\n var speakAttribute = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%speak\"));\n\n if (speakAttribute) {\n speechSpecified = true;\n xmlNode.hasSpeech = !(speakAttribute === \"none\");\n }\n }\n\n if (!speechSpecified) {\n // it's inherited downwards, if I don't specify, I get what my parent specifies.\n xmlNode.hasSpeech = parentSpeech;\n }\n\n if (xmlNode.children) {\n var hasSpeech = xmlNode.hasSpeech;\n\n var _iterator5 = _createForOfIteratorHelper(xmlNode.children),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var c = _step5.value;\n var thisChildHasSpeech = markSpeech(c, hasSpeech);\n xmlNode.hasSpeech = thisChildHasSpeech || xmlNode.hasSpeech; //If any children have speech, I have speech (but that doesn't mean all my children do)\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n\n return xmlNode.hasSpeech;\n}\n\nfunction removeNotAudio(xmlNode) {\n //Remove anythin without .hasAudio or .hasSpeech.\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if (c.hasAudio || c.hasSpeech) {\n removeNotAudio(c);\n i++;\n } else {\n xmlNode.children.splice(i, 1);\n }\n }\n }\n}\n\nfunction prepareXML(xmlNode) {\n propagateNamespaces(xmlNode);\n flattenSpans(xmlNode);\n removeOther(xmlNode); //Mark nodes for hasSpeech and hasAudio\n //Basically am I used in the pathway; if I or my descendants or my ascendants\n //have speech or audio attributes, I'm marked too.\n\n markAudio(xmlNode);\n markSpeech(xmlNode);\n removeNotAudio(xmlNode);\n}\n\nfunction parseAnimateNode(parent, node, audioContext) {\n var ret = new _AnimateNode[\"default\"](parent, node, audioContext);\n return ret;\n}\n\nfunction isLeafNode(node) {\n return node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\") || node.fullyQualifiedName === \"\"; //span or anonymous span/\n}\n\nfunction parseSpeechNode(parent, node, audioContext) {\n var ret = new _SpeechSourceNode[\"default\"](parent, node, audioContext);\n return ret;\n}\n\nfunction parseAudioSourceNode(parent, node) {\n var src = node.attributes.src;\n\n if (src && src.indexOf(trackPrefix) >= 0) {\n //Ignore body level track specifiers.\n return undefined;\n }\n\n var audioSrc;\n\n if (src) {\n if (src.indexOf(\"#\") === 0) {\n audioSrc = audioResources[src.substring(1)];\n } else {\n audioSrc = currentUrl + src;\n }\n } else if (!src && node.children) {\n audioSrc = parseEmbeddedSource(node);\n } else {\n Logger.error(\"Found an audio node but couldn't work out what its source is supposed to be.\");\n }\n\n var ret;\n\n if (audioSrc) {\n var mediaPair = getAudioElement(audioSrc, parent.audioContext);\n ret = new _AdSourceNode[\"default\"](parent, node, undefined, mediaPair);\n }\n\n return ret;\n}\n\nfunction parseNode(parent, node) {\n var ret = null;\n\n if (node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\")) {\n ret = parseAudioSourceNode(parent, node);\n } else if (node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%animate\")) {\n ret = parseAnimateNode(parent, node);\n } else if (isLeafNode(node)) {\n ret = parseLeafNode(parent, node);\n } else {\n ret = parseIntermediateNode(parent, node);\n }\n\n return ret;\n}\n\nfunction parseLeafNode(parent, node, audioContext) {\n var ret = new _AdLeafNode[\"default\"](parent, node, audioContext);\n ret.children = node.children.map(parseNode.bind(null, ret)); //Remove nulls. These are nodes to nowhere. We should also remove anonymous spans if we're a leaf.\n\n ret.children = ret.children.filter(function (n) {\n return !!n && (n._xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\") || n._xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%animate\"));\n });\n\n if (node.hasSpeech) {\n ret.children.push(parseSpeechNode(ret, node, audioContext));\n }\n\n return ret;\n}\n\nfunction parseIntermediateNode(parent, node, audioContext) {\n var ret = new _AudioNub[\"default\"](parent, node, audioContext);\n ret.children = node.children.map(parseNode.bind(null, ret));\n ret.children = ret.children.filter(function (n) {\n return !!n;\n }); //Remove nulls. These are nodes to nowhere\n\n return ret;\n}\n\nfunction parseBody(parent, node, audioContext) {\n var body = parseNode(parent, node, audioContext);\n body.postComputeEnd();\n return body;\n}\n\nfunction parseTree(audioContext, media, url, xmlTree, startRoot) {\n var root;\n\n if (startRoot) {\n //We can't make a new AdSourceNode on the media without\n root = startRoot;\n } else {\n //Make an magic source node for the media - there's no xml for this so fake it.\n var mediaPair = {\n media: media,\n mediaNode: audioContext.createMediaElementSource(media)\n };\n root = new _AdUserControlledSourceNode[\"default\"](null, {\n name: \"root(mediaAudio)\",\n attributes: {\n \"tta:gain\": defaultVideoGain,\n \"tta:pan\": 0\n },\n namespaces: {\n \"default\": _Utils[\"default\"].NS_TTML_URI,\n xml: _Utils[\"default\"].NS_XML_URI,\n tta: \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI)\n },\n fullyQualifiedName: \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%tt\")\n }, audioContext, mediaPair);\n }\n\n var defaultOutput = new _AdLeafNode[\"default\"](root, {\n name: \"default audio out\",\n attributes: {},\n namespaces: {\n xml: _Utils[\"default\"].NS_XML_URI\n },\n fullyQualifiedName: \"\"\n }, audioContext);\n defaultOutput.makeDefaultOutput();\n root.children = [defaultOutput];\n\n if (typeof url === \"string\") {\n currentUrl = \"\".concat(url.slice(0, url.lastIndexOf(\"/\")), \"/\");\n } else {\n currentUrl = \"\";\n }\n\n prepareXML(xmlTree);\n var head = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%head\"), xmlTree)[0];\n\n if (head) {\n grabAudioResources(head);\n }\n\n if (isName(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%tt\"), xmlTree)) {\n var body = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%body\"), xmlTree)[0];\n\n if (body) {\n root.children.push(parseBody(root, body, null));\n } else {\n Logger.error(\"Couldn't find body element in the ttml document\");\n }\n }\n\n return root;\n}\n\nfunction setAudioCacheStrategy(cacheStrategy) {\n audioCacheStrategy = cacheStrategy;\n Logger.log(\"Audio cache strategy set to \".concat(cacheStrategy === CACHE_STRATEGY_REUSE ? \"REUSE\" : \"NO CACHE\"));\n}\n\nfunction getAudioCacheStrategy() {\n return audioCacheStrategy;\n}\n\n//# sourceURL=webpack://adhere-lib/./src/Parser.es6?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nexports.default = parseTree;\nexports.setAudioCacheStrategy = setAudioCacheStrategy;\nexports.getAudioCacheStrategy = getAudioCacheStrategy;\n\nvar _Utils = _interopRequireDefault(__webpack_require__(/*! ./Utils.es6 */ \"./src/Utils.es6\"));\n\nvar _AdSourceNode = _interopRequireDefault(__webpack_require__(/*! ./AdSourceNode.es6 */ \"./src/AdSourceNode.es6\"));\n\nvar _AdLeafNode = _interopRequireDefault(__webpack_require__(/*! ./AdLeafNode.es6 */ \"./src/AdLeafNode.es6\"));\n\nvar _AdUserControlledSourceNode = _interopRequireDefault(__webpack_require__(/*! ./AdUserControlledSourceNode.es6 */ \"./src/AdUserControlledSourceNode.es6\"));\n\nvar _SpeechSourceNode = _interopRequireDefault(__webpack_require__(/*! ./SpeechSourceNode.es6 */ \"./src/SpeechSourceNode.es6\"));\n\nvar _AudioNub = _interopRequireDefault(__webpack_require__(/*! ./AudioNub.es6 */ \"./src/AudioNub.es6\"));\n\nvar _AnimateNode = _interopRequireDefault(__webpack_require__(/*! ./AnimateNode.es6 */ \"./src/AnimateNode.es6\"));\n\nvar _base64Js = _interopRequireDefault(__webpack_require__(/*! base64-js */ \"./node_modules/base64-js/index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _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); }\n\nfunction _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; }\n\n// import Logger from \"./Logger.es6\";\nvar Logger = __webpack_require__(/*! ./Logger.es6 */ \"./src/Logger.es6\").Logger;\n\nvar CACHE_STRATEGY_REUSE = true;\nvar CACHE_STRATEGY_NOCACHE = false;\nvar currentUrl = \"\";\nvar audioElements = {};\nvar audioResources = {};\nvar trackPrefix = \";track=\";\nvar defaultVideoGain = 1;\nvar audioCacheStrategy = CACHE_STRATEGY_NOCACHE;\n/*eslint func-style: [\"error\", \"declaration\"]*/\n\n/*eslint no-use-before-define: [\"error\", { \"functions\": false }]*/\n\n/*eslint max-statements: [\"error\", 25]*/\n\nfunction isName(fullyQualifiedName, node) {\n return node.fullyQualifiedName === fullyQualifiedName;\n}\n\nfunction getNamedChildren(fullyQualifiedName, node) {\n return node.children.filter(isName.bind(null, fullyQualifiedName));\n} //For an audio with a element, make a mediaSrc url from the base64.\n\n\nfunction parseEmbeddedSource(node) {\n var source = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%source\"), node)[0];\n var data = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%data\"), source)[0];\n var dataType = data.attributes.type;\n var chunks = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%chunk\"), data);\n var chunk = chunks[0]; //TODO: merge multiple chunks\n\n if (chunk.children.length > 0) {\n chunk.value = chunk.children[0].value;\n }\n\n var wsRegex = /\\s/gi; // eslint-disable-next-line no-undef\n\n var dataChunk = _base64Js[\"default\"].toByteArray(chunk.value.replace(wsRegex, \"\"));\n\n var blob = new Blob([dataChunk], {\n type: dataType\n });\n return URL.createObjectURL(blob);\n}\n\nfunction grabAudioResources(headNode) {\n var ret = {};\n var resources = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%resources\"), headNode)[0];\n\n if (resources) {\n var audios = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\"), resources);\n\n var _iterator = _createForOfIteratorHelper(audios),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var a = _step.value;\n\n var id = _Utils[\"default\"].getAttributeByFullyQualifiedName(a, \"\".concat(_Utils[\"default\"].NS_XML_URI, \"%%id\"));\n\n if (id) {\n audioResources[id] = parseEmbeddedSource(a);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n\n return ret;\n}\n\nfunction getAudioElement(audioSrc, audioContext) {\n if (audioCacheStrategy === CACHE_STRATEGY_REUSE && audioSrc in audioElements) {\n // Yay reuse this one\n return audioElements[audioSrc];\n } // Need to make one\n\n\n var media = new Audio();\n\n media.onError = function () {\n Logger.error(\"Error \".concat(media.error.code, \"; details: \").concat(media.error.message));\n };\n\n media.src = audioSrc;\n media.preload = \"metadata\";\n var node = audioContext.createMediaElementSource(media);\n var pair = {\n media: media,\n mediaNode: node\n };\n\n if (audioCacheStrategy === CACHE_STRATEGY_REUSE) {\n audioElements[audioSrc] = pair;\n }\n\n return pair;\n}\n\nfunction propagateNamespaces(xmlNode) {\n if (xmlNode.parent === null) {\n xmlNode.namespaces = _Utils[\"default\"].gleanNamespaces(xmlNode);\n xmlNode.fullyQualifiedName = _Utils[\"default\"].getFullyQualifiedName(xmlNode);\n }\n\n if (xmlNode.children) {\n var _iterator2 = _createForOfIteratorHelper(xmlNode.children),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var c = _step2.value;\n\n if (c.parent === null || c.parent.namespaces === {}) {\n c.namespaces = _Utils[\"default\"].gleanNamespaces(c);\n } else {\n c.namespaces = Object.assign(c.parent.namespaces, _Utils[\"default\"].gleanNamespaces(c));\n }\n\n c.fullyQualifiedName = _Utils[\"default\"].getFullyQualifiedName(c);\n propagateNamespaces(c);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n} //The xml parser makes anonymous spans under real spans, let's flatten the two together.\n\n\nfunction flattenSpans(xmlNode) {\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if ((xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\") || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%chunk\")) && c.fullyQualifiedName === \"\") {\n xmlNode.value = c.value; //Take the text inside it\n\n xmlNode.children.splice(i, 1);\n } else {\n flattenSpans(c);\n i++;\n }\n }\n }\n} //remove any nodes that don't fall under the isAudioType definition\n//clear out the unrelated ttml stuff\n\n\nfunction removeOther(xmlNode) {\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if (!_Utils[\"default\"].isAudioType(c.fullyQualifiedName)) {\n xmlNode.children.splice(i, 1);\n } else {\n removeOther(c);\n i++;\n }\n }\n }\n}\n\nfunction siblingsHaveAudio(xmlNode) {\n var siblings = xmlNode.parent.children;\n\n var _iterator3 = _createForOfIteratorHelper(siblings),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var s = _step3.value;\n\n // eslint-disable-next-line eqeqeq\n if (s != xmlNode && s.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\")) {\n return true;\n }\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n return false;\n}\n\nfunction markAudio(xmlNode) {\n if (xmlNode.parent) {\n xmlNode.hasAudio = xmlNode.parent.hasAudio;\n }\n\n if (_Utils[\"default\"].isAudioElement(xmlNode) || (xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%p\") || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%div\") || xmlNode.fullyQualifiedName === \"\" || xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\")) && siblingsHaveAudio(xmlNode)) {\n xmlNode.hasAudio = true;\n }\n\n if (xmlNode.children) {\n var _iterator4 = _createForOfIteratorHelper(xmlNode.children),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var c = _step4.value;\n markAudio(c);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n xmlNode.hasAudio = xmlNode.hasAudio || xmlNode.children.some(function (c) {\n return c.hasAudio;\n });\n }\n}\n\nfunction markSpeech(xmlNode, parentSpeech) {\n var speechSpecified = false;\n\n if (xmlNode.attributes) {\n var speakAttribute = _Utils[\"default\"].getAttributeByFullyQualifiedName(xmlNode, \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI, \"%%speak\"));\n\n if (speakAttribute) {\n speechSpecified = true;\n xmlNode.hasSpeech = !(speakAttribute === \"none\");\n }\n }\n\n if (!speechSpecified) {\n // it's inherited downwards, if I don't specify, I get what my parent specifies.\n xmlNode.hasSpeech = parentSpeech;\n }\n\n if (xmlNode.children) {\n var hasSpeech = xmlNode.hasSpeech;\n\n var _iterator5 = _createForOfIteratorHelper(xmlNode.children),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var c = _step5.value;\n var thisChildHasSpeech = markSpeech(c, hasSpeech);\n xmlNode.hasSpeech = thisChildHasSpeech || xmlNode.hasSpeech; //If any children have speech, I have speech (but that doesn't mean all my children do)\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n\n return xmlNode.hasSpeech;\n}\n\nfunction removeNotAudio(xmlNode) {\n //Remove anythin without .hasAudio or .hasSpeech.\n if (xmlNode.children) {\n for (var i = 0; i < xmlNode.children.length;) {\n var c = xmlNode.children[i];\n\n if (c.hasAudio || c.hasSpeech) {\n removeNotAudio(c);\n i++;\n } else {\n xmlNode.children.splice(i, 1);\n }\n }\n }\n}\n\nfunction prepareXML(xmlNode) {\n propagateNamespaces(xmlNode);\n flattenSpans(xmlNode);\n removeOther(xmlNode); //Mark nodes for hasSpeech and hasAudio\n //Basically am I used in the pathway; if I or my descendants or my ascendants\n //have speech or audio attributes, I'm marked too.\n\n markAudio(xmlNode);\n markSpeech(xmlNode);\n removeNotAudio(xmlNode);\n}\n\nfunction parseAnimateNode(parent, node, audioContext) {\n var ret = new _AnimateNode[\"default\"](parent, node, audioContext);\n return ret;\n}\n\nfunction isLeafNode(node) {\n return node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%span\") || node.fullyQualifiedName === \"\"; //span or anonymous span/\n}\n\nfunction parseSpeechNode(parent, node, audioContext) {\n var ret = new _SpeechSourceNode[\"default\"](parent, node, audioContext);\n return ret;\n}\n\nfunction parseAudioSourceNode(parent, node) {\n var src = node.attributes.src;\n\n if (src && src.indexOf(trackPrefix) >= 0) {\n //Ignore body level track specifiers.\n return undefined;\n }\n\n var audioSrc;\n\n if (src) {\n if (src.indexOf(\"#\") === 0) {\n audioSrc = audioResources[src.substring(1)];\n } else {\n audioSrc = currentUrl + src;\n }\n } else if (!src && node.children) {\n audioSrc = parseEmbeddedSource(node);\n } else {\n Logger.error(\"Found an audio node but couldn't work out what its source is supposed to be.\");\n }\n\n var ret;\n\n if (audioSrc) {\n var mediaPair = getAudioElement(audioSrc, parent.audioContext);\n ret = new _AdSourceNode[\"default\"](parent, node, undefined, mediaPair);\n }\n\n return ret;\n}\n\nfunction parseNode(parent, node) {\n var ret = null;\n\n if (node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\")) {\n ret = parseAudioSourceNode(parent, node);\n } else if (node.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%animate\")) {\n ret = parseAnimateNode(parent, node);\n } else if (isLeafNode(node)) {\n ret = parseLeafNode(parent, node);\n } else {\n ret = parseIntermediateNode(parent, node);\n }\n\n return ret;\n}\n\nfunction parseLeafNode(parent, node, audioContext) {\n var ret = new _AdLeafNode[\"default\"](parent, node, audioContext);\n ret.children = node.children.map(parseNode.bind(null, ret)); //Remove nulls. These are nodes to nowhere. We should also remove anonymous spans if we're a leaf.\n\n ret.children = ret.children.filter(function (n) {\n return !!n && (n._xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%audio\") || n._xmlNode.fullyQualifiedName === \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%animate\"));\n });\n\n if (node.hasSpeech) {\n ret.children.push(parseSpeechNode(ret, node, audioContext));\n }\n\n return ret;\n}\n\nfunction parseIntermediateNode(parent, node, audioContext) {\n var ret = new _AudioNub[\"default\"](parent, node, audioContext);\n ret.children = node.children.map(parseNode.bind(null, ret));\n ret.children = ret.children.filter(function (n) {\n return !!n;\n }); //Remove nulls. These are nodes to nowhere\n\n return ret;\n}\n\nfunction parseBody(parent, node, audioContext) {\n var body = parseNode(parent, node, audioContext);\n body.postComputeEnd();\n return body;\n}\n\nfunction parseTree(audioContext, media, url, xmlTree, startRoot) {\n var root;\n\n if (startRoot) {\n //We can't make a new AdSourceNode on the media without\n root = startRoot;\n } else {\n //Make an magic source node for the media - there's no xml for this so fake it.\n var mediaPair = {\n media: media,\n mediaNode: audioContext.createMediaElementSource(media)\n };\n root = new _AdUserControlledSourceNode[\"default\"](null, {\n name: \"root(mediaAudio)\",\n attributes: {\n \"tta:gain\": defaultVideoGain,\n \"tta:pan\": 0\n },\n namespaces: {\n \"default\": _Utils[\"default\"].NS_TTML_URI,\n xml: _Utils[\"default\"].NS_XML_URI,\n tta: \"\".concat(_Utils[\"default\"].NS_TTML_AUDIO_URI)\n },\n fullyQualifiedName: \"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%tt\")\n }, audioContext, mediaPair);\n }\n\n var defaultOutput = new _AdLeafNode[\"default\"](root, {\n name: \"default audio out\",\n attributes: {},\n namespaces: {\n xml: _Utils[\"default\"].NS_XML_URI\n },\n fullyQualifiedName: \"\"\n }, audioContext);\n defaultOutput.makeDefaultOutput();\n root.children = [defaultOutput];\n\n if (typeof url === \"string\") {\n currentUrl = \"\".concat(url.slice(0, url.lastIndexOf(\"/\")), \"/\");\n } else {\n currentUrl = \"\";\n }\n\n prepareXML(xmlTree);\n var head = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%head\"), xmlTree)[0];\n\n if (head) {\n grabAudioResources(head);\n }\n\n if (isName(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%tt\"), xmlTree)) {\n var body = getNamedChildren(\"\".concat(_Utils[\"default\"].NS_TTML_URI, \"%%body\"), xmlTree)[0];\n\n if (body) {\n root.children.push(parseBody(root, body, null));\n } else {\n Logger.error(\"Couldn't find body element in the ttml document\");\n }\n }\n\n return root;\n}\n\nfunction setAudioCacheStrategy(cacheStrategy) {\n audioCacheStrategy = cacheStrategy;\n Logger.log(\"Audio cache strategy set to \".concat(cacheStrategy === CACHE_STRATEGY_REUSE ? \"REUSE\" : \"NO CACHE\"));\n}\n\nfunction getAudioCacheStrategy() {\n return audioCacheStrategy;\n}\n\n//# sourceURL=webpack://adhere-lib/./src/Parser.es6?"); /***/ }), diff --git a/package-lock.json b/package-lock.json index 0f68619..42735e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1437,6 +1437,7 @@ "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", "dev": true, "dependencies": { + "colors": "^1.1.2", "object-assign": "^4.1.0", "string-width": "^4.2.0" }, @@ -3832,6 +3833,7 @@ "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -5197,7 +5199,8 @@ "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1" + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -13330,6 +13333,7 @@ "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0",