@@ -65,6 +65,7 @@ namespace Docnet | |||
/// Gets a value indicating whether this element is the __index element | |||
/// </summary> | |||
bool IsIndexElement { get; set; } | |||
bool IsAutoGenerated { get; set; } | |||
string Name { get; set; } | |||
object Value { get; set; } | |||
NavigationLevel ParentContainer { get; set; } | |||
@@ -67,6 +67,8 @@ namespace Docnet | |||
/// </summary> | |||
public abstract bool IsIndexElement { get; set; } | |||
public bool IsAutoGenerated { get; set; } | |||
public string Name { get; set; } | |||
/// <summary> | |||
/// Gets or sets the value of this element, which can either be a string or a NavigationLevel | |||
@@ -180,8 +180,14 @@ namespace Docnet | |||
} | |||
else | |||
{ | |||
fragments.Add(string.Format("{0}<a href=\"{1}{2}\">{3}</a></span></li>", elementStartTag, relativePathToRoot, HttpUtility.UrlPathEncode(indexElement.GetTargetURL(pathSpecification)), | |||
this.Name)); | |||
var link = HttpUtility.UrlPathEncode(indexElement.GetTargetURL(pathSpecification)); | |||
if (link.EndsWith("index.htm",StringComparison.InvariantCultureIgnoreCase)) | |||
{ | |||
link = link.Substring(0, link.Length - "index.htm".Length); | |||
} | |||
fragments.Add(string.Format("{0}<a href=\"{1}{2}\">{3}</a></span></li>", | |||
elementStartTag, relativePathToRoot, link, this.Name)); | |||
} | |||
} | |||
// then the elements in the container. Index elements are skipped here. | |||
@@ -209,7 +215,8 @@ namespace Docnet | |||
{ | |||
var root = new NavigationLevel(_rootDirectory) | |||
{ | |||
ParentContainer = this | |||
ParentContainer = this, | |||
IsAutoGenerated = true | |||
}; | |||
foreach (var mdFile in Directory.GetFiles(path, "*.md", SearchOption.TopDirectoryOnly)) | |||
@@ -224,7 +231,8 @@ namespace Docnet | |||
{ | |||
Name = name, | |||
Value = Path.Combine(Utils.MakeRelativePath(_rootDirectory, path), Path.GetFileName(mdFile)), | |||
ParentContainer = root | |||
ParentContainer = root, | |||
IsAutoGenerated = true | |||
}; | |||
root.Value.Add(item); | |||
@@ -282,6 +290,7 @@ namespace Docnet | |||
{ | |||
return string.Empty; | |||
} | |||
return defaultElement.GetTargetURL(pathSpecification) ?? string.Empty; | |||
} | |||
@@ -312,22 +321,25 @@ namespace Docnet | |||
break; | |||
case PathSpecification.Relative: | |||
var preferredPath = path; | |||
// We're making a big assumption here, but we can get the first page and assume it's | |||
// in the right folder. | |||
// Find first (simple) child and use 1 level up. A SimpleNavigationElement mostly represents a folder | |||
// thus is excellent to be used as a folder name | |||
var firstSimpleChildPage = (SimpleNavigationElement)this.Value.FirstOrDefault(x => x is SimpleNavigationElement && !ReferenceEquals(this, x)); | |||
if (firstSimpleChildPage != null) | |||
case PathSpecification.RelativeAsFolder: | |||
if (!IsRoot) | |||
{ | |||
preferredPath = Path.GetDirectoryName(firstSimpleChildPage.Value); | |||
} | |||
var preferredPath = value; | |||
if (!string.IsNullOrWhiteSpace(preferredPath)) | |||
{ | |||
value = Path.Combine(preferredPath, "index.md"); | |||
// We're making a big assumption here, but we can get the first page and assume it's | |||
// in the right folder. | |||
// Find first (simple) child and use 1 level up. A SimpleNavigationElement mostly represents a folder | |||
// thus is excellent to be used as a folder name | |||
var firstSimpleChildPage = (SimpleNavigationElement) this.Value.FirstOrDefault(x => x is SimpleNavigationElement && !ReferenceEquals(this, x)); | |||
if (firstSimpleChildPage != null) | |||
{ | |||
preferredPath = Path.GetDirectoryName(firstSimpleChildPage.Value); | |||
if (!string.IsNullOrWhiteSpace(preferredPath)) | |||
{ | |||
value = Path.Combine(preferredPath, "index.md"); | |||
} | |||
} | |||
} | |||
break; | |||
@@ -4,6 +4,8 @@ | |||
{ | |||
Full, | |||
Relative | |||
Relative, | |||
RelativeAsFolder | |||
} | |||
} |
@@ -219,12 +219,26 @@ namespace Docnet | |||
if (_targetURLForHTML == null) | |||
{ | |||
_targetURLForHTML = (this.Value ?? string.Empty); | |||
if (_targetURLForHTML.ToLowerInvariant().EndsWith(".md")) | |||
var toReplace = ".md"; | |||
var replacement = ".htm"; | |||
if (pathSpecification == PathSpecification.RelativeAsFolder) | |||
{ | |||
_targetURLForHTML = _targetURLForHTML.Substring(0, _targetURLForHTML.Length - 3) + ".htm"; | |||
if (!IsIndexElement && !_targetURLForHTML.EndsWith("index.md", StringComparison.InvariantCultureIgnoreCase)) | |||
{ | |||
replacement = "/index.htm"; | |||
} | |||
} | |||
if (_targetURLForHTML.EndsWith(toReplace, StringComparison.InvariantCultureIgnoreCase)) | |||
{ | |||
_targetURLForHTML = _targetURLForHTML.Substring(0, _targetURLForHTML.Length - toReplace.Length) + replacement; | |||
} | |||
_targetURLForHTML = _targetURLForHTML.Replace("\\", "/"); | |||
} | |||
return _targetURLForHTML; | |||
} | |||
@@ -14,6 +14,7 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.IO; | |||
using System.Linq; | |||
using System.Text; | |||
@@ -279,8 +280,10 @@ namespace MarkdownDeep | |||
} | |||
// Override to supply the size of an image | |||
public virtual bool OnGetImageSize(string url, bool TitledImage, out int width, out int height) | |||
public virtual bool OnGetImageSize(string url, bool TitledImage, out int width, out int height, out string finalUrl) | |||
{ | |||
finalUrl = url; | |||
if (GetImageSizeFunc != null) | |||
{ | |||
var info = new ImageInfo() { url = url, titled_image=TitledImage }; | |||
@@ -314,30 +317,51 @@ namespace MarkdownDeep | |||
url=url.Substring(1); | |||
} | |||
str=str + "\\" + url.Replace("/", "\\"); | |||
var success = false; | |||
// Because PathSpecification.RelativeAsFolder creates an additional layer of directories, | |||
// this trial & error code was implemented to ensure that images could be found | |||
var count = 0; | |||
while (count < 2) | |||
{ | |||
//Create an image object from the uploaded file | |||
try | |||
{ | |||
var fileName = str + "\\"; | |||
var currentUrl = url; | |||
// | |||
for (int i = 0; i < count; i++) | |||
{ | |||
currentUrl = "../" + currentUrl; | |||
} | |||
//Create an image object from the uploaded file | |||
try | |||
{ | |||
var img = System.Drawing.Image.FromFile(str); | |||
width=img.Width; | |||
height=img.Height; | |||
fileName += currentUrl.Replace("/", "\\"); | |||
if (File.Exists(fileName)) | |||
{ | |||
var img = System.Drawing.Image.FromFile(fileName); | |||
width = img.Width; | |||
height = img.Height; | |||
finalUrl = currentUrl; | |||
if (MaxImageWidth != 0 && width > MaxImageWidth) | |||
{ | |||
height = (int)((double)height * (double)MaxImageWidth / (double)width); | |||
width = MaxImageWidth; | |||
} | |||
if (MaxImageWidth != 0 && width>MaxImageWidth) | |||
success = true; | |||
break; | |||
} | |||
} | |||
catch (Exception) | |||
{ | |||
height=(int)((double)height * (double)MaxImageWidth / (double)width); | |||
width=MaxImageWidth; | |||
} | |||
return true; | |||
} | |||
catch (Exception) | |||
{ | |||
return false; | |||
count++; | |||
} | |||
return success; | |||
} | |||
@@ -386,9 +410,11 @@ namespace MarkdownDeep | |||
} | |||
// Try to determine width and height | |||
var url = tag.attributes["src"]; | |||
int width, height; | |||
if (OnGetImageSize(tag.attributes["src"], TitledImage, out width, out height)) | |||
if (OnGetImageSize(url, TitledImage, out width, out height, out url)) | |||
{ | |||
tag.attributes["src"] = url; | |||
tag.attributes["width"] = width.ToString(); | |||
tag.attributes["height"] = height.ToString(); | |||
} | |||