convertPathToRelative method

Path convertPathToRelative(
  1. Path globalPath
)

Implementation

Path convertPathToRelative(Path globalPath) {
  // 1. Find last shared ancestor
  // 2. Drill up using ".." style (actually represented as "^")
  // 3. Re-build downward chain from common ancestor

  var ownPath = path;

  var minPathLength = min(globalPath.length, ownPath.length);
  var lastSharedPathCompIndex = -1;

  for (var i = 0; i < minPathLength; ++i) {
    var ownComp = ownPath.getComponent(i);
    var otherComp = globalPath.getComponent(i);

    if (ownComp == otherComp) {
      lastSharedPathCompIndex = i;
    } else {
      break;
    }
  }

  // No shared path components, so just use global path
  if (lastSharedPathCompIndex == -1) return globalPath;

  var numUpwardsMoves = (ownPath.length - 1) - lastSharedPathCompIndex;

  var newPathComps = <Component>[];

  for (var up = 0; up < numUpwardsMoves; ++up) {
    newPathComps.add(Component.toParent());
  }

  for (var down = lastSharedPathCompIndex + 1;
      down < globalPath.length;
      ++down) {
    newPathComps.add(globalPath.getComponent(down));
  }

  var relativePath = Path(newPathComps, true);
  return relativePath;
}