forked from mtcontrib/3d_armor
Add Support for Generating HTML Documentation with LDoc (#58)
* Add Python scripts to generate temp files that can be parsed by LDoc * Add config & script for generating HTML docs with LDoc... * Add Lua docstrings for API & items * Add workflow for building API reference docs on gh-pages branch * Add LDoc's default stylesheet * LDoc: make navigation panel fixed
This commit is contained in:
344
.ldoc/config.ld
Normal file
344
.ldoc/config.ld
Normal file
@ -0,0 +1,344 @@
|
||||
-- Place this file in mod "docs" directory
|
||||
|
||||
local print, type, string, table, tostring, tonumber, error, pairs, ipairs
|
||||
if import then
|
||||
print = import("print")
|
||||
type = import("type")
|
||||
string = import("string")
|
||||
table = import("table")
|
||||
tostring = import("tostring")
|
||||
tonumber = import("tonumber")
|
||||
error = import("error")
|
||||
pairs = import("pairs")
|
||||
ipairs = import("ipairs")
|
||||
end
|
||||
|
||||
project = "3d_armor"
|
||||
title = "3D Armor"
|
||||
format = "markdown"
|
||||
not_luadoc = true
|
||||
boilerplate = false
|
||||
wrap = false
|
||||
style = true
|
||||
|
||||
file = {
|
||||
"3d_armor/api.lua",
|
||||
".ldoc/settings.luadoc",
|
||||
--".ldoc/armors.luadoc",
|
||||
".ldoc/helmets.luadoc",
|
||||
".ldoc/chestplates.luadoc",
|
||||
".ldoc/leggings.luadoc",
|
||||
".ldoc/boots.luadoc",
|
||||
".ldoc/shields.luadoc",
|
||||
".ldoc/crafting.luadoc",
|
||||
}
|
||||
|
||||
|
||||
new_type("setting", "Settings")
|
||||
new_type("armor", "Armors")
|
||||
new_type("craft", "Craft Recipes")
|
||||
|
||||
alias("helmet", "armor")
|
||||
alias("chestplate", "armor")
|
||||
alias("leggings", "armor")
|
||||
alias("boots", "armor")
|
||||
alias("shield", "armor")
|
||||
alias("grp", "group")
|
||||
|
||||
-- function declarations
|
||||
local format_text
|
||||
local format_group
|
||||
|
||||
custom_tags = {
|
||||
-- settings
|
||||
{
|
||||
"settype",
|
||||
title = "Type",
|
||||
hidden = true,
|
||||
},
|
||||
{
|
||||
"min",
|
||||
title = "Minimum Value",
|
||||
hidden = true,
|
||||
},
|
||||
{
|
||||
"max",
|
||||
title = "Maximum Value",
|
||||
hidden = true,
|
||||
},
|
||||
{
|
||||
"default",
|
||||
title = "Default Value",
|
||||
hidden = true,
|
||||
},
|
||||
-- craft items/tools
|
||||
{
|
||||
-- specify image basename only
|
||||
"img",
|
||||
title = "Image",
|
||||
format = function(value)
|
||||
local img = "<img src=\"https://raw.githubusercontent.com/minetest-mods/3d_armor/master/"
|
||||
if string then
|
||||
if string.find(value, "shields_") == 1 then
|
||||
img = img .. "shields/"
|
||||
else
|
||||
img = img .. "3d_armor/"
|
||||
end
|
||||
end
|
||||
|
||||
return img .. "textures/" .. value .. "\" style=\"width:32px; height:32px;\" />"
|
||||
end,
|
||||
},
|
||||
{
|
||||
-- specify full (relative or absolute) image path
|
||||
"image",
|
||||
title = "Image",
|
||||
format = function(value)
|
||||
return "<img src=\"" .. value .. "\" style=\"width:32px; height:32px;\" />"
|
||||
end,
|
||||
},
|
||||
{
|
||||
"group",
|
||||
title = "Groups",
|
||||
format = function(value)
|
||||
return format_group(value)
|
||||
end,
|
||||
},
|
||||
{
|
||||
"armorgrp",
|
||||
title = "Armor Groups",
|
||||
format = function(value)
|
||||
return format_group(value)
|
||||
end,
|
||||
},
|
||||
{
|
||||
"damagegrp",
|
||||
title = "Damage Groups",
|
||||
format = function(value)
|
||||
return format_group(value)
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
if string then
|
||||
string.trim = function(st, delim)
|
||||
if not delim then
|
||||
delim = " "
|
||||
end
|
||||
|
||||
while string.find(st, delim) == 1 do
|
||||
st = st:sub(2)
|
||||
end
|
||||
|
||||
while string.sub(st, string.len(st)) == delim do
|
||||
st = st:sub(1, string.len(st)-1)
|
||||
end
|
||||
|
||||
return st
|
||||
end
|
||||
|
||||
string.split = function(st, delim)
|
||||
local list = {}
|
||||
|
||||
local idx = string.find(st, delim)
|
||||
while idx do
|
||||
table.insert(list, st:sub(1, idx-1))
|
||||
st = st:sub(idx+1)
|
||||
idx = string.find(st, delim)
|
||||
end
|
||||
-- add remaining item
|
||||
table.insert(list, st)
|
||||
|
||||
return list
|
||||
end
|
||||
end
|
||||
|
||||
if table then
|
||||
if not table.copy then
|
||||
table.copy = function(orig_table)
|
||||
local new_table = {}
|
||||
for k, v in pairs(orig_table) do
|
||||
new_table[k] = v
|
||||
end
|
||||
|
||||
return new_table
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
format_text = function(text, flags)
|
||||
local ret = "<"
|
||||
local ttype = "span"
|
||||
if flags.code then
|
||||
ttype = "code"
|
||||
end
|
||||
|
||||
ret = ret .. ttype .. " style=\""
|
||||
|
||||
if flags.size then
|
||||
ret = ret .. "font-size:" .. flags.size .. ";"
|
||||
end
|
||||
if flags.mono then
|
||||
ret = ret .. "font-family:monospace;"
|
||||
end
|
||||
if flags.italic then
|
||||
ret = ret .. "font-style:italic;"
|
||||
end
|
||||
if flags.bold then
|
||||
ret = ret .. "font-weight:bold;"
|
||||
end
|
||||
if flags.color then
|
||||
ret = ret .. "color:" .. flags.color .. ";"
|
||||
end
|
||||
if flags.bgcolor then
|
||||
ret = ret .. "background-color:" .. flags.bgcolor .. ";"
|
||||
end
|
||||
|
||||
ret = ret .. "\">" .. text .. "</" .. ttype .. ">"
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
format_group = function(text)
|
||||
if string then
|
||||
local idx, k, v = string.find(text, " ")
|
||||
if idx then
|
||||
text = format_text(string.sub(text, 1, idx-1) .. ": ", {mono=true, color="darkgreen"})
|
||||
.. string.sub(text, idx)
|
||||
end
|
||||
end
|
||||
|
||||
return text
|
||||
end
|
||||
|
||||
|
||||
local function format_setting_tag(desc, value)
|
||||
return "\n- <span style=\"font-size:80%;\">`" .. desc .. ":`</span> `" .. value .. "`"
|
||||
end
|
||||
|
||||
|
||||
local registered = {
|
||||
settings = {},
|
||||
}
|
||||
|
||||
local function setting_handler(item)
|
||||
if not ipairs or not type then
|
||||
return item
|
||||
end
|
||||
|
||||
local tags = {
|
||||
{"settype", "type"},
|
||||
{"default"},
|
||||
{"min", "minimum value"},
|
||||
{"max", "maximum value"},
|
||||
}
|
||||
|
||||
local def = {
|
||||
["settype"] = format_setting_tag("type", "string"),
|
||||
}
|
||||
|
||||
for _, t in ipairs(tags) do
|
||||
local name = t[1]
|
||||
local desc = t[2]
|
||||
if not desc then desc = name end
|
||||
|
||||
local value = item.tags[name]
|
||||
if type(value) == "table" then
|
||||
if #value > 1 then
|
||||
local msg = item.file.filename .. " (line " .. item.lineno
|
||||
.. "): multiple instances of tag \"" .. name .. "\" found"
|
||||
if error then
|
||||
error(msg)
|
||||
elseif print then
|
||||
print("WARNING: " .. msg)
|
||||
end
|
||||
end
|
||||
|
||||
if value[1] then
|
||||
def[name] = format_setting_tag(desc, value[1])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
item.description = item.description .. "\n\n**Definition:**\n" .. def.settype
|
||||
for _, t in ipairs({def.default, def.min, def.max}) do
|
||||
if t then
|
||||
item.description = item.description .. t
|
||||
end
|
||||
end
|
||||
|
||||
registered.settings[item.name] = true
|
||||
|
||||
return item
|
||||
end
|
||||
|
||||
function custom_display_name_handler(item, default_handler)
|
||||
if item.type == "setting" then
|
||||
-- avoid parsing again
|
||||
if not registered.settings[item.name] then
|
||||
item = setting_handler(item)
|
||||
end
|
||||
elseif item.type == "armor" and string then
|
||||
-- HACK: not sure why "shields:" is being trimmed from item name
|
||||
if string.find(item.name, "shield_") == 1 then
|
||||
item.name = "shields:" .. item.name
|
||||
end
|
||||
end
|
||||
|
||||
if item then
|
||||
return default_handler(item)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local custom_see_links = {
|
||||
["ObjectRef"] = "https://minetest.gitlab.io/minetest/class-reference/#objectref",
|
||||
["PlayerMetaRef"] = "https://minetest.gitlab.io/minetest/class-reference/#playermetaref",
|
||||
["ItemDef"] = "https://minetest.gitlab.io/minetest/definition-tables/#item-definition",
|
||||
["ItemStack"] = "https://minetest.gitlab.io/minetest/class-reference/#itemstack",
|
||||
["groups"] = "https://minetest.gitlab.io/minetest/groups/",
|
||||
["entity_damage_mechanism"] = "https://minetest.gitlab.io/minetest/entity-damage-mechanism/",
|
||||
["vector"] = "https://minetest.gitlab.io/minetest/representations-of-simple-things/#positionvector",
|
||||
}
|
||||
|
||||
local function format_custom_see(name, section)
|
||||
local url = custom_see_links[name]
|
||||
if not url then
|
||||
url = ""
|
||||
end
|
||||
|
||||
if not name then
|
||||
name = ""
|
||||
end
|
||||
|
||||
return name, url
|
||||
end
|
||||
|
||||
custom_see_handler("^(ObjectRef)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(PlayerMetaRef)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(ItemDef)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(groups)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(entity_damage_mechanism)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(ItemStack)$", function(name, section)
|
||||
return format_custom_see(name, section)
|
||||
end)
|
||||
|
||||
custom_see_handler("^(vector)$", function(name, section)
|
||||
return name, "https://minetest.gitlab.io/minetest/representations-of-simple-things/#positionvector"
|
||||
end)
|
304
.ldoc/ldoc.css
Normal file
304
.ldoc/ldoc.css
Normal file
@ -0,0 +1,304 @@
|
||||
/* BEGIN RESET
|
||||
|
||||
Copyright (c) 2010, Yahoo! Inc. All rights reserved.
|
||||
Code licensed under the BSD License:
|
||||
http://developer.yahoo.com/yui/license.html
|
||||
version: 2.8.2r1
|
||||
*/
|
||||
html {
|
||||
color: #000;
|
||||
background: #FFF;
|
||||
}
|
||||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
fieldset,img {
|
||||
border: 0;
|
||||
}
|
||||
address,caption,cite,code,dfn,em,strong,th,var,optgroup {
|
||||
font-style: inherit;
|
||||
font-weight: inherit;
|
||||
}
|
||||
del,ins {
|
||||
text-decoration: none;
|
||||
}
|
||||
li {
|
||||
margin-left: 20px;
|
||||
}
|
||||
caption,th {
|
||||
text-align: left;
|
||||
}
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
font-size: 100%;
|
||||
font-weight: bold;
|
||||
}
|
||||
q:before,q:after {
|
||||
content: '';
|
||||
}
|
||||
abbr,acronym {
|
||||
border: 0;
|
||||
font-variant: normal;
|
||||
}
|
||||
sup {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
sub {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
legend {
|
||||
color: #000;
|
||||
}
|
||||
input,button,textarea,select,optgroup,option {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
font-style: inherit;
|
||||
font-weight: inherit;
|
||||
}
|
||||
input,button,textarea,select {*font-size:100%;
|
||||
}
|
||||
/* END RESET */
|
||||
|
||||
body {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
font-family: arial, helvetica, geneva, sans-serif;
|
||||
background-color: #ffffff; margin: 0px;
|
||||
}
|
||||
|
||||
code, tt { font-family: monospace; font-size: 1.1em; }
|
||||
span.parameter { font-family:monospace; }
|
||||
span.parameter:after { content:":"; }
|
||||
span.types:before { content:"("; }
|
||||
span.types:after { content:")"; }
|
||||
.type { font-weight: bold; font-style:italic }
|
||||
|
||||
body, p, td, th { font-size: .95em; line-height: 1.2em;}
|
||||
|
||||
p, ul { margin: 10px 0 0 0px;}
|
||||
|
||||
strong { font-weight: bold;}
|
||||
|
||||
em { font-style: italic;}
|
||||
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
margin: 20px 0 20px 0;
|
||||
}
|
||||
h2, h3, h4 { margin: 15px 0 10px 0; }
|
||||
h2 { font-size: 1.25em; }
|
||||
h3 { font-size: 1.15em; }
|
||||
h4 { font-size: 1.06em; }
|
||||
|
||||
a:link { font-weight: bold; color: #004080; text-decoration: none; }
|
||||
a:visited { font-weight: bold; color: #006699; text-decoration: none; }
|
||||
a:link:hover { text-decoration: underline; }
|
||||
|
||||
hr {
|
||||
color:#cccccc;
|
||||
background: #00007f;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
blockquote { margin-left: 3em; }
|
||||
|
||||
ul { list-style-type: disc; }
|
||||
|
||||
p.name {
|
||||
font-family: "Andale Mono", monospace;
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: rgb(245, 245, 245);
|
||||
border: 1px solid #C0C0C0; /* silver */
|
||||
padding: 10px;
|
||||
margin: 10px 0 10px 0;
|
||||
overflow: auto;
|
||||
font-family: "Andale Mono", monospace;
|
||||
}
|
||||
|
||||
pre.example {
|
||||
font-size: .85em;
|
||||
}
|
||||
|
||||
table.index { border: 1px #00007f; }
|
||||
table.index td { text-align: left; vertical-align: top; }
|
||||
|
||||
#container {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
#product {
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #cccccc;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
#product big {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
#main {
|
||||
background-color: #f0f0f0;
|
||||
border-left: 2px solid #cccccc;
|
||||
}
|
||||
|
||||
#navigation {
|
||||
float: left;
|
||||
width: 14em;
|
||||
vertical-align: top;
|
||||
background-color: #f0f0f0;
|
||||
overflow: visible;
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
#navigation h2 {
|
||||
background-color:#e7e7e7;
|
||||
font-size:1.1em;
|
||||
color:#000000;
|
||||
text-align: left;
|
||||
padding:0.2em;
|
||||
border-top:1px solid #dddddd;
|
||||
border-bottom:1px solid #dddddd;
|
||||
}
|
||||
|
||||
#navigation ul
|
||||
{
|
||||
font-size:1em;
|
||||
list-style-type: none;
|
||||
margin: 1px 1px 10px 1px;
|
||||
}
|
||||
|
||||
#navigation li {
|
||||
text-indent: -1em;
|
||||
display: block;
|
||||
margin: 3px 0px 0px 22px;
|
||||
}
|
||||
|
||||
#navigation li li a {
|
||||
margin: 0px 3px 0px -1em;
|
||||
}
|
||||
|
||||
#content {
|
||||
margin-left: 14em;
|
||||
padding: 1em;
|
||||
width: 700px;
|
||||
border-left: 2px solid #cccccc;
|
||||
border-right: 2px solid #cccccc;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
#about {
|
||||
clear: both;
|
||||
padding: 5px;
|
||||
border-top: 2px solid #cccccc;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body {
|
||||
font: 12pt "Times New Roman", "TimeNR", Times, serif;
|
||||
}
|
||||
a { font-weight: bold; color: #004080; text-decoration: underline; }
|
||||
|
||||
#main {
|
||||
background-color: #ffffff;
|
||||
border-left: 0px;
|
||||
}
|
||||
|
||||
#container {
|
||||
margin-left: 2%;
|
||||
margin-right: 2%;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
#content {
|
||||
padding: 1em;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
#navigation {
|
||||
display: none;
|
||||
}
|
||||
pre.example {
|
||||
font-family: "Andale Mono", monospace;
|
||||
font-size: 10pt;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
}
|
||||
|
||||
table.module_list {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.module_list td {
|
||||
border-width: 1px;
|
||||
padding: 3px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
}
|
||||
table.module_list td.name { background-color: #f0f0f0; min-width: 200px; }
|
||||
table.module_list td.summary { width: 100%; }
|
||||
|
||||
|
||||
table.function_list {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.function_list td {
|
||||
border-width: 1px;
|
||||
padding: 3px;
|
||||
border-style: solid;
|
||||
border-color: #cccccc;
|
||||
}
|
||||
table.function_list td.name { background-color: #f0f0f0; min-width: 200px; }
|
||||
table.function_list td.summary { width: 100%; }
|
||||
|
||||
ul.nowrap {
|
||||
overflow:auto;
|
||||
white-space:nowrap;
|
||||
}
|
||||
|
||||
dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
|
||||
dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;}
|
||||
dl.table h3, dl.function h3 {font-size: .95em;}
|
||||
|
||||
/* stop sublists from having initial vertical space */
|
||||
ul ul { margin-top: 0px; }
|
||||
ol ul { margin-top: 0px; }
|
||||
ol ol { margin-top: 0px; }
|
||||
ul ol { margin-top: 0px; }
|
||||
|
||||
/* make the target distinct; helps when we're navigating to a function */
|
||||
a:target + * {
|
||||
background-color: #FF9;
|
||||
}
|
||||
|
||||
|
||||
/* styles for prettification of source */
|
||||
pre .comment { color: #558817; }
|
||||
pre .constant { color: #a8660d; }
|
||||
pre .escape { color: #844631; }
|
||||
pre .keyword { color: #aa5050; font-weight: bold; }
|
||||
pre .library { color: #0e7c6b; }
|
||||
pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; }
|
||||
pre .string { color: #8080ff; }
|
||||
pre .number { color: #f8660d; }
|
||||
pre .operator { color: #2239a8; font-weight: bold; }
|
||||
pre .preprocessor, pre .prepro { color: #a33243; }
|
||||
pre .global { color: #800080; }
|
||||
pre .user-keyword { color: #800080; }
|
||||
pre .prompt { color: #558817; }
|
||||
pre .url { color: #272fc2; text-decoration: underline; }
|
||||
|
46
.ldoc/parse_crafts.py
Executable file
46
.ldoc/parse_crafts.py
Executable file
@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# This script will parse source files for craft recipes.
|
||||
|
||||
import sys, os, codecs, errno
|
||||
|
||||
|
||||
path = os.path.realpath(__file__)
|
||||
script = os.path.basename(path)
|
||||
d_root = os.path.dirname(os.path.dirname(path))
|
||||
d_ldoc = os.path.join(d_root, ".ldoc")
|
||||
|
||||
craftfile = os.path.realpath(os.path.join(d_root, "3d_armor/armor.lua"))
|
||||
if not os.path.isfile(craftfile):
|
||||
print("ERROR: craft file does not exist for parsing: {}".format(craftfile))
|
||||
sys.exit(errnor.ENOENT)
|
||||
|
||||
buffer = codecs.open(craftfile, "r", "utf-8")
|
||||
if not buffer:
|
||||
print("ERROR: could not open file for reading: {}".format(craftfile))
|
||||
sys.exit(errno.EIO)
|
||||
|
||||
data_in = buffer.read()
|
||||
buffer.close()
|
||||
|
||||
craft = ""
|
||||
|
||||
data_in = data_in.replace("\r\n", "\n").replace("\r", "\n")
|
||||
for sect in data_in.split("\n---"):
|
||||
if "@craft armor" in sect:
|
||||
sect = "---{}".format(sect)
|
||||
for li in sect.split("\n"):
|
||||
if li.startswith("--"):
|
||||
craft = "{}\n{}".format(craft, li)
|
||||
|
||||
outfile = os.path.join(d_ldoc, "crafting.luadoc")
|
||||
|
||||
buffer = codecs.open(outfile, "w", "utf-8")
|
||||
if not buffer:
|
||||
print("ERROR: could not open file for writing: {}".format(outfile))
|
||||
sys.exit(errno.EIO)
|
||||
|
||||
buffer.write("\n--- 3D Armor Crafting\n--\n-- @topic crafting\n\n{}\n".format(craft))
|
||||
buffer.close()
|
||||
|
||||
print("crafts exported to\t{}".format(outfile))
|
118
.ldoc/parse_settings.py
Executable file
118
.ldoc/parse_settings.py
Executable file
@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# This script will format "settingtypes.txt" file found at the root
|
||||
# of 3d_armor modpack into a format readable by LDoc.
|
||||
|
||||
import sys, os, errno, codecs
|
||||
|
||||
|
||||
path = os.path.realpath(__file__)
|
||||
script = os.path.basename(path)
|
||||
d_root = os.path.dirname(os.path.dirname(path))
|
||||
d_ldoc = os.path.join(d_root, ".ldoc")
|
||||
f_settings = os.path.join(d_root, "settingtypes.txt")
|
||||
|
||||
if not os.path.isfile(f_settings):
|
||||
print("settingtypes.txt does not exist")
|
||||
sys.exit(errno.ENOENT)
|
||||
|
||||
i_stream = codecs.open(f_settings, "r", "utf-8")
|
||||
data_in = i_stream.read()
|
||||
i_stream.close()
|
||||
|
||||
data_in = data_in.replace("\r", "")
|
||||
|
||||
sets = data_in.split("\n\n")
|
||||
|
||||
for idx in reversed(range(len(sets))):
|
||||
set = sets[idx]
|
||||
lines = set.split("\n")
|
||||
for idx2 in reversed(range(len(lines))):
|
||||
li = lines[idx2].strip(" \t")
|
||||
if li == "" or li[0] == "[":
|
||||
lines.pop(idx2)
|
||||
|
||||
if len(lines) == 0:
|
||||
sets.pop(idx)
|
||||
else:
|
||||
sets[idx] = "\n".join(lines)
|
||||
|
||||
filtered = []
|
||||
|
||||
for set in sets:
|
||||
comment = False
|
||||
lines = set.split("\n")
|
||||
new_lines = []
|
||||
for li in lines:
|
||||
if li[0] == "#":
|
||||
new_lines.append(li)
|
||||
else:
|
||||
new_lines.append(li)
|
||||
filtered.append("\n".join(new_lines))
|
||||
new_lines = []
|
||||
|
||||
settings = []
|
||||
|
||||
def parse_setting(set):
|
||||
desc = []
|
||||
setting = summary = stype = sdefault = soptions = None
|
||||
|
||||
for li in set.split("\n"):
|
||||
if li[0] == "#":
|
||||
desc.append("-- {}".format(li.lstrip(" #")))
|
||||
else:
|
||||
setting = li.split(" ")[0]
|
||||
summary = li.split(")")[0].split("(")[-1]
|
||||
li = li.split(")")[-1].strip()
|
||||
rem = li.split(" ")
|
||||
stype = rem[0]
|
||||
rem.pop(0)
|
||||
|
||||
if len(rem) > 0:
|
||||
sdefault = rem[0]
|
||||
rem.pop(0)
|
||||
|
||||
if len(rem) > 0:
|
||||
soptions = " ".join(rem)
|
||||
|
||||
if not setting:
|
||||
return
|
||||
|
||||
st = "---"
|
||||
if summary:
|
||||
if summary[-1] != ".":
|
||||
summary = "{}.".format(summary)
|
||||
st = "{} {}".format(st, summary)
|
||||
|
||||
st = "{}\n--".format(st)
|
||||
|
||||
if len(desc) > 0:
|
||||
st = "{}\n{}\n--".format(st, "\n".join(desc))
|
||||
|
||||
st = "{}\n-- @setting {}".format(st, setting)
|
||||
|
||||
if stype:
|
||||
st = "{}\n-- @settype {}".format(st, stype)
|
||||
|
||||
if sdefault:
|
||||
st = "{}\n-- @default {}".format(st, sdefault)
|
||||
|
||||
# TODO: add options
|
||||
|
||||
settings.append(st)
|
||||
|
||||
for f in filtered:
|
||||
parse_setting(f)
|
||||
|
||||
outfile = os.path.join(d_ldoc, "settings.luadoc")
|
||||
data_out = "\n--- 3D Armor Settings\n--\n-- @topic settings\n\n\n{}\n".format("\n\n".join(settings))
|
||||
|
||||
o_stream = codecs.open(outfile, "w", "utf-8")
|
||||
if not o_stream:
|
||||
print("ERROR: could not open file for writing: {}".format(outfile))
|
||||
sys.exit(errno.EIO)
|
||||
|
||||
o_stream.write(data_out)
|
||||
o_stream.close()
|
||||
|
||||
print("settings exported to\t{}".format(outfile))
|
90
.ldoc/parse_src.py
Executable file
90
.ldoc/parse_src.py
Executable file
@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# This script will parse source files for docstring.
|
||||
|
||||
import os, codecs
|
||||
|
||||
|
||||
path = os.path.realpath(__file__)
|
||||
script = os.path.basename(path)
|
||||
d_root = os.path.dirname(os.path.dirname(path))
|
||||
d_ldoc = os.path.join(d_root, ".ldoc")
|
||||
|
||||
|
||||
armor_types = {
|
||||
"armor": {"topic": "Armors", "values": []},
|
||||
"helmet": {"topic": "Helmets", "values": []},
|
||||
"chestplate": {"topic": "Chestplates", "values": []},
|
||||
"leggings": {"topic": "Leggings", "values": []},
|
||||
"boots": {"topic": "Boots", "values": []},
|
||||
"shield": {"topic": "Shields", "values": []},
|
||||
}
|
||||
|
||||
def parse_file(f):
|
||||
buffer = codecs.open(f, "r", "utf-8")
|
||||
if not buffer:
|
||||
print("ERROR: could not open file for reading: {}".format(f))
|
||||
return
|
||||
|
||||
data_in = buffer.read()
|
||||
buffer.close()
|
||||
|
||||
# format to LF (Unix)
|
||||
data_in = data_in.replace("\r\n", "\n").replace("\r", "\n")
|
||||
|
||||
current_item = []
|
||||
item_type = None
|
||||
new_item = False
|
||||
for li in data_in.split("\n"):
|
||||
li = li.strip()
|
||||
if li.startswith("---"):
|
||||
new_item = True
|
||||
elif not li.startswith("--"):
|
||||
new_item = False
|
||||
|
||||
if new_item:
|
||||
current_item.append(li)
|
||||
if not item_type:
|
||||
for a_type in armor_types:
|
||||
if "@{} ".format(a_type) in li:
|
||||
item_type = a_type
|
||||
break
|
||||
elif item_type and len(current_item):
|
||||
armor_types[item_type]["values"].append("\n".join(current_item))
|
||||
item_type = None
|
||||
current_item = []
|
||||
else:
|
||||
current_item = []
|
||||
|
||||
to_parse = []
|
||||
|
||||
for obj in os.listdir(d_root):
|
||||
fullpath = os.path.join(d_root, obj)
|
||||
if not obj.startswith(".") and os.path.isdir(fullpath):
|
||||
for root, dirs, files in os.walk(fullpath):
|
||||
for f in files:
|
||||
if f.endswith(".lua"):
|
||||
to_parse.append(os.path.join(root, f))
|
||||
|
||||
for p in to_parse:
|
||||
if not os.path.isfile(p):
|
||||
print("ERROR: {} is not a file".format(p))
|
||||
else:
|
||||
parse_file(p)
|
||||
|
||||
for t in armor_types:
|
||||
topic = armor_types[t]["topic"]
|
||||
items = armor_types[t]["values"]
|
||||
|
||||
if len(items):
|
||||
outfile = os.path.join(d_ldoc, "{}.luadoc".format(topic.lower()))
|
||||
|
||||
buffer = codecs.open(outfile, "w", "utf-8")
|
||||
if not buffer:
|
||||
print("ERROR: could not open file for writing: {}".format(outfile))
|
||||
continue
|
||||
|
||||
buffer.write("\n--- 3D Armor {}\n--\n-- @topic {}\n\n\n{}\n".format(topic, topic.lower(), "\n\n".join(items)))
|
||||
buffer.close()
|
||||
|
||||
print("{} exported to\t{}".format(topic.lower(), outfile))
|
Reference in New Issue
Block a user