isElementValuesEqual method

bool isElementValuesEqual(
  1. dynamic elementValue1,
  2. dynamic elementValue2
)

Compares two elements

The elements could be String or Node

Implementation

bool isElementValuesEqual(dynamic elementValue1, dynamic elementValue2) {
  dynamic _elementValue1 = elementValue1;
  dynamic _elementValue2 = elementValue2;

  if (_elementValue1 is String || _elementValue2 is String) {
    return _elementValue1 == _elementValue2;
  }

  if (_elementValue1 is Attribute) {
    if (_elementValue1.op != _elementValue2.op ||
        _elementValue1.key != _elementValue2.key) {
      return false;
    }
    if (_elementValue1.value == null || _elementValue2.value == null) {
      if (_elementValue1.value != null || _elementValue2.value != null) {
        return false;
      }
      return true;
    }
    _elementValue1 = (_elementValue1.value is Node)
        ? _elementValue1.value.value
        : _elementValue1.value;
    _elementValue2 = (_elementValue2.value is Node)
        ? _elementValue2.value.value
        : _elementValue2.value;
    return _elementValue1 == _elementValue2;
  }

  _elementValue1 = _elementValue1.value;
  _elementValue2 = _elementValue2.value;
  if (_elementValue1 is Selector) {
    if (_elementValue2 is! Selector ||
        _elementValue1.elements.length != _elementValue2.elements.length) {
      return false;
    }
    for (var i = 0; i < _elementValue1.elements.length; i++) {
      if (_elementValue1.elements[i].combinator.value !=
          _elementValue2.elements[i].combinator.value) {
        if (i != 0 ||
            (_elementValue1.elements[i].combinator.value ?? ' ') !=
                (_elementValue2.elements[i].combinator.value ?? ' ')) {
          return false;
        }
      }
      if (!isElementValuesEqual(_elementValue1.elements[i].value,
          _elementValue2.elements[i].value)) {
        return false;
      }
    }
    return true;
  }
  return false;

//2.3.1
//  isElementValuesEqual: function(elementValue1, elementValue2) {
//      if (typeof elementValue1 === "string" || typeof elementValue2 === "string") {
//          return elementValue1 === elementValue2;
//      }
//      if (elementValue1 instanceof tree.Attribute) {
//          if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {
//              return false;
//          }
//          if (!elementValue1.value || !elementValue2.value) {
//              if (elementValue1.value || elementValue2.value) {
//                  return false;
//              }
//              return true;
//          }
//          elementValue1 = elementValue1.value.value || elementValue1.value;
//          elementValue2 = elementValue2.value.value || elementValue2.value;
//          return elementValue1 === elementValue2;
//      }
//      elementValue1 = elementValue1.value;
//      elementValue2 = elementValue2.value;
//      if (elementValue1 instanceof tree.Selector) {
//          if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {
//              return false;
//          }
//          for(var i = 0; i  < elementValue1.elements.length; i++) {
//              if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {
//                  if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {
//                      return false;
//                  }
//              }
//              if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {
//                  return false;
//              }
//          }
//          return true;
//      }
//      return false;
//  },
}