/// <summary> /// Calculates a new resource path based on the supplied /// <paramref name="relativePath"/>. /// </summary> /// <param name="relativePath"> /// The relative path to evaluate. /// </param> /// <returns>The newly calculated resource path.</returns> private string CalculateResourcePath(string relativePath) { StringBuilder path = new StringBuilder(256); if (relativePath.StartsWith("..")) // back level navigation { string[] pathElements = ResourcePath.Split(PathSeparatorChars); int upWalks = UpWalks(relativePath); if (upWalks > pathElements.Length) { throw new UriFormatException("Too many back levels."); } char separator = PathSeparatorChars[0]; for (int i = 0; i < pathElements.Length - upWalks; i++) { path.Append(pathElements[i]).Append(separator); } string[] relativeParts = relativePath.Split('/', '\\'); for (int i = upWalks; i < relativeParts.Length - 1; i++) { path.Append(relativeParts[i]).Append(separator); } if (path.Length > 0) { path.Length -= 1; } return(path.ToString()); } else if (relativePath.StartsWith("/")) // relative to root { if (relativePath.Length > 1) { return(relativePath.Substring(1, relativePath.Length - 2)); } else { return(null); } } else // relative to current namespace... { if (ResourcePath != null && ResourcePath != String.Empty) { path.Append(ResourcePath.TrimEnd(PathSeparatorChars)).Append(PathSeparatorChars[0]); } if (relativePath.StartsWith("./")) { if (relativePath.Length > 2) { path.Append(relativePath.Substring(2, relativePath.Length - 3)); } } else { path.Append(relativePath.Substring(0, relativePath.Length - 1)); } return(path.ToString()); } }