193 lines
4.6 KiB
JavaScript
193 lines
4.6 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
exports.__esModule = true;
|
||
|
|
||
|
var _has = require('has');
|
||
|
|
||
|
var _has2 = _interopRequireDefault(_has);
|
||
|
|
||
|
var _postcss = require('postcss');
|
||
|
|
||
|
var _postcss2 = _interopRequireDefault(_postcss);
|
||
|
|
||
|
var _postcssValueParser = require('postcss-value-parser');
|
||
|
|
||
|
var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
function getValues(list, _ref, index) {
|
||
|
var value = _ref.value;
|
||
|
|
||
|
if (index % 2 === 0) {
|
||
|
return [].concat(list, [parseFloat(value)]);
|
||
|
}
|
||
|
return list;
|
||
|
}
|
||
|
|
||
|
function matrix3d(node, values) {
|
||
|
// matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1) => matrix(a, b, c, d, tx, ty)
|
||
|
if (values[15] && values[2] === 0 && values[3] === 0 && values[6] === 0 && values[7] === 0 && values[8] === 0 && values[9] === 0 && values[10] === 1 && values[11] === 0 && values[14] === 0 && values[15] === 1) {
|
||
|
var nodes = node.nodes;
|
||
|
|
||
|
node.value = 'matrix';
|
||
|
node.nodes = [nodes[0], // a
|
||
|
nodes[1], // ,
|
||
|
nodes[2], // b
|
||
|
nodes[3], // ,
|
||
|
nodes[8], // c
|
||
|
nodes[9], // ,
|
||
|
nodes[10], // d
|
||
|
nodes[11], // ,
|
||
|
nodes[24], // tx
|
||
|
nodes[25], // ,
|
||
|
nodes[26]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var rotate3dMappings = [['rotateX', [1, 0, 0]], // rotate3d(1, 0, 0, a) => rotateX(a)
|
||
|
['rotateY', [0, 1, 0]], // rotate3d(0, 1, 0, a) => rotateY(a)
|
||
|
['rotate', [0, 0, 1]]];
|
||
|
|
||
|
function rotate3dMatch(values) {
|
||
|
return values.reduce(function (list, arg, i) {
|
||
|
return list.filter(function (value) {
|
||
|
return value[1][i] === arg;
|
||
|
});
|
||
|
}, rotate3dMappings);
|
||
|
}
|
||
|
|
||
|
function rotate3d(node, values) {
|
||
|
var nodes = node.nodes;
|
||
|
|
||
|
if (!nodes[6]) {
|
||
|
return;
|
||
|
}
|
||
|
var match = rotate3dMatch(values.slice(0, 3));
|
||
|
if (match.length) {
|
||
|
node.value = match[0][0];
|
||
|
node.nodes = [nodes[6]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function rotateZ(node) {
|
||
|
// rotateZ(rz) => rotate(rz)
|
||
|
node.value = 'rotate';
|
||
|
}
|
||
|
|
||
|
function scale(node, values) {
|
||
|
var nodes = node.nodes;
|
||
|
|
||
|
if (!nodes[2]) {
|
||
|
return;
|
||
|
}
|
||
|
var first = values[0];
|
||
|
var second = values[1];
|
||
|
// scale(sx, sy) => scale(sx)
|
||
|
|
||
|
if (first === second) {
|
||
|
node.nodes = [nodes[0]];
|
||
|
return;
|
||
|
}
|
||
|
// scale(sx, 1) => scaleX(sx)
|
||
|
if (second === 1) {
|
||
|
node.value = 'scaleX';
|
||
|
node.nodes = [nodes[0]];
|
||
|
return;
|
||
|
}
|
||
|
// scale(1, sy) => scaleY(sy)
|
||
|
if (first === 1) {
|
||
|
node.value = 'scaleY';
|
||
|
node.nodes = [nodes[2]];
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function scale3d(node, values) {
|
||
|
var nodes = node.nodes;
|
||
|
|
||
|
if (!nodes[4]) {
|
||
|
return;
|
||
|
}
|
||
|
var first = values[0];
|
||
|
var second = values[1];
|
||
|
var third = values[2];
|
||
|
// scale3d(sx, 1, 1) => scaleX(sx)
|
||
|
|
||
|
if (second === 1 && third === 1) {
|
||
|
node.value = 'scaleX';
|
||
|
node.nodes = [nodes[0]];
|
||
|
return;
|
||
|
}
|
||
|
// scale3d(1, sy, 1) => scaleY(sy)
|
||
|
if (first === 1 && third === 1) {
|
||
|
node.value = 'scaleY';
|
||
|
node.nodes = [nodes[2]];
|
||
|
return;
|
||
|
}
|
||
|
// scale3d(1, 1, sz) => scaleZ(sz)
|
||
|
if (first === 1 && second === 1) {
|
||
|
node.value = 'scaleZ';
|
||
|
node.nodes = [nodes[4]];
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function translate(node, values) {
|
||
|
var nodes = node.nodes;
|
||
|
|
||
|
if (!nodes[2]) {
|
||
|
return;
|
||
|
}
|
||
|
// translate(tx, 0) => translate(tx)
|
||
|
if (values[1] === 0) {
|
||
|
node.nodes = [nodes[0]];
|
||
|
return;
|
||
|
}
|
||
|
// translate(0, ty) => translateY(ty)
|
||
|
if (values[0] === 0) {
|
||
|
node.value = 'translateY';
|
||
|
node.nodes = [nodes[2]];
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function translate3d(node, values) {
|
||
|
var nodes = node.nodes;
|
||
|
// translate3d(0, 0, tz) => translateZ(tz)
|
||
|
|
||
|
if (nodes[4] && values[0] === 0 && values[1] === 0) {
|
||
|
node.value = 'translateZ';
|
||
|
node.nodes = [nodes[4]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var reducers = {
|
||
|
matrix3d: matrix3d,
|
||
|
rotate3d: rotate3d,
|
||
|
rotateZ: rotateZ,
|
||
|
scale: scale,
|
||
|
scale3d: scale3d,
|
||
|
translate: translate,
|
||
|
translate3d: translate3d
|
||
|
};
|
||
|
|
||
|
function reduce(node) {
|
||
|
var nodes = node.nodes;
|
||
|
var type = node.type;
|
||
|
var value = node.value;
|
||
|
|
||
|
if (type === 'function' && (0, _has2.default)(reducers, value)) {
|
||
|
reducers[value](node, nodes.reduce(getValues, []));
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
exports.default = _postcss2.default.plugin('postcss-reduce-transforms', function () {
|
||
|
return function (css) {
|
||
|
css.walkDecls(/transform$/, function (decl) {
|
||
|
decl.value = (0, _postcssValueParser2.default)(decl.value).walk(reduce).toString();
|
||
|
});
|
||
|
};
|
||
|
});
|
||
|
module.exports = exports['default'];
|