123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 |
- "use strict";
- function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
- function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); }
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
- function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); }
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
- var parser = require('postcss-value-parser');
- var range = require('normalize-range');
- var OldValue = require('../old-value');
- var Value = require('../value');
- var utils = require('../utils');
- var IS_DIRECTION = /top|left|right|bottom/gi;
- var Gradient = /*#__PURE__*/function (_Value) {
- _inheritsLoose(Gradient, _Value);
- function Gradient() {
- var _this;
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- _this = _Value.call.apply(_Value, [this].concat(args)) || this;
- _defineProperty(_assertThisInitialized(_this), "directions", {
- top: 'bottom',
- left: 'right',
- bottom: 'top',
- right: 'left'
- });
- _defineProperty(_assertThisInitialized(_this), "oldDirections", {
- 'top': 'left bottom, left top',
- 'left': 'right top, left top',
- 'bottom': 'left top, left bottom',
- 'right': 'left top, right top',
- 'top right': 'left bottom, right top',
- 'top left': 'right bottom, left top',
- 'right top': 'left bottom, right top',
- 'right bottom': 'left top, right bottom',
- 'bottom right': 'left top, right bottom',
- 'bottom left': 'right top, left bottom',
- 'left top': 'right bottom, left top',
- 'left bottom': 'right top, left bottom'
- });
- return _this;
- }
- var _proto = Gradient.prototype;
- /**
- * Change degrees for webkit prefix
- */
- _proto.replace = function replace(string, prefix) {
- var ast = parser(string);
- for (var _iterator = _createForOfIteratorHelperLoose(ast.nodes), _step; !(_step = _iterator()).done;) {
- var node = _step.value;
- if (node.type === 'function' && node.value === this.name) {
- node.nodes = this.newDirection(node.nodes);
- node.nodes = this.normalize(node.nodes);
- if (prefix === '-webkit- old') {
- var changes = this.oldWebkit(node);
- if (!changes) {
- return false;
- }
- } else {
- node.nodes = this.convertDirection(node.nodes);
- node.value = prefix + node.value;
- }
- }
- }
- return ast.toString();
- }
- /**
- * Replace first token
- */
- ;
- _proto.replaceFirst = function replaceFirst(params) {
- for (var _len2 = arguments.length, words = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
- words[_key2 - 1] = arguments[_key2];
- }
- var prefix = words.map(function (i) {
- if (i === ' ') {
- return {
- type: 'space',
- value: i
- };
- }
- return {
- type: 'word',
- value: i
- };
- });
- return prefix.concat(params.slice(1));
- }
- /**
- * Convert angle unit to deg
- */
- ;
- _proto.normalizeUnit = function normalizeUnit(str, full) {
- var num = parseFloat(str);
- var deg = num / full * 360;
- return deg + "deg";
- }
- /**
- * Normalize angle
- */
- ;
- _proto.normalize = function normalize(nodes) {
- if (!nodes[0]) return nodes;
- if (/-?\d+(.\d+)?grad/.test(nodes[0].value)) {
- nodes[0].value = this.normalizeUnit(nodes[0].value, 400);
- } else if (/-?\d+(.\d+)?rad/.test(nodes[0].value)) {
- nodes[0].value = this.normalizeUnit(nodes[0].value, 2 * Math.PI);
- } else if (/-?\d+(.\d+)?turn/.test(nodes[0].value)) {
- nodes[0].value = this.normalizeUnit(nodes[0].value, 1);
- } else if (nodes[0].value.includes('deg')) {
- var num = parseFloat(nodes[0].value);
- num = range.wrap(0, 360, num);
- nodes[0].value = num + "deg";
- }
- if (nodes[0].value === '0deg') {
- nodes = this.replaceFirst(nodes, 'to', ' ', 'top');
- } else if (nodes[0].value === '90deg') {
- nodes = this.replaceFirst(nodes, 'to', ' ', 'right');
- } else if (nodes[0].value === '180deg') {
- nodes = this.replaceFirst(nodes, 'to', ' ', 'bottom');
- } else if (nodes[0].value === '270deg') {
- nodes = this.replaceFirst(nodes, 'to', ' ', 'left');
- }
- return nodes;
- }
- /**
- * Replace old direction to new
- */
- ;
- _proto.newDirection = function newDirection(params) {
- if (params[0].value === 'to') {
- return params;
- }
- IS_DIRECTION.lastIndex = 0; // reset search index of global regexp
- if (!IS_DIRECTION.test(params[0].value)) {
- return params;
- }
- params.unshift({
- type: 'word',
- value: 'to'
- }, {
- type: 'space',
- value: ' '
- });
- for (var i = 2; i < params.length; i++) {
- if (params[i].type === 'div') {
- break;
- }
- if (params[i].type === 'word') {
- params[i].value = this.revertDirection(params[i].value);
- }
- }
- return params;
- }
- /**
- * Look for at word
- */
- ;
- _proto.isRadial = function isRadial(params) {
- var state = 'before';
- for (var _iterator2 = _createForOfIteratorHelperLoose(params), _step2; !(_step2 = _iterator2()).done;) {
- var param = _step2.value;
- if (state === 'before' && param.type === 'space') {
- state = 'at';
- } else if (state === 'at' && param.value === 'at') {
- state = 'after';
- } else if (state === 'after' && param.type === 'space') {
- return true;
- } else if (param.type === 'div') {
- break;
- } else {
- state = 'before';
- }
- }
- return false;
- }
- /**
- * Change new direction to old
- */
- ;
- _proto.convertDirection = function convertDirection(params) {
- if (params.length > 0) {
- if (params[0].value === 'to') {
- this.fixDirection(params);
- } else if (params[0].value.includes('deg')) {
- this.fixAngle(params);
- } else if (this.isRadial(params)) {
- this.fixRadial(params);
- }
- }
- return params;
- }
- /**
- * Replace `to top left` to `bottom right`
- */
- ;
- _proto.fixDirection = function fixDirection(params) {
- params.splice(0, 2);
- for (var _iterator3 = _createForOfIteratorHelperLoose(params), _step3; !(_step3 = _iterator3()).done;) {
- var param = _step3.value;
- if (param.type === 'div') {
- break;
- }
- if (param.type === 'word') {
- param.value = this.revertDirection(param.value);
- }
- }
- }
- /**
- * Add 90 degrees
- */
- ;
- _proto.fixAngle = function fixAngle(params) {
- var first = params[0].value;
- first = parseFloat(first);
- first = Math.abs(450 - first) % 360;
- first = this.roundFloat(first, 3);
- params[0].value = first + "deg";
- }
- /**
- * Fix radial direction syntax
- */
- ;
- _proto.fixRadial = function fixRadial(params) {
- var first = [];
- var second = [];
- var a, b, c, i, next;
- for (i = 0; i < params.length - 2; i++) {
- a = params[i];
- b = params[i + 1];
- c = params[i + 2];
- if (a.type === 'space' && b.value === 'at' && c.type === 'space') {
- next = i + 3;
- break;
- } else {
- first.push(a);
- }
- }
- var div;
- for (i = next; i < params.length; i++) {
- if (params[i].type === 'div') {
- div = params[i];
- break;
- } else {
- second.push(params[i]);
- }
- }
- params.splice.apply(params, [0, i].concat(second, [div], first));
- };
- _proto.revertDirection = function revertDirection(word) {
- return this.directions[word.toLowerCase()] || word;
- }
- /**
- * Round float and save digits under dot
- */
- ;
- _proto.roundFloat = function roundFloat(_float, digits) {
- return parseFloat(_float.toFixed(digits));
- }
- /**
- * Convert to old webkit syntax
- */
- ;
- _proto.oldWebkit = function oldWebkit(node) {
- var nodes = node.nodes;
- var string = parser.stringify(node.nodes);
- if (this.name !== 'linear-gradient') {
- return false;
- }
- if (nodes[0] && nodes[0].value.includes('deg')) {
- return false;
- }
- if (string.includes('px') || string.includes('-corner') || string.includes('-side')) {
- return false;
- }
- var params = [[]];
- for (var _iterator4 = _createForOfIteratorHelperLoose(nodes), _step4; !(_step4 = _iterator4()).done;) {
- var i = _step4.value;
- params[params.length - 1].push(i);
- if (i.type === 'div' && i.value === ',') {
- params.push([]);
- }
- }
- this.oldDirection(params);
- this.colorStops(params);
- node.nodes = [];
- for (var _i = 0, _params = params; _i < _params.length; _i++) {
- var param = _params[_i];
- node.nodes = node.nodes.concat(param);
- }
- node.nodes.unshift({
- type: 'word',
- value: 'linear'
- }, this.cloneDiv(node.nodes));
- node.value = '-webkit-gradient';
- return true;
- }
- /**
- * Change direction syntax to old webkit
- */
- ;
- _proto.oldDirection = function oldDirection(params) {
- var div = this.cloneDiv(params[0]);
- if (params[0][0].value !== 'to') {
- return params.unshift([{
- type: 'word',
- value: this.oldDirections.bottom
- }, div]);
- } else {
- var words = [];
- for (var _iterator5 = _createForOfIteratorHelperLoose(params[0].slice(2)), _step5; !(_step5 = _iterator5()).done;) {
- var node = _step5.value;
- if (node.type === 'word') {
- words.push(node.value.toLowerCase());
- }
- }
- words = words.join(' ');
- var old = this.oldDirections[words] || words;
- params[0] = [{
- type: 'word',
- value: old
- }, div];
- return params[0];
- }
- }
- /**
- * Get div token from exists parameters
- */
- ;
- _proto.cloneDiv = function cloneDiv(params) {
- for (var _iterator6 = _createForOfIteratorHelperLoose(params), _step6; !(_step6 = _iterator6()).done;) {
- var i = _step6.value;
- if (i.type === 'div' && i.value === ',') {
- return i;
- }
- }
- return {
- type: 'div',
- value: ',',
- after: ' '
- };
- }
- /**
- * Change colors syntax to old webkit
- */
- ;
- _proto.colorStops = function colorStops(params) {
- var result = [];
- for (var i = 0; i < params.length; i++) {
- var pos = void 0;
- var param = params[i];
- var item = void 0;
- if (i === 0) {
- continue;
- }
- var color = parser.stringify(param[0]);
- if (param[1] && param[1].type === 'word') {
- pos = param[1].value;
- } else if (param[2] && param[2].type === 'word') {
- pos = param[2].value;
- }
- var stop = void 0;
- if (i === 1 && (!pos || pos === '0%')) {
- stop = "from(" + color + ")";
- } else if (i === params.length - 1 && (!pos || pos === '100%')) {
- stop = "to(" + color + ")";
- } else if (pos) {
- stop = "color-stop(" + pos + ", " + color + ")";
- } else {
- stop = "color-stop(" + color + ")";
- }
- var div = param[param.length - 1];
- params[i] = [{
- type: 'word',
- value: stop
- }];
- if (div.type === 'div' && div.value === ',') {
- item = params[i].push(div);
- }
- result.push(item);
- }
- return result;
- }
- /**
- * Remove old WebKit gradient too
- */
- ;
- _proto.old = function old(prefix) {
- if (prefix === '-webkit-') {
- var type = this.name === 'linear-gradient' ? 'linear' : 'radial';
- var string = '-gradient';
- var regexp = utils.regexp("-webkit-(" + type + "-gradient|gradient\\(\\s*" + type + ")", false);
- return new OldValue(this.name, prefix + this.name, string, regexp);
- } else {
- return _Value.prototype.old.call(this, prefix);
- }
- }
- /**
- * Do not add non-webkit prefixes for list-style and object
- */
- ;
- _proto.add = function add(decl, prefix) {
- var p = decl.prop;
- if (p.includes('mask')) {
- if (prefix === '-webkit-' || prefix === '-webkit- old') {
- return _Value.prototype.add.call(this, decl, prefix);
- }
- } else if (p === 'list-style' || p === 'list-style-image' || p === 'content') {
- if (prefix === '-webkit-' || prefix === '-webkit- old') {
- return _Value.prototype.add.call(this, decl, prefix);
- }
- } else {
- return _Value.prototype.add.call(this, decl, prefix);
- }
- return undefined;
- };
- return Gradient;
- }(Value);
- _defineProperty(Gradient, "names", ['linear-gradient', 'repeating-linear-gradient', 'radial-gradient', 'repeating-radial-gradient']);
- module.exports = Gradient;
|