Browse Source

Refactor MarkdownDocumentToHtmlConverter

pull/625/head
Halil ibrahim Kalkan 8 years ago
parent
commit
71f0dc2a17
  1. 12
      modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs
  2. 25
      modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs
  3. 2
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml
  4. 45
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

12
modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs

@ -1,14 +1,10 @@
using Volo.Docs.Documents;
using Volo.Docs.Projects;
namespace Volo.Docs.HtmlConverting namespace Volo.Docs.HtmlConverting
{ {
public interface IDocumentToHtmlConverter public interface IDocumentToHtmlConverter
{ {
string Convert(string content); string Convert(ProjectDto project, DocumentWithDetailsDto document,string version);
string NormalizeLinks(
string content,
string projectShortName,
string version,
string documentLocalDirectory
);
} }
} }

25
modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs

@ -3,7 +3,9 @@ using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CommonMark; using CommonMark;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Docs.Documents;
using Volo.Docs.HtmlConverting; using Volo.Docs.HtmlConverting;
using Volo.Docs.Projects;
using Volo.Docs.Utils; using Volo.Docs.Utils;
namespace Volo.Docs.Markdown namespace Volo.Docs.Markdown
@ -13,17 +15,30 @@ namespace Volo.Docs.Markdown
public const string Type = "md"; public const string Type = "md";
private const string NewLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})"; private const string NewLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})";
private const string MarkdownLinkRegExp = @"\[([^)]+)\]\(([^)]+." + Type + @")\)"; private const string MarkdownLinkRegExp = @"\[([^)]+)\]\(([^)]+." + Type + @")\)";
private const string AnchorLinkRegExp = @"<a[^>]+href=\""(.*?)\""[^>]*>(.*)?</a>"; private const string AnchorLinkRegExp = @"<a[^>]+href=\""(.*?)\""[^>]*>(.*)?</a>";
public string Convert(string content) public string Convert(ProjectDto project, DocumentWithDetailsDto document, string version)
{ {
return content == null ? null : CommonMarkConverter.Convert(Encoding.UTF8.GetString(Encoding.Default.GetBytes(content))); if (document.Content.IsNullOrEmpty())
{
return document.Content;
}
var content = NormalizeLinks(
document.Content,
project.ShortName,
version,
document.LocalDirectory
);
return CommonMarkConverter.Convert(Encoding.UTF8.GetString(Encoding.Default.GetBytes(content)));
} }
public string NormalizeLinks(string content, string projectShortName, string version, private string NormalizeLinks(
string content,
string projectShortName,
string version,
string documentLocalDirectory) string documentLocalDirectory)
{ {
if (content == null) if (content == null)

2
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml

@ -81,7 +81,7 @@
</span> </span>
</div> </div>
@if (Model.Versions.Any()) @if (Model.VersionSelectItems.Any())
{ {
<div class="docs-version"> <div class="docs-version">
<div class="version-select"> <div class="version-select">

45
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -29,8 +29,6 @@ namespace Volo.Docs.Pages.Documents.Project
public DocumentWithDetailsDto Document { get; private set; } public DocumentWithDetailsDto Document { get; private set; }
public List<VersionInfoViewModel> Versions { get; private set; }
public List<SelectListItem> VersionSelectItems { get; private set; } public List<SelectListItem> VersionSelectItems { get; private set; }
public NavigationWithDetailsDto Navigation { get; private set; } public NavigationWithDetailsDto Navigation { get; private set; }
@ -58,6 +56,7 @@ namespace Volo.Docs.Pages.Documents.Project
SetDocumentNames(); SetDocumentNames();
await SetVersionAsync(); await SetVersionAsync();
await SetDocumentAsync(); await SetDocumentAsync();
ConvertDocumentContentToHtml();
await SetNavigationAsync(); await SetNavigationAsync();
} }
@ -73,13 +72,14 @@ namespace Volo.Docs.Pages.Documents.Project
private async Task SetVersionAsync() private async Task SetVersionAsync()
{ {
var output = await _projectAppService.GetVersionsAsync(Project.Id); //TODO: Needs refactoring
Versions = output.Items var output = await _projectAppService.GetVersionsAsync(Project.Id);
var versions = output.Items
.Select(v => new VersionInfoViewModel(v.DisplayName, v.Name)) .Select(v => new VersionInfoViewModel(v.DisplayName, v.Name))
.ToList(); .ToList();
LatestVersionInfo = Versions.First(); LatestVersionInfo = versions.First();
LatestVersionInfo.DisplayText = $"{LatestVersionInfo.DisplayText} ({DocsAppConsts.Latest})"; LatestVersionInfo.DisplayText = $"{LatestVersionInfo.DisplayText} ({DocsAppConsts.Latest})";
LatestVersionInfo.Version = LatestVersionInfo.Version; LatestVersionInfo.Version = LatestVersionInfo.Version;
@ -90,7 +90,7 @@ namespace Volo.Docs.Pages.Documents.Project
} }
else else
{ {
var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version); var versionFromUrl = versions.FirstOrDefault(v => v.Version == Version);
if (versionFromUrl != null) if (versionFromUrl != null)
{ {
versionFromUrl.IsSelected = true; versionFromUrl.IsSelected = true;
@ -98,12 +98,12 @@ namespace Volo.Docs.Pages.Documents.Project
} }
else else
{ {
Versions.First().IsSelected = true; versions.First().IsSelected = true;
Version = Versions.First().Version; Version = versions.First().Version;
} }
} }
VersionSelectItems = Versions.Select(v => new SelectListItem VersionSelectItems = versions.Select(v => new SelectListItem
{ {
Text = v.DisplayText, Text = v.DisplayText,
Value = CreateLink(LatestVersionInfo, v.Version, DocumentName), Value = CreateLink(LatestVersionInfo, v.Version, DocumentName),
@ -191,16 +191,27 @@ namespace Volo.Docs.Pages.Documents.Project
catch (DocumentNotFoundException) catch (DocumentNotFoundException)
{ {
//TODO: Handle it! //TODO: Handle it!
return; throw;
} }
}
var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? Project.Format);
var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, GetSpecificVersionOrLatest(), Document.LocalDirectory);
content = converter.Convert(content);
content = HtmlNormalizer.ReplaceImageSources(content, Document.RawRootUrl, Document.LocalDirectory); private void ConvertDocumentContentToHtml()
content = HtmlNormalizer.ReplaceCodeBlocksLanguage(content, "language-C#", "language-csharp"); //todo find a way to make it on client in prismJS configuration (eg: map C# => csharp) {
var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? Project.Format);
var content = converter.Convert(Project, Document, GetSpecificVersionOrLatest());
content = HtmlNormalizer.ReplaceImageSources(
content,
Document.RawRootUrl,
Document.LocalDirectory
);
//todo find a way to make it on client in prismJS configuration (eg: map C# => csharp)
content = HtmlNormalizer.ReplaceCodeBlocksLanguage(
content,
"language-C#",
"language-csharp"
);
Document.Content = content; Document.Content = content;
} }

Loading…
Cancel
Save