Skip to content
Merged
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
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,19 @@ Claude Haiku 4.5

- [dotnet/runtime](https://github.com/dotnet/runtime)
- [Claude Docs - Models overview](https://platform.claude.com/docs/en/about-claude/models/overview)

## Third-party Notices

### Material Design Icons

- Icon: rss
- URL: https://pictogrammers.com/library/mdi/icon/rss/
- Copyright (c) 2014 Austin Andrews (https://templarian.com/)
- Licensed under the [Apache License, Version 2.0](https://github.com/Templarian/MaterialDesign/blob/master/LICENSE)

### GitHub Octicons

- Icon: mark-github
- URL: https://github.com/primer/octicons/blob/main/icons/mark-github-24.svg
- Copyright (c) 2012 GitHub, Inc.
- Licensed under the [MIT License](https://github.com/primer/octicons/blob/main/LICENSE)
211 changes: 115 additions & 96 deletions src/PRDigest.NET/HtmlGenereator.cs → src/PRDigest.NET/HtmlGenerator.cs

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions src/PRDigest.NET/MarkdownOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Markdig;
using Markdig.Extensions.AutoIdentifiers;

namespace PRDigest.NET;

internal static class MarkdownOptions
{
public static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder()
.UseAutoIdentifiers(AutoIdentifierOptions.GitHub)
.UseAdvancedExtensions()
.Build();
}
48 changes: 42 additions & 6 deletions src/PRDigest.NET/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Anthropic.Models.Messages;
using Octokit;
using PRDigest.NET;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;

if (args.Length == 0) return;
Expand All @@ -20,6 +22,9 @@
// convert all markdown files to HTML
await CreateHtml(archivesDir, outputsDir);

// (Re)create RSS feed from archived markdown files
await CreateRss(archivesDir, outputsDir);

// end
var endTime = TimeProvider.System.GetTimestamp();
Console.WriteLine($"Total elapsed time: {TimeProvider.System.GetElapsedTime(startTime, endTime).TotalSeconds} seconds.");
Expand Down Expand Up @@ -68,7 +73,7 @@ async ValueTask SummarizeCurrentPullRequestAndCreate(string archivesDir, string
if (string.IsNullOrEmpty(markdown)) return;

// Save markdown and HTML files.
var html = HtmlGenereator.GenerateHtmlFromMarkdown($"{year}年{month}月{day}日", markdown);
var html = HtmlGenerator.GenerateHtmlFromMarkdown($"{year}年{month}月{day}日", markdown);
var markdownTask = File.WriteAllTextAsync(Path.Combine(archivesDir, year, month, $"{day}.md"), markdown);
var htmlTask = File.WriteAllTextAsync(Path.Combine(outputsDir, year, month, $"{day}.html"), html);
await Task.WhenAll(markdownTask, htmlTask);
Expand Down Expand Up @@ -260,6 +265,37 @@ async ValueTask<string> SummarizePullRequestAsync(PullRequestInfo[] pullRequestI
return $"{tableOfContentsBuilder}{separator}{markdownlBuilder}";
}

async ValueTask CreateRss(string archivesDir, string outputsDir)
{
const int MaxDays = 3;
var comparer = StringComparer.Create(CultureInfo.InvariantCulture, CompareOptions.NumericOrdering);

var items = new List<(string target, string markdownContent)>(MaxDays);
foreach (var yearDir in Directory.EnumerateDirectories(archivesDir).OrderDescending(comparer))
{
var year = Path.GetFileName(yearDir);

foreach (var monthDir in Directory.EnumerateDirectories(yearDir).OrderDescending(comparer))
{
var month = Path.GetFileName(monthDir);

foreach (var mdFilePath in Directory.EnumerateFiles(monthDir, "*.md").OrderDescending(comparer))
{
if (items.Count >= MaxDays) goto END;
var day = Path.GetFileNameWithoutExtension(mdFilePath);
var markdown = await File.ReadAllTextAsync(mdFilePath);
items.Add(($"{year}/{month}/{day}", markdown));
}
}
}

if (items.Count == 0) return;

END:
var rssContent = RssFeedGenerator.Generate(CollectionsMarshal.AsSpan(items));
await File.WriteAllTextAsync(Path.Combine(outputsDir, $"feed.xml"), rssContent);
}

async ValueTask CreateHtml(string archivesDir, string outputsDir)
{
// set up archives directory
Expand All @@ -274,36 +310,36 @@ async ValueTask CreateHtml(string archivesDir, string outputsDir)
Directory.CreateDirectory(outputsDir);
}

foreach (var yearDirs in Directory.GetDirectories(archivesDir))
foreach (var yearDirs in Directory.EnumerateDirectories(archivesDir))
{
var year = Path.GetFileName(yearDirs);
if (!Directory.Exists(Path.Combine(outputsDir, year)))
{
Directory.CreateDirectory(Path.Combine(outputsDir, year));
}

foreach (var monthDirss in Directory.GetDirectories(yearDirs))
foreach (var monthDirss in Directory.EnumerateDirectories(yearDirs))
{
var month = Path.GetFileName(monthDirss);
if (!Directory.Exists(Path.Combine(outputsDir, year, month)))
{
Directory.CreateDirectory(Path.Combine(outputsDir, year, month));
}

await Parallel.ForEachAsync(Directory.GetFiles(monthDirss, "*.md"), async (dayFiles, _) =>
await Parallel.ForEachAsync(Directory.EnumerateFiles(monthDirss, "*.md"), async (dayFiles, _) =>
{
var day = Path.GetFileNameWithoutExtension(dayFiles);
var markdown = await File.ReadAllTextAsync(dayFiles);

// ./yyyy/mm/dd.html
var html = HtmlGenereator.GenerateHtmlFromMarkdown($"{year}年{month}月{day}日", markdown);
var html = HtmlGenerator.GenerateHtmlFromMarkdown($"{year}年{month}月{day}日", markdown);
await File.WriteAllTextAsync(Path.Combine(outputsDir, year, month, $"{day}.html"), html);
});
}
}

// set up index.html
await File.WriteAllTextAsync(Path.Combine(outputsDir, "index.html"), HtmlGenereator.GenerateIndex(archivesDir, outputsDir));
await File.WriteAllTextAsync(Path.Combine(outputsDir, "index.html"), HtmlGenerator.GenerateIndex(archivesDir, outputsDir));
}

internal sealed class PullRequestInfo
Expand Down
161 changes: 0 additions & 161 deletions src/PRDigest.NET/PullReqeustAnalayzer.cs

This file was deleted.

Loading