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