renderForeach method

void renderForeach(
  1. Element element,
  2. CodeBuffer buffer,
  3. SymbolTable scope,
  4. bool html5,
)

Implementation

void renderForeach(
    Element element, CodeBuffer buffer, SymbolTable scope, bool html5) {
  var attribute = element.attributes.singleWhere((a) => a.name == 'for-each');
  if (attribute.value == null) return;

  var asAttribute =
      element.attributes.firstWhereOrNull((a) => a.name == 'as');
  var indexAsAttribute =
      element.attributes.firstWhereOrNull((a) => a.name == 'index-as');
  var alias = asAttribute?.value?.compute(scope)?.toString() ?? 'item';
  var indexAs = indexAsAttribute?.value?.compute(scope)?.toString() ?? 'i';
  var otherAttributes = element.attributes.where(
      (a) => a.name != 'for-each' && a.name != 'as' && a.name != 'index-as');
  late Element strippedElement;

  if (element is SelfClosingElement) {
    strippedElement = SelfClosingElement(element.lt, element.tagName,
        otherAttributes, element.slash, element.gt);
  } else if (element is RegularElement) {
    strippedElement = RegularElement(
        element.lt,
        element.tagName,
        otherAttributes,
        element.gt,
        element.children,
        element.lt2,
        element.slash,
        element.tagName2,
        element.gt2);
  }

  var i = 0;
  for (var item in attribute.value!.compute(scope)) {
    var childScope = scope.createChild(values: {alias: item, indexAs: i++});
    renderElement(strippedElement, buffer, childScope, html5);
  }
}