renderTemplateAdvanced function
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;
}