diff options
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.js | 177 |
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); |