UNPKG

snapsvg

Version:
90 lines (89 loc) 3.01 kB
// Copyright (c) 2013 Adobe Systems Incorporated. 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. Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { var operators = { "+": function (x, y) { return x + y; }, "-": function (x, y) { return x - y; }, "/": function (x, y) { return x / y; }, "*": function (x, y) { return x * y; } }, Str = String, reUnit = /[a-z]+$/i, reAddon = /^\s*([+\-\/*])\s*=\s*([\d.eE+\-]+)\s*([^\d\s]+)?\s*$/; function getNumber(val) { return val; } function getUnit(unit) { return function (val) { return +val.toFixed(3) + unit; }; } eve.on("snap.util.attr", function (val) { var plus = Str(val).match(reAddon); if (plus) { var evnt = eve.nt(), name = evnt.substring(evnt.lastIndexOf(".") + 1), a = this.attr(name), atr = {}; eve.stop(); var unit = plus[3] || "", aUnit = a.match(reUnit), op = operators[plus[1]]; if (aUnit && aUnit == unit) { val = op(parseFloat(a), +plus[2]); } else { a = this.asPX(name); val = op(this.asPX(name), this.asPX(name, plus[2] + unit)); } if (isNaN(a) || isNaN(val)) { return; } atr[name] = val; this.attr(atr); } })(-10); eve.on("snap.util.equal", function (name, b) { var A, B, a = Str(this.attr(name) || ""), el = this, bplus = Str(b).match(reAddon); if (bplus) { eve.stop(); var unit = bplus[3] || "", aUnit = a.match(reUnit), op = operators[bplus[1]]; if (aUnit && aUnit == unit) { return { from: parseFloat(a), to: op(parseFloat(a), +bplus[2]), f: getUnit(aUnit) }; } else { a = this.asPX(name); return { from: a, to: op(a, this.asPX(name, bplus[2] + unit)), f: getNumber }; } } })(-10); });