Skip to content

Commit d6d7425

Browse files
reakaleekcotti
andauthored
Open external links in another tab (#793)
* Open external links in another tab * Fix * Fix tests --------- Co-authored-by: Felipe Cotti <[email protected]>
1 parent 2c10112 commit d6d7425

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

src/Elastic.Markdown/Myst/InlineParsers/DiagnosticLinkInlineParser.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,11 @@ private static void ValidateAndProcessLink(LinkInline link, InlineProcessor proc
131131

132132
if (IsCrossLink(uri))
133133
{
134+
link.SetData("isCrossLink", true);
134135
ProcessCrossLink(link, processor, context, uri);
135136
return;
136137
}
138+
link.SetData("isCrossLink", false);
137139

138140
if (ValidateExternalUri(link, processor, uri))
139141
return;

src/Elastic.Markdown/Myst/Renderers/HtmxLinkInlineRenderer.cs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class HtmxLinkInlineRenderer : LinkInlineRenderer
1717
{
1818
protected override void Write(HtmlRenderer renderer, LinkInline link)
1919
{
20-
if (renderer.EnableHtmlForInline && !link.IsImage && link.Url?.StartsWith('/') == true)
20+
if (renderer.EnableHtmlForInline && !link.IsImage)
2121
{
2222
// ReSharper disable once UnusedVariable
2323
if (link.GetData(nameof(ParserContext.CurrentUrlPath)) is not string currentUrl)
@@ -26,21 +26,32 @@ protected override void Write(HtmlRenderer renderer, LinkInline link)
2626
return;
2727
}
2828

29-
var currentRootNavigation = link.GetData(nameof(MarkdownFile.RootNavigation)) as INavigation;
30-
var targetRootNavigation = link.GetData($"Target{nameof(MarkdownFile.RootNavigation)}") as INavigation;
29+
var url = link.GetDynamicUrl != null ? link.GetDynamicUrl() : link.Url;
3130

3231
_ = renderer.Write("<a href=\"");
33-
_ = renderer.WriteEscapeUrl(link.GetDynamicUrl != null ? link.GetDynamicUrl() : link.Url);
32+
_ = renderer.WriteEscapeUrl(url);
3433
_ = renderer.Write('"');
3534
_ = renderer.WriteAttributes(link);
36-
_ = renderer.Write(" hx-get=\"");
37-
_ = renderer.WriteEscapeUrl(link.GetDynamicUrl != null ? link.GetDynamicUrl() : link.Url);
38-
_ = renderer.Write('"');
39-
_ = renderer.Write($" hx-select-oob=\"{Htmx.GetHxSelectOob(currentRootNavigation?.Id == targetRootNavigation?.Id)}\"");
40-
_ = renderer.Write(" hx-swap=\"none\"");
41-
_ = renderer.Write(" hx-push-url=\"true\"");
42-
_ = renderer.Write(" hx-indicator=\"#htmx-indicator\"");
43-
_ = renderer.Write($" preload=\"{Htmx.GetPreload()}\"");
35+
36+
37+
if (link.Url?.StartsWith('/') == true)
38+
{
39+
var currentRootNavigation = link.GetData(nameof(MarkdownFile.RootNavigation)) as INavigation;
40+
var targetRootNavigation = link.GetData($"Target{nameof(MarkdownFile.RootNavigation)}") as INavigation;
41+
_ = renderer.Write(" hx-get=\"");
42+
_ = renderer.WriteEscapeUrl(url);
43+
_ = renderer.Write('"');
44+
_ = renderer.Write($" hx-select-oob=\"{Htmx.GetHxSelectOob(currentRootNavigation?.Id == targetRootNavigation?.Id)}\"");
45+
_ = renderer.Write(" hx-swap=\"none\"");
46+
_ = renderer.Write(" hx-push-url=\"true\"");
47+
_ = renderer.Write(" hx-indicator=\"#htmx-indicator\"");
48+
_ = renderer.Write($" preload=\"{Htmx.GetPreload()}\"");
49+
}
50+
else if (link.Url?.StartsWith("http") == true && (link.GetData("isCrossLink") as bool?) == false)
51+
{
52+
_ = renderer.Write(" target=\"_blank\"");
53+
_ = renderer.Write(" rel=\"noopener noreferrer\"");
54+
}
4455

4556
if (!string.IsNullOrEmpty(link.Title))
4657
{
@@ -49,7 +60,7 @@ protected override void Write(HtmlRenderer renderer, LinkInline link)
4960
_ = renderer.Write('"');
5061
}
5162

52-
if (!string.IsNullOrWhiteSpace(Rel))
63+
if (!string.IsNullOrWhiteSpace(Rel) && link.Url?.StartsWith('/') == false)
5364
{
5465
_ = renderer.Write(" rel=\"");
5566
_ = renderer.Write(Rel);

tests/Elastic.Markdown.Tests/Inline/InlineLinkTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ [link to app]({{some-url-with-a-version}})
194194
public void GeneratesHtml() =>
195195
// language=html
196196
Html.Should().Contain(
197-
"""<p><a href="https://github.com/elastic/fake-repo/tree/v1.17.0">link to app</a></p>"""
197+
"""<p><a href="https://github.com/elastic/fake-repo/tree/v1.17.0" target="_blank" rel="noopener noreferrer">link to app</a></p>"""
198198
);
199199

200200
[Fact]

0 commit comments

Comments
 (0)