fillTemplateString method

String fillTemplateString(
  1. String template,
  2. TreeReference contextRef, [
  3. Map<String, Object?> variables = const {}
])

Replaces ${n} placeholders in template with the values of outputFragments, evaluated at contextRef.

Implementation

String fillTemplateString(
  String template,
  TreeReference contextRef, [
  Map<String, Object?> variables = const {},
]) {
  final args = <String, String>{};
  var depth = 0;
  var outstanding = Localizer.getArgs(template);
  while (outstanding.isNotEmpty) {
    for (final argName in outstanding) {
      if (args.containsKey(argName)) continue;
      final index = int.tryParse(argName) ?? -1;
      if (index < 0 || index >= outputFragments.length) continue;
      final ec = EvaluationContext.withContext(evaluationContext, contextRef)
        ..originalContext = contextRef
        ..setVariables(variables);
      args[argName] = outputFragments[index].evalReadable(mainInstance, ec);
    }
    template = Localizer.processNamedArguments(template, args);
    outstanding = Localizer.getArgs(template);
    if (++depth >= _templatingRecursionLimit) {
      throw StateError(
        'Dependency cycle in <output>s; recursion limit exceeded!!',
      );
    }
  }
  return template;
}