resolveData function
Replaces JSON and system-field tokens in source.
Implementation
String resolveData(
String source,
Map<String, dynamic> data, {
int pageNumber = 1,
int pageCount = 1,
DateTime? now,
String locale = 'de-DE',
Map<String, dynamic> variables = const {},
}) {
final current = now ?? DateTime.now();
String two(int value) => value.toString().padLeft(2, '0');
final date = locale.startsWith('en-US')
? '${two(current.month)}/${two(current.day)}/${current.year}'
: locale.startsWith('en')
? '${two(current.day)}/${two(current.month)}/${current.year}'
: '${two(current.day)}.${two(current.month)}.${current.year}';
final time =
'${two(current.hour)}:${two(current.minute)}:${two(current.second)}';
final systemValues = <String, String>{
'PageNumber': '$pageNumber',
'PageCount': '$pageCount',
'Date': date,
'Time': time,
'DateTime': '$date $time',
};
return source.replaceAllMapped(RegExp(r'\{\{\s*(.*?)\s*\}\}'), (match) {
final path = match.group(1)!;
if (systemValues.containsKey(path)) return systemValues[path]!;
if (path.startsWith('=')) {
try {
return '${evaluateFormula(path.substring(1), data, variables: variables)}';
} catch (_) {
return match.group(0)!;
}
}
if (variables.containsKey(path)) return '${variables[path]}';
return resolvePath(path, data)?.toString() ?? match.group(0)!;
});
}