Files

76 lines
3.0 KiB
C#

using AtomUI.Docs.LLMsGenerator.Reader;
namespace AtomUI.Docs.LLMsGenerator.Writers;
public static class LLMsDocumentationWriter
{
public static IReadOnlyList<GeneratedLLMsFile> WriteAll(IReadOnlyList<ControlDocModel> models)
{
var files = new List<GeneratedLLMsFile>();
foreach (var model in models)
{
files.Add(new GeneratedLLMsFile(model.OutputIndexPath, LLMsControlWriter.Write(model)));
files.Add(new GeneratedLLMsFile(model.OutputSemanticPath, LLMsSemanticWriter.Write(model)));
}
files.Add(new GeneratedLLMsFile("docs/AI/generated/llms/llms.txt", LLMsIndexWriter.Write(models)));
files.Add(new GeneratedLLMsFile("docs/AI/generated/llms/llms-full-cn.txt",
LLMsAggregateWriter.Write("AtomUI Desktop Controls Full CN", files, "index-cn.md")));
files.Add(new GeneratedLLMsFile("docs/AI/generated/llms/llms-semantic-cn.md",
LLMsAggregateWriter.Write("AtomUI Desktop Controls Semantic CN", files, "semantic-cn.md")));
return files;
}
public static void WriteFiles(string repositoryRoot, IReadOnlyList<GeneratedLLMsFile> files)
{
PruneStaleGeneratedFiles(repositoryRoot, files);
foreach (var file in files)
{
var path = Path.Combine(repositoryRoot, file.Path);
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
File.WriteAllText(path, file.Content);
}
}
private static void PruneStaleGeneratedFiles(string repositoryRoot, IReadOnlyList<GeneratedLLMsFile> files)
{
var expectedPaths = files.Select(file => file.Path).ToHashSet(StringComparer.Ordinal);
var outputRoot = Path.Combine(repositoryRoot, "docs/AI/generated/llms");
if (!Directory.Exists(outputRoot))
{
return;
}
foreach (var path in Directory.GetFiles(outputRoot, "*", SearchOption.AllDirectories))
{
var relativePath = Path.GetRelativePath(repositoryRoot, path).Replace(Path.DirectorySeparatorChar, '/');
if (IsGeneratedLLMsPath(relativePath) && !expectedPaths.Contains(relativePath))
{
File.Delete(path);
}
}
var controlsRoot = Path.Combine(outputRoot, "controls");
if (!Directory.Exists(controlsRoot))
{
return;
}
foreach (var directory in Directory.GetDirectories(controlsRoot, "*", SearchOption.AllDirectories)
.OrderByDescending(directory => directory.Length))
{
if (!Directory.EnumerateFileSystemEntries(directory).Any())
{
Directory.Delete(directory);
}
}
}
private static bool IsGeneratedLLMsPath(string path)
{
return path is "docs/AI/generated/llms/llms.txt" or "docs/AI/generated/llms/llms-full-cn.txt" or "docs/AI/generated/llms/llms-semantic-cn.md" ||
path.StartsWith("docs/AI/generated/llms/controls/", StringComparison.Ordinal);
}
}