| using System; | |
| namespace AppsheetEpplus; | |
| 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; | |
| } | |
| 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(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(dirUp + file, UriKind.Relative); | |
| } | |
| } |