diff --git a/src/Pennington.Book/BookArtifactService.cs b/src/Pennington.Book/BookArtifactService.cs index 25f1ec8e..72e5f340 100644 --- a/src/Pennington.Book/BookArtifactService.cs +++ b/src/Pennington.Book/BookArtifactService.cs @@ -38,7 +38,10 @@ public sealed class BookArtifactService : IFileWatchAware private readonly ILogger _logger; private readonly AsyncLazy _projectionLazy; - private readonly ConcurrentDictionary> _composed = new(StringComparer.OrdinalIgnoreCase); + + private readonly ConcurrentDictionary> _composed = + new(StringComparer.OrdinalIgnoreCase); + private readonly ConcurrentDictionary> _pdfs = new(StringComparer.OrdinalIgnoreCase); /// @@ -104,7 +107,8 @@ internal IReadOnlyList EnumerateArtifacts() public async Task GetPdfAsync(string pdfPath) { var key = pdfPath.Trim('/'); - var artifact = EnumerateArtifacts().FirstOrDefault(a => a.PdfPath.Equals(key, StringComparison.OrdinalIgnoreCase)); + var artifact = EnumerateArtifacts() + .FirstOrDefault(a => a.PdfPath.Equals(key, StringComparison.OrdinalIgnoreCase)); if (artifact is null) { return null; @@ -139,7 +143,8 @@ private AsyncLazy GetComposedLazy(BookArtifact artifact) private async Task ComposeAsync(BookArtifact artifact) { var data = await _projectionLazy; - var scoped = BookScoping.ScopeToc(data.TocItems, artifact.Book.NormalizedRoutePrefix, _localization, artifact.Locale); + var scoped = BookScoping.ScopeToc(data.TocItems, artifact.Book.NormalizedRoutePrefix, _localization, + artifact.Locale); var tree = await _navigationBuilder.BuildTreeAsync(scoped, currentPath: null, locale: artifact.Locale); // Version auto-detection lives here (not in the composer) so composer tests stay @@ -164,7 +169,7 @@ private async Task BuildProjectionAsync() await foreach (var page in _projection.GetPagesAsync()) { // Reuse the existing "don't extract me" opt-out, and skip pages with no body to compose. - if (page.Toc.ExcludeFromLlms || page.Content is null) + if (page.Toc.ExcludeFromLlms || !page.HasContent) { continue; } @@ -179,7 +184,8 @@ private async Task BuildProjectionAsync() private static string NormalizePreview(string path) => path.Trim('/'); - private static int CountPages(ImmutableList tree, IReadOnlyDictionary pages) + private static int CountPages(ImmutableList tree, + IReadOnlyDictionary pages) { var count = 0; Walk(tree); @@ -219,4 +225,4 @@ internal sealed record BookArtifact( string? Locale, string Slug, string PdfPath, - string PreviewPath); + string PreviewPath); \ No newline at end of file diff --git a/src/Pennington.Book/Composition/BookComposer.cs b/src/Pennington.Book/Composition/BookComposer.cs index 8682be80..0f6cd5c9 100644 --- a/src/Pennington.Book/Composition/BookComposer.cs +++ b/src/Pennington.Book/Composition/BookComposer.cs @@ -118,7 +118,8 @@ public string Compose( : $"{siteTitle} — {book.Title}"; var sb = new StringBuilder(); - sb.Append("\n\n\n\n"); + sb.Append("\n\n\n\n"); sb.Append("").Append(Encode(documentTitle)).Append("\n"); sb.Append("\n"); // PagedConfig must precede the polyfill so the auto-run picks up the readiness callback. - sb.Append("\n"); + sb.Append( + "\n"); sb.Append("\n"); sb.Append("\n\n"); @@ -219,7 +221,7 @@ private void RenderNode( var key = NormalizePath(node.Route.CanonicalPath.Value); if (!string.IsNullOrEmpty(key) && pageByPath.TryGetValue(key, out var page) - && page.Content is not null + && page.HasContent && !string.IsNullOrEmpty(page.Html)) { var content = ProcessPageContent(page, depth, slug, rewriteHref, resolveImageSrc); @@ -471,7 +473,8 @@ private void AppendColophon(StringBuilder sb, BookStamp stamp) } var pennington = BookVersion.Pennington(); - AppendColophonLine(sb, pennington is null ? "Produced with Pennington" : $"Produced with Pennington {pennington}"); + AppendColophonLine(sb, + pennington is null ? "Produced with Pennington" : $"Produced with Pennington {pennington}"); sb.Append("\n"); } @@ -487,7 +490,8 @@ private void AppendToc( string? locale) { sb.Append("