aboutsummaryrefslogtreecommitdiff
path: root/modules/lua/tadoc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'modules/lua/tadoc.lua')
-rw-r--r--modules/lua/tadoc.lua90
1 files changed, 37 insertions, 53 deletions
diff --git a/modules/lua/tadoc.lua b/modules/lua/tadoc.lua
index f4ba1b93..8404364f 100644
--- a/modules/lua/tadoc.lua
+++ b/modules/lua/tadoc.lua
@@ -1,11 +1,10 @@
-- Copyright 2007-2021 Mitchell. See LICENSE.
-- Textadept autocompletions and API documentation doclet for LuaDoc.
--- This module is used by LuaDoc to create Lua autocompletion and API
--- documentation files that Textadept can read.
--- To preserve formatting, the included *luadoc.patch* file must be applied to
--- your instance of LuaDoc. It will not affect the look of HTML web pages, only
--- the look of plain-text output.
+-- This module is used by LuaDoc to create Lua autocompletion and API documentation files that
+-- Textadept can read.
+-- To preserve formatting, the included *luadoc.patch* file must be applied to your instance
+-- of LuaDoc. It will not affect the look of HTML web pages, only the look of plain-text output.
-- Also requires LuaFileSystem (lfs) to be installed.
-- @usage luadoc -d [output_path] -doclet path/to/tadoc [file(s)]
local M = {}
@@ -14,13 +13,16 @@ local CTAG = '%s\t%s\t/^%s$/;"\t%s\t%s'
local string_format = string.format
local lfs = require('lfs')
--- As a special case for Textadept API tags, do not store the local path, but
--- use a `_HOME` prefix that will be filled in by consumers. Do this by making
--- use of a custom command line switch: --ta-home="path/to/ta/home".
+-- As a special case for Textadept API tags, do not store the local path, but use a `_HOME`
+-- prefix that will be filled in by consumers. Do this by making use of a custom command line
+-- switch: --ta-home="path/to/ta/home".
local _HOME
for i = 1, #arg do
_HOME = arg[i]:match('^%-%-ta%-home=(.+)$')
- if _HOME then _HOME = _HOME:gsub('%p', '%%%0') break end
+ if _HOME then
+ _HOME = _HOME:gsub('%p', '%%%0')
+ break
+ end
end
-- Writes a ctag.
@@ -28,8 +30,8 @@ end
-- @param name The name of the tag.
-- @param filename The filename the tag occurs in.
-- @param code The line of code the tag occurs on.
--- @param k The kind of ctag. The Lua module recognizes 4 kinds: m Module, f
--- Function, t Table, and F Field.
+-- @param k The kind of ctag. The Lua module recognizes 4 kinds: m Module, f Function, t Table,
+-- and F Field.
-- @param ext_fields The ext_fields for the ctag.
local function write_tag(file, name, filename, code, k, ext_fields)
if _HOME then filename = filename:gsub(_HOME, '_HOME') end
@@ -37,16 +39,16 @@ local function write_tag(file, name, filename, code, k, ext_fields)
file[#file + 1] = string_format(CTAG, name, filename, code, k, ext_fields)
end
--- Sanitizes Markdown from the given documentation string by stripping links and
--- replacing HTML entities.
+-- Sanitizes Markdown from the given documentation string by stripping links and replacing
+-- HTML entities.
-- @param s String to sanitize Markdown from.
-- @return string
local function sanitize_markdown(s)
return s:gsub('%[([^%]\r\n]+)%]%b[]', '%1') -- [foo][]
- :gsub('%[([^%]\r\n]+)%]%b()', '%1') -- [foo](bar)
- :gsub('\r?\n\r?\n%[([^%]\r\n]+)%]:[^\r\n]+', '') -- [foo]: bar
- :gsub('\r?\n%[([^%]\r\n]+)%]:[^\r\n]+', '') -- [foo]: bar
- :gsub('&([%a]+);', {quot = '"', apos = "'"})
+ :gsub('%[([^%]\r\n]+)%]%b()', '%1') -- [foo](bar)
+ :gsub('\r?\n\r?\n%[([^%]\r\n]+)%]:[^\r\n]+', '') -- [foo]: bar
+ :gsub('\r?\n%[([^%]\r\n]+)%]:[^\r\n]+', '') -- [foo]: bar
+ :gsub('&([%a]+);', {quot = '"', apos = "'"})
end
-- Writes a function or field apidoc.
@@ -63,8 +65,7 @@ local function write_apidoc(file, m, b)
local class = b.class
local header = name
if class == 'function' then
- header = header ..
- (b.param and string.format('(%s)', table.concat(b.param, ', ')) or '')
+ header = header .. (b.param and string.format('(%s)', table.concat(b.param, ', ')) or '')
elseif class == 'field' and b.description:find('^%s*%b()') then
header = string.format('%s %s', header, b.description:match('^%s*(%b())'))
elseif class == 'module' or class == 'table' then
@@ -74,8 +75,8 @@ local function write_apidoc(file, m, b)
-- Function or field description.
local description = b.description
if class == 'module' then
- -- Modules usually have additional Markdown documentation so just grab the
- -- documentation before a Markdown header.
+ -- Modules usually have additional Markdown documentation so just grab the documentation
+ -- before a Markdown header.
description = description:match('^(.-)[\r\n]+#') or description
elseif class == 'field' then
-- Type information is already in the header; discard it in the description.
@@ -83,17 +84,14 @@ local function write_apidoc(file, m, b)
-- Strip consistent leading whitespace.
local indent
indent, description = description:match('^(%s*)(.*)$')
- if indent ~= '' then
- description = description:gsub('\n' .. indent, '\n')
- end
+ if indent ~= '' then description = description:gsub('\n' .. indent, '\n') end
end
doc[#doc + 1] = sanitize_markdown(description)
-- Function parameters (@param).
if class == 'function' and b.param then
for _, p in ipairs(b.param) do
if b.param[p] and #b.param[p] > 0 then
- doc[#doc + 1] = string.format(
- '@param %s %s', p, sanitize_markdown(b.param[p]))
+ doc[#doc + 1] = string.format('@param %s %s', p, sanitize_markdown(b.param[p]))
end
end
end
@@ -141,9 +139,9 @@ end
-- Called by LuaDoc to process a doc object.
-- @param doc The LuaDoc doc object.
function M.start(doc)
--- require('luarocks.require')
--- local profiler = require('profiler')
--- profiler.start()
+ -- require('luarocks.require')
+ -- local profiler = require('profiler')
+ -- profiler.start()
local modules, files = doc.modules, doc.files
@@ -156,8 +154,7 @@ function M.start(doc)
-- Add a module's fields to its LuaDoc.
for _, filename in ipairs(files) do
local module_doc = files[filename].doc[1]
- if module_doc and module_doc.class == 'module' and
- modules[module_doc.name] then
+ if module_doc and module_doc.class == 'module' and modules[module_doc.name] then
modules[module_doc.name].fields = module_doc.field
elseif module_doc then
print(string.format('[WARN] %s has no module declaration', filename))
@@ -172,9 +169,7 @@ function M.start(doc)
local module_name = func.name:match('^([^%.:]+)[%.:]') or '_G'
if not modules[module_name] then
modules[#modules + 1] = module_name
- modules[module_name] = {
- name = module_name, functions = {}, doc = {{code = func.code}}
- }
+ modules[module_name] = {name = module_name, functions = {}, doc = {{code = func.code}}}
files[modules[module_name].doc] = abspath(files[1])
-- For functions like file:read(), 'file' is not a module; fake it.
if func.name:find(':') then modules[module_name].fake = true end
@@ -206,8 +201,7 @@ function M.start(doc)
if m.name:find('%.') then
-- Tag the last part of the module as a table of the first part.
local parent, child = m.name:match('^(.-)%.([^%.]+)$')
- write_tag(
- ctags, child, filename, m.doc[1].code[1], 'm', 'class:' .. parent)
+ write_tag(ctags, child, filename, m.doc[1].code[1], 'm', 'class:' .. parent)
end
m.class = 'module'
write_apidoc(apidoc, {name = '_G'}, m)
@@ -217,8 +211,7 @@ function M.start(doc)
local module_name, name = function_name:match('^(.-)[%.:]?([^.:]+)$')
if module_name == '' then module_name = m.name end
local func = m.functions[function_name]
- write_tag(
- ctags, name, filename, func.code[1], 'f', 'class:' .. module_name)
+ write_tag(ctags, name, filename, func.code[1], 'f', 'class:' .. module_name)
write_apidoc(apidoc, m, func)
end
if m.tables then
@@ -234,21 +227,15 @@ function M.start(doc)
module_name = '_G' -- _G.keys or _G.snippets
end
end
- write_tag(
- ctags, table_name, filename, table.code[1], 't',
- 'class:' .. module_name)
+ write_tag(ctags, table_name, filename, table.code[1], 't', 'class:' .. module_name)
write_apidoc(apidoc, m, table)
if table.field then
-- Tag and document the table's fields.
table_name = string.format('%s.%s', module_name, table_name)
for _, field_name in ipairs(table.field) do
- write_tag(
- ctags, field_name, filename, table.code[1], 'F',
- 'class:' .. table_name)
+ write_tag(ctags, field_name, filename, table.code[1], 'F', 'class:' .. table_name)
write_apidoc(apidoc, {name = table_name}, {
- name = field_name,
- description = table.field[field_name],
- class = 'table'
+ name = field_name, description = table.field[field_name], class = 'table'
})
end
end
@@ -265,12 +252,9 @@ function M.start(doc)
print('[ERROR] Cannot determine module name for ' .. field.name)
end
end
- write_tag(
- ctags, field_name, filename, m.doc[1].code[1], 'F',
- 'class:' .. module_name)
+ write_tag(ctags, field_name, filename, m.doc[1].code[1], 'F', 'class:' .. module_name)
write_apidoc(apidoc, {name = field_name}, {
- name = string.format('%s.%s', module_name, field_name),
- description = field,
+ name = string.format('%s.%s', module_name, field_name), description = field,
class = 'field'
})
end
@@ -285,7 +269,7 @@ function M.start(doc)
f:write(table.concat(apidoc, '\n'))
f:close()
--- profiler.stop()
+ -- profiler.stop()
end
return M