Module:Diagram
From Space Station 14 Wiki
Documentation for this module may be created at Module:Diagram/doc
--[[
This Lua script includes content from the following source:
Source: https://terraria.wiki.gg/wiki/Module:Diagram
License: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
You are free to:
- Share: Copy and redistribute the material in any medium or format.
- Adapt: Remix, transform, and build upon the material.
Under the following terms:
- Attribution: You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- NonCommercial: You may not use the material for commercial purposes.
- ShareAlike: If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
For full license details, please visit: https://creativecommons.org/licenses/by-nc-sa/3.0/
--]]
local trim = mw.text.trim
local inputArgs
local function getArg(key)
local v = trim(inputArgs[key] or '')
if v=='' then
return nil
else
return v
end
end
local function tableStartTag()
local t
local str = '<table class="diagram'
t = getArg('class')
if t then
str = str .. ' ' .. t
end
str = str .. '"'
t = getArg('id')
if t then
str = str .. ' id="' .. t ..'"'
end
t = getArg('style') or getArg('css')
if t then
str = str .. ' style="' .. t ..'"'
end
t = getArg('summary')
if t then
str = str .. ' title="' .. t ..'"'
end
return str .. '>'
end
--------------------------------------------------------------
return {
render = function(frame)
--currentFrame = frame
inputArgs = frame:getParent().args
local str = tableStartTag()
local _i = 1
local v
local row1 = ''
local row2 = ''
local boxclass = getArg('boxclass')
local boxstyle = getArg('boxstyle')
while true do
v = inputArgs[_i]
if not v then
break
end
_i = _i+1
v = trim(v)
if v == '#' then
str = str .. '<tr class="x"> '..row1 .. '</tr><tr class="y">' .. row2 .. '</tr>'
row1 = ''
row2 = ''
elseif v == '_' or v == '0' or v == 'O' then
row1 = row1 .. '<td class="l nr nb"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '-' then
row1 = row1 .. '<td colspan="2" class="l sb"></td>'
row2 = row2 .. '<td class="l nr"></td><td class="l"></td>'
elseif v == 'I' then
row1 = row1 .. '<td rowspan="2" class="l sr"></td><td class="l nb"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == ',' then
row1 = row1 .. '<td class="l cf"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'v' then
row1 = row1 .. '<td colspan="2" class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == '.' then
row1 = row1 .. '<td class="l sb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == ')' then
row1 = row1 .. '<td rowspan="2" class="l sr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == '+' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == '(' then
row1 = row1 .. '<td class="l sb sr"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == '`' then
row1 = row1 .. '<td class="l sr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '^' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == "'" then
row1 = row1 .. '<td class="l sr sb"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '~' then
row1 = row1 .. '<td colspan="2" class="l db"></td>'
row2 = row2 .. '<td class="l nr"></td><td class="l"></td>'
elseif v == ':' then
row1 = row1 .. '<td rowspan="2" class="l dr"></td><td class="l nb"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == 'F' then
row1 = row1 .. '<td class="l cf"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'V' then
row1 = row1 .. '<td colspan="2" class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '7' then
row1 = row1 .. '<td class="l db"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'D' then
row1 = row1 .. '<td rowspan="2" class="l dr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == 'X' then
row1 = row1 .. '<td class="l dr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'C' then
row1 = row1 .. '<td class="l db dr"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'L' then
row1 = row1 .. '<td class="l dr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'A' then
row1 = row1 .. '<td class="l dr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'J' then
row1 = row1 .. '<td class="l dr db"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'r' then
row1 = row1 .. '<td class="l cf"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'y' then
row1 = row1 .. '<td colspan="2" class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'n' then
row1 = row1 .. '<td class="l db"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == ']' then
row1 = row1 .. '<td rowspan="2" class="l sr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == '$' then
row1 = row1 .. '<td class="l sr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == '[' then
row1 = row1 .. '<td class="l db sr"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == 'c' then
row1 = row1 .. '<td class="l sr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'h' then
row1 = row1 .. '<td class="l sr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'j' then
row1 = row1 .. '<td class="l sr db"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'p' then
row1 = row1 .. '<td class="l cf"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'u' then
row1 = row1 .. '<td colspan="2" class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'q' then
row1 = row1 .. '<td class="l sb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'E' then
row1 = row1 .. '<td rowspan="2" class="l dr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == 'x' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '3' then
row1 = row1 .. '<td class="l sb dr"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'b' then
row1 = row1 .. '<td class="l dr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 't' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'd' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '/' then
row1 = row1 .. '<td class="l dr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'Y' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == '\\' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'B' then
row1 = row1 .. '<td class="l sr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'G' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'R' then
row1 = row1 .. '<td class="l sr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'U' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '4' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '!' then
row1 = row1 .. '<td class="l sr nb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'i' then
row1 = row1 .. '<td class="l dr nb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == '<' then
row1 = row1 .. '<td class="l sb nr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '>' then
row1 = row1 .. '<td class="l db nr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '9' then
row1 = row1 .. '<td class="l sr nb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == '6' then
row1 = row1 .. '<td colspan="2" class="l nb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == '&' then
row1 = row1 .. '<td class="l sb nr"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '?' then
row1 = row1 .. '<td class="l nr"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '"' then
row1 = row1 .. '<td class="l dr nb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l"></td>'
elseif v == ';' then
row1 = row1 .. '<td colspan="2" class="l nb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'a' then
row1 = row1 .. '<td class="l db nr"></td><td class="l"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'e' then
row1 = row1 .. '<td class="l nr"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'M' then
row1 = row1 .. '<td class="l dr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'W' then
row1 = row1 .. '<td class="l sr db"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '2' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == '5' then
row1 = row1 .. '<td class="l dr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'f' then
row1 = row1 .. '<td class="l sr nb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'g' then
row1 = row1 .. '<td class="l sr db"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'k' then
row1 = row1 .. '<td class="l dr nb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 's' then
row1 = row1 .. '<td class="l dr db"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == 'o' then
row1 = row1 .. '<td class="l nr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'm' then
row1 = row1 .. '<td class="l nr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'w' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'z' then
row1 = row1 .. '<td class="l dr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'P' then
row1 = row1 .. '<td class="l dr nb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'H' then
row1 = row1 .. '<td class="l dr sb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == 'K' then
row1 = row1 .. '<td class="l sr nb"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l dr"></td><td class="l"></td>'
elseif v == 'N' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == 'T' then
row1 = row1 .. '<td class="l nr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'Z' then
row1 = row1 .. '<td class="l nr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l sr"></td><td class="l"></td>'
elseif v == 'S' then
row1 = row1 .. '<td class="l sr db"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == 'Q' then
row1 = row1 .. '<td class="l sr sb"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l" colspan="2"></td>'
elseif v == '←' then
row1 = row1 .. '<td class="l sb alt"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l alb" colspan="2"></td>'
elseif v == '→' then
row1 = row1 .. '<td class="l sb"></td><td class="l sb art"></td>'
row2 = row2 .. '<td class="l arb" colspan="2"></td>'
elseif v == '↑' then
row1 = row1 .. '<td class="l sr atl"></td><td class="l atr" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr"></td>'
elseif v == '↓' then
row1 = row1 .. '<td class="l sr"></td><td class="l abr" rowspan="2"></td>'
row2 = row2 .. '<td class="l sr abl"></td>'
elseif v == '⇠' then
row1 = row1 .. '<td class="l db alt"></td><td class="l db"></td>'
row2 = row2 .. '<td class="l alb" colspan="2"></td>'
elseif v == '⇢' then
row1 = row1 .. '<td class="l db"></td><td class="l db art"></td>'
row2 = row2 .. '<td class="l arb" colspan="2"></td>'
elseif v == '⇡' then
row1 = row1 .. '<td class="l dr atl"></td><td class="l atr" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr"></td>'
elseif v == '⇣' then
row1 = row1 .. '<td class="l dr"></td><td class="l abr" rowspan="2"></td>'
row2 = row2 .. '<td class="l dr abl"></td>'
elseif v == '*' then -- unlinked crossing
row1 = row1 .. '<td class="l sb ct"></td><td class="l sb"></td>'
row2 = row2 .. '<td class="l sr cb"></td><td class="l"></td>'
elseif v == '' then
-- just skip.
else
-- content box
local cols = tonumber(getArg(v..'_cols') or 3)
local rows = tonumber(getArg(v..'_rows') or 1)
row1 = row1 .. '<td colspan="' .. tostring(cols*2) .. '" rowspan="' .. tostring(rows*2) .. '" class="diagram-box'
local t = getArg(v..'_class')
if boxclass or t then
row1 = row1 .. ' ' .. tostring(boxclass or '') .. ' ' .. tostring(t or '')
end
row1 = row1 .. '"'
t = getArg(v..'_id')
if t then
row1 = row1 .. ' id="' .. t ..'"'
end
t = getArg(v..'_boxstyle') or getArg(v..'_style') or getArg(v..'_css')
if boxstyle or t then
row1 = row1 .. ' style="' .. tostring(boxstyle or '') .. ';' .. tostring(t or '') .. '"'
end
row1 = row1 .. '>' .. trim(inputArgs[v] or '') .. '</td>'
end
end
if row1 ~= '' then
str = str .. '<tr class="x"> '..row1 .. '</tr><tr class="y">' .. row2 .. '</tr>'
end
return str .. '</table>'
end,
}