From afa0fd882927ae457b7c2cbf1e6497e1f3ed0cdc Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 6 Dec 2018 10:17:02 +0300 Subject: [PATCH] Refactor markdown document formatting --- .../Docs/Documents/DocumentStoreFactory.cs | 2 +- .../docs/src/Volo.Docs.Web/DocsWebModule.cs | 7 ++++ .../Formatting/DocumentConverterFactory.cs | 27 --------------- .../Formatting/IDocumentConverter.cs | 9 ----- .../Formatting/IDocumentConverterFactory.cs | 7 ---- .../DocumentToHtmlConverterFactory.cs | 33 +++++++++++++++++++ .../DocumentToHtmlConverterOptions.cs | 15 +++++++++ .../IDocumentToHtmlConverter.cs | 14 ++++++++ .../IDocumentToHtmlConverterFactory.cs | 7 ++++ .../MarkdownDocumentToHtmlConverter.cs} | 9 ++--- .../Pages/Documents/Project/Index.cshtml.cs | 10 +++--- 11 files changed, 87 insertions(+), 53 deletions(-) delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs delete mode 100644 modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs create mode 100644 modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs rename modules/docs/src/Volo.Docs.Web/{Formatting/MarkdownDocumentConverter.cs => Markdown/MarkdownDocumentToHtmlConverter.cs} (95%) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs index 0cd2b75f7f..9e13dd2fd8 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentStoreFactory.cs @@ -24,7 +24,7 @@ namespace Volo.Docs.Documents var serviceType = Options.Stores.GetOrDefault(storeType); if (serviceType == null) { - throw new ApplicationException($"Undefined document store: {storeType}"); + throw new ApplicationException($"Unknown document store: {storeType}"); } return (IDocumentStore) ServiceProvider.GetRequiredService(serviceType); diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs index c583215be9..1791463fb3 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs @@ -5,7 +5,9 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; +using Volo.Docs.HtmlConverting; using Volo.Docs.Localization; +using Volo.Docs.Markdown; namespace Volo.Docs { @@ -40,6 +42,11 @@ namespace Volo.Docs { options.AddProfile(validate: true); }); + + Configure(options => + { + options.Converters[MarkdownDocumentToHtmlConverter.Type] = typeof(MarkdownDocumentToHtmlConverter); + }); } } } diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs deleted file mode 100644 index 74c73590c2..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; - -namespace Volo.Docs.Formatting -{ - public class DocumentConverterFactory : IDocumentConverterFactory, ITransientDependency - { - private readonly IServiceProvider _serviceProvider; - - public DocumentConverterFactory(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public IDocumentConverter Create(string format) - { - switch (format.ToLowerInvariant()) - { - case MarkdownDocumentConverter.Type: - return _serviceProvider.GetRequiredService(); - default: - throw new ApplicationException($"Undefined document formatting: {format}"); - } - } - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs b/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs deleted file mode 100644 index ef11fc6851..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Volo.Docs.Formatting -{ - public interface IDocumentConverter - { - string Convert(string content); - - string NormalizeLinks(string content, string projectShortName, string version, string documentLocalDirectory); - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs deleted file mode 100644 index 20fe67f142..0000000000 --- a/modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Docs.Formatting -{ - public interface IDocumentConverterFactory - { - IDocumentConverter Create(string format); - } -} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs new file mode 100644 index 0000000000..a6a7978eee --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Docs.HtmlConverting +{ + public class DocumentToHtmlConverterFactory : IDocumentToHtmlConverterFactory, ITransientDependency + { + protected DocumentToHtmlConverterOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + + public DocumentToHtmlConverterFactory( + IServiceProvider serviceProvider, + IOptions options) + { + ServiceProvider = serviceProvider; + Options = options.Value; + } + + public virtual IDocumentToHtmlConverter Create(string format) + { + var serviceType = Options.Converters.GetOrDefault(format); + if (serviceType == null) + { + throw new ApplicationException($"Unknown document format: {format}"); + } + + return (IDocumentToHtmlConverter)ServiceProvider.GetRequiredService(serviceType); + } + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs new file mode 100644 index 0000000000..f332f6f58a --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/DocumentToHtmlConverterOptions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Docs.HtmlConverting +{ + public class DocumentToHtmlConverterOptions + { + public Dictionary Converters { get; set; } + + public DocumentToHtmlConverterOptions() + { + Converters = new Dictionary(); + } + } +} diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs new file mode 100644 index 0000000000..8948c39942 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs @@ -0,0 +1,14 @@ +namespace Volo.Docs.HtmlConverting +{ + public interface IDocumentToHtmlConverter + { + string Convert(string content); + + string NormalizeLinks( + string content, + string projectShortName, + string version, + string documentLocalDirectory + ); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs new file mode 100644 index 0000000000..9cdca43a8f --- /dev/null +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverterFactory.cs @@ -0,0 +1,7 @@ +namespace Volo.Docs.HtmlConverting +{ + public interface IDocumentToHtmlConverterFactory + { + IDocumentToHtmlConverter Create(string format); + } +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs similarity index 95% rename from modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs rename to modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs index c2189f2d72..01d1c92667 100644 --- a/modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs @@ -1,13 +1,14 @@ -using CommonMark; -using System; +using System; using System.Text; using System.Text.RegularExpressions; +using CommonMark; using Volo.Abp.DependencyInjection; +using Volo.Docs.HtmlConverting; using Volo.Docs.Utils; -namespace Volo.Docs.Formatting +namespace Volo.Docs.Markdown { - public class MarkdownDocumentConverter : IDocumentConverter, ITransientDependency + public class MarkdownDocumentToHtmlConverter : IDocumentToHtmlConverter, ITransientDependency { public const string Type = "md"; diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs index bbc4078ab1..f7c8a9ffdc 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; using Volo.Docs.Documents; -using Volo.Docs.Formatting; +using Volo.Docs.HtmlConverting; using Volo.Docs.Models; using Volo.Docs.Projects; @@ -41,16 +41,16 @@ namespace Volo.Docs.Pages.Documents.Project public VersionInfo LatestVersionInfo { get; private set; } private readonly IDocumentAppService _documentAppService; - private readonly IDocumentConverterFactory _documentConverterFactory; + private readonly IDocumentToHtmlConverterFactory _documentToHtmlConverterFactory; private readonly IProjectAppService _projectAppService; public IndexModel( IDocumentAppService documentAppService, - IDocumentConverterFactory documentConverterFactory, + IDocumentToHtmlConverterFactory documentToHtmlConverterFactory, IProjectAppService projectAppService) { _documentAppService = documentAppService; - _documentConverterFactory = documentConverterFactory; + _documentToHtmlConverterFactory = documentToHtmlConverterFactory; _projectAppService = projectAppService; } @@ -206,7 +206,7 @@ namespace Volo.Docs.Pages.Documents.Project return; } - var converter = _documentConverterFactory.Create(Document.Format ?? ProjectFormat); + var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? ProjectFormat); var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, GetSpecificVersionOrLatest(), Document.LocalDirectory); content = converter.Convert(content);