Skip to content

Commit fdd97d2

Browse files
Copilotreakaleek
andcommitted
Fix cross-links to markdown files to preserve .md extensions
- Store original cross-link URL before resolution - Detect cross-links pointing to .md files - Extract relative path with .md extension for LLM output - Update test to validate cross-link behavior - Maintain absolute URLs for non-markdown cross-links Co-authored-by: reakaleek <[email protected]>
1 parent 5ad52af commit fdd97d2

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ private static void ProcessCrossLink(LinkInline link, InlineProcessor processor,
179179
if (url != null)
180180
context.Build.Collector.EmitCrossLink(url);
181181

182+
// Store the original cross-link URL for LLM rendering
183+
link.SetData("originalCrossLinkUrl", uri.ToString());
184+
182185
if (context.CrossLinkResolver.TryResolve(
183186
s => processor.EmitError(link, s),
184187
uri, out var resolvedUri)

src/Elastic.Markdown/Myst/Renderers/LlmMarkdown/LlmInlineRenderers.cs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,24 @@ protected override void Write(LlmMarkdownRenderer renderer, LinkInline obj)
3737
// Check if this is an internal link to a markdown page
3838
var isCrossLink = (obj.GetData("isCrossLink") as bool?) == true;
3939
var hasTargetNavigationRoot = obj.GetData($"Target{nameof(MarkdownFile.NavigationRoot)}") != null;
40+
var originalCrossLinkUrl = obj.GetData("originalCrossLinkUrl") as string;
4041
var isInternalMarkdownLink = !isCrossLink && hasTargetNavigationRoot;
42+
var isCrossLinkToMarkdown = isCrossLink && originalCrossLinkUrl != null && IsCrossLinkToMarkdown(originalCrossLinkUrl);
4143

4244
if (isInternalMarkdownLink)
4345
{
4446
// For internal markdown links, preserve the .md extension
4547
renderer.Writer.Write(EnsureMarkdownExtension(url) ?? string.Empty);
4648
}
49+
else if (isCrossLinkToMarkdown)
50+
{
51+
// For cross-links to markdown files, extract relative path with .md extension
52+
var markdownPath = ExtractMarkdownPath(originalCrossLinkUrl!);
53+
renderer.Writer.Write(markdownPath ?? string.Empty);
54+
}
4755
else
4856
{
49-
// For external links and cross-links, make absolute
57+
// For external links and non-markdown cross-links, make absolute
5058
var absoluteUrl = LlmRenderingHelpers.MakeAbsoluteUrl(renderer, url);
5159
renderer.Writer.Write(absoluteUrl ?? string.Empty);
5260
}
@@ -78,6 +86,44 @@ protected override void Write(LlmMarkdownRenderer renderer, LinkInline obj)
7886
// Add .md extension to internal markdown links
7987
return processedUrl + ".md";
8088
}
89+
90+
/// <summary>
91+
/// Checks if a cross-link URL points to a markdown file
92+
/// </summary>
93+
private static bool IsCrossLinkToMarkdown(string originalCrossLinkUrl)
94+
{
95+
if (string.IsNullOrEmpty(originalCrossLinkUrl))
96+
return false;
97+
98+
// Parse the cross-link URI to extract the path
99+
if (Uri.TryCreate(originalCrossLinkUrl, UriKind.Absolute, out var uri))
100+
{
101+
var path = uri.AbsolutePath;
102+
return path.EndsWith(".md", StringComparison.OrdinalIgnoreCase);
103+
}
104+
105+
return false;
106+
}
107+
108+
/// <summary>
109+
/// Extracts the relative markdown path from a cross-link URL
110+
/// </summary>
111+
private static string? ExtractMarkdownPath(string originalCrossLinkUrl)
112+
{
113+
if (string.IsNullOrEmpty(originalCrossLinkUrl))
114+
return null;
115+
116+
// Parse the cross-link URI to extract the path
117+
if (Uri.TryCreate(originalCrossLinkUrl, UriKind.Absolute, out var uri))
118+
{
119+
var path = uri.AbsolutePath;
120+
if (path.StartsWith('/'))
121+
path = path.TrimStart('/');
122+
return path;
123+
}
124+
125+
return null;
126+
}
81127
}
82128

83129
public class LlmEmphasisInlineRenderer : MarkdownObjectRenderer<LlmMarkdownRenderer, EmphasisInline>

tests/authoring/LlmMarkdown/LlmMarkdownOutput.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ This is a [link to another page](another-page.md).
546546

547547
This is an [external link](https://example.com).
548548

549-
This is a [cross-link](https://docs.elastic.co/some-page).
549+
This is a [cross-link](docs-content:/solutions/observability/apps/apm-server-binary.md).
550550
"""
551551
Markdown "another-page.md" """
552552
# Another Page
@@ -560,5 +560,5 @@ This is another page for testing internal links.
560560
generator |> convertsToNewLLM """
561561
This is a [link to another page](another-page.md).
562562
This is an [external link](https://example.com).
563-
This is a [cross-link](https://docs.elastic.co/some-page).
563+
This is a [cross-link](solutions/observability/apps/apm-server-binary.md).
564564
"""

0 commit comments

Comments
 (0)