in src/Elastic.Markdown/Extensions/DetectionRules/DetectionRulesDocsBuilderExtension.cs [14:77]
public class DetectionRulesDocsBuilderExtension(BuildContext build) : IDocsBuilderExtension
{
private BuildContext Build { get; } = build;
public IDocumentationFileExporter? FileExporter { get; } = new RuleDocumentationFileExporter(build.ReadFileSystem, build.WriteFileSystem);
private DetectionRuleOverviewFile? _overviewFile;
public void Visit(DocumentationFile file, ITocItem tocItem)
{
// TODO the parsing of rules should not happen at ITocItem reading time.
// ensure the file has an instance of the rule the reference parsed.
if (file is DetectionRuleFile df && tocItem is RuleReference r)
{
df.Rule = r.Rule;
_overviewFile?.AddDetectionRuleFile(df, r);
}
if (file is DetectionRuleOverviewFile of && tocItem is RuleOverviewReference or)
{
var rules = or.Children.OfType<RuleReference>().ToArray();
of.Rules = rules;
_overviewFile = of;
}
}
public DocumentationFile? CreateDocumentationFile(IFileInfo file, DocumentationSet documentationSet)
{
if (file.Extension != ".toml")
return null;
return new DetectionRuleFile(file, Build.DocumentationSourceDirectory, documentationSet.MarkdownParser, Build, documentationSet);
}
public MarkdownFile? CreateMarkdownFile(IFileInfo file, IDirectoryInfo sourceDirectory, DocumentationSet documentationSet) =>
file.Name == "index.md"
? new DetectionRuleOverviewFile(file, sourceDirectory, documentationSet.MarkdownParser, Build, documentationSet)
: null;
public bool TryGetDocumentationFileBySlug(DocumentationSet documentationSet, string slug, out DocumentationFile? documentationFile)
{
var tomlFile = $"../{slug}.toml";
return documentationSet.FlatMappedFiles.TryGetValue(tomlFile, out documentationFile);
}
public IReadOnlyCollection<DocumentationFile> ScanDocumentationFiles(
Func<IFileInfo, IDirectoryInfo, DocumentationFile> defaultFileHandling
)
{
var rules = Build.Configuration.TableOfContents.OfType<FileReference>().First().Children.OfType<RuleReference>().ToArray();
if (rules.Length == 0)
return [];
var sourcePath = Path.GetFullPath(Path.Combine(Build.DocumentationSourceDirectory.FullName, rules[0].SourceDirectory));
var sourceDirectory = Build.ReadFileSystem.DirectoryInfo.New(sourcePath);
return rules.Select(r =>
{
var file = Build.ReadFileSystem.FileInfo.New(Path.Combine(sourceDirectory.FullName, r.RelativePath));
return defaultFileHandling(file, sourceDirectory);
}).ToArray();
}
}