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(_forRegex, (match) {
    final itemVar = match.group(1)!;
    final listName = match.group(2)!;
    final loopBody = match.group(3)!;

    final list = context[listName];
    if (list is List) {
      final buffer = StringBuffer();

      for (var item in list) {
        var rendered = loopBody;

        // Support for {{item}} or {{$item}} or {{ $item }} inside the loop
        final variablePatterns = [
          RegExp(r'{{\s*' + itemVar + r'\s*}}'),
          RegExp(r'\{\{\s*\$' + itemVar + r'\s*\}\}'),
        ];

        for (var pattern in variablePatterns) {
          rendered =
              rendered.replaceAllMapped(pattern, (_) => item.toString());
        }

        buffer.write(rendered);
      }
      return buffer.toString();
    }

    return '';
  });
}