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,
Format = project.Format,
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
{
public class DocumentFormattingFactory : IDocumentFormattingFactory, ITransientDependency
public class DocumentConverterFactory : IDocumentConverterFactory, ITransientDependency
{
private readonly IServiceProvider _serviceProvider;
public DocumentFormattingFactory(IServiceProvider serviceProvider)
public DocumentConverterFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IDocumentFormatting Create(string format)
public IDocumentConverter Create(string format)
{
switch (format.ToLowerInvariant())
{
case MarkdownDocumentFormatting.Type:
return _serviceProvider.GetRequiredService<MarkdownDocumentFormatting>();
case MarkdownDocumentConverter.Type:
return _serviceProvider.GetRequiredService<MarkdownDocumentConverter>();
default:
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
{
//todo: fix this for html content.
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)
public static string ReplaceImageSources(string content, string documentRawRootUrl, string localDirectory)
{
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; }
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;
_documentFormattingFactory = documentFormattingFactory;
_documentConverterFactory = documentConverterFactory;
}
public async Task OnGet()
@ -41,12 +41,14 @@ namespace Volo.Docs.Pages.Documents.Project
.Select(v => new VersionInfo(v, v))
.ToList();
var hasAnyVersion = Versions.Any();
var latestVersion = Versions.First();
AddDefaultVersionIfNotContains();
var latestVersion = hasAnyVersion ? Versions[1] : Versions[0];
latestVersion.DisplayText = $"{latestVersion.Version} - latest";
latestVersion.Version = latestVersion.Version;
AddDefaultVersionIfNotContains();
var versionFromUrl = Versions.FirstOrDefault(v => v.Version == Version);
if (versionFromUrl != null)
@ -68,11 +70,11 @@ namespace Volo.Docs.Pages.Documents.Project
}
Document = await _documentAppService.GetByNameAsync(ProjectName, DocumentName, Version, true);
var documentFormatting = _documentFormattingFactory.Create(Document.Format ?? "md");
var content = documentFormatting.Format(Document.Content);
content = HtmlNormalizer.NormalizeImages(content, Document.RawRootUrl, Document.LocalDirectory);
content = HtmlNormalizer.NormalizeLinks(content, Document.Project.ShortName, Document.Version);
var converter = _documentConverterFactory.Create(Document.Format ?? "md");
var content = converter.NormalizeLinks(Document.Content, Document.Project.ShortName, Document.Version, Document.LocalDirectory);
content = converter.Convert(content);
content = HtmlNormalizer.ReplaceImageSources(content, Document.RawRootUrl, Document.LocalDirectory);
Document.Content = content;
Navigation = await _documentAppService.GetNavigationDocumentAsync(ProjectName, Version, false);

Loading…
Cancel
Save