renderTemplateAdvanced function

Future<String> renderTemplateAdvanced(
  1. String templatePath,
  2. Map<String, dynamic> vars
)

Implementation

Future<String> renderTemplateAdvanced(
  String templatePath,
  Map<String, dynamic> vars,
) async {
  String content = await renderTemplate(
    templatePath,
    vars.map((k, v) => MapEntry(k, v.toString())),
  );

  final ifPattern = RegExp(
    r'\{%\s*if\s+(\w+)\s*%\}(.*?)\{%\s*endif\s*%\}',
    multiLine: true,
  );

  content = content.replaceAllMapped(ifPattern, (match) {
    final conditionVar = match.group(1)!;
    final block = match.group(2)!;
    return vars[conditionVar] == true ? block : '';
  });

  final forPattern = RegExp(
    r'\{%\s*for\s+(\w+)\s+in\s+(\w+)\s*%\}(.*?)\{%\s*endfor\s*%\}',
    multiLine: true,
  );

  content = content.replaceAllMapped(forPattern, (match) {
    final itemVar = match.group(1)!;
    final collectionVar = match.group(2)!;
    final block = match.group(3)!;

    final collection = vars[collectionVar];
    if (collection is! List) return '';

    return collection.map((item) {
      final localVars = {...vars, itemVar: item};
      String result = block;

      for (final entry in localVars.entries) {
        result = result.replaceAll(
          '{{${entry.key}}}',
          entry.value.toString(),
        );
      }

      return result;
    }).join('');
  });

  return content;
}