blob: 84ff94373387e28a36f0a911686faf18064bd45c [file] [log] [blame]
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);
}
}
}