Browse Source

Fixed link normalizing for MD.

pull/441/head
Alper Ebicoglu 8 years ago
parent
commit
16942fc2b7
  1. 3
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/GithubDocumentStore.cs
  2. 10
      modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs
  3. 9
      modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs
  4. 7
      modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs
  5. 7
      modules/docs/src/Volo.Docs.Web/Formatting/IDocumentFormatting.cs
  6. 7
      modules/docs/src/Volo.Docs.Web/Formatting/IDocumentFormattingFactory.cs
  7. 32
      modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs
  8. 19
      modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentFormatting.cs
  9. 18
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/HtmlNormalizer.cs
  10. 22
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

3
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/GithubDocumentStore.cs

@ -50,7 +50,8 @@ namespace Volo.Docs.Documents
RawRootUrl = rawRootUrl, RawRootUrl = rawRootUrl,
Format = project.Format, Format = project.Format,
LocalDirectory = localDirectory, LocalDirectory = localDirectory,
FileName = fileName FileName = fileName,
Version = version
}); });
} }

10
modules/docs/src/Volo.Docs.Web/Formatting/DocumentFormattingFactory.cs → modules/docs/src/Volo.Docs.Web/Formatting/DocumentConverterFactory.cs

@ -4,21 +4,21 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Docs.Formatting namespace Volo.Docs.Formatting
{ {
public class DocumentFormattingFactory : IDocumentFormattingFactory, ITransientDependency public class DocumentConverterFactory : IDocumentConverterFactory, ITransientDependency
{ {
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
public DocumentFormattingFactory(IServiceProvider serviceProvider) public DocumentConverterFactory(IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
} }
public IDocumentFormatting Create(string format) public IDocumentConverter Create(string format)
{ {
switch (format.ToLowerInvariant()) switch (format.ToLowerInvariant())
{ {
case MarkdownDocumentFormatting.Type: case MarkdownDocumentConverter.Type:
return _serviceProvider.GetRequiredService<MarkdownDocumentFormatting>(); return _serviceProvider.GetRequiredService<MarkdownDocumentConverter>();
default: default:
throw new ApplicationException($"Undefined document formatting: {format}"); throw new ApplicationException($"Undefined document formatting: {format}");
} }

9
modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverter.cs

@ -0,0 +1,9 @@
namespace Volo.Docs.Formatting
{
public interface IDocumentConverter
{
string Convert(string content);
string NormalizeLinks(string content, string projectShortName, string version, string documentLocalDirectory);
}
}

7
modules/docs/src/Volo.Docs.Web/Formatting/IDocumentConverterFactory.cs

@ -0,0 +1,7 @@
namespace Volo.Docs.Formatting
{
public interface IDocumentConverterFactory
{
IDocumentConverter Create(string format);
}
}

7
modules/docs/src/Volo.Docs.Web/Formatting/IDocumentFormatting.cs

@ -1,7 +0,0 @@
namespace Volo.Docs.Formatting
{
public interface IDocumentFormatting
{
string Format(string content);
}
}

7
modules/docs/src/Volo.Docs.Web/Formatting/IDocumentFormattingFactory.cs

@ -1,7 +0,0 @@
namespace Volo.Docs.Formatting
{
public interface IDocumentFormattingFactory
{
IDocumentFormatting Create(string format);
}
}

32
modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentConverter.cs

@ -0,0 +1,32 @@
using System.Text;
using System.Text.RegularExpressions;
using CommonMark;
using Volo.Abp.DependencyInjection;
namespace Volo.Docs.Formatting
{
public class MarkdownDocumentConverter : IDocumentConverter, ITransientDependency
{
public const string Type = "md";
private const string NewLinkFormat = "[{0}](/documents/{1}/{2}/{3}/{4})";
public string Convert(string content)
{
return CommonMarkConverter.Convert(Encoding.UTF8.GetString(Encoding.Default.GetBytes(content)));
}
public string NormalizeLinks(string content, string projectShortName, string version,
string documentLocalDirectory)
{
return Regex.Replace(content, @"\[([^)]+)\]\(([^)]+.md)\)", delegate (Match match)
{
var displayText = match.Groups[1].Value;
var documentName = match.Groups[2].Value;
var newLink = string.Format(NewLinkFormat, displayText, projectShortName, version, documentLocalDirectory.TrimStart('/').TrimEnd('/'), documentName);
return newLink;
});
}
}
}

19
modules/docs/src/Volo.Docs.Web/Formatting/MarkdownDocumentFormatting.cs

@ -1,19 +0,0 @@
using System.Text;
using CommonMark;
using Volo.Abp.DependencyInjection;
namespace Volo.Docs.Formatting
{
public class MarkdownDocumentFormatting : IDocumentFormatting, ITransientDependency
{
public const string Type = "md";
public string Format(string content)
{
byte[] bytes = Encoding.Default.GetBytes(content);
var utf8Content = Encoding.UTF8.GetString(bytes);
return CommonMarkConverter.Convert(utf8Content);
}
}
}

18
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/HtmlNormalizer.cs

@ -5,23 +5,7 @@ namespace Volo.Docs.Pages.Documents.Project
{ {
public static class HtmlNormalizer public static class HtmlNormalizer
{ {
//todo: fix this for html content. public static string ReplaceImageSources(string content, string documentRawRootUrl, string localDirectory)
public static string NormalizeLinks(string content, string projectShortName, string version)
{
//var linkRegex = new Regex(@"\(([^)]+.md)\)", RegexOptions.Multiline);
//var matches = linkRegex.Matches(content);
//foreach (Match match in matches)
//{
// var mdFile = match.Value;
// content = content.Replace(mdFile, "(/documents/" + projectShortName + "/" + version + "/" + mdFile.Replace("(", "").Replace(")", "").Replace(".md", "") + ")");
//}
//return content;
return content;
}
public static string NormalizeImages(string content, string documentRawRootUrl, string localDirectory)
{ {
content = Regex.Replace(content, @"(<img\s+[^>]*)src=""([^""]*)""([^>]*>)", delegate (Match match) content = Regex.Replace(content, @"(<img\s+[^>]*)src=""([^""]*)""([^>]*>)", delegate (Match match)
{ {

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

@ -27,12 +27,12 @@ namespace Volo.Docs.Pages.Documents.Project
public NavigationWithDetailsDto Navigation { get; private set; } public NavigationWithDetailsDto Navigation { get; private set; }
private readonly IDocumentAppService _documentAppService; private readonly IDocumentAppService _documentAppService;
private readonly IDocumentFormattingFactory _documentFormattingFactory; private readonly IDocumentConverterFactory _documentConverterFactory;
public IndexModel(IDocumentAppService documentAppService, IDocumentFormattingFactory documentFormattingFactory) public IndexModel(IDocumentAppService documentAppService, IDocumentConverterFactory documentConverterFactory)
{ {
_documentAppService = documentAppService; _documentAppService = documentAppService;
_documentFormattingFactory = documentFormattingFactory; _documentConverterFactory = documentConverterFactory;
} }
public async Task OnGet() public async Task OnGet()
@ -41,12 +41,14 @@ namespace Volo.Docs.Pages.Documents.Project
.Select(v => new VersionInfo(v, v)) .Select(v => new VersionInfo(v, v))
.ToList(); .ToList();
var hasAnyVersion = Versions.Any();
var latestVersion = Versions.First(); AddDefaultVersionIfNotContains();
var latestVersion = hasAnyVersion ? Versions[1] : Versions[0];
latestVersion.DisplayText = $"{latestVersion.Version} - latest"; latestVersion.DisplayText = $"{latestVersion.Version} - latest";
latestVersion.Version = latestVersion.Version; latestVersion.Version = latestVersion.Version;
AddDefaultVersionIfNotContains();
var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version); var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version);
if (versionFromUrl != null) if (versionFromUrl != null)
@ -68,11 +70,11 @@ namespace Volo.Docs.Pages.Documents.Project
} }
Document = await _documentAppService.GetByNameAsync(ProjectName, DocumentName, Version, true); Document = await _documentAppService.GetByNameAsync(ProjectName, DocumentName, Version, true);
var documentFormatting = _documentFormattingFactory.Create(Document.Format ?? "md"); var converter = _documentConverterFactory.Create(Document.Format ?? "md");
var content = documentFormatting.Format(Document.Content); var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, Document.Version, Document.LocalDirectory);
content = converter.Convert(content);
content = HtmlNormalizer.NormalizeImages(content, Document.RawRootUrl, Document.LocalDirectory);
content = HtmlNormalizer.NormalizeLinks(content, Document.Project.ShortName, Document.Version); content = HtmlNormalizer.ReplaceImageSources(content, Document.RawRootUrl, Document.LocalDirectory);
Document.Content = content; Document.Content = content;
Navigation = await _documentAppService.GetNavigationDocumentAsync(ProjectName, Version, false); Navigation = await _documentAppService.GetNavigationDocumentAsync(ProjectName, Version, false);

Loading…
Cancel
Save