JAVASCRIPT   91

selector.js

Guest on 7th September 2021 05:52:17 PM

  1. (function (tree) {
  2.  
  3. tree.Selector = function (elements, extendList, condition, index, currentFileInfo, isReferenced) {
  4.     this.elements = elements;
  5.     this.extendList = extendList;
  6.     this.condition = condition;
  7.     this.currentFileInfo = currentFileInfo || {};
  8.     this.isReferenced = isReferenced;
  9.     if (!condition) {
  10.         this.evaldCondition = true;
  11.     }
  12. };
  13. tree.Selector.prototype = {
  14.     type: "Selector",
  15.     accept: function (visitor) {
  16.         if (this.elements) {
  17.             this.elements = visitor.visitArray(this.elements);
  18.         }
  19.         if (this.extendList) {
  20.             this.extendList = visitor.visitArray(this.extendList);
  21.         }
  22.         if (this.condition) {
  23.             this.condition = visitor.visit(this.condition);
  24.         }
  25.     },
  26.     createDerived: function(elements, extendList, evaldCondition) {
  27.         evaldCondition = (evaldCondition != null) ? evaldCondition : this.evaldCondition;
  28.         var newSelector = new(tree.Selector)(elements, extendList || this.extendList, null, this.index, this.currentFileInfo, this.isReferenced);
  29.         newSelector.evaldCondition = evaldCondition;
  30.         newSelector.mediaEmpty = this.mediaEmpty;
  31.         return newSelector;
  32.     },
  33.     match: function (other) {
  34.         var elements = this.elements,
  35.             len = elements.length,
  36.             olen, i;
  37.  
  38.         other.CacheElements();
  39.  
  40.         olen = other._elements.length;
  41.         if (olen === 0 || len < olen) {
  42.             return 0;
  43.         } else {
  44.             for (i = 0; i < olen; i++) {
  45.                 if (elements[i].value !== other._elements[i]) {
  46.                     return 0;
  47.                 }
  48.             }
  49.         }
  50.  
  51.         return olen; // return number of matched elements
  52.     },
  53.     CacheElements: function(){
  54.         var css = '', len, v, i;
  55.  
  56.         if( !this._elements ){
  57.  
  58.             len = this.elements.length;
  59.             for(i = 0; i < len; i++){
  60.  
  61.                 v = this.elements[i];
  62.                 css += v.combinator.value;
  63.  
  64.                 if( !v.value.value ){
  65.                     css += v.value;
  66.                     continue;
  67.                 }
  68.  
  69.                 if( typeof v.value.value !== "string" ){
  70.                     css = '';
  71.                     break;
  72.                 }
  73.                 css += v.value.value;
  74.             }
  75.  
  76.             this._elements = css.match(/[,&#\.\w-]([\w-]|(\\.))*/g);
  77.  
  78.             if (this._elements) {
  79.                 if (this._elements[0] === "&") {
  80.                     this._elements.shift();
  81.                 }
  82.  
  83.             } else {
  84.                 this._elements = [];
  85.             }
  86.  
  87.         }
  88.     },
  89.     isJustParentSelector: function() {
  90.         return !this.mediaEmpty &&
  91.             this.elements.length === 1 &&
  92.             this.elements[0].value === '&' &&
  93.             (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');
  94.     },
  95.     eval: function (env) {
  96.         var evaldCondition = this.condition && this.condition.eval(env),
  97.             elements = this.elements, extendList = this.extendList;
  98.  
  99.         elements = elements && elements.map(function (e) { return e.eval(env); });
  100.         extendList = extendList && extendList.map(function(extend) { return extend.eval(env); });
  101.  
  102.         return this.createDerived(elements, extendList, evaldCondition);
  103.     },
  104.     genCSS: function (env, output) {
  105.         var i, element;
  106.         if ((!env || !env.firstSelector) && this.elements[0].combinator.value === "") {
  107.             output.add(' ', this.currentFileInfo, this.index);
  108.         }
  109.         if (!this._css) {
  110.             //TODO caching? speed comparison?
  111.             for(i = 0; i < this.elements.length; i++) {
  112.                 element = this.elements[i];
  113.                 element.genCSS(env, output);
  114.             }
  115.         }
  116.     },
  117.     toCSS: tree.toCSS,
  118.     markReferenced: function () {
  119.         this.isReferenced = true;
  120.     },
  121.     getIsReferenced: function() {
  122.         return !this.currentFileInfo.reference || this.isReferenced;
  123.     },
  124.     getIsOutput: function() {
  125.         return this.evaldCondition;
  126.     }
  127. };
  128.  
  129. })(require('../tree'));

Raw Paste


Login or Register to edit or fork this paste. It's free.