first documentation results

This commit is contained in:
Booklordofthedings 2024-09-30 14:41:13 +02:00
parent 3b71f22ece
commit 7c360a1dd8
11 changed files with 288 additions and 1 deletions

View file

@ -1,4 +1,5 @@
FileVersion = 1 FileVersion = 1
Dependencies = {corlib = "*", Bofa = "*", LybCL = "*"}
[Project] [Project]
Name = "bdocs" Name = "bdocs"

View file

@ -1,5 +1,5 @@
FileVersion = 1 FileVersion = 1
Projects = {bdocs = {Path = "."}} Projects = {bdocs = {Path = "."}, Bofa = {Path = "deps/Bofa"}, LybCL = {Path = "deps/LybCl"}}
[Workspace] [Workspace]
StartupProject = "bdocs" StartupProject = "bdocs"

7
documentation.md Normal file
View file

@ -0,0 +1,7 @@
# Classes
- Crawler
- DataStore
## Crawler
Crawls through the input directory in order to read all input files and get all available sections.## DataStore
Store information about the entire setup of the program,
while its running, so that it can be recovered later

4
pkkg
View file

@ -14,4 +14,8 @@ a Dependencies
o Bofa o Bofa
l Name Bofa l Name Bofa
l Url https://code.booklordofthe.dev/Booklordofthedings/Bofa.git l Url https://code.booklordofthe.dev/Booklordofthedings/Bofa.git
l Tag 1.1.0
o LybCl
l Name LybCl
l Url https://code.booklordofthe.dev/Booklordofthedings/LybCL.git
l Tag 1.0.0 l Tag 1.0.0

View file

@ -0,0 +1,13 @@
namespace bdocs.Constructs;
using System;
using Bofa;
using Bofa.Serialization;
[BofaSerialize]
class bdocs_Class
{
[BofaInclude("n")] public String Name = new .() ~ delete _;
[BofaInclude("d")] public String Description = new .() ~ delete _;
}

View file

@ -0,0 +1,14 @@
namespace bdocs.Constructs;
using System;
using Bofa;
using Bofa.Serialization;
[BofaSerialize]
class bdocs_Method
{
public String Name = null ~ delete _;
public String Description = null ~ delete _;
public String Parent = null ~ delete _;
}

View file

@ -0,0 +1,13 @@
namespace bdocs.Constructs;
using System;
using Bofa;
using Bofa.Serialization;
[BofaSerialize]
class bdocs_Struct
{
public String Name = null ~ delete _;
public String Description = null ~ delete _;
}

71
src/Crawler.bf Normal file
View file

@ -0,0 +1,71 @@
namespace bdocs;
using System;
using System.IO;
using System.Collections;
/*$$$c
l n Crawler
t d Crawls through the input directory in order to read all input files and get all available sections.
$$$*/
class Crawler
{
public const uint32 FOLDER_LIMIT = 999999;
private bool _HasErrored = false;
private String _InputDirectory ~ delete _;
private List<String> _Sections = new .() ~ DeleteContainerAndItems!(_);
public StringView InputDirectory
{
public get => _InputDirectory;
}
public bool HasErrored
{
public get => _HasErrored;
}
///Retrieve all sections containing bdocs data
public Result<void> GetSections(List<String> pBuffer)
{
for(var i in _Sections)
pBuffer.Add(new .(i));
if(_HasErrored)
return .Err;
return .Ok;
}
public this(StringView pInputDir)
{
_InputDirectory = new .(pInputDir);
List<String> toProcess = new .();
defer delete toProcess;
toProcess.Add(new .(_InputDirectory));
uint32 counter = 0;
while(toProcess.Count > 0)
{
counter++;
if(counter >= FOLDER_LIMIT)
return;
var target = toProcess.PopBack();
for(var file in Directory.EnumerateFiles(target))
{
var sections = SectionFinder.GetSections(file.GetFilePath(.. scope .()), .. new .());
for(var i in sections)
_Sections.Add(i);
delete sections;
}
for(var dir in Directory.EnumerateDirectories(target))
toProcess.Add(dir.GetFileName(.. new .()));
delete target;
}
}
}

60
src/DataStore.bf Normal file
View file

@ -0,0 +1,60 @@
namespace bdocs;
using bdocs.Constructs;
using System;
using System.Collections;
using Bofa;
/*$$$c
l n DataStore
t d Store information about the entire setup of the program,
- while its running, so that it can be recovered later
$$$*/
class DataStore
{
public Dictionary<StringView, bdocs_Class> Classes = new .() ~ DeleteDictionaryAndValues!(_);
/*$$$f
l n Document
t d Process all of the content of the DataStore class into a single document for future use
$$$*/
public void Document(String pBuffer)
{
pBuffer.Append("# Classes\n");
for(var i in Classes)
pBuffer.Append(scope $"- {i.key}\n");
for(var i in Classes)
{
pBuffer.Append(scope $"## {i.key}\n{i.value.Description}");
}
}
public void AddSection(StringView pData)
{
if(pData == "" || !pData.Contains('\n'))
return;
var type = pData.Split('\n').GetNext().Value;
var data = pData.Split('\n')..GetNext().Remnant;
List<int64> errors = scope .();
var res = BofaParser.Parse(data,.. new .(), errors);
defer {DeleteDictionaryAndValues!(res);}
switch(type)
{
case "c":
bdocs_Class n = new .();
if(!Bofa.Deserialize<bdocs_Class>(ref n, res))
{
delete n;
return;
}
Classes.Add(n.Name, n);
default:
return;
}
}
}

47
src/Program.bf Normal file
View file

@ -0,0 +1,47 @@
namespace bdocs;
using LybCL;
using System;
using System.IO;
using System.Collections;
class Program
{
public static void Main(String[] args)
{
LybCl cmd = scope .(args);
String inputDir = scope .();
String outputDir = scope .();
#if DEBUG
Console.WriteLine("WARNING: Debug mode. Not for distribution");
inputDir.Append("src/");
outputDir.Append(".");
#endif
inputDir.Append(cmd.GetParameter("input", "Input", "I", "i", "in", "In"));
outputDir.Append(cmd.GetParameter("output", "Output", "out", "Out", "o", "O"));
if(!Directory.Exists(inputDir))
Console.WriteLine("Target input directory does not exist");
Crawler c = new .(inputDir);
DataStore d = new .();
for(var i in c.GetSections(.. scope .()))
{
d.AddSection(i);
delete i;
}
delete c;
File.WriteAllText(
scope $"{outputDir}/documentation.md",
d.Document(.. scope .())
).IgnoreError();
delete d;
}
}

57
src/SectionFinder.bf Normal file
View file

@ -0,0 +1,57 @@
namespace bdocs;
using System;
using System.IO;
using System.Collections;
class SectionFinder
{
public static void GetSections(StringView pPath, List<String> pSections)
{
String fileData = scope .();
if(File.ReadAllText(pPath, fileData) case .Err)
return;
bool insideSection = false;
int depth = 0;
String sectionData = null;
for(var line in fileData.Split('\n'))
{
if((scope String(line))..TrimStart().StartsWith("/*$$$"))
{
if(insideSection)
continue;
else
{
insideSection = true;
sectionData = new .();
sectionData.Append(scope $"{line.Split("/*$$$")..GetNext().Remnant}\n");
while(line[depth].IsWhiteSpace)
depth++;
}
}
else if((scope String(line))..TrimStart().StartsWith("$$$*/"))
{
if(insideSection)
{
insideSection = false;
depth = 0;
sectionData.RemoveFromEnd(1);
pSections.Add(sectionData);
}
}
else if(insideSection)
{
sectionData.Append(scope $"{line.Substring(depth)}\n");
}
}
if(insideSection)
{
insideSection = false;
sectionData.RemoveFromEnd(1);
pSections.Add(sectionData);
}
}
}