Class
Sealed
public sealed class FileDiscoveryService
Namespace: Moka.Docs.Engine.Discovery
Scans the project directory for Markdown files, C# projects, and static assets.
Constructors
| Name | Description |
|---|---|
FileDiscoveryService(IFileSystem fileSystem, FileDiscoveryService> logger) |
Scans the project directory for Markdown files, C# projects, and static assets. |
FileDiscoveryService(IFileSystem fileSystem, FileDiscoveryService> logger)
FileDiscoveryService.FileDiscoveryService(IFileSystem fileSystem, ILogger<FileDiscoveryService> logger)
Scans the project directory for Markdown files, C# projects, and static assets.
Methods
| Name | Description |
|---|---|
Discover(string rootDirectory, SiteConfig config) |
Discovers all relevant files based on the site configuration. |
Discover(…) |
Discovers all relevant files using a specific filesystem abstraction. Used by ASP.NET Core integration to pass the virtual MockFileSystem. |
Discover(string rootDirectory, SiteConfig config)
DiscoveryResult FileDiscoveryService.Discover(string rootDirectory, SiteConfig config)
Discovers all relevant files based on the site configuration.
Discover(string rootDirectory, SiteConfig config, IFileSystem fs)
DiscoveryResult FileDiscoveryService.Discover(string rootDirectory, SiteConfig config, IFileSystem fs)
Discovers all relevant files using a specific filesystem abstraction. Used by ASP.NET Core integration to pass the virtual MockFileSystem.
View Source
/// <summary>
/// Scans the project directory for Markdown files, C# projects, and static assets.
/// </summary>
public sealed class FileDiscoveryService(IFileSystem fileSystem, ILogger<FileDiscoveryService> logger)
{
private static readonly HashSet<string> _assetExtensions = new(StringComparer.OrdinalIgnoreCase)
{
".png",
".jpg",
".jpeg",
".gif",
".svg",
".webp",
".ico",
".pdf",
".zip",
".mp4",
".webm",
".css",
".js",
".json",
".xml",
".woff",
".woff2",
".ttf",
".eot"
};
/// <summary>
/// Discovers all relevant files based on the site configuration.
/// </summary>
public DiscoveryResult Discover(string rootDirectory, SiteConfig config) => Discover(rootDirectory, config, fileSystem);
/// <summary>
/// Discovers all relevant files using a specific filesystem abstraction.
/// Used by ASP.NET Core integration to pass the virtual MockFileSystem.
/// </summary>
public DiscoveryResult Discover(string rootDirectory, SiteConfig config, IFileSystem fs)
{
var result = new DiscoveryResult();
// Discover Markdown files
string docsPath = ResolvePath(fs, rootDirectory, config.Content.Docs);
if (fs.Directory.Exists(docsPath))
{
var mdFiles = fs.Directory.GetFiles(docsPath, "*.md", SearchOption.AllDirectories).Select(f => fs.Path.GetRelativePath(docsPath, f)).Order(StringComparer.OrdinalIgnoreCase).ToList();
result.MarkdownFiles.AddRange(mdFiles);
logger.LogInformation("Discovered {Count} Markdown files in {Path}", mdFiles.Count, docsPath);
}
else
{
logger.LogWarning("Documentation directory not found: {Path}", docsPath);
}
// Discover C# project files
foreach (ProjectSource project in config.Content.Projects)
{
string projectPath = ResolvePath(fs, rootDirectory, project.Path);
if (fs.File.Exists(projectPath))
{
result.ProjectFiles.Add(projectPath);
logger.LogInformation("Discovered project: {Path}", projectPath);
}
else
{
logger.LogWarning("Project file not found: {Path}", projectPath);
}
}
// Discover static assets in docs directory
if (fs.Directory.Exists(docsPath))
{
var assetFiles = fs.Directory.GetFiles(docsPath, "*.*", SearchOption.AllDirectories).Where(f => _assetExtensions.Contains(fs.Path.GetExtension(f))).Select(f => fs.Path.GetRelativePath(docsPath, f)).Order(StringComparer.OrdinalIgnoreCase).ToList();
result.AssetFiles.AddRange(assetFiles);
logger.LogInformation("Discovered {Count} asset files", assetFiles.Count);
}
return result;
}
private static string ResolvePath(IFileSystem fs, string rootDirectory, string relativePath)
{
if (fs.Path.IsPathRooted(relativePath))
{
return relativePath;
}
return fs.Path.GetFullPath(fs.Path.Combine(rootDirectory, relativePath));
}
}