Browse Source

update docs

pull/19419/head
Salih 3 years ago
parent
commit
aaf36a1112
  1. 44
      modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs
  2. 17
      modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs
  3. 82
      modules/docs/src/Volo.Docs.Web/Markdown/MarkdownDocumentToHtmlConverter.cs

44
modules/docs/src/Volo.Docs.Web/Areas/Documents/TagHelpers/TreeTagHelper.cs

@ -24,6 +24,10 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
private readonly IStringLocalizer<DocsResource> _localizer; private readonly IStringLocalizer<DocsResource> _localizer;
private readonly LinkGenerator _linkGenerator; private readonly LinkGenerator _linkGenerator;
private readonly Func<DocsUrlNormalizerContext, string> _urlNormalizer;
private readonly IServiceProvider _serviceProvider;
private const string LiItemTemplateWithLink = @"<li class='{0}'><span class='plus-icon'><i class='fa fa-{1}'></i></span>{2}{3}</li>"; private const string LiItemTemplateWithLink = @"<li class='{0}'><span class='plus-icon'><i class='fa fa-{1}'></i></span>{2}{3}</li>";
@ -51,11 +55,13 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
[HtmlAttributeName("language")] [HtmlAttributeName("language")]
public string LanguageCode { get; set; } public string LanguageCode { get; set; }
public TreeTagHelper(IOptions<DocsUiOptions> urlOptions, IStringLocalizer<DocsResource> localizer, LinkGenerator linkGenerator) public TreeTagHelper(IOptions<DocsUiOptions> urlOptions, IStringLocalizer<DocsResource> localizer, LinkGenerator linkGenerator, IServiceProvider serviceProvider)
{ {
_localizer = localizer; _localizer = localizer;
_uiOptions = urlOptions.Value; _uiOptions = urlOptions.Value;
_linkGenerator = linkGenerator; _linkGenerator = linkGenerator;
_urlNormalizer = _uiOptions.UrlNormalizer ?? (context => context.Url);
_serviceProvider = serviceProvider;
} }
public override void Process(TagHelperContext context, TagHelperOutput output) public override void Process(TagHelperContext context, TagHelperOutput output)
@ -168,26 +174,34 @@ namespace Volo.Docs.Areas.Documents.TagHelpers
private string NormalizePath(string path) private string NormalizePath(string path)
{ {
if (UrlHelper.IsExternalLink(path))
{
return path;
}
var pathWithoutFileExtension = RemoveFileExtensionFromPath(path); var pathWithoutFileExtension = RemoveFileExtensionFromPath(path);
if (string.IsNullOrWhiteSpace(path)) if (string.IsNullOrWhiteSpace(path))
{ {
return "javascript:;"; return "javascript:;";
} }
var routeValues = new Dictionary<string, object> { if (!UrlHelper.IsExternalLink(path))
{ nameof(IndexModel.LanguageCode), LanguageCode }, {
{ nameof(IndexModel.Version), Version }, var routeValues = new Dictionary<string, object> {
{ nameof(IndexModel.DocumentName), pathWithoutFileExtension }, { nameof(IndexModel.LanguageCode), LanguageCode },
{ nameof(IndexModel.ProjectName), ProjectName } { nameof(IndexModel.Version), Version },
}; { nameof(IndexModel.DocumentName), pathWithoutFileExtension },
{ nameof(IndexModel.ProjectName), ProjectName }
return _linkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues); };
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) private string RemoveFileExtensionFromPath(string path)

17
modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs

@ -34,6 +34,8 @@ namespace Volo.Docs
public bool SectionRendering = true; public bool SectionRendering = true;
public SingleProjectModeOptions SingleProjectMode { get; } = new (); public SingleProjectModeOptions SingleProjectMode { get; } = new ();
public Func<DocsUrlNormalizerContext, string> UrlNormalizer { get; set; }
private string GetFormattedRoutePrefix() private string GetFormattedRoutePrefix()
{ {
@ -56,4 +58,19 @@ namespace Volo.Docs
public string ProjectName { get; set; } 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; }
}
} }

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

@ -19,13 +19,18 @@ namespace Volo.Docs.Markdown
private readonly IMarkdownConverter _markdownConverter; private readonly IMarkdownConverter _markdownConverter;
private readonly DocsUiOptions _uiOptions; private readonly DocsUiOptions _uiOptions;
private readonly LinkGenerator _linkGenerator; private readonly LinkGenerator _linkGenerator;
private readonly IServiceProvider _serviceProvider;
private readonly Func<DocsUrlNormalizerContext, string> _urlNormalizer;
public MarkdownDocumentToHtmlConverter(IMarkdownConverter markdownConverter, public MarkdownDocumentToHtmlConverter(IMarkdownConverter markdownConverter,
IOptions<DocsUiOptions> urlOptions, LinkGenerator linkGenerator) IOptions<DocsUiOptions> urlOptions, LinkGenerator linkGenerator,
IServiceProvider serviceProvider)
{ {
_markdownConverter = markdownConverter; _markdownConverter = markdownConverter;
_linkGenerator = linkGenerator; _linkGenerator = linkGenerator;
_serviceProvider = serviceProvider;
_uiOptions = urlOptions.Value; _uiOptions = urlOptions.Value;
_urlNormalizer = _uiOptions.UrlNormalizer ?? (context => context.Url);
} }
private const string MdLinkFormat = "[{0}]({1})"; private const string MdLinkFormat = "[{0}]({1})";
@ -78,28 +83,27 @@ namespace Volo.Docs.Markdown
return Regex.Replace(content, MarkdownLinkRegExp, delegate (Match match) return Regex.Replace(content, MarkdownLinkRegExp, delegate (Match match)
{ {
var link = match.Groups[3].Value; var link = match.Groups[3].Value;
var displayText = match.Groups[1].Value;
var hashPart = ""; var hashPart = "";
var linkPart = link;
if (link.Contains("#")) if (link.Contains("#"))
{ {
var linkSplitted = link.Split("#"); var linkSplitted = link.Split("#");
link = linkSplitted[0]; linkPart = linkSplitted[0];
hashPart = linkSplitted[1]; hashPart = linkSplitted[1];
} }
var documentName = RemoveFileExtension(linkPart);
if (UrlHelper.IsExternalLink(link)) if (UrlHelper.IsExternalLink(link) || !linkPart.EndsWith(".md"))
{
return match.Value;
}
if (!link.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(); var hasUrlParameter = match.Groups.Count > 3 && !match.Groups[4].Value.IsNullOrEmpty();
if (hasUrlParameter) if (hasUrlParameter)
@ -117,11 +121,15 @@ namespace Volo.Docs.Markdown
{ {
documentName += $"#{hashPart}"; documentName += $"#{hashPart}";
} }
return string.Format( return NormalizeLink(
MdLinkFormat,
displayText, 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) return Regex.Replace(normalized, AnchorLinkRegExp, delegate (Match match)
{ {
var link = match.Groups[1].Value; var link = match.Groups[1].Value;
if (UrlHelper.IsExternalLink(link))
{
return match.Value;
}
var displayText = match.Groups[2].Value; var displayText = match.Groups[2].Value;
var documentName = RemoveFileExtension(link); 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( link = GenerateUrl(languageCode, $"{version}{documentLocalDirectoryNormalized}", documentName, projectShortName);
MdLinkFormat, }
displayText,
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) private static string RemoveFileExtension(string documentName)
{ {

Loading…
Cancel
Save