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