Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,12 @@ private static void ProcessCrossLink(LinkInline link, InlineProcessor processor,
uri, out var resolvedUri)
)
link.Url = resolvedUri.ToString();

// Emit error for empty link text in crosslinks
if (link.FirstChild == null)
{
processor.EmitError(link, $"Crosslink '{url}' has empty link text. Please provide explicit link text.");
}
}

private static void ProcessInternalLink(LinkInline link, InlineProcessor processor, ParserContext context)
Expand Down
56 changes: 56 additions & 0 deletions tests/Elastic.Markdown.Tests/Inline/InlineLinkTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,62 @@ public void EmitsCrossLink()
}
}

public class CrossLinkEmptyTextTest(ITestOutputHelper output) : LinkTestBase(output,
"""

Go to [](kibana://index.md)
"""
)
{
[Fact]
public void GeneratesHtml() =>
// language=html - empty crosslinks now emit an error
Html.Should().Contain(
"""<p>Go to <a href="https://docs-v3-preview.elastic.dev/elastic/kibana/tree/main/" hx-select-oob="#main-container" preload="mousedown"></a></p>"""
);

[Fact]
public void HasError() =>
Collector.Diagnostics.Should().Contain(d =>
d.Severity == Severity.Error &&
d.Message.Contains("empty link text"));

[Fact]
public void EmitsCrossLink()
{
Collector.CrossLinks.Should().HaveCount(1);
Collector.CrossLinks.Should().Contain("kibana://index.md");
}
}

public class CrossLinkEmptyTextNoTitleTest(ITestOutputHelper output) : LinkTestBase(output,
"""

Go to [](kibana://get-started/index.md)
"""
)
{
[Fact]
public void GeneratesHtml() =>
// language=html - empty crosslinks emit an error
Html.Should().Contain(
"""<p>Go to <a href="https://docs-v3-preview.elastic.dev/elastic/kibana/tree/main/get-started" hx-select-oob="#main-container" preload="mousedown"></a></p>"""
);

[Fact]
public void HasError() =>
Collector.Diagnostics.Should().Contain(d =>
d.Severity == Severity.Error &&
d.Message.Contains("empty link text"));

[Fact]
public void EmitsCrossLink()
{
Collector.CrossLinks.Should().HaveCount(1);
Collector.CrossLinks.Should().Contain("kibana://get-started/index.md");
}
}

public class LinkWithUnresolvedInterpolationError(ITestOutputHelper output) : LinkTestBase(output,
"""
[global search field]({{this-variable-does-not-exist}}/introduction.html#kibana-navigation-search)
Expand Down
1 change: 1 addition & 0 deletions tests/authoring/Framework/TestCrossLinkResolver.fs
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,4 @@ type TestCrossLinkResolver (config: ConfigurationFile) =
CrossLinkResolver.TryResolve(errorEmitter, crossLinks, uriResolver, crossLinkUri, &resolvedUri)