89 lines
2.9 KiB
JavaScript
89 lines
2.9 KiB
JavaScript
// 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);
|
|
}); |