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