From aaf36a1112a0845b289eb0f13b159d1d3e375a0b Mon Sep 17 00:00:00 2001 From: Salih Date: Tue, 9 Apr 2024 00:43:02 +0300 Subject: [PATCH] update docs --- .../Documents/TagHelpers/TreeTagHelper.cs | 44 ++++++---- .../docs/src/Volo.Docs.Web/DocsUiOptions.cs | 17 ++++ .../MarkdownDocumentToHtmlConverter.cs | 82 ++++++++++++------- 3 files changed, 97 insertions(+), 46 deletions(-) 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 3ebcd39f84..88c34aab2f 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 @@ -24,6 +24,10 @@ namespace Volo.Docs.Areas.Documents.TagHelpers private readonly IStringLocalizer _localizer; private readonly LinkGenerator _linkGenerator; + + private readonly Func _urlNormalizer; + + private readonly IServiceProvider _serviceProvider; private const string LiItemTemplateWithLink = @"
  • {2}{3}
  • "; @@ -51,11 +55,13 @@ namespace Volo.Docs.Areas.Documents.TagHelpers [HtmlAttributeName("language")] public string LanguageCode { get; set; } - public TreeTagHelper(IOptions urlOptions, IStringLocalizer localizer, LinkGenerator linkGenerator) + public TreeTagHelper(IOptions urlOptions, IStringLocalizer localizer, LinkGenerator linkGenerator, IServiceProvider serviceProvider) { _localizer = localizer; _uiOptions = urlOptions.Value; _linkGenerator = linkGenerator; + _urlNormalizer = _uiOptions.UrlNormalizer ?? (context => context.Url); + _serviceProvider = serviceProvider; } public override void Process(TagHelperContext context, TagHelperOutput output) @@ -168,26 +174,34 @@ namespace Volo.Docs.Areas.Documents.TagHelpers private string NormalizePath(string path) { - if (UrlHelper.IsExternalLink(path)) - { - return path; - } - var pathWithoutFileExtension = RemoveFileExtensionFromPath(path); if (string.IsNullOrWhiteSpace(path)) { return "javascript:;"; } - - var routeValues = new Dictionary { - { nameof(IndexModel.LanguageCode), LanguageCode }, - { nameof(IndexModel.Version), Version }, - { nameof(IndexModel.DocumentName), pathWithoutFileExtension }, - { nameof(IndexModel.ProjectName), ProjectName } - }; - - return _linkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues); + + if (!UrlHelper.IsExternalLink(path)) + { + var routeValues = new Dictionary { + { nameof(IndexModel.LanguageCode), LanguageCode }, + { nameof(IndexModel.Version), Version }, + { nameof(IndexModel.DocumentName), pathWithoutFileExtension }, + { nameof(IndexModel.ProjectName), ProjectName } + }; + + path = _linkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues); + } + + + return _urlNormalizer(new DocsUrlNormalizerContext { + Url = path, + Version = Version, + ProjectName = ProjectName, + LanguageCode = LanguageCode, + DocumentName = pathWithoutFileExtension, + ServiceProvider = _serviceProvider + }); } private string RemoveFileExtensionFromPath(string path) diff --git a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs index 2119c958c2..816c51528d 100644 --- a/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs +++ b/modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs @@ -34,6 +34,8 @@ namespace Volo.Docs public bool SectionRendering = true; public SingleProjectModeOptions SingleProjectMode { get; } = new (); + + public Func UrlNormalizer { get; set; } private string GetFormattedRoutePrefix() { @@ -56,4 +58,19 @@ namespace Volo.Docs public string ProjectName { get; set; } } + + public class DocsUrlNormalizerContext + { + public string ProjectName { get; set; } + + public string Version { get; set; } + + public string LanguageCode { get; set; } + + public string DocumentName { get; set; } + + public string Url { get; set; } + + public IServiceProvider ServiceProvider { get; set; } + } } diff --git a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs index 7e5f416ab0..4db11661c4 100644 --- a/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs +++ b/modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs @@ -19,13 +19,18 @@ namespace Volo.Docs.Markdown private readonly IMarkdownConverter _markdownConverter; private readonly DocsUiOptions _uiOptions; private readonly LinkGenerator _linkGenerator; + private readonly IServiceProvider _serviceProvider; + private readonly Func _urlNormalizer; public MarkdownDocumentToHtmlConverter(IMarkdownConverter markdownConverter, - IOptions urlOptions, LinkGenerator linkGenerator) + IOptions urlOptions, LinkGenerator linkGenerator, + IServiceProvider serviceProvider) { _markdownConverter = markdownConverter; _linkGenerator = linkGenerator; + _serviceProvider = serviceProvider; _uiOptions = urlOptions.Value; + _urlNormalizer = _uiOptions.UrlNormalizer ?? (context => context.Url); } private const string MdLinkFormat = "[{0}]({1})"; @@ -78,28 +83,27 @@ namespace Volo.Docs.Markdown return Regex.Replace(content, MarkdownLinkRegExp, delegate (Match match) { var link = match.Groups[3].Value; + var displayText = match.Groups[1].Value; var hashPart = ""; + var linkPart = link; if (link.Contains("#")) { var linkSplitted = link.Split("#"); - link = linkSplitted[0]; + linkPart = linkSplitted[0]; hashPart = linkSplitted[1]; } + + var documentName = RemoveFileExtension(linkPart); - if (UrlHelper.IsExternalLink(link)) - { - return match.Value; - } - - if (!link.EndsWith(".md")) + if (UrlHelper.IsExternalLink(link) || !linkPart.EndsWith(".md")) { - return match.Value; + return NormalizeLink(displayText, MdLinkFormat, link, projectShortName, + version, + documentName, + languageCode); } - - var displayText = match.Groups[1].Value; - - var documentName = RemoveFileExtension(link); + var hasUrlParameter = match.Groups.Count > 3 && !match.Groups[4].Value.IsNullOrEmpty(); if (hasUrlParameter) @@ -117,11 +121,15 @@ namespace Volo.Docs.Markdown { documentName += $"#{hashPart}"; } - - return string.Format( - MdLinkFormat, + + return NormalizeLink( displayText, - GenerateUrl(languageCode, $"{version}{documentLocalDirectoryNormalized}", documentName, projectShortName) + MdLinkFormat, + GenerateUrl(languageCode, $"{version}{documentLocalDirectoryNormalized}", documentName, projectShortName), + projectShortName, + version, + documentName, + languageCode ); }); } @@ -132,26 +140,38 @@ namespace Volo.Docs.Markdown return Regex.Replace(normalized, AnchorLinkRegExp, delegate (Match match) { var link = match.Groups[1].Value; - if (UrlHelper.IsExternalLink(link)) - { - return match.Value; - } - var displayText = match.Groups[2].Value; var documentName = RemoveFileExtension(link); - var documentLocalDirectoryNormalized = documentLocalDirectory.TrimStart('/').TrimEnd('/'); - if (!string.IsNullOrWhiteSpace(documentLocalDirectoryNormalized)) + + if (UrlHelper.IsExternalLink(link)) { - documentLocalDirectoryNormalized = "/" + documentLocalDirectoryNormalized; - } + var documentLocalDirectoryNormalized = documentLocalDirectory.TrimStart('/').TrimEnd('/'); + if (!string.IsNullOrWhiteSpace(documentLocalDirectoryNormalized)) + { + documentLocalDirectoryNormalized = "/" + documentLocalDirectoryNormalized; + } - return string.Format( - MdLinkFormat, - displayText, - GenerateUrl(languageCode, $"{version}{documentLocalDirectoryNormalized}", documentName, projectShortName) - ); + link = GenerateUrl(languageCode, $"{version}{documentLocalDirectoryNormalized}", documentName, projectShortName); + } + + return NormalizeLink(displayText, MdLinkFormat, link,projectShortName, + version, + documentName, + languageCode); }); } + + private string NormalizeLink(string displayText, string linkFormat, string link, string projectName, string version, string documentName, string languageCode) + { + return string.Format(linkFormat, displayText, _urlNormalizer(new DocsUrlNormalizerContext { + Url = link, + ProjectName = projectName, + Version = version, + DocumentName = documentName, + LanguageCode = languageCode, + ServiceProvider = _serviceProvider + })); + } private static string RemoveFileExtension(string documentName) {