resolveData function

String resolveData(
  1. String source,
  2. Map<String, dynamic> data, {
  3. int pageNumber = 1,
  4. int pageCount = 1,
  5. DateTime? now,
  6. String locale = 'de-DE',
  7. Map<String, dynamic> variables = const {},
})

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)!;
  });
}