Skip to content

Commit d453f6a

Browse files
committed
Ensure we emit llm data as zip too
1 parent f470203 commit d453f6a

File tree

5 files changed

+58
-15
lines changed

5 files changed

+58
-15
lines changed

src/Elastic.Markdown/DocumentationGenerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ await Parallel.ForEachAsync(DocumentationSet.Files, ctx, async (file, token) =>
173173
_logger.LogInformation("-> Processed {ProcessedFiles}/{TotalFileCount} files", processedFiles, totalFileCount);
174174
});
175175
_logger.LogInformation("-> Processed {ProcessedFileCount}/{TotalFileCount} files", processedFileCount, totalFileCount);
176+
176177
}
177178

178179
private void HintUnusedSubstitutionKeys()
@@ -245,7 +246,7 @@ private async Task ProcessFile(HashSet<string> offendingFiles, DocumentationFile
245246
foreach (var exporter in _markdownExporters)
246247
{
247248
var document = context.MarkdownDocument ??= await markdown.ParseFullAsync(ctx);
248-
_ = await exporter.ExportAsync(new MarkdownExportContext
249+
_ = await exporter.ExportAsync(new MarkdownExportFileContext
249250
{
250251
BuildContext = Context,
251252
Resolvers = DocumentationSet.MarkdownParser.Resolvers,

src/Elastic.Markdown/Exporters/IMarkdownExporter.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010

1111
namespace Elastic.Markdown.Exporters;
1212

13-
public class MarkdownExportContext
13+
14+
public record MarkdownExportContext
15+
{
16+
}
17+
public record MarkdownExportFileContext
1418
{
1519
public required BuildContext BuildContext { get; init; }
1620
public required IParserResolvers Resolvers { get; init; }
@@ -24,5 +28,6 @@ public interface IMarkdownExporter
2428
{
2529
ValueTask StartAsync(Cancel ctx = default);
2630
ValueTask StopAsync(Cancel ctx = default);
27-
ValueTask<bool> ExportAsync(MarkdownExportContext context, Cancel ctx);
31+
ValueTask<bool> ExportAsync(MarkdownExportFileContext fileContext, Cancel ctx);
32+
ValueTask<bool> FinishExportAsync(IDirectoryInfo outputFolder, Cancel ctx);
2833
}

src/Elastic.Markdown/Exporters/LLMTextExporter.cs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
using System.Buffers;
66
using System.IO.Abstractions;
7+
using System.IO.Compression;
78
using System.Text;
89
using Elastic.Documentation.Configuration;
910
using Elastic.Markdown.Helpers;
1011
using Elastic.Markdown.Myst;
1112
using Elastic.Markdown.Myst.FrontMatter;
12-
using Markdig.Syntax;
1313

1414
namespace Elastic.Markdown.Exporters;
1515

@@ -19,26 +19,53 @@ public class LLMTextExporter : IMarkdownExporter
1919

2020
public ValueTask StopAsync(Cancel ctx = default) => ValueTask.CompletedTask;
2121

22-
public async ValueTask<bool> ExportAsync(MarkdownExportContext context, Cancel ctx)
22+
public async ValueTask<bool> ExportAsync(MarkdownExportFileContext fileContext, Cancel ctx)
2323
{
24-
var source = context.SourceFile.SourceFile;
24+
var source = fileContext.SourceFile.SourceFile;
2525
var fs = source.FileSystem;
26-
var llmText = context.LLMText ??= ToLLMText(context.BuildContext, context.SourceFile.YamlFrontMatter, context.Resolvers, source);
26+
var llmText = fileContext.LLMText ??= ToLLMText(fileContext.BuildContext, fileContext.SourceFile.YamlFrontMatter, fileContext.Resolvers, source);
2727

2828
// write to the output version of the Markdown file directly
29-
var outputFile = context.DefaultOutputFile;
29+
var outputFile = fileContext.DefaultOutputFile;
3030
if (outputFile.Name == "index.md")
3131
{
32+
var root = fileContext.BuildContext.DocumentationOutputDirectory;
3233
// Write to a file named after the parent folder
33-
outputFile = fs.FileInfo.New(outputFile.Directory!.FullName + ".md");
34+
if (outputFile.Directory!.FullName == root.FullName)
35+
{
36+
// TODO in FinishExportAsync find a way to generate llms.txt
37+
// e.g should it embedd all the links?
38+
outputFile = fs.FileInfo.New(Path.Combine(root.FullName, "llms.md"));
39+
}
40+
else
41+
outputFile = fs.FileInfo.New(outputFile.Directory!.FullName + ".md");
3442
}
43+
3544
if (outputFile.Directory is { Exists: false })
3645
outputFile.Directory.Create();
3746

3847
await fs.File.WriteAllTextAsync(outputFile.FullName, llmText, ctx);
3948
return true;
4049
}
4150

51+
/// <inheritdoc />
52+
public ValueTask<bool> FinishExportAsync(IDirectoryInfo outputFolder, Cancel ctx)
53+
{
54+
var outputDirectory = Path.Combine(outputFolder.FullName, "docs");
55+
var zipPath = Path.Combine(outputDirectory, "llm.zip");
56+
using (var zip = ZipFile.Open(zipPath, ZipArchiveMode.Create))
57+
{
58+
var markdownFiles = Directory.GetFiles(outputDirectory, "*.md", SearchOption.AllDirectories);
59+
60+
foreach (var file in markdownFiles)
61+
{
62+
var relativePath = Path.GetRelativePath(outputDirectory, file);
63+
_ = zip.CreateEntryFromFile(file, relativePath);
64+
}
65+
}
66+
return ValueTask.FromResult(true);
67+
}
68+
4269
public static string ToLLMText(BuildContext buildContext, YamlFrontMatter? frontMatter, IParserResolvers resolvers, IFileInfo source)
4370
{
4471
var fs = source.FileSystem;
@@ -56,7 +83,6 @@ public static string ToLLMText(BuildContext buildContext, YamlFrontMatter? front
5683
DocumentationObjectPoolProvider.StringBuilderPool.Return(sb);
5784
var replaced = full.ReplaceSubstitutions(new ParserContext(state));
5885
return replaced;
59-
6086
}
6187

6288
private static void Read(IFileInfo source, IFileSystem fs, StringBuilder sb, IDirectoryInfo setDirectory)
@@ -83,6 +109,7 @@ private static void Read(IFileInfo source, IFileSystem fs, StringBuilder sb, IDi
83109
includePath = Path.Combine(setDirectory.FullName, relativeFile.TrimStart('/').ToString());
84110
includeSource = fs.FileInfo.New(includePath);
85111
}
112+
86113
if (includeSource.Extension == "md" && includePath.Contains("_snippets"))
87114
Read(includeSource, fs, sb, setDirectory);
88115
startIndex = cursor + relativeFileEnd;
@@ -94,7 +121,7 @@ private static void Read(IFileInfo source, IFileSystem fs, StringBuilder sb, IDi
94121
startIndex = Math.Min(text.Length, startIndex);
95122
}
96123
}
124+
97125
_ = sb.Append(text[startIndex..]);
98126
}
99127
}
100-

src/tooling/docs-assembler/Building/AssemblerBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ public async Task BuildAllAsync(FrozenDictionary<string, AssemblerDocumentationS
8484
throw;
8585
}
8686
}
87+
foreach (var exporter in markdownExporters)
88+
{
89+
_logger.LogInformation("Calling FinishExportAsync on {ExporterName}", exporter.GetType().Name);
90+
_ = await exporter.FinishExportAsync(context.OutputDirectory, ctx);
91+
}
92+
8793

8894
tasks = markdownExporters.Select(async e => await e.StopAsync(ctx));
8995
await Task.WhenAll(tasks);

src/tooling/docs-assembler/Exporters/ElasticsearchMarkdownExporter.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5+
using System.IO.Abstractions;
56
using Elastic.Documentation.Diagnostics;
67
using Elastic.Documentation.Search;
78
using Elastic.Documentation.Serialization;
@@ -108,10 +109,10 @@ private async ValueTask<bool> TryWrite(DocumentationDocument document, Cancel ct
108109
return false;
109110
}
110111

111-
public async ValueTask<bool> ExportAsync(MarkdownExportContext context, Cancel ctx)
112+
public async ValueTask<bool> ExportAsync(MarkdownExportFileContext fileContext, Cancel ctx)
112113
{
113-
var file = context.SourceFile;
114-
var document = context.Document;
114+
var file = fileContext.SourceFile;
115+
var document = fileContext.Document;
115116
if (file.FileName.EndsWith(".toml", StringComparison.OrdinalIgnoreCase))
116117
return true;
117118

@@ -121,7 +122,7 @@ public async ValueTask<bool> ExportAsync(MarkdownExportContext context, Cancel c
121122
return true;
122123

123124
// TODO!
124-
var body = context.LLMText ??= "string.Empty";
125+
var body = fileContext.LLMText ??= "string.Empty";
125126
var doc = new DocumentationDocument
126127
{
127128
Title = file.Title,
@@ -133,4 +134,7 @@ public async ValueTask<bool> ExportAsync(MarkdownExportContext context, Cancel c
133134
};
134135
return await TryWrite(doc, ctx);
135136
}
137+
138+
/// <inheritdoc />
139+
public async ValueTask<bool> FinishExportAsync(IDirectoryInfo outputFolder, Cancel ctx) => await _channel.RefreshAsync(ctx);
136140
}

0 commit comments

Comments
 (0)