Initial Commit
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Model\Model.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Markdig" Version="0.40.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,110 @@
|
||||
using System.Text;
|
||||
using Markdig;
|
||||
using Model;
|
||||
|
||||
var docsDir = Path.GetFullPath(args.Length > 0 ? args[0] : Path.Combine("..", "..", "gsr.docs"));
|
||||
var outputDir = Path.GetFullPath(args.Length > 1 ? args[1] : Path.Combine("..", "Model"));
|
||||
|
||||
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
|
||||
|
||||
var games = new List<GameDoc>();
|
||||
string? overviewHtml = null;
|
||||
|
||||
foreach (var file in Directory.EnumerateFiles(docsDir, "*.md"))
|
||||
{
|
||||
var text = File.ReadAllText(file);
|
||||
var title = Path.GetFileNameWithoutExtension(file);
|
||||
|
||||
string body;
|
||||
var category = string.Empty;
|
||||
string? link = null;
|
||||
string? git = null;
|
||||
|
||||
if (text.StartsWith("---"))
|
||||
{
|
||||
var endIdx = text.IndexOf("---", 3, StringComparison.Ordinal);
|
||||
if (endIdx > 0)
|
||||
{
|
||||
var yaml = text[3..endIdx].Trim();
|
||||
body = text[(endIdx + 3)..].Trim();
|
||||
|
||||
foreach (var line in yaml.Split('\n', StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
var colonIdx = line.IndexOf(':');
|
||||
if (colonIdx < 0) continue;
|
||||
|
||||
var key = line[..colonIdx].Trim();
|
||||
var val = line[(colonIdx + 1)..].Trim();
|
||||
|
||||
if (val.Length == 0) continue;
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case "category": category = val; break;
|
||||
case "link": link = val; break;
|
||||
case "git": git = val; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
body = text;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
body = text;
|
||||
}
|
||||
|
||||
var html = Markdown.ToHtml(body, pipeline);
|
||||
|
||||
if (title == "Overview")
|
||||
{
|
||||
overviewHtml = html;
|
||||
}
|
||||
else
|
||||
{
|
||||
games.Add(new GameDoc
|
||||
{
|
||||
Title = title,
|
||||
Category = category,
|
||||
Link = link,
|
||||
Git = git,
|
||||
ContentHtml = html
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static string VStr(string? s) =>
|
||||
s is null ? "null" : "@\"" + s.Replace("\"", "\"\"") + "\"";
|
||||
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("// <auto-generated/>");
|
||||
sb.AppendLine("#nullable enable");
|
||||
sb.AppendLine("namespace Model;");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine("public static class GeneratedData");
|
||||
sb.AppendLine("{");
|
||||
sb.AppendLine($" public static string? OverviewHtml => {VStr(overviewHtml)};");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine(" public static List<GameDoc> Games => new()");
|
||||
sb.AppendLine(" {");
|
||||
|
||||
foreach (var g in games)
|
||||
{
|
||||
sb.AppendLine(" new GameDoc");
|
||||
sb.AppendLine(" {");
|
||||
sb.AppendLine($" Title = {VStr(g.Title)},");
|
||||
sb.AppendLine($" Category = {VStr(g.Category)},");
|
||||
sb.AppendLine($" Link = {VStr(g.Link)},");
|
||||
sb.AppendLine($" Git = {VStr(g.Git)},");
|
||||
sb.AppendLine($" ContentHtml = {VStr(g.ContentHtml)}");
|
||||
sb.AppendLine(" },");
|
||||
}
|
||||
|
||||
sb.AppendLine(" };");
|
||||
sb.AppendLine("}");
|
||||
|
||||
File.WriteAllText(Path.Combine(outputDir, "GeneratedData.cs"), sb.ToString());
|
||||
|
||||
Console.WriteLine($"Generated GeneratedData.cs: {games.Count} games, overview: {overviewHtml != null}");
|
||||
Reference in New Issue
Block a user