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,
}