package com.google.dart.engine.services.internal.correction; import java.net.URI; public class URIUtils { /** * Computes relative relative path to reference "target" from "base". Uses ".." if needed, in * contrast to {@link URI#relativize(URI)}. */ public static String computeRelativePath(String base, String target) { // convert to URI separator base = base.replaceAll("\\\\", "/"); target = target.replaceAll("\\\\", "/"); if (base.startsWith("/") && target.startsWith("/")) { base = base.substring(1); target = target.substring(1); } // equal paths - no relative if (base.equals(target)) { return null; } // split paths String[] baseParts = base.split("/"); String[] targetParts = target.split("/"); // prepare maximum possible common root length int length = baseParts.length < targetParts.length ? baseParts.length : targetParts.length; // find common root int lastCommonRoot = -1; for (int i = 0; i < length; i++) { if (baseParts[i].equals(targetParts[i])) { lastCommonRoot = i; } else { break; } } // append .. StringBuilder relativePath = new StringBuilder(); for (int i = lastCommonRoot + 1; i < baseParts.length; i++) { if (baseParts[i].length() > 0) { relativePath.append("../"); } } // append target folder names for (int i = lastCommonRoot + 1; i < targetParts.length - 1; i++) { String p = targetParts[i]; relativePath.append(p); relativePath.append("/"); } // append target file name relativePath.append(targetParts[targetParts.length - 1]); // done return relativePath.toString(); } }