@@ -32,7 +32,7 @@ protected override void Write(LlmMarkdownRenderer renderer, LinkInline obj)
3232 renderer . WriteChildren ( obj ) ;
3333 renderer . Writer . Write ( "](" ) ;
3434 var url = obj . GetDynamicUrl ? . Invoke ( ) ?? obj . Url ;
35- var absoluteUrl = LlmRenderingHelpers . MakeAbsoluteUrl ( renderer , url ) ;
35+ var absoluteUrl = ProcessLinkUrl ( renderer , obj , url ) ;
3636 renderer . Writer . Write ( absoluteUrl ?? string . Empty ) ;
3737 }
3838 if ( ! string . IsNullOrEmpty ( obj . Title ) )
@@ -43,6 +43,43 @@ protected override void Write(LlmMarkdownRenderer renderer, LinkInline obj)
4343 }
4444 renderer . Writer . Write ( ")" ) ;
4545 }
46+
47+ /// <summary>
48+ /// Processes link URLs with special handling for crosslinks to ensure they get .md treatment
49+ /// </summary>
50+ private static string ? ProcessLinkUrl ( LlmMarkdownRenderer renderer , LinkInline obj , string ? url )
51+ {
52+ // Check if this is a crosslink (similar to HtmxLinkInlineRenderer)
53+ var isCrossLink = ( obj . GetData ( "isCrossLink" ) as bool ? ) == true ;
54+
55+ // Also check if this is a resolved crosslink to Elastic docs by URL pattern
56+ // This handles cases where crosslinks have been resolved but lost their metadata
57+ var isElasticDocsUrl = ! string . IsNullOrEmpty ( url ) &&
58+ url . StartsWith ( "https://www.elastic.co/docs/" , StringComparison . Ordinal ) ;
59+
60+ if ( ( isCrossLink || isElasticDocsUrl ) && ! string . IsNullOrEmpty ( url ) )
61+ {
62+ // For crosslinks that resolve to documentation URLs, use MakeAbsoluteMarkdownUrl
63+ // to ensure they get the .md treatment
64+ if ( url . Contains ( "/docs/" , StringComparison . Ordinal ) )
65+ {
66+ // Extract the docs path from the resolved URL
67+ var uri = Uri . TryCreate ( url , UriKind . Absolute , out var parsedUri ) ? parsedUri : null ;
68+ if ( uri != null && renderer . BuildContext . CanonicalBaseUrl != null )
69+ {
70+ var path = uri . AbsolutePath ;
71+ if ( path . StartsWith ( "/docs/" , StringComparison . Ordinal ) )
72+ {
73+ return LlmRenderingHelpers . MakeAbsoluteMarkdownUrl ( renderer . BuildContext . CanonicalBaseUrl , path ) ;
74+ }
75+ }
76+ }
77+ }
78+
79+ // For regular links, use the standard absolute URL conversion
80+ return LlmRenderingHelpers . MakeAbsoluteUrl ( renderer , url ) ;
81+ }
82+
4683}
4784
4885public class LlmEmphasisInlineRenderer : MarkdownObjectRenderer < LlmMarkdownRenderer , EmphasisInline >
0 commit comments