diff --git a/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs index af08393bad..709614a230 100644 --- a/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs +++ b/modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs @@ -142,9 +142,7 @@ namespace Volo.Docs.Areas.Documents.TagHelpers return "javascript:;"; } - var prefix = _urlOptions.RoutePrefix.IsNullOrEmpty() - ? "" - : _urlOptions.RoutePrefix.EnsureEndsWith('/'); + var prefix = _urlOptions.GetFormattedRoutePrefix(); return "/" + prefix + LanguageCode + "/" + ProjectName + "/" + Version + "/" + pathWithoutFileExtension; } diff --git a/modules/docs/src/Volo.Docs.Web/DocsUrlOptions.cs b/modules/docs/src/Volo.Docs.Web/DocsUrlOptions.cs index 739d8b0eac..283b343965 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsUrlOptions.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsUrlOptions.cs @@ -1,4 +1,6 @@ -namespace Volo.Docs +using System; + +namespace Volo.Docs { public class DocsUrlOptions { @@ -6,5 +8,15 @@ /// Default value: "documents"; /// public string RoutePrefix { get; set; } = "documents"; + + public string GetFormattedRoutePrefix() + { + if (string.IsNullOrWhiteSpace(RoutePrefix)) + { + return ""; + } + + return RoutePrefix.Trim('/').EnsureEndsWith('/'); + } } } diff --git a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs index 7f901ad0da..e16d36f6cb 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsWebModule.cs @@ -45,9 +45,7 @@ namespace Volo.Docs .GetRequiredServiceLazy>() .Value; - var routePrefix = urlOptions.Value.RoutePrefix.IsNullOrEmpty() - ? "" - : urlOptions.Value.RoutePrefix.EnsureEndsWith('/'); + var routePrefix = urlOptions.Value.GetFormattedRoutePrefix(); options.Conventions.AddPageRoute("/Documents/Project/Index", routePrefix + "{projectName}"); options.Conventions.AddPageRoute("/Documents/Project/Index", routePrefix + "{languageCode}/{projectName}"); diff --git a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs index 1ff429510b..9346fdfb99 100644 --- a/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/HtmlConverting/IDocumentToHtmlConverter.cs @@ -5,6 +5,6 @@ namespace Volo.Docs.HtmlConverting { public interface IDocumentToHtmlConverter { - string Convert(ProjectDto project, DocumentWithDetailsDto document,string version); + string Convert(ProjectDto project, DocumentWithDetailsDto document, string version, string languageCode); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs index ba44924799..5bf88664ef 100644 --- a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs @@ -1,5 +1,6 @@ using System; using System.Text.RegularExpressions; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Docs.Documents; using Volo.Docs.HtmlConverting; @@ -13,17 +14,21 @@ namespace Volo.Docs.Markdown public const string Type = "md"; private readonly IMarkdownConverter _markdownConverter; + private readonly DocsUrlOptions _urlOptions; - public MarkdownDocumentToHtmlConverter(IMarkdownConverter markdownConverter) + public MarkdownDocumentToHtmlConverter(IMarkdownConverter markdownConverter, + IOptions urlOptions) { _markdownConverter = markdownConverter; + _urlOptions = urlOptions.Value; } - private const string MdLinkFormat = "[{0}](/documents/{1}/{2}{3}/{4})"; + private const string MdLinkFormat = "[{0}](/{1}{2}/{3}/{4}{5}/{6})"; private const string MarkdownLinkRegExp = @"\[(.*)\]\((.*\.md)\)"; private const string AnchorLinkRegExp = @"]+href=\""(.*?)\""[^>]*>(.*)?"; - public virtual string Convert(ProjectDto project, DocumentWithDetailsDto document, string version) + public virtual string Convert(ProjectDto project, DocumentWithDetailsDto document, string version, + string languageCode) { if (document.Content.IsNullOrEmpty()) { @@ -34,7 +39,8 @@ namespace Volo.Docs.Markdown document.Content, project.ShortName, version, - document.LocalDirectory + document.LocalDirectory, + languageCode ); return _markdownConverter.ConvertToHtml(content); @@ -44,7 +50,8 @@ namespace Volo.Docs.Markdown string content, string projectShortName, string version, - string documentLocalDirectory) + string documentLocalDirectory, + string languageCode) { var normalized = Regex.Replace(content, MarkdownLinkRegExp, delegate (Match match) { @@ -66,6 +73,8 @@ namespace Volo.Docs.Markdown return string.Format( MdLinkFormat, displayText, + _urlOptions.GetFormattedRoutePrefix(), + languageCode, projectShortName, version, documentLocalDirectoryNormalized, @@ -92,6 +101,8 @@ namespace Volo.Docs.Markdown return string.Format( MdLinkFormat, displayText, + _urlOptions.GetFormattedRoutePrefix(), + languageCode, projectShortName, version, documentLocalDirectoryNormalized, diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs index bc52df6ea9..186a9122db 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml.cs @@ -27,9 +27,7 @@ namespace Volo.Docs.Pages.Documents public async Task OnGetAsync() { - DocumentsUrlPrefix = _urlOptions.RoutePrefix.IsNullOrEmpty() - ? "" - : _urlOptions.RoutePrefix.EnsureEndsWith('/'); + DocumentsUrlPrefix = _urlOptions.GetFormattedRoutePrefix(); var listResult = await _projectAppService.GetListAsync(); 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 e11a8a6114..83a1f62f27 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 @@ -70,9 +70,7 @@ namespace Volo.Docs.Pages.Documents.Project public async Task OnGetAsync() { - DocumentsUrlPrefix = _options.RoutePrefix.IsNullOrEmpty() - ? "" - : _options.RoutePrefix.EnsureEndsWith('/'); + DocumentsUrlPrefix = _options.GetFormattedRoutePrefix(); await SetProjectAsync(); await SetProjectsAsync(); @@ -92,7 +90,6 @@ namespace Volo.Docs.Pages.Documents.Project await SetDocumentAsync(); await SetNavigationAsync(); SetLanguageSelectListItems(); - AddLanguageCodePrefixToLinks(); return Page(); } @@ -234,7 +231,7 @@ namespace Volo.Docs.Pages.Documents.Project version = DocsAppConsts.Latest; } - var link = DocumentsUrlPrefix.EnsureStartsWith('/') + LanguageCode + "/" + ProjectName + "/" + version; + var link = DocumentsUrlPrefix + LanguageCode + "/" + ProjectName + "/" + version; if (documentName != null) { @@ -330,7 +327,7 @@ namespace Volo.Docs.Pages.Documents.Project private void ConvertDocumentContentToHtml() { var converter = _documentToHtmlConverterFactory.Create(Document.Format ?? Project.Format); - var content = converter.Convert(Project, Document, GetSpecificVersionOrLatest()); + var content = converter.Convert(Project, Document, GetSpecificVersionOrLatest(), LanguageCode); content = HtmlNormalizer.ReplaceImageSources( content, @@ -347,10 +344,5 @@ namespace Volo.Docs.Pages.Documents.Project Document.Content = content; } - - private void AddLanguageCodePrefixToLinks() - { - Document.Content = Document.Content.Replace("href=\"/documents", "href=\"/" + DocumentsUrlPrefix + LanguageCode); - } } } \ No newline at end of file