diff --git a/src/Markdig.Tests/Markdig.Tests.csproj b/src/Markdig.Tests/Markdig.Tests.csproj index bbb6f935d..953102aac 100644 --- a/src/Markdig.Tests/Markdig.Tests.csproj +++ b/src/Markdig.Tests/Markdig.Tests.csproj @@ -65,6 +65,7 @@ + diff --git a/src/Markdig.Tests/Markdig.Tests.nuget.props b/src/Markdig.Tests/Markdig.Tests.nuget.props new file mode 100644 index 000000000..476495381 --- /dev/null +++ b/src/Markdig.Tests/Markdig.Tests.nuget.props @@ -0,0 +1,18 @@ + + + + True + NuGet + C:\code\github\markdig\src\Markdig.Tests\project.lock.json + $(UserProfile)\.nuget\packages\ + C:\Users\mheath\.nuget\packages\ + ProjectJson + 4.5.0 + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + \ No newline at end of file diff --git a/src/Markdig.Tests/TestLinkRewriter.cs b/src/Markdig.Tests/TestLinkRewriter.cs new file mode 100644 index 000000000..be1a84829 --- /dev/null +++ b/src/Markdig.Tests/TestLinkRewriter.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; +using Markdig.Parsers; +using Markdig.Renderers; +using NUnit.Framework; + +namespace Markdig.Tests +{ + public class TestLinkRewriter + { + [Test] + public void ReplacesRelativeLinks() + { + TestSpec(s => "abc" + s, "Link: [hello](/relative.jpg)", "abc/relative.jpg"); + TestSpec(s => s + "xyz", "Link: [hello](relative.jpg)", "relative.jpgxyz"); + TestSpec(null, "Link: [hello](relative.jpg)", "relative.jpg"); + TestSpec(null, "Link: [hello](/relative.jpg)", "/relative.jpg"); + } + + [Test] + public void ReplacesRelativeImageSources() + { + TestSpec(s => "abc" + s, "Image: ![alt text](/image.jpg)", "abc/image.jpg"); + TestSpec(s => "abc" + s, "Image: ![alt text](image.jpg \"title\")", "abcimage.jpg"); + TestSpec(null, "Image: ![alt text](/image.jpg)", "/image.jpg"); + } + + public static void TestSpec(Func linkRewriter, string markdown, string expectedLink) + { + var pipeline = new MarkdownPipelineBuilder().Build(); + + var writer = new StringWriter(); + var renderer = new HtmlRenderer(writer); + renderer.LinkRewriter = linkRewriter; + pipeline.Setup(renderer); + + var document = MarkdownParser.Parse(markdown, pipeline); + renderer.Render(document); + writer.Flush(); + + Assert.That(writer.ToString(), Contains.Substring("=\"" + expectedLink + "\"")); + } + } +} \ No newline at end of file diff --git a/src/Markdig/Renderers/HtmlRenderer.cs b/src/Markdig/Renderers/HtmlRenderer.cs index f529a17e2..8373e93f9 100644 --- a/src/Markdig/Renderers/HtmlRenderer.cs +++ b/src/Markdig/Renderers/HtmlRenderer.cs @@ -80,6 +80,11 @@ public HtmlRenderer(TextWriter writer) : base(writer) /// public Uri BaseUrl { get; set; } + /// + /// Allows links to be rewritten + /// + public Func LinkRewriter { get; set; } + /// /// Writes the content escaped for HTML. /// @@ -202,6 +207,11 @@ public HtmlRenderer WriteEscapeUrl(string content) content = new Uri(BaseUrl, content).AbsoluteUri; } + if (LinkRewriter != null) + { + content = LinkRewriter(content); + } + int previousPosition = 0; int length = content.Length;