resolveAttributeValue method

String? resolveAttributeValue(
  1. DOMElement domElement,
  2. T element,
  3. String attrName,
  4. DOMTreeMap<T> treeMap, {
  5. required bool booleanDefault,
  6. required String? valueDefault,
  7. bool preserveClass = false,
  8. bool preserveStyle = false,
})

The value to set for attrName of domElement in element (null: no attribute).

A boolean attribute resolves to 'true', or null when false. An attribute without a value resolves to booleanDefault (boolean) or valueDefault (any other one), as resolveAttributeDefaults.

// <option selected="true">  -> 'true'
// <option selected="false"> -> null (off)
// <div title="x">           -> 'x'
// <div title> with no value -> valueDefault

Implementation

String? resolveAttributeValue(
  DOMElement domElement,
  T element,
  String attrName,
  DOMTreeMap<T> treeMap, {
  required bool booleanDefault,
  required String? valueDefault,
  bool preserveClass = false,
  bool preserveStyle = false,
}) {
  var attr = domElement.getAttribute(attrName)!;
  var attrVal = attr.getValue(_domContext, treeMap);

  if (preserveClass && attrName == 'class') {
    var prev = getAttribute(element, attrName);
    if (prev != null && prev.isNotEmpty) {
      attrVal = attrVal != null && attrVal.isNotEmpty
          ? '$prev $attrVal'
          : prev;
    }
  } else if (preserveStyle && attrName == 'style') {
    var prev = getAttribute(element, attrName);
    if (prev != null && prev.isNotEmpty) {
      if (attrVal != null && attrVal.isNotEmpty) {
        attrVal = !prev.endsWith(';') ? '$prev; $attrVal' : '$prev $attrVal';
      } else {
        attrVal = prev;
      }
    }
  } else if ((attrName == 'src' || attrName == 'href') &&
      attrVal != null &&
      attrVal.isNotEmpty) {
    var attrVal2 = resolveSource(attrVal);

    if (attrVal != attrVal2) {
      setAttribute(element, '$attrName-original', attrVal);
      attrVal = attrVal2;
    }
  } else if (DOMAttribute.isBooleanAttribute(attrName) && attrVal != null) {
    // A keyword is kept: `hidden="until-found"`.
    var keyword = DOMAttribute.booleanAttributeKeyword(attrName, attrVal);
    if (keyword != null) return keyword;

    // A boolean attribute, also with a template value
    // (`checked="{{:on}}true{{?}}false{{/}}"`): `'true'`, or `null` (off).
    return DOMAttribute.parseBooleanValue(attrName, attrVal) ? 'true' : null;
  }

  // No value (also after a preserved class/style): the defaults.
  return resolveAttributeDefaults(
    attrName,
    attrVal,
    booleanDefault: booleanDefault,
    valueDefault: valueDefault,
  );
}