apply method

  1. @override
Future<String> apply(
  1. String content,
  2. Map<String, dynamic> context
)
override

Implementation

@override
Future<String> apply(String content, Map<String, dynamic> context) async {
  return content.replaceAllMapped(_foreachRegex, (match) {
    final arrayName = match.group(1)!;
    final valueVar = match.group(2)!;
    final keyVar = match.group(3);
    final loopBody = match.group(4)!;

    final array = context[arrayName];
    if (array is! List && array is! Map) {
      return '';
    }

    final buffer = StringBuffer();

    if (array is List) {
      for (var i = 0; i < array.length; i++) {
        var rendered = loopBody;
        final item = array[i];

        // Replace value variable
        rendered = _replaceVariable(rendered, valueVar, item.toString());

        // Replace key variable (index)
        if (keyVar != null) {
          rendered = _replaceVariable(rendered, keyVar, i.toString());
        }

        buffer.write(rendered);
      }
    } else if (array is Map) {
      array.forEach((key, value) {
        var rendered = loopBody;

        // Replace value variable
        rendered = _replaceVariable(rendered, valueVar, value.toString());

        // Replace key variable
        if (keyVar != null) {
          rendered = _replaceVariable(rendered, keyVar, key.toString());
        }

        buffer.write(rendered);
      });
    }

    return buffer.toString();
  });
}