From 316a818c2fe80c40e60c4aa21667208e1016c68a Mon Sep 17 00:00:00 2001 From: sammyette Date: Mon, 18 Dec 2023 21:12:59 -0400 Subject: [PATCH] feat: work on nature doc gen --- cmd/docgen/docgen.lua | 72 ++++++++++++++++++++++++++++++++++++++ luadocs/api/nature/dirs.md | 0 luadocs/api/nil/dirs.md | 0 nature/dirs.lua | 13 +++---- 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 cmd/docgen/docgen.lua create mode 100644 luadocs/api/nature/dirs.md create mode 100644 luadocs/api/nil/dirs.md diff --git a/cmd/docgen/docgen.lua b/cmd/docgen/docgen.lua new file mode 100644 index 0000000..88837f9 --- /dev/null +++ b/cmd/docgen/docgen.lua @@ -0,0 +1,72 @@ +local fs = require 'fs' +local emmyPattern = '^%-%-%- (.+)' +local modpattern = '^%-+ @module (%w+)' +local pieces = {} + +local files = fs.readdir 'nature' +for _, fname in ipairs(files) do + local isScript = fname:match'%.lua$' + if not isScript then goto continue end + + local f = io.open(string.format('nature/%s', fname)) + local header = f:read '*l' + local mod = header:match(modpattern) + if not mod then goto continue end + + print(fname, mod) + pieces[mod] = {} + + local docPiece = {} + for line in f:lines() do + if line == header then goto continue2 end + if not line:match(emmyPattern) then + if line:match '^function' then + local pattern = (string.format('^function %s%%.', mod) .. '(%w+)') + local funcName = line:match(pattern) + if not funcName then goto continue2 end + print(line) + print(pattern) + print(funcName) + pieces[iface][funcName] = docPiece + end + docPiece = {} + goto continue2 + end + + table.insert(docPiece, line) + ::continue2:: + end + ::continue:: +end + +for iface, dps in pairs(pieces) do + local mod = iface:match '(%w+)%.' or 'nature' + local path = string.format('luadocs/api/%s/%s.md', mod, iface) + local f = io.open(path, 'a+') + print(f) + + print(mod, path) + fs.mkdir(fs.dir(path), true) + + for func, docs in pairs(dps) do + local params = table.filter(docs, function(t) + return t:match '^%-%-%- @param' + end) + f:write(string.format('## %s(', func)) + for i, str in ipairs(params) do + if i ~= 1 then + f:write ', ' + end + f:write(str:match '^%-%-%- @param ([%w]+) ') + end + f:write(')\n') + + for _, str in ipairs(docs) do + if not str:match '^%-%-%- @' then + f:write(str:match '^%-%-%- (.+)' .. '\n') + end + end + f:write('\n') + end + f:flush() +end diff --git a/luadocs/api/nature/dirs.md b/luadocs/api/nature/dirs.md new file mode 100644 index 0000000..e69de29 diff --git a/luadocs/api/nil/dirs.md b/luadocs/api/nil/dirs.md new file mode 100644 index 0000000..e69de29 diff --git a/nature/dirs.lua b/nature/dirs.lua index 5b7ec86..5e738b6 100644 --- a/nature/dirs.lua +++ b/nature/dirs.lua @@ -1,3 +1,4 @@ +-- @module dirs local fs = require 'fs' local dirs = {} @@ -11,8 +12,8 @@ dirs.recentDirs = {} dirs.recentSize = 10 --- Get (and remove) a `num` of entries from recent directories. ---- @param num number ---- @param remove boolean Whether to remove items +-- @param num number +-- @param remove boolean Whether to remove items function dirRecents(num, remove) num = num or 1 local entries = {} @@ -34,7 +35,7 @@ function dirRecents(num, remove) end --- Look at `num` amount of recent directories, starting from the latest. ---- @param num? number +-- @param num? number function dirs.peak(num) return dirRecents(num) end @@ -51,19 +52,19 @@ function dirs.push(d) end --- Remove `num` amount of dirs from the recent directories. ---- @param num number +-- @param num number function dirs.pop(num) return dirRecents(num, true) end --- Get entry from recent directories. ---- @param idx number +-- @param idx number function dirs.recent(idx) return dirs.recentDirs[idx] end --- Sets the old directory. ---- @param d string +-- @param d string function dirs.setOld(d) ok, d = pcall(fs.abs, d) assert(ok, 'could not turn "' .. d .. '"into an absolute path')