1"use strict"; 2 3exports.__esModule = true; 4exports["default"] = void 0; 5var _util = require("../util"); 6function _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); } } 7function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } 8var cloneNode = function cloneNode(obj, parent) { 9 if (typeof obj !== 'object' || obj === null) { 10 return obj; 11 } 12 var cloned = new obj.constructor(); 13 for (var i in obj) { 14 if (!obj.hasOwnProperty(i)) { 15 continue; 16 } 17 var value = obj[i]; 18 var type = typeof value; 19 if (i === 'parent' && type === 'object') { 20 if (parent) { 21 cloned[i] = parent; 22 } 23 } else if (value instanceof Array) { 24 cloned[i] = value.map(function (j) { 25 return cloneNode(j, cloned); 26 }); 27 } else { 28 cloned[i] = cloneNode(value, cloned); 29 } 30 } 31 return cloned; 32}; 33var Node = /*#__PURE__*/function () { 34 function Node(opts) { 35 if (opts === void 0) { 36 opts = {}; 37 } 38 Object.assign(this, opts); 39 this.spaces = this.spaces || {}; 40 this.spaces.before = this.spaces.before || ''; 41 this.spaces.after = this.spaces.after || ''; 42 } 43 var _proto = Node.prototype; 44 _proto.remove = function remove() { 45 if (this.parent) { 46 this.parent.removeChild(this); 47 } 48 this.parent = undefined; 49 return this; 50 }; 51 _proto.replaceWith = function replaceWith() { 52 if (this.parent) { 53 for (var index in arguments) { 54 this.parent.insertBefore(this, arguments[index]); 55 } 56 this.remove(); 57 } 58 return this; 59 }; 60 _proto.next = function next() { 61 return this.parent.at(this.parent.index(this) + 1); 62 }; 63 _proto.prev = function prev() { 64 return this.parent.at(this.parent.index(this) - 1); 65 }; 66 _proto.clone = function clone(overrides) { 67 if (overrides === void 0) { 68 overrides = {}; 69 } 70 var cloned = cloneNode(this); 71 for (var name in overrides) { 72 cloned[name] = overrides[name]; 73 } 74 return cloned; 75 } 76 77 /** 78 * Some non-standard syntax doesn't follow normal escaping rules for css. 79 * This allows non standard syntax to be appended to an existing property 80 * by specifying the escaped value. By specifying the escaped value, 81 * illegal characters are allowed to be directly inserted into css output. 82 * @param {string} name the property to set 83 * @param {any} value the unescaped value of the property 84 * @param {string} valueEscaped optional. the escaped value of the property. 85 */; 86 _proto.appendToPropertyAndEscape = function appendToPropertyAndEscape(name, value, valueEscaped) { 87 if (!this.raws) { 88 this.raws = {}; 89 } 90 var originalValue = this[name]; 91 var originalEscaped = this.raws[name]; 92 this[name] = originalValue + value; // this may trigger a setter that updates raws, so it has to be set first. 93 if (originalEscaped || valueEscaped !== value) { 94 this.raws[name] = (originalEscaped || originalValue) + valueEscaped; 95 } else { 96 delete this.raws[name]; // delete any escaped value that was created by the setter. 97 } 98 } 99 100 /** 101 * Some non-standard syntax doesn't follow normal escaping rules for css. 102 * This allows the escaped value to be specified directly, allowing illegal 103 * characters to be directly inserted into css output. 104 * @param {string} name the property to set 105 * @param {any} value the unescaped value of the property 106 * @param {string} valueEscaped the escaped value of the property. 107 */; 108 _proto.setPropertyAndEscape = function setPropertyAndEscape(name, value, valueEscaped) { 109 if (!this.raws) { 110 this.raws = {}; 111 } 112 this[name] = value; // this may trigger a setter that updates raws, so it has to be set first. 113 this.raws[name] = valueEscaped; 114 } 115 116 /** 117 * When you want a value to passed through to CSS directly. This method 118 * deletes the corresponding raw value causing the stringifier to fallback 119 * to the unescaped value. 120 * @param {string} name the property to set. 121 * @param {any} value The value that is both escaped and unescaped. 122 */; 123 _proto.setPropertyWithoutEscape = function setPropertyWithoutEscape(name, value) { 124 this[name] = value; // this may trigger a setter that updates raws, so it has to be set first. 125 if (this.raws) { 126 delete this.raws[name]; 127 } 128 } 129 130 /** 131 * 132 * @param {number} line The number (starting with 1) 133 * @param {number} column The column number (starting with 1) 134 */; 135 _proto.isAtPosition = function isAtPosition(line, column) { 136 if (this.source && this.source.start && this.source.end) { 137 if (this.source.start.line > line) { 138 return false; 139 } 140 if (this.source.end.line < line) { 141 return false; 142 } 143 if (this.source.start.line === line && this.source.start.column > column) { 144 return false; 145 } 146 if (this.source.end.line === line && this.source.end.column < column) { 147 return false; 148 } 149 return true; 150 } 151 return undefined; 152 }; 153 _proto.stringifyProperty = function stringifyProperty(name) { 154 return this.raws && this.raws[name] || this[name]; 155 }; 156 _proto.valueToString = function valueToString() { 157 return String(this.stringifyProperty("value")); 158 }; 159 _proto.toString = function toString() { 160 return [this.rawSpaceBefore, this.valueToString(), this.rawSpaceAfter].join(''); 161 }; 162 _createClass(Node, [{ 163 key: "rawSpaceBefore", 164 get: function get() { 165 var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.before; 166 if (rawSpace === undefined) { 167 rawSpace = this.spaces && this.spaces.before; 168 } 169 return rawSpace || ""; 170 }, 171 set: function set(raw) { 172 (0, _util.ensureObject)(this, "raws", "spaces"); 173 this.raws.spaces.before = raw; 174 } 175 }, { 176 key: "rawSpaceAfter", 177 get: function get() { 178 var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.after; 179 if (rawSpace === undefined) { 180 rawSpace = this.spaces.after; 181 } 182 return rawSpace || ""; 183 }, 184 set: function set(raw) { 185 (0, _util.ensureObject)(this, "raws", "spaces"); 186 this.raws.spaces.after = raw; 187 } 188 }]); 189 return Node; 190}(); 191exports["default"] = Node; 192module.exports = exports.default;