775 lines
63 KiB
JavaScript
775 lines
63 KiB
JavaScript
|
"use strict";
|
|||
|
|
|||
|
exports.__esModule = true;
|
|||
|
exports.default = void 0;
|
|||
|
|
|||
|
var _declaration = _interopRequireDefault(require("./declaration"));
|
|||
|
|
|||
|
var _comment = _interopRequireDefault(require("./comment"));
|
|||
|
|
|||
|
var _node = _interopRequireDefault(require("./node"));
|
|||
|
|
|||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: 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 _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|||
|
|
|||
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|||
|
|
|||
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|||
|
|
|||
|
function cleanSource(nodes) {
|
|||
|
return nodes.map(function (i) {
|
|||
|
if (i.nodes) i.nodes = cleanSource(i.nodes);
|
|||
|
delete i.source;
|
|||
|
return i;
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* The {@link Root}, {@link AtRule}, and {@link Rule} container nodes
|
|||
|
* inherit some common methods to help work with their children.
|
|||
|
*
|
|||
|
* Note that all containers can store any content. If you write a rule inside
|
|||
|
* a rule, PostCSS will parse it.
|
|||
|
*
|
|||
|
* @extends Node
|
|||
|
* @abstract
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
var Container = /*#__PURE__*/function (_Node) {
|
|||
|
_inheritsLoose(Container, _Node);
|
|||
|
|
|||
|
function Container() {
|
|||
|
return _Node.apply(this, arguments) || this;
|
|||
|
}
|
|||
|
|
|||
|
var _proto = Container.prototype;
|
|||
|
|
|||
|
_proto.push = function push(child) {
|
|||
|
child.parent = this;
|
|||
|
this.nodes.push(child);
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Iterates through the container’s immediate children,
|
|||
|
* calling `callback` for each child.
|
|||
|
*
|
|||
|
* Returning `false` in the callback will break iteration.
|
|||
|
*
|
|||
|
* This method only iterates through the container’s immediate children.
|
|||
|
* If you need to recursively iterate through all the container’s descendant
|
|||
|
* nodes, use {@link Container#walk}.
|
|||
|
*
|
|||
|
* Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe
|
|||
|
* if you are mutating the array of child nodes during iteration.
|
|||
|
* PostCSS will adjust the current index to match the mutations.
|
|||
|
*
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} Returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const root = postcss.parse('a { color: black; z-index: 1 }')
|
|||
|
* const rule = root.first
|
|||
|
*
|
|||
|
* for (const decl of rule.nodes) {
|
|||
|
* decl.cloneBefore({ prop: '-webkit-' + decl.prop })
|
|||
|
* // Cycle will be infinite, because cloneBefore moves the current node
|
|||
|
* // to the next index
|
|||
|
* }
|
|||
|
*
|
|||
|
* rule.each(decl => {
|
|||
|
* decl.cloneBefore({ prop: '-webkit-' + decl.prop })
|
|||
|
* // Will be executed only for color and z-index
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.each = function each(callback) {
|
|||
|
if (!this.lastEach) this.lastEach = 0;
|
|||
|
if (!this.indexes) this.indexes = {};
|
|||
|
this.lastEach += 1;
|
|||
|
var id = this.lastEach;
|
|||
|
this.indexes[id] = 0;
|
|||
|
if (!this.nodes) return undefined;
|
|||
|
var index, result;
|
|||
|
|
|||
|
while (this.indexes[id] < this.nodes.length) {
|
|||
|
index = this.indexes[id];
|
|||
|
result = callback(this.nodes[index], index);
|
|||
|
if (result === false) break;
|
|||
|
this.indexes[id] += 1;
|
|||
|
}
|
|||
|
|
|||
|
delete this.indexes[id];
|
|||
|
return result;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Traverses the container’s descendant nodes, calling callback
|
|||
|
* for each node.
|
|||
|
*
|
|||
|
* Like container.each(), this method is safe to use
|
|||
|
* if you are mutating arrays during iteration.
|
|||
|
*
|
|||
|
* If you only need to iterate through the container’s immediate children,
|
|||
|
* use {@link Container#each}.
|
|||
|
*
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} Returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* root.walk(node => {
|
|||
|
* // Traverses all descendant nodes.
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.walk = function walk(callback) {
|
|||
|
return this.each(function (child, i) {
|
|||
|
var result;
|
|||
|
|
|||
|
try {
|
|||
|
result = callback(child, i);
|
|||
|
} catch (e) {
|
|||
|
e.postcssNode = child;
|
|||
|
|
|||
|
if (e.stack && child.source && /\n\s{4}at /.test(e.stack)) {
|
|||
|
var s = child.source;
|
|||
|
e.stack = e.stack.replace(/\n\s{4}at /, "$&" + s.input.from + ":" + s.start.line + ":" + s.start.column + "$&");
|
|||
|
}
|
|||
|
|
|||
|
throw e;
|
|||
|
}
|
|||
|
|
|||
|
if (result !== false && child.walk) {
|
|||
|
result = child.walk(callback);
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Traverses the container’s descendant nodes, calling callback
|
|||
|
* for each declaration node.
|
|||
|
*
|
|||
|
* If you pass a filter, iteration will only happen over declarations
|
|||
|
* with matching properties.
|
|||
|
*
|
|||
|
* Like {@link Container#each}, this method is safe
|
|||
|
* to use if you are mutating arrays during iteration.
|
|||
|
*
|
|||
|
* @param {string|RegExp} [prop] String or regular expression
|
|||
|
* to filter declarations by property name.
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} Returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* root.walkDecls(decl => {
|
|||
|
* checkPropertySupport(decl.prop)
|
|||
|
* })
|
|||
|
*
|
|||
|
* root.walkDecls('border-radius', decl => {
|
|||
|
* decl.remove()
|
|||
|
* })
|
|||
|
*
|
|||
|
* root.walkDecls(/^background/, decl => {
|
|||
|
* decl.value = takeFirstColorFromGradient(decl.value)
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.walkDecls = function walkDecls(prop, callback) {
|
|||
|
if (!callback) {
|
|||
|
callback = prop;
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'decl') {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (prop instanceof RegExp) {
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'decl' && prop.test(child.prop)) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'decl' && child.prop === prop) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Traverses the container’s descendant nodes, calling callback
|
|||
|
* for each rule node.
|
|||
|
*
|
|||
|
* If you pass a filter, iteration will only happen over rules
|
|||
|
* with matching selectors.
|
|||
|
*
|
|||
|
* Like {@link Container#each}, this method is safe
|
|||
|
* to use if you are mutating arrays during iteration.
|
|||
|
*
|
|||
|
* @param {string|RegExp} [selector] String or regular expression
|
|||
|
* to filter rules by selector.
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const selectors = []
|
|||
|
* root.walkRules(rule => {
|
|||
|
* selectors.push(rule.selector)
|
|||
|
* })
|
|||
|
* console.log(`Your CSS uses ${ selectors.length } selectors`)
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.walkRules = function walkRules(selector, callback) {
|
|||
|
if (!callback) {
|
|||
|
callback = selector;
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'rule') {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (selector instanceof RegExp) {
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'rule' && selector.test(child.selector)) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'rule' && child.selector === selector) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Traverses the container’s descendant nodes, calling callback
|
|||
|
* for each at-rule node.
|
|||
|
*
|
|||
|
* If you pass a filter, iteration will only happen over at-rules
|
|||
|
* that have matching names.
|
|||
|
*
|
|||
|
* Like {@link Container#each}, this method is safe
|
|||
|
* to use if you are mutating arrays during iteration.
|
|||
|
*
|
|||
|
* @param {string|RegExp} [name] String or regular expression
|
|||
|
* to filter at-rules by name.
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} Returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* root.walkAtRules(rule => {
|
|||
|
* if (isOld(rule.name)) rule.remove()
|
|||
|
* })
|
|||
|
*
|
|||
|
* let first = false
|
|||
|
* root.walkAtRules('charset', rule => {
|
|||
|
* if (!first) {
|
|||
|
* first = true
|
|||
|
* } else {
|
|||
|
* rule.remove()
|
|||
|
* }
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.walkAtRules = function walkAtRules(name, callback) {
|
|||
|
if (!callback) {
|
|||
|
callback = name;
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'atrule') {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (name instanceof RegExp) {
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'atrule' && name.test(child.name)) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'atrule' && child.name === name) {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Traverses the container’s descendant nodes, calling callback
|
|||
|
* for each comment node.
|
|||
|
*
|
|||
|
* Like {@link Container#each}, this method is safe
|
|||
|
* to use if you are mutating arrays during iteration.
|
|||
|
*
|
|||
|
* @param {childIterator} callback Iterator receives each node and index.
|
|||
|
*
|
|||
|
* @return {false|undefined} Returns `false` if iteration was broke.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* root.walkComments(comment => {
|
|||
|
* comment.remove()
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.walkComments = function walkComments(callback) {
|
|||
|
return this.walk(function (child, i) {
|
|||
|
if (child.type === 'comment') {
|
|||
|
return callback(child, i);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Inserts new nodes to the end of the container.
|
|||
|
*
|
|||
|
* @param {...(Node|object|string|Node[])} children New nodes.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const decl1 = postcss.decl({ prop: 'color', value: 'black' })
|
|||
|
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' })
|
|||
|
* rule.append(decl1, decl2)
|
|||
|
*
|
|||
|
* root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule
|
|||
|
* root.append({ selector: 'a' }) // rule
|
|||
|
* rule.append({ prop: 'color', value: 'black' }) // declaration
|
|||
|
* rule.append({ text: 'Comment' }) // comment
|
|||
|
*
|
|||
|
* root.append('a {}')
|
|||
|
* root.first.append('color: black; z-index: 1')
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.append = function append() {
|
|||
|
for (var _len = arguments.length, children = new Array(_len), _key = 0; _key < _len; _key++) {
|
|||
|
children[_key] = arguments[_key];
|
|||
|
}
|
|||
|
|
|||
|
for (var _i = 0, _children = children; _i < _children.length; _i++) {
|
|||
|
var child = _children[_i];
|
|||
|
var nodes = this.normalize(child, this.last);
|
|||
|
|
|||
|
for (var _iterator = _createForOfIteratorHelperLoose(nodes), _step; !(_step = _iterator()).done;) {
|
|||
|
var node = _step.value;
|
|||
|
this.nodes.push(node);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Inserts new nodes to the start of the container.
|
|||
|
*
|
|||
|
* @param {...(Node|object|string|Node[])} children New nodes.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const decl1 = postcss.decl({ prop: 'color', value: 'black' })
|
|||
|
* const decl2 = postcss.decl({ prop: 'background-color', value: 'white' })
|
|||
|
* rule.prepend(decl1, decl2)
|
|||
|
*
|
|||
|
* root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule
|
|||
|
* root.append({ selector: 'a' }) // rule
|
|||
|
* rule.append({ prop: 'color', value: 'black' }) // declaration
|
|||
|
* rule.append({ text: 'Comment' }) // comment
|
|||
|
*
|
|||
|
* root.append('a {}')
|
|||
|
* root.first.append('color: black; z-index: 1')
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.prepend = function prepend() {
|
|||
|
for (var _len2 = arguments.length, children = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|||
|
children[_key2] = arguments[_key2];
|
|||
|
}
|
|||
|
|
|||
|
children = children.reverse();
|
|||
|
|
|||
|
for (var _iterator2 = _createForOfIteratorHelperLoose(children), _step2; !(_step2 = _iterator2()).done;) {
|
|||
|
var child = _step2.value;
|
|||
|
var nodes = this.normalize(child, this.first, 'prepend').reverse();
|
|||
|
|
|||
|
for (var _iterator3 = _createForOfIteratorHelperLoose(nodes), _step3; !(_step3 = _iterator3()).done;) {
|
|||
|
var node = _step3.value;
|
|||
|
this.nodes.unshift(node);
|
|||
|
}
|
|||
|
|
|||
|
for (var id in this.indexes) {
|
|||
|
this.indexes[id] = this.indexes[id] + nodes.length;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
_proto.cleanRaws = function cleanRaws(keepBetween) {
|
|||
|
_Node.prototype.cleanRaws.call(this, keepBetween);
|
|||
|
|
|||
|
if (this.nodes) {
|
|||
|
for (var _iterator4 = _createForOfIteratorHelperLoose(this.nodes), _step4; !(_step4 = _iterator4()).done;) {
|
|||
|
var node = _step4.value;
|
|||
|
node.cleanRaws(keepBetween);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* Insert new node before old node within the container.
|
|||
|
*
|
|||
|
* @param {Node|number} exist Child or child’s index.
|
|||
|
* @param {Node|object|string|Node[]} add New node.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop }))
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.insertBefore = function insertBefore(exist, add) {
|
|||
|
exist = this.index(exist);
|
|||
|
var type = exist === 0 ? 'prepend' : false;
|
|||
|
var nodes = this.normalize(add, this.nodes[exist], type).reverse();
|
|||
|
|
|||
|
for (var _iterator5 = _createForOfIteratorHelperLoose(nodes), _step5; !(_step5 = _iterator5()).done;) {
|
|||
|
var node = _step5.value;
|
|||
|
this.nodes.splice(exist, 0, node);
|
|||
|
}
|
|||
|
|
|||
|
var index;
|
|||
|
|
|||
|
for (var id in this.indexes) {
|
|||
|
index = this.indexes[id];
|
|||
|
|
|||
|
if (exist <= index) {
|
|||
|
this.indexes[id] = index + nodes.length;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Insert new node after old node within the container.
|
|||
|
*
|
|||
|
* @param {Node|number} exist Child or child’s index.
|
|||
|
* @param {Node|object|string|Node[]} add New node.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.insertAfter = function insertAfter(exist, add) {
|
|||
|
exist = this.index(exist);
|
|||
|
var nodes = this.normalize(add, this.nodes[exist]).reverse();
|
|||
|
|
|||
|
for (var _iterator6 = _createForOfIteratorHelperLoose(nodes), _step6; !(_step6 = _iterator6()).done;) {
|
|||
|
var node = _step6.value;
|
|||
|
this.nodes.splice(exist + 1, 0, node);
|
|||
|
}
|
|||
|
|
|||
|
var index;
|
|||
|
|
|||
|
for (var id in this.indexes) {
|
|||
|
index = this.indexes[id];
|
|||
|
|
|||
|
if (exist < index) {
|
|||
|
this.indexes[id] = index + nodes.length;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Removes node from the container and cleans the parent properties
|
|||
|
* from the node and its children.
|
|||
|
*
|
|||
|
* @param {Node|number} child Child or child’s index.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.nodes.length //=> 5
|
|||
|
* rule.removeChild(decl)
|
|||
|
* rule.nodes.length //=> 4
|
|||
|
* decl.parent //=> undefined
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.removeChild = function removeChild(child) {
|
|||
|
child = this.index(child);
|
|||
|
this.nodes[child].parent = undefined;
|
|||
|
this.nodes.splice(child, 1);
|
|||
|
var index;
|
|||
|
|
|||
|
for (var id in this.indexes) {
|
|||
|
index = this.indexes[id];
|
|||
|
|
|||
|
if (index >= child) {
|
|||
|
this.indexes[id] = index - 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Removes all children from the container
|
|||
|
* and cleans their parent properties.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.removeAll()
|
|||
|
* rule.nodes.length //=> 0
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.removeAll = function removeAll() {
|
|||
|
for (var _iterator7 = _createForOfIteratorHelperLoose(this.nodes), _step7; !(_step7 = _iterator7()).done;) {
|
|||
|
var node = _step7.value;
|
|||
|
node.parent = undefined;
|
|||
|
}
|
|||
|
|
|||
|
this.nodes = [];
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Passes all declaration values within the container that match pattern
|
|||
|
* through callback, replacing those values with the returned result
|
|||
|
* of callback.
|
|||
|
*
|
|||
|
* This method is useful if you are using a custom unit or function
|
|||
|
* and need to iterate through all values.
|
|||
|
*
|
|||
|
* @param {string|RegExp} pattern Replace pattern.
|
|||
|
* @param {object} opts Options to speed up the search.
|
|||
|
* @param {string|string[]} opts.props An array of property names.
|
|||
|
* @param {string} opts.fast String that’s used to narrow down
|
|||
|
* values and speed up the regexp search.
|
|||
|
* @param {function|string} callback String to replace pattern or callback
|
|||
|
* that returns a new value. The callback
|
|||
|
* will receive the same arguments
|
|||
|
* as those passed to a function parameter
|
|||
|
* of `String#replace`.
|
|||
|
*
|
|||
|
* @return {Node} This node for methods chain.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* root.replaceValues(/\d+rem/, { fast: 'rem' }, string => {
|
|||
|
* return 15 * parseInt(string) + 'px'
|
|||
|
* })
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.replaceValues = function replaceValues(pattern, opts, callback) {
|
|||
|
if (!callback) {
|
|||
|
callback = opts;
|
|||
|
opts = {};
|
|||
|
}
|
|||
|
|
|||
|
this.walkDecls(function (decl) {
|
|||
|
if (opts.props && opts.props.indexOf(decl.prop) === -1) return;
|
|||
|
if (opts.fast && decl.value.indexOf(opts.fast) === -1) return;
|
|||
|
decl.value = decl.value.replace(pattern, callback);
|
|||
|
});
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Returns `true` if callback returns `true`
|
|||
|
* for all of the container’s children.
|
|||
|
*
|
|||
|
* @param {childCondition} condition Iterator returns true or false.
|
|||
|
*
|
|||
|
* @return {boolean} Is every child pass condition.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const noPrefixes = rule.every(i => i.prop[0] !== '-')
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.every = function every(condition) {
|
|||
|
return this.nodes.every(condition);
|
|||
|
}
|
|||
|
/**
|
|||
|
* Returns `true` if callback returns `true` for (at least) one
|
|||
|
* of the container’s children.
|
|||
|
*
|
|||
|
* @param {childCondition} condition Iterator returns true or false.
|
|||
|
*
|
|||
|
* @return {boolean} Is some child pass condition.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const hasPrefix = rule.some(i => i.prop[0] === '-')
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.some = function some(condition) {
|
|||
|
return this.nodes.some(condition);
|
|||
|
}
|
|||
|
/**
|
|||
|
* Returns a `child`’s index within the {@link Container#nodes} array.
|
|||
|
*
|
|||
|
* @param {Node} child Child of the current container.
|
|||
|
*
|
|||
|
* @return {number} Child index.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.index( rule.nodes[2] ) //=> 2
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.index = function index(child) {
|
|||
|
if (typeof child === 'number') {
|
|||
|
return child;
|
|||
|
}
|
|||
|
|
|||
|
return this.nodes.indexOf(child);
|
|||
|
}
|
|||
|
/**
|
|||
|
* The container’s first child.
|
|||
|
*
|
|||
|
* @type {Node}
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.first === rules.nodes[0]
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_proto.normalize = function normalize(nodes, sample) {
|
|||
|
var _this = this;
|
|||
|
|
|||
|
if (typeof nodes === 'string') {
|
|||
|
var parse = require('./parse');
|
|||
|
|
|||
|
nodes = cleanSource(parse(nodes).nodes);
|
|||
|
} else if (Array.isArray(nodes)) {
|
|||
|
nodes = nodes.slice(0);
|
|||
|
|
|||
|
for (var _iterator8 = _createForOfIteratorHelperLoose(nodes), _step8; !(_step8 = _iterator8()).done;) {
|
|||
|
var i = _step8.value;
|
|||
|
if (i.parent) i.parent.removeChild(i, 'ignore');
|
|||
|
}
|
|||
|
} else if (nodes.type === 'root') {
|
|||
|
nodes = nodes.nodes.slice(0);
|
|||
|
|
|||
|
for (var _iterator9 = _createForOfIteratorHelperLoose(nodes), _step9; !(_step9 = _iterator9()).done;) {
|
|||
|
var _i2 = _step9.value;
|
|||
|
if (_i2.parent) _i2.parent.removeChild(_i2, 'ignore');
|
|||
|
}
|
|||
|
} else if (nodes.type) {
|
|||
|
nodes = [nodes];
|
|||
|
} else if (nodes.prop) {
|
|||
|
if (typeof nodes.value === 'undefined') {
|
|||
|
throw new Error('Value field is missed in node creation');
|
|||
|
} else if (typeof nodes.value !== 'string') {
|
|||
|
nodes.value = String(nodes.value);
|
|||
|
}
|
|||
|
|
|||
|
nodes = [new _declaration.default(nodes)];
|
|||
|
} else if (nodes.selector) {
|
|||
|
var Rule = require('./rule');
|
|||
|
|
|||
|
nodes = [new Rule(nodes)];
|
|||
|
} else if (nodes.name) {
|
|||
|
var AtRule = require('./at-rule');
|
|||
|
|
|||
|
nodes = [new AtRule(nodes)];
|
|||
|
} else if (nodes.text) {
|
|||
|
nodes = [new _comment.default(nodes)];
|
|||
|
} else {
|
|||
|
throw new Error('Unknown node type in node creation');
|
|||
|
}
|
|||
|
|
|||
|
var processed = nodes.map(function (i) {
|
|||
|
if (i.parent) i.parent.removeChild(i);
|
|||
|
|
|||
|
if (typeof i.raws.before === 'undefined') {
|
|||
|
if (sample && typeof sample.raws.before !== 'undefined') {
|
|||
|
i.raws.before = sample.raws.before.replace(/[^\s]/g, '');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
i.parent = _this;
|
|||
|
return i;
|
|||
|
});
|
|||
|
return processed;
|
|||
|
}
|
|||
|
/**
|
|||
|
* @memberof Container#
|
|||
|
* @member {Node[]} nodes An array containing the container’s children.
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const root = postcss.parse('a { color: black }')
|
|||
|
* root.nodes.length //=> 1
|
|||
|
* root.nodes[0].selector //=> 'a'
|
|||
|
* root.nodes[0].nodes[0].prop //=> 'color'
|
|||
|
*/
|
|||
|
;
|
|||
|
|
|||
|
_createClass(Container, [{
|
|||
|
key: "first",
|
|||
|
get: function get() {
|
|||
|
if (!this.nodes) return undefined;
|
|||
|
return this.nodes[0];
|
|||
|
}
|
|||
|
/**
|
|||
|
* The container’s last child.
|
|||
|
*
|
|||
|
* @type {Node}
|
|||
|
*
|
|||
|
* @example
|
|||
|
* rule.last === rule.nodes[rule.nodes.length - 1]
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "last",
|
|||
|
get: function get() {
|
|||
|
if (!this.nodes) return undefined;
|
|||
|
return this.nodes[this.nodes.length - 1];
|
|||
|
}
|
|||
|
}]);
|
|||
|
|
|||
|
return Container;
|
|||
|
}(_node.default);
|
|||
|
|
|||
|
var _default = Container;
|
|||
|
/**
|
|||
|
* @callback childCondition
|
|||
|
* @param {Node} node Container child.
|
|||
|
* @param {number} index Child index.
|
|||
|
* @param {Node[]} nodes All container children.
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* @callback childIterator
|
|||
|
* @param {Node} node Container child.
|
|||
|
* @param {number} index Child index.
|
|||
|
* @return {false|undefined} Returning `false` will break iteration.
|
|||
|
*/
|
|||
|
|
|||
|
exports.default = _default;
|
|||
|
module.exports = exports.default;
|
|||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5lczYiXSwibmFtZXMiOlsiY2xlYW5Tb3VyY2UiLCJub2RlcyIsIm1hcCIsImkiLCJzb3VyY2UiLCJDb250YWluZXIiLCJwdXNoIiwiY2hpbGQiLCJwYXJlbnQiLCJlYWNoIiwiY2FsbGJhY2siLCJsYXN0RWFjaCIsImluZGV4ZXMiLCJpZCIsInVuZGVmaW5lZCIsImluZGV4IiwicmVzdWx0IiwibGVuZ3RoIiwid2FsayIsImUiLCJwb3N0Y3NzTm9kZSIsInN0YWNrIiwidGVzdCIsInMiLCJyZXBsYWNlIiwiaW5wdXQiLCJmcm9tIiwic3RhcnQiLCJsaW5lIiwiY29sdW1uIiwid2Fsa0RlY2xzIiwicHJvcCIsInR5cGUiLCJSZWdFeHAiLCJ3YWxrUnVsZXMiLCJzZWxlY3RvciIsIndhbGtBdFJ1bGVzIiwibmFtZSIsIndhbGtDb21tZW50cyIsImFwcGVuZCIsImNoaWxkcmVuIiwibm9ybWFsaXplIiwibGFzdCIsIm5vZGUiLCJwcmVwZW5kIiwicmV2ZXJzZSIsImZpcnN0IiwidW5zaGlmdCIsImNsZWFuUmF3cyIsImtlZXBCZXR3ZWVuIiwiaW5zZXJ0QmVmb3JlIiwiZXhpc3QiLCJhZGQiLCJzcGxpY2UiLCJpbnNlcnRBZnRlciIsInJlbW92ZUNoaWxkIiwicmVtb3ZlQWxsIiwicmVwbGFjZVZhbHVlcyIsInBhdHRlcm4iLCJvcHRzIiwiZGVjbCIsInByb3BzIiwiaW5kZXhPZiIsImZhc3QiLCJ2YWx1ZSIsImV2ZXJ5IiwiY29uZGl0aW9uIiwic29tZSIsInNhbXBsZSIsInBhcnNlIiwicmVxdWlyZSIsIkFycmF5IiwiaXNBcnJheSIsInNsaWNlIiwiRXJyb3IiLCJTdHJpbmciLCJEZWNsYXJhdGlvbiIsIlJ1bGUiLCJBdFJ1bGUiLCJ0ZXh0IiwiQ29tbWVudCIsInByb2Nlc3NlZCIsInJhd3MiLCJiZWZvcmUiLCJOb2RlIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsU0FBU0EsV0FB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
|