aboutsummaryrefslogtreecommitdiff
path: root/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js')
-rw-r--r--catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js b/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js
new file mode 100644
index 00000000..d9f05e17
--- /dev/null
+++ b/catapult/third_party/polymer/components/web-animations-js/src/handler-utils.js
@@ -0,0 +1,177 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+ // consume* functions return a 2 value array of [parsed-data, '' or not-yet consumed input]
+
+ // Regex should be anchored with /^
+ function consumeToken(regex, string) {
+ var result = regex.exec(string);
+ if (result) {
+ result = regex.ignoreCase ? result[0].toLowerCase() : result[0];
+ return [result, string.substr(result.length)];
+ }
+ }
+
+ function consumeTrimmed(consumer, string) {
+ string = string.replace(/^\s*/, '');
+ var result = consumer(string);
+ if (result) {
+ return [result[0], result[1].replace(/^\s*/, '')];
+ }
+ }
+
+ function consumeRepeated(consumer, separator, string) {
+ consumer = consumeTrimmed.bind(null, consumer);
+ var list = [];
+ while (true) {
+ var result = consumer(string);
+ if (!result) {
+ return [list, string];
+ }
+ list.push(result[0]);
+ string = result[1];
+ result = consumeToken(separator, string);
+ if (!result || result[1] == '') {
+ return [list, string];
+ }
+ string = result[1];
+ }
+ }
+
+ // Consumes a token or expression with balanced parentheses
+ function consumeParenthesised(parser, string) {
+ var nesting = 0;
+ for (var n = 0; n < string.length; n++) {
+ if (/\s|,/.test(string[n]) && nesting == 0) {
+ break;
+ } else if (string[n] == '(') {
+ nesting++;
+ } else if (string[n] == ')') {
+ nesting--;
+ if (nesting == 0)
+ n++;
+ if (nesting <= 0)
+ break;
+ }
+ }
+ var parsed = parser(string.substr(0, n));
+ return parsed == undefined ? undefined : [parsed, string.substr(n)];
+ }
+
+ function lcm(a, b) {
+ var c = a;
+ var d = b;
+ while (c && d)
+ c > d ? c %= d : d %= c;
+ c = (a * b) / (c + d);
+ return c;
+ }
+
+ function ignore(value) {
+ return function(input) {
+ var result = value(input);
+ if (result)
+ result[0] = undefined;
+ return result;
+ }
+ }
+
+ function optional(value, defaultValue) {
+ return function(input) {
+ var result = value(input);
+ if (result)
+ return result;
+ return [defaultValue, input];
+ }
+ }
+
+ function consumeList(list, input) {
+ var output = [];
+ for (var i = 0; i < list.length; i++) {
+ var result = scope.consumeTrimmed(list[i], input);
+ if (!result || result[0] == '')
+ return;
+ if (result[0] !== undefined)
+ output.push(result[0]);
+ input = result[1];
+ }
+ if (input == '') {
+ return output;
+ }
+ }
+
+ function mergeWrappedNestedRepeated(wrap, nestedMerge, separator, left, right) {
+ var matchingLeft = [];
+ var matchingRight = [];
+ var reconsititution = [];
+ var length = lcm(left.length, right.length);
+ for (var i = 0; i < length; i++) {
+ var thing = nestedMerge(left[i % left.length], right[i % right.length]);
+ if (!thing) {
+ return;
+ }
+ matchingLeft.push(thing[0]);
+ matchingRight.push(thing[1]);
+ reconsititution.push(thing[2]);
+ }
+ return [matchingLeft, matchingRight, function(positions) {
+ var result = positions.map(function(position, i) {
+ return reconsititution[i](position);
+ }).join(separator);
+ return wrap ? wrap(result) : result;
+ }];
+ }
+
+ function mergeList(left, right, list) {
+ var lefts = [];
+ var rights = [];
+ var functions = [];
+ var j = 0;
+ for (var i = 0; i < list.length; i++) {
+ if (typeof list[i] == 'function') {
+ var result = list[i](left[j], right[j++]);
+ lefts.push(result[0]);
+ rights.push(result[1]);
+ functions.push(result[2]);
+ } else {
+ (function(pos) {
+ lefts.push(false);
+ rights.push(false);
+ functions.push(function() { return list[pos]; });
+ })(i);
+ }
+ }
+ return [lefts, rights, function(results) {
+ var result = '';
+ for (var i = 0; i < results.length; i++) {
+ result += functions[i](results[i]);
+ }
+ return result;
+ }];
+ }
+
+ scope.consumeToken = consumeToken;
+ scope.consumeTrimmed = consumeTrimmed;
+ scope.consumeRepeated = consumeRepeated;
+ scope.consumeParenthesised = consumeParenthesised;
+ scope.ignore = ignore;
+ scope.optional = optional;
+ scope.consumeList = consumeList;
+ scope.mergeNestedRepeated = mergeWrappedNestedRepeated.bind(null, null);
+ scope.mergeWrappedNestedRepeated = mergeWrappedNestedRepeated;
+ scope.mergeList = mergeList;
+
+})(webAnimations1);