diff options
Diffstat (limited to 'catapult/third_party/polymer/components/web-animations-js/src/position-handler.js')
-rw-r--r-- | catapult/third_party/polymer/components/web-animations-js/src/position-handler.js | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js b/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js new file mode 100644 index 00000000..18cea438 --- /dev/null +++ b/catapult/third_party/polymer/components/web-animations-js/src/position-handler.js @@ -0,0 +1,117 @@ +// 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) { + + function negateDimension(dimension) { + var result = {}; + for (var k in dimension) { + result[k] = -dimension[k]; + } + return result; + } + + function consumeOffset(string) { + return scope.consumeToken(/^(left|center|right|top|bottom)\b/i, string) || scope.consumeLengthOrPercent(string); + } + + var offsetMap = { + left: {'%': 0}, + center: {'%': 50}, + right: {'%': 100}, + top: {'%': 0}, + bottom: {'%': 100}, + }; + + function parseOrigin(slots, string) { + var result = scope.consumeRepeated(consumeOffset, /^/, string); + if (!result || result[1] != '') return; + var tokens = result[0]; + tokens[0] = tokens[0] || 'center'; + tokens[1] = tokens[1] || 'center'; + if (slots == 3) { + tokens[2] = tokens[2] || {px: 0}; + } + if (tokens.length != slots) { + return; + } + // Reorder so that the horizontal axis comes first. + if (/top|bottom/.test(tokens[0]) || /left|right/.test(tokens[1])) { + var tmp = tokens[0]; + tokens[0] = tokens[1]; + tokens[1] = tmp; + } + // Invalid if not horizontal then vertical. + if (!/left|right|center|Object/.test(tokens[0])) + return; + if (!/top|bottom|center|Object/.test(tokens[1])) + return; + return tokens.map(function(position) { + return typeof position == 'object' ? position : offsetMap[position]; + }); + } + + var mergeOffsetList = scope.mergeNestedRepeated.bind(null, scope.mergeDimensions, ' '); + scope.addPropertiesHandler(parseOrigin.bind(null, 3), mergeOffsetList, ['transform-origin']); + scope.addPropertiesHandler(parseOrigin.bind(null, 2), mergeOffsetList, ['perspective-origin']); + + function consumePosition(string) { + var result = scope.consumeRepeated(consumeOffset, /^/, string); + if (!result) { + return; + } + + var tokens = result[0]; + var out = [{'%': 50}, {'%': 50}]; + var pos = 0; + var bottomOrRight = false; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (typeof token == 'string') { + bottomOrRight = /bottom|right/.test(token); + pos = {left: 0, right: 0, center: pos, top: 1, bottom: 1}[token]; + out[pos] = offsetMap[token]; + if (token == 'center') { + // Center doesn't accept a length offset. + pos++; + } + } else { + if (bottomOrRight) { + // If bottom or right we need to subtract the length from 100% + token = negateDimension(token); + token['%'] = (token['%'] || 0) + 100; + } + out[pos] = token; + pos++; + bottomOrRight = false; + } + } + return [out, result[1]]; + } + + function parsePositionList(string) { + var result = scope.consumeRepeated(consumePosition, /^,/, string); + if (result && result[1] == '') { + return result[0]; + } + } + + scope.consumePosition = consumePosition; + scope.mergeOffsetList = mergeOffsetList; + + var mergePositionList = scope.mergeNestedRepeated.bind(null, mergeOffsetList, ', '); + scope.addPropertiesHandler(parsePositionList, mergePositionList, ['background-position', 'object-position']); + +})(webAnimations1); |