renderTemplateAdvanced function

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

Implementation

String renderTemplateAdvanced(String templatePath, Map<String, dynamic> vars) {
  String content = 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;
}