using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OfficeOpenXml.Utils { internal class UriHelper { internal static Uri ResolvePartUri(Uri sourceUri, Uri targetUri) { if(targetUri.OriginalString.StartsWith("/")) { return targetUri; } string[] source = sourceUri.OriginalString.Split('/'); string[] target = targetUri.OriginalString.Split('/'); int t = target.Length - 1; int s; if(sourceUri.OriginalString.EndsWith("/")) //is the source a directory? { s = source.Length-1; } else { s=source.Length-2; } string file = target[t--]; while (t >= 0) { if (target[t] == ".") { break; } else if (target[t] == "..") { s--; t--; } else { file = target[t--] + "/" + file; } } if (s >= 0) { for(int i=s;i>=0;i--) { file = source[i] + "/" + file; } } return new Uri(file,UriKind.RelativeOrAbsolute); } internal static Uri GetRelativeUri(Uri WorksheetUri, Uri uri) { string[] source = WorksheetUri.OriginalString.Split('/'); string[] target = uri.OriginalString.Split('/'); int slen; if (WorksheetUri.OriginalString.EndsWith("/")) { slen = source.Length; } else { slen = source.Length-1; } int i = 0; while (i < slen && i < target.Length && source[i] == target[i]) { i++; } string dirUp=""; for (int s = i; s < slen; s++) { dirUp += "../"; } string file = ""; for (int t = i; t < target.Length; t++) { file += (file==""?"":"/") + target[t]; } return new Uri(dirUp+file,UriKind.Relative); } } }