replaceReferences static method

String replaceReferences(
  1. Observable observable,
  2. Scope? scope,
  3. String value
)

Implementation

static String replaceReferences(
    Observable observable, Scope? scope, String value) {
  if (scope == null || observable.key == null || observable.bindings == null) {
    return value;
  }

  bool requery = false;
  for (Binding binding in observable.bindings!) {
    // replace "this" with the id in the signature
    if (binding.source == "this" || binding.source == "parent") {
      requery = true;

      // get source id
      String sourceId = observable.key!.split(".").first;
      if (binding.source == "parent") sourceId = parentId(scope, sourceId);
      if (binding.property == "parent") {
        sourceId = parentId(scope, sourceId);
        for (var segment in binding.dotnotation ?? []) {
          if (segment.name != "parent") break;
          sourceId = parentId(scope, sourceId);
        }
      }

      // build signature
      var signature = sourceId;
      if (binding.property != "parent") {
        signature = "$sourceId.${binding.property}";
      }
      if (binding.dotnotation != null) {
        int i = 0;

        // skip parent dotnotation
        while (i < binding.dotnotation!.length &&
            binding.dotnotation![i].name == "parent") {
          i++;
        }

        // append non-parent dotnotation
        while (i < binding.dotnotation!.length) {
          signature = "$signature.${binding.dotnotation![i++].name}";
        }
      }

      // replace signature
      value = value.replaceAll(binding.signature, "{$signature}");
    }
  }

  // requery the bindings
  if (requery) observable.bindings = Binding.getBindings(value, scope: scope);

  return value;
}