192 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
exports.__esModule = true;
 | 
						|
exports["default"] = void 0;
 | 
						|
var _util = require("../util");
 | 
						|
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); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
 | 
						|
var cloneNode = function cloneNode(obj, parent) {
 | 
						|
  if (typeof obj !== 'object' || obj === null) {
 | 
						|
    return obj;
 | 
						|
  }
 | 
						|
  var cloned = new obj.constructor();
 | 
						|
  for (var i in obj) {
 | 
						|
    if (!obj.hasOwnProperty(i)) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    var value = obj[i];
 | 
						|
    var type = typeof value;
 | 
						|
    if (i === 'parent' && type === 'object') {
 | 
						|
      if (parent) {
 | 
						|
        cloned[i] = parent;
 | 
						|
      }
 | 
						|
    } else if (value instanceof Array) {
 | 
						|
      cloned[i] = value.map(function (j) {
 | 
						|
        return cloneNode(j, cloned);
 | 
						|
      });
 | 
						|
    } else {
 | 
						|
      cloned[i] = cloneNode(value, cloned);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return cloned;
 | 
						|
};
 | 
						|
var Node = /*#__PURE__*/function () {
 | 
						|
  function Node(opts) {
 | 
						|
    if (opts === void 0) {
 | 
						|
      opts = {};
 | 
						|
    }
 | 
						|
    Object.assign(this, opts);
 | 
						|
    this.spaces = this.spaces || {};
 | 
						|
    this.spaces.before = this.spaces.before || '';
 | 
						|
    this.spaces.after = this.spaces.after || '';
 | 
						|
  }
 | 
						|
  var _proto = Node.prototype;
 | 
						|
  _proto.remove = function remove() {
 | 
						|
    if (this.parent) {
 | 
						|
      this.parent.removeChild(this);
 | 
						|
    }
 | 
						|
    this.parent = undefined;
 | 
						|
    return this;
 | 
						|
  };
 | 
						|
  _proto.replaceWith = function replaceWith() {
 | 
						|
    if (this.parent) {
 | 
						|
      for (var index in arguments) {
 | 
						|
        this.parent.insertBefore(this, arguments[index]);
 | 
						|
      }
 | 
						|
      this.remove();
 | 
						|
    }
 | 
						|
    return this;
 | 
						|
  };
 | 
						|
  _proto.next = function next() {
 | 
						|
    return this.parent.at(this.parent.index(this) + 1);
 | 
						|
  };
 | 
						|
  _proto.prev = function prev() {
 | 
						|
    return this.parent.at(this.parent.index(this) - 1);
 | 
						|
  };
 | 
						|
  _proto.clone = function clone(overrides) {
 | 
						|
    if (overrides === void 0) {
 | 
						|
      overrides = {};
 | 
						|
    }
 | 
						|
    var cloned = cloneNode(this);
 | 
						|
    for (var name in overrides) {
 | 
						|
      cloned[name] = overrides[name];
 | 
						|
    }
 | 
						|
    return cloned;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Some non-standard syntax doesn't follow normal escaping rules for css.
 | 
						|
   * This allows non standard syntax to be appended to an existing property
 | 
						|
   * by specifying the escaped value. By specifying the escaped value,
 | 
						|
   * illegal characters are allowed to be directly inserted into css output.
 | 
						|
   * @param {string} name the property to set
 | 
						|
   * @param {any} value the unescaped value of the property
 | 
						|
   * @param {string} valueEscaped optional. the escaped value of the property.
 | 
						|
   */;
 | 
						|
  _proto.appendToPropertyAndEscape = function appendToPropertyAndEscape(name, value, valueEscaped) {
 | 
						|
    if (!this.raws) {
 | 
						|
      this.raws = {};
 | 
						|
    }
 | 
						|
    var originalValue = this[name];
 | 
						|
    var originalEscaped = this.raws[name];
 | 
						|
    this[name] = originalValue + value; // this may trigger a setter that updates raws, so it has to be set first.
 | 
						|
    if (originalEscaped || valueEscaped !== value) {
 | 
						|
      this.raws[name] = (originalEscaped || originalValue) + valueEscaped;
 | 
						|
    } else {
 | 
						|
      delete this.raws[name]; // delete any escaped value that was created by the setter.
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Some non-standard syntax doesn't follow normal escaping rules for css.
 | 
						|
   * This allows the escaped value to be specified directly, allowing illegal
 | 
						|
   * characters to be directly inserted into css output.
 | 
						|
   * @param {string} name the property to set
 | 
						|
   * @param {any} value the unescaped value of the property
 | 
						|
   * @param {string} valueEscaped the escaped value of the property.
 | 
						|
   */;
 | 
						|
  _proto.setPropertyAndEscape = function setPropertyAndEscape(name, value, valueEscaped) {
 | 
						|
    if (!this.raws) {
 | 
						|
      this.raws = {};
 | 
						|
    }
 | 
						|
    this[name] = value; // this may trigger a setter that updates raws, so it has to be set first.
 | 
						|
    this.raws[name] = valueEscaped;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * When you want a value to passed through to CSS directly. This method
 | 
						|
   * deletes the corresponding raw value causing the stringifier to fallback
 | 
						|
   * to the unescaped value.
 | 
						|
   * @param {string} name the property to set.
 | 
						|
   * @param {any} value The value that is both escaped and unescaped.
 | 
						|
   */;
 | 
						|
  _proto.setPropertyWithoutEscape = function setPropertyWithoutEscape(name, value) {
 | 
						|
    this[name] = value; // this may trigger a setter that updates raws, so it has to be set first.
 | 
						|
    if (this.raws) {
 | 
						|
      delete this.raws[name];
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   *
 | 
						|
   * @param {number} line The number (starting with 1)
 | 
						|
   * @param {number} column The column number (starting with 1)
 | 
						|
   */;
 | 
						|
  _proto.isAtPosition = function isAtPosition(line, column) {
 | 
						|
    if (this.source && this.source.start && this.source.end) {
 | 
						|
      if (this.source.start.line > line) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      if (this.source.end.line < line) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      if (this.source.start.line === line && this.source.start.column > column) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      if (this.source.end.line === line && this.source.end.column < column) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
    return undefined;
 | 
						|
  };
 | 
						|
  _proto.stringifyProperty = function stringifyProperty(name) {
 | 
						|
    return this.raws && this.raws[name] || this[name];
 | 
						|
  };
 | 
						|
  _proto.valueToString = function valueToString() {
 | 
						|
    return String(this.stringifyProperty("value"));
 | 
						|
  };
 | 
						|
  _proto.toString = function toString() {
 | 
						|
    return [this.rawSpaceBefore, this.valueToString(), this.rawSpaceAfter].join('');
 | 
						|
  };
 | 
						|
  _createClass(Node, [{
 | 
						|
    key: "rawSpaceBefore",
 | 
						|
    get: function get() {
 | 
						|
      var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.before;
 | 
						|
      if (rawSpace === undefined) {
 | 
						|
        rawSpace = this.spaces && this.spaces.before;
 | 
						|
      }
 | 
						|
      return rawSpace || "";
 | 
						|
    },
 | 
						|
    set: function set(raw) {
 | 
						|
      (0, _util.ensureObject)(this, "raws", "spaces");
 | 
						|
      this.raws.spaces.before = raw;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: "rawSpaceAfter",
 | 
						|
    get: function get() {
 | 
						|
      var rawSpace = this.raws && this.raws.spaces && this.raws.spaces.after;
 | 
						|
      if (rawSpace === undefined) {
 | 
						|
        rawSpace = this.spaces.after;
 | 
						|
      }
 | 
						|
      return rawSpace || "";
 | 
						|
    },
 | 
						|
    set: function set(raw) {
 | 
						|
      (0, _util.ensureObject)(this, "raws", "spaces");
 | 
						|
      this.raws.spaces.after = raw;
 | 
						|
    }
 | 
						|
  }]);
 | 
						|
  return Node;
 | 
						|
}();
 | 
						|
exports["default"] = Node;
 | 
						|
module.exports = exports.default; |