| 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); |
| } |
| } |
| } |