コード例 #1
0
        /// <summary>
        /// Calculates a new resource path based on the supplied
        /// <paramref name="relativePath"/>.
        /// </summary>
        /// <param name="relativePath">
        /// The relative path to evaluate.
        /// </param>
        /// <returns>The newly calculated resource path.</returns>
        private string CalculateResourcePath(string relativePath)
        {
            StringBuilder path = new StringBuilder(256);

            if (relativePath.StartsWith("..")) // back level navigation
            {
                string[] pathElements = ResourcePath.Split(PathSeparatorChars);
                int      upWalks      = UpWalks(relativePath);
                if (upWalks > pathElements.Length)
                {
                    throw new UriFormatException("Too many back levels.");
                }
                char separator = PathSeparatorChars[0];
                for (int i = 0; i < pathElements.Length - upWalks; i++)
                {
                    path.Append(pathElements[i]).Append(separator);
                }
                string[] relativeParts = relativePath.Split('/', '\\');
                for (int i = upWalks; i < relativeParts.Length - 1; i++)
                {
                    path.Append(relativeParts[i]).Append(separator);
                }
                if (path.Length > 0)
                {
                    path.Length -= 1;
                }
                return(path.ToString());
            }
            else if (relativePath.StartsWith("/")) // relative to root
            {
                if (relativePath.Length > 1)
                {
                    return(relativePath.Substring(1, relativePath.Length - 2));
                }
                else
                {
                    return(null);
                }
            }
            else // relative to current namespace...
            {
                if (ResourcePath != null && ResourcePath != String.Empty)
                {
                    path.Append(ResourcePath.TrimEnd(PathSeparatorChars)).Append(PathSeparatorChars[0]);
                }
                if (relativePath.StartsWith("./"))
                {
                    if (relativePath.Length > 2)
                    {
                        path.Append(relativePath.Substring(2, relativePath.Length - 3));
                    }
                }
                else
                {
                    path.Append(relativePath.Substring(0, relativePath.Length - 1));
                }

                return(path.ToString());
            }
        }