| @@ -65,6 +65,7 @@ namespace Docnet | |||||
| /// Gets a value indicating whether this element is the __index element | /// Gets a value indicating whether this element is the __index element | ||||
| /// </summary> | /// </summary> | ||||
| bool IsIndexElement { get; set; } | bool IsIndexElement { get; set; } | ||||
| bool IsAutoGenerated { get; set; } | |||||
| string Name { get; set; } | string Name { get; set; } | ||||
| object Value { get; set; } | object Value { get; set; } | ||||
| NavigationLevel ParentContainer { get; set; } | NavigationLevel ParentContainer { get; set; } | ||||
| @@ -67,6 +67,8 @@ namespace Docnet | |||||
| /// </summary> | /// </summary> | ||||
| public abstract bool IsIndexElement { get; set; } | public abstract bool IsIndexElement { get; set; } | ||||
| public bool IsAutoGenerated { get; set; } | |||||
| public string Name { get; set; } | public string Name { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// Gets or sets the value of this element, which can either be a string or a NavigationLevel | /// Gets or sets the value of this element, which can either be a string or a NavigationLevel | ||||
| @@ -180,8 +180,14 @@ namespace Docnet | |||||
| } | } | ||||
| else | 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. | // then the elements in the container. Index elements are skipped here. | ||||
| @@ -209,7 +215,8 @@ namespace Docnet | |||||
| { | { | ||||
| var root = new NavigationLevel(_rootDirectory) | var root = new NavigationLevel(_rootDirectory) | ||||
| { | { | ||||
| ParentContainer = this | |||||
| ParentContainer = this, | |||||
| IsAutoGenerated = true | |||||
| }; | }; | ||||
| foreach (var mdFile in Directory.GetFiles(path, "*.md", SearchOption.TopDirectoryOnly)) | foreach (var mdFile in Directory.GetFiles(path, "*.md", SearchOption.TopDirectoryOnly)) | ||||
| @@ -224,7 +231,8 @@ namespace Docnet | |||||
| { | { | ||||
| Name = name, | Name = name, | ||||
| Value = Path.Combine(Utils.MakeRelativePath(_rootDirectory, path), Path.GetFileName(mdFile)), | Value = Path.Combine(Utils.MakeRelativePath(_rootDirectory, path), Path.GetFileName(mdFile)), | ||||
| ParentContainer = root | |||||
| ParentContainer = root, | |||||
| IsAutoGenerated = true | |||||
| }; | }; | ||||
| root.Value.Add(item); | root.Value.Add(item); | ||||
| @@ -282,6 +290,7 @@ namespace Docnet | |||||
| { | { | ||||
| return string.Empty; | return string.Empty; | ||||
| } | } | ||||
| return defaultElement.GetTargetURL(pathSpecification) ?? string.Empty; | return defaultElement.GetTargetURL(pathSpecification) ?? string.Empty; | ||||
| } | } | ||||
| @@ -312,22 +321,25 @@ namespace Docnet | |||||
| break; | break; | ||||
| case PathSpecification.Relative: | 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; | break; | ||||
| @@ -4,6 +4,8 @@ | |||||
| { | { | ||||
| Full, | Full, | ||||
| Relative | |||||
| Relative, | |||||
| RelativeAsFolder | |||||
| } | } | ||||
| } | } | ||||
| @@ -219,12 +219,26 @@ namespace Docnet | |||||
| if (_targetURLForHTML == null) | if (_targetURLForHTML == null) | ||||
| { | { | ||||
| _targetURLForHTML = (this.Value ?? string.Empty); | _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("\\", "/"); | _targetURLForHTML = _targetURLForHTML.Replace("\\", "/"); | ||||
| } | } | ||||
| return _targetURLForHTML; | return _targetURLForHTML; | ||||
| } | } | ||||
| @@ -14,6 +14,7 @@ | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.IO; | |||||
| using System.Linq; | using System.Linq; | ||||
| using System.Text; | using System.Text; | ||||
| @@ -279,8 +280,10 @@ namespace MarkdownDeep | |||||
| } | } | ||||
| // Override to supply the size of an image | // 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) | if (GetImageSizeFunc != null) | ||||
| { | { | ||||
| var info = new ImageInfo() { url = url, titled_image=TitledImage }; | var info = new ImageInfo() { url = url, titled_image=TitledImage }; | ||||
| @@ -314,30 +317,51 @@ namespace MarkdownDeep | |||||
| url=url.Substring(1); | 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 | // Try to determine width and height | ||||
| var url = tag.attributes["src"]; | |||||
| int width, height; | 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["width"] = width.ToString(); | ||||
| tag.attributes["height"] = height.ToString(); | tag.attributes["height"] = height.ToString(); | ||||
| } | } | ||||