Merge pull request #97 from dampee/our-437-edit-link-github-casing
OUR-437 fix casing of md file in case incoming URL has incorrect casing
This commit is contained in:
@@ -5,6 +5,8 @@ using System.Web;
|
|||||||
using OurUmbraco.Documentation.Busineslogic;
|
using OurUmbraco.Documentation.Busineslogic;
|
||||||
using Umbraco.Core;
|
using Umbraco.Core;
|
||||||
using Umbraco.Web.Routing;
|
using Umbraco.Web.Routing;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace OurUmbraco.Documentation
|
namespace OurUmbraco.Documentation
|
||||||
{
|
{
|
||||||
@@ -29,7 +31,7 @@ namespace OurUmbraco.Documentation
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// kill those old urls
|
// kill those old urls
|
||||||
foreach (var s in new []{ "master", "v480" })
|
foreach (var s in new[] { "master", "v480" })
|
||||||
if (url.StartsWith(mdRoot + "/" + s))
|
if (url.StartsWith(mdRoot + "/" + s))
|
||||||
{
|
{
|
||||||
url = url.Replace(mdRoot + "/" + s, mdRoot);
|
url = url.Replace(mdRoot + "/" + s, mdRoot);
|
||||||
@@ -39,7 +41,7 @@ namespace OurUmbraco.Documentation
|
|||||||
|
|
||||||
// find the md file
|
// find the md file
|
||||||
var mdFilepath = FindMarkdownFile(url);
|
var mdFilepath = FindMarkdownFile(url);
|
||||||
|
|
||||||
//return the broken link doc page
|
//return the broken link doc page
|
||||||
var is404 = false;
|
var is404 = false;
|
||||||
if (mdFilepath == null)
|
if (mdFilepath == null)
|
||||||
@@ -48,13 +50,13 @@ namespace OurUmbraco.Documentation
|
|||||||
is404 = true;
|
is404 = true;
|
||||||
}
|
}
|
||||||
if (mdFilepath == null)
|
if (mdFilepath == null)
|
||||||
{
|
{
|
||||||
// clear the published content (that was set by FindContent) to cause a 404, and in
|
// clear the published content (that was set by FindContent) to cause a 404, and in
|
||||||
// both case return 'true' because there's no point other finders try to handle the request
|
// both case return 'true' because there's no point other finders try to handle the request
|
||||||
contentRequest.PublishedContent = null;
|
contentRequest.PublishedContent = null;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is404) contentRequest.SetIs404();
|
if (is404) contentRequest.SetIs404();
|
||||||
|
|
||||||
// set the context vars
|
// set the context vars
|
||||||
@@ -70,7 +72,7 @@ namespace OurUmbraco.Documentation
|
|||||||
var templateIsSet = contentRequest.TrySetTemplate(altTemplate);
|
var templateIsSet = contentRequest.TrySetTemplate(altTemplate);
|
||||||
//httpContext.Trace.Write("Markdown Files Handler",
|
//httpContext.Trace.Write("Markdown Files Handler",
|
||||||
// string.Format("Template changed to: '{0}' is {1}", altTemplate, templateIsSet));
|
// string.Format("Template changed to: '{0}' is {1}", altTemplate, templateIsSet));
|
||||||
|
|
||||||
// be happy
|
// be happy
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -113,7 +115,7 @@ namespace OurUmbraco.Documentation
|
|||||||
fpath = string.Concat(HttpRuntime.AppDomainAppPath, relpath, "\\index.md");
|
fpath = string.Concat(HttpRuntime.AppDomainAppPath, relpath, "\\index.md");
|
||||||
if (File.Exists(fpath))
|
if (File.Exists(fpath))
|
||||||
return fpath;
|
return fpath;
|
||||||
|
|
||||||
fpath = string.Concat(HttpRuntime.AppDomainAppPath, relpath, "\\readme.md");
|
fpath = string.Concat(HttpRuntime.AppDomainAppPath, relpath, "\\readme.md");
|
||||||
if (File.Exists(fpath))
|
if (File.Exists(fpath))
|
||||||
return fpath;
|
return fpath;
|
||||||
@@ -145,37 +147,94 @@ namespace OurUmbraco.Documentation
|
|||||||
string baseUrl = "https://github.com/umbraco/UmbracoDocs/blob/" + branchName;
|
string baseUrl = "https://github.com/umbraco/UmbracoDocs/blob/" + branchName;
|
||||||
|
|
||||||
var docUrl = HttpContext.Current.Items[MarkdownLogic.MarkdownPathKey].ToString();
|
var docUrl = HttpContext.Current.Items[MarkdownLogic.MarkdownPathKey].ToString();
|
||||||
|
|
||||||
if (System.IO.File.Exists(docUrl))
|
//Need to get NEW key as needs to be the original MD filename
|
||||||
|
//from Github including .md & correct casing of file
|
||||||
|
//var originalUrl = HttpContext.Current.Items["umbOriginalUrl"].ToString();
|
||||||
|
string originalUrl;
|
||||||
|
if (!TryGetExactPath(docUrl, out originalUrl))
|
||||||
{
|
{
|
||||||
//Need to get NEW key as needs to be the original MD filename
|
// MD file does not exist on disk - hide edit button
|
||||||
//from Github including .md & correct casing of file
|
return null;
|
||||||
var originalUrl = HttpContext.Current.Items["umbOriginalUrl"].ToString();
|
|
||||||
|
|
||||||
//Ensure beginning part of url is right case for GitHub URL
|
|
||||||
if (originalUrl.StartsWith("/documentation/", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
// don't strip off the leading "/"
|
|
||||||
originalUrl = originalUrl.Substring("/documentation/".Length - 1);
|
|
||||||
|
|
||||||
//If ends with / then it's an index.md file in a folder
|
|
||||||
if (originalUrl.EndsWith("/"))
|
|
||||||
{
|
|
||||||
//Add the word after the /, so it's /index
|
|
||||||
originalUrl += "index";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Append the .md file extension
|
|
||||||
docUrl = baseUrl + string.Format("{0}{1}", originalUrl, ".md");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// Ensure beginning part of url is right case for GitHub URL
|
||||||
|
var docFolderPosition = originalUrl.IndexOf(@"\documentation\", StringComparison.InvariantCultureIgnoreCase);
|
||||||
|
if (docFolderPosition > -1)
|
||||||
{
|
{
|
||||||
//MD file does not exist on disk - hide edit button
|
// don't strip off the leading "/"
|
||||||
docUrl = null;
|
originalUrl = originalUrl
|
||||||
|
.Substring(docFolderPosition + @"\documentation\".Length - 1)
|
||||||
|
.Replace('\\', '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If ends with / then it's an index.md file in a folder
|
||||||
|
if (originalUrl.EndsWith("/"))
|
||||||
|
{
|
||||||
|
// Add the word after the /, so it's /index
|
||||||
|
originalUrl += "index.md";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append the base and file url together
|
||||||
|
docUrl = baseUrl + originalUrl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return docUrl;
|
return docUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the exact case used on the file system for an existing file or directory.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">A relative or absolute path.</param>
|
||||||
|
/// <param name="exactPath">The full path using the correct case if the path exists. Otherwise, null.</param>
|
||||||
|
/// <returns>True if the exact path was found. False otherwise.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// This supports drive-lettered paths and UNC paths, but a UNC root
|
||||||
|
/// will be returned in title case (e.g., \\Server\Share).
|
||||||
|
/// Original from http://stackoverflow.com/a/29578292/97615
|
||||||
|
/// </remarks>
|
||||||
|
public static bool TryGetExactPath(string path, out string exactPath)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
exactPath = null;
|
||||||
|
|
||||||
|
// DirectoryInfo accepts either a file path or a directory path, and most of its properties work for either.
|
||||||
|
// However, its Exists property only works for a directory path.
|
||||||
|
DirectoryInfo directory = new DirectoryInfo(path);
|
||||||
|
if (File.Exists(path) || directory.Exists)
|
||||||
|
{
|
||||||
|
var parts = new List<string>();
|
||||||
|
|
||||||
|
DirectoryInfo parentDirectory = directory.Parent;
|
||||||
|
while (parentDirectory != null)
|
||||||
|
{
|
||||||
|
FileSystemInfo entry = parentDirectory.EnumerateFileSystemInfos(directory.Name).First();
|
||||||
|
parts.Add(entry.Name);
|
||||||
|
|
||||||
|
directory = parentDirectory;
|
||||||
|
parentDirectory = directory.Parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the root part (i.e., drive letter or UNC \\server\share).
|
||||||
|
string root = directory.FullName;
|
||||||
|
if (root.Contains(':'))
|
||||||
|
{
|
||||||
|
root = root.ToUpper();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string[] rootParts = root.Split('\\');
|
||||||
|
root = string.Join("\\", rootParts.Select(part => CultureInfo.CurrentCulture.TextInfo.ToTitleCase(part)));
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.Add(root);
|
||||||
|
parts.Reverse();
|
||||||
|
exactPath = Path.Combine(parts.ToArray());
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user