@@ -126,7 +126,6 @@ private bool HasIndex(string slug)
126126 var description = fm . GetString ( "description" ) ;
127127 var canonical = fm . GetString ( "canonical" ) ;
128128 var noindex = fm . GetBool ( "noindex" , defaultValue : false ) ;
129- var ogImage = fm . GetString ( "og_image" ) ?? fm . GetString ( "og:image" ) ;
130129 var gameName = fm . GetString ( "game" ) ?? title ;
131130 var leaderboardUrl = fm . GetString ( "leaderboard" ) ;
132131 var timingMethod = fm . GetString ( "timing_method" ) ; // e.g. "RTA (AutoSplitter + LRT)" etc
@@ -135,6 +134,13 @@ private bool HasIndex(string slug)
135134 var whereToBuy = fm . GetString ( "where_to_buy" ) ;
136135 var platforms = fm . GetList ( "platforms" ) ;
137136
137+
138+ var ogImageRaw = fm . GetString ( "og_image" ) ?? fm . GetString ( "og:image" ) ;
139+ var squareImageRaw = fm . GetString ( "square_image" ) ?? fm . GetString ( "square:image" ) ;
140+
141+ var ogImage = ResolveAssetPath ( ogImageRaw , slug ) ;
142+ var squareImage = ResolveAssetPath ( squareImageRaw , slug ) ;
143+
138144 var etag = ComputeETag ( fi . Length , lastWrite ) ;
139145
140146 var doc = new MarkdownDoc
@@ -156,7 +162,8 @@ private bool HasIndex(string slug)
156162 Html = body ,
157163 LastModifiedUtc = lastWrite ,
158164 ETag = etag ,
159- OgImage = ogImage
165+ OgImage = ogImage ,
166+ SquareImage = squareImage
160167 } ;
161168
162169 Console . WriteLine ( $ "slug={ slug } path={ path } exists={ File . Exists ( path ) } ") ;
@@ -340,6 +347,32 @@ public Task<List<DocEntry>> GetGuideIndexAsync(string host, CancellationToken ct
340347
341348 return Task . FromResult ( items ) ;
342349 }
350+ private static string ? ResolveAssetPath ( string ? raw , string slug )
351+ {
352+ if ( string . IsNullOrWhiteSpace ( raw ) ) return null ;
353+
354+ raw = raw . Trim ( ) ;
355+
356+ // Already absolute URL
357+ if ( raw . StartsWith ( "http://" , StringComparison . OrdinalIgnoreCase ) ||
358+ raw . StartsWith ( "https://" , StringComparison . OrdinalIgnoreCase ) )
359+ return raw ;
360+
361+ // Already absolute path (site-root)
362+ if ( raw . StartsWith ( "/" ) )
363+ return raw ;
364+
365+ // Relative to the doc folder
366+ // slug is like "guide/template-game" or "guide/template-game/index"
367+ var cleanSlug = ( slug ?? "" ) . Trim ( '/' ) ;
368+
369+ if ( cleanSlug . EndsWith ( "/index" , StringComparison . OrdinalIgnoreCase ) )
370+ cleanSlug = cleanSlug [ ..^ "/index" . Length ] . TrimEnd ( '/' ) ;
371+
372+ // folder base under content
373+ // -> /content/guide/template-game/ + raw
374+ return $ "/content/{ cleanSlug } /{ raw } ". Replace ( "\\ " , "/" ) ;
375+ }
343376
344377
345378 private sealed record CacheEntry ( DateTime LastWriteUtc , MarkdownDoc Doc ) ;
0 commit comments