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
{
public interface IDocumentToHtmlConverter
{
string Convert(string content);
string NormalizeLinks(
string content,
string projectShortName,
string version,
string documentLocalDirectory
);
string Convert(ProjectDto project, DocumentWithDetailsDto document,string version);
}
}

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

@ -3,7 +3,9 @@ using System.Text;
using System.Text.RegularExpressions;
using CommonMark;
using Volo.Abp.DependencyInjection;
using Volo.Docs.Documents;
using Volo.Docs.HtmlConverting;
using Volo.Docs.Projects;
using Volo.Docs.Utils;
namespace Volo.Docs.Markdown
@ -13,17 +15,30 @@ namespace Volo.Docs.Markdown
public const string Type = "md";
private const string NewLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})";
private const string MarkdownLinkRegExp = @"\[([^)]+)\]\(([^)]+." + Type + @")\)";
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)
{
if (content == null)

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

@ -81,7 +81,7 @@
</span>
</div>
@if (Model.Versions.Any())
@if (Model.VersionSelectItems.Any())
{
<div class="docs-version">
<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 List<VersionInfoViewModel> Versions { get; private set; }
public List<SelectListItem> VersionSelectItems { get; private set; }
public NavigationWithDetailsDto Navigation { get; private set; }
@ -58,6 +56,7 @@ namespace Volo.Docs.Pages.Documents.Project
SetDocumentNames();
await SetVersionAsync();
await SetDocumentAsync();
ConvertDocumentContentToHtml();
await SetNavigationAsync();
}
@ -73,13 +72,14 @@ namespace Volo.Docs.Pages.Documents.Project
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))
.ToList();
LatestVersionInfo = Versions.First();
LatestVersionInfo = versions.First();
LatestVersionInfo.DisplayText = $"{LatestVersionInfo.DisplayText} ({DocsAppConsts.Latest})";
LatestVersionInfo.Version = LatestVersionInfo.Version;
@ -90,7 +90,7 @@ namespace Volo.Docs.Pages.Documents.Project
}
else
{
var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version);
var versionFromUrl = versions.FirstOrDefault(v => v.Version == Version);
if (versionFromUrl != null)
{
versionFromUrl.IsSelected = true;
@ -98,12 +98,12 @@ namespace Volo.Docs.Pages.Documents.Project
}
else
{
Versions.First().IsSelected = true;
Version = Versions.First().Version;
versions.First().IsSelected = true;
Version = versions.First().Version;
}
}
VersionSelectItems = Versions.Select(v => new SelectListItem
VersionSelectItems = versions.Select(v => new SelectListItem
{
Text = v.DisplayText,
Value = CreateLink(LatestVersionInfo, v.Version, DocumentName),
@ -191,16 +191,27 @@ namespace Volo.Docs.Pages.Documents.Project
catch (DocumentNotFoundException)
{
//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);
content = HtmlNormalizer.ReplaceCodeBlocksLanguage(content, "language-C#", "language-csharp"); //todo find a way to make it on client in prismJS configuration (eg: map C# => csharp)
private void ConvertDocumentContentToHtml()
{
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;
}

Loading…
Cancel
Save