- Updated DocsGenerator to support run code and item tables
- Updated Table to support new Collection System (could break things, sorry) - Updated Tree to support new Collection System - Added experimental ScrollFrame - Updated Menu to support Collection System
This commit is contained in:
@@ -23,6 +23,8 @@ local eventParser = require("parsers.eventParser")
|
||||
|
||||
local globalParser = require("parsers.globalParser")
|
||||
|
||||
local helper = require("utils.helper")
|
||||
|
||||
local markdownGenerator = require("utils.markdownGenerator")
|
||||
|
||||
BasaltDoc.annotationHandlers = {}
|
||||
@@ -145,6 +147,31 @@ BasaltDoc.registerAnnotation("@globalDescription", function(target, args)
|
||||
end
|
||||
end)
|
||||
|
||||
BasaltDoc.registerAnnotation("@tableType", function(target, args)
|
||||
if not target.tableTypes then target.tableTypes = {} end
|
||||
local tableName = args:match("^%s*(%S+)")
|
||||
if tableName then
|
||||
target._currentTableType = {
|
||||
name = tableName,
|
||||
fields = {}
|
||||
}
|
||||
table.insert(target.tableTypes, target._currentTableType)
|
||||
end
|
||||
end)
|
||||
|
||||
BasaltDoc.registerAnnotation("@tableField", function(target, args)
|
||||
if target._currentTableType then
|
||||
local fieldName, fieldType, fieldDesc = args:match("^%s*([%w_]+)%s+([%w_|]+)%s+(.*)")
|
||||
if fieldName and fieldType then
|
||||
table.insert(target._currentTableType.fields, {
|
||||
name = fieldName,
|
||||
type = fieldType,
|
||||
description = fieldDesc or ""
|
||||
})
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
if classParser then classParser.setHandlers(BasaltDoc.annotationHandlers) end
|
||||
if functionParser then functionParser.setHandlers(BasaltDoc.annotationHandlers) end
|
||||
if propertyParser then propertyParser.setHandlers(BasaltDoc.annotationHandlers) end
|
||||
@@ -192,12 +219,14 @@ function BasaltDoc.parse(content)
|
||||
local annotationBuffer = {}
|
||||
local currentClass = nil
|
||||
local firstTag = nil
|
||||
local pendingTableTypes = {}
|
||||
|
||||
local blockStartTags = {
|
||||
["@class"] = true,
|
||||
["@property"] = true,
|
||||
["@event"] = true,
|
||||
["@skip"] = true
|
||||
["@skip"] = true,
|
||||
["@tableType"] = true
|
||||
}
|
||||
|
||||
local i = 1
|
||||
@@ -225,9 +254,25 @@ function BasaltDoc.parse(content)
|
||||
if firstTag == "@class" and classParser then
|
||||
local class = classParser.parse(annotationBuffer, table.concat(annotationBuffer, "\n"))
|
||||
if class and not class.skip then
|
||||
if #pendingTableTypes > 0 then
|
||||
for _, tableType in ipairs(pendingTableTypes) do
|
||||
table.insert(class.tableTypes, tableType)
|
||||
end
|
||||
pendingTableTypes = {}
|
||||
end
|
||||
table.insert(ast.classes, class)
|
||||
currentClass = class
|
||||
end
|
||||
elseif firstTag == "@tableType" then
|
||||
local tempTarget = {tableTypes = {}}
|
||||
if classParser and classParser.handlers then
|
||||
helper.applyAnnotations(annotationBuffer, tempTarget, classParser.handlers)
|
||||
end
|
||||
if tempTarget.tableTypes and #tempTarget.tableTypes > 0 then
|
||||
for _, tt in ipairs(tempTarget.tableTypes) do
|
||||
table.insert(pendingTableTypes, tt)
|
||||
end
|
||||
end
|
||||
elseif firstTag == "@property" and currentClass and propertyParser then
|
||||
local prop = propertyParser.parse(annotationBuffer, table.concat(annotationBuffer, "\n"))
|
||||
if prop then
|
||||
|
||||
@@ -17,6 +17,7 @@ function classParser.parse(annotations, line)
|
||||
properties = {},
|
||||
events = {},
|
||||
functions = {},
|
||||
tableTypes = {},
|
||||
skip = false
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,36 @@ function helper.applyAnnotations(annotations, target, handlers)
|
||||
|
||||
local tag, args = ann:match("^%-%-%-?%s*(@%S+)%s*(.*)")
|
||||
if tag then
|
||||
if args == ">" then
|
||||
if args and args:match("^%s*%[%[") then
|
||||
local blockContent = args:gsub("^%s*%[%[%s*", "")
|
||||
|
||||
if blockContent:match("%]%]%s*$") then
|
||||
args = blockContent:gsub("%]%]%s*$", "")
|
||||
else
|
||||
local multiArgs = {}
|
||||
if blockContent ~= "" then
|
||||
table.insert(multiArgs, blockContent)
|
||||
end
|
||||
i = i + 1
|
||||
|
||||
while i <= #annotations do
|
||||
local nextAnn = annotations[i]
|
||||
local content = nextAnn:match("^%-%-%-?%s*(.*)") or nextAnn
|
||||
|
||||
if content:match("%]%]%s*$") then
|
||||
local finalContent = content:gsub("%]%]%s*$", "")
|
||||
if finalContent ~= "" then
|
||||
table.insert(multiArgs, finalContent)
|
||||
end
|
||||
break
|
||||
else
|
||||
table.insert(multiArgs, content)
|
||||
end
|
||||
i = i + 1
|
||||
end
|
||||
args = table.concat(multiArgs, "\n")
|
||||
end
|
||||
elseif args == ">" then
|
||||
local multiArgs = ""
|
||||
i = i + 1
|
||||
|
||||
|
||||
@@ -72,16 +72,21 @@ local function generateFunctionMarkdown(class, functions)
|
||||
|
||||
if f.usage then
|
||||
table.insert(md, "### Usage")
|
||||
table.insert(md, "```lua")
|
||||
for _, usage in ipairs(f.usage) do
|
||||
if usage == "" then
|
||||
table.insert(md, "")
|
||||
else
|
||||
table.insert(md, usage)
|
||||
for _, usageBlock in ipairs(f.usage) do
|
||||
table.insert(md, "```lua run")
|
||||
-- Check if usageBlock is already multi-line
|
||||
if type(usageBlock) == "string" then
|
||||
if usageBlock:match("\n") then
|
||||
-- Multi-line block
|
||||
table.insert(md, usageBlock)
|
||||
else
|
||||
-- Single line
|
||||
table.insert(md, usageBlock)
|
||||
end
|
||||
end
|
||||
table.insert(md, "```")
|
||||
table.insert(md, "")
|
||||
end
|
||||
table.insert(md, "```")
|
||||
table.insert(md, "")
|
||||
end
|
||||
|
||||
if f.run then
|
||||
@@ -157,6 +162,38 @@ function markdownGenerator.generate(ast)
|
||||
end
|
||||
table.insert(md, "")
|
||||
|
||||
if class.usage then
|
||||
table.insert(md, "## Usage")
|
||||
for _, usageBlock in ipairs(class.usage) do
|
||||
table.insert(md, "```lua run")
|
||||
if type(usageBlock) == "string" then
|
||||
table.insert(md, usageBlock)
|
||||
end
|
||||
table.insert(md, "```")
|
||||
table.insert(md, "")
|
||||
end
|
||||
end
|
||||
|
||||
if #class.tableTypes > 0 then
|
||||
table.insert(md, "## Table Types")
|
||||
table.insert(md, "")
|
||||
for _, tableType in ipairs(class.tableTypes) do
|
||||
table.insert(md, "### " .. tableType.name)
|
||||
table.insert(md, "")
|
||||
if #tableType.fields > 0 then
|
||||
table.insert(md, "|Property|Type|Description|")
|
||||
table.insert(md, "|---|---|---|")
|
||||
for _, field in ipairs(tableType.fields) do
|
||||
table.insert(md, string.format("|%s|%s|%s|",
|
||||
field.name or "",
|
||||
field.type or "any",
|
||||
field.description or ""))
|
||||
end
|
||||
table.insert(md, "")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not class.skipPropertyList and #class.properties > 0 then
|
||||
table.insert(md, "## Properties")
|
||||
table.insert(md, "")
|
||||
|
||||
Reference in New Issue
Block a user