-- ANTI-CAPITALIST SOFTWARE LICENSE (v 1.4) -- -- marigold-cgi Copyright (c) 2022 Kate Swanson -- -- This is anti-capitalist software, released for free use by individuals and -- organizations that do not operate by capitalist principles. -- -- Permission is hereby granted, free of charge, to any person or organization ( -- the "User") obtaining a copy of this software and associated documentation -- files (the "Software"), to use, copy, modify, merge, distribute, and/or sell -- copies of the Software, subject to the following conditions: -- -- 1. The above copyright notice and this permission notice shall be included in -- all copies or modified versions of the Software. -- -- 2. The User is one of the following: -- a. An individual person, laboring for themselves -- b. A non-profit organization -- c. An educational institution -- d. An organization that seeks shared profit for all of its members, and allows -- non-members to set the cost of their labor -- -- 3. If the User is an organization with owners, then all owners are workers and -- all workers are owners with equal equity and/or equal vote. -- -- 4. If the User is an organization, then the User is not law enforcement or -- military, or working for or under either. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY -- KIND, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE -- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -- CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local marigold = {} marigold.get_metavars = function() local vars = { "AUTH_TYPE", "CONTENT_LENGTH", "CONTENT_TYPE", "GATEWAY_INTERFACE", "PATH_INFO", "PATH_TRANSLATED", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_HOST", "REMOTE_IDENT", "REMOTE_USER", "REQUEST_METHOD", "SCRIPT_NAME", "SERVER_NAME", "SERVER_PORT", "SERVER_PROTOCOL", "SERVER_SOFTWARE" } local metavars = {} for _, var in ipairs(vars) do metavars[string.lower(var)] = os.getenv(var) end return metavars end marigold.h = function(tag_type, content, tbl) if type(content) == 'table' and tbl == nil then tbl = content content = '' end if content == nil then tbl = {} content = '' end local tag = {} tag.tag = tag_type tag.content = content tag.attributes = {} tag.children = {} if tbl then -- add attributes for k, v in pairs(tbl) do if type(k) == 'string' then tag.attributes[k] = v end end -- add children for _, child in ipairs(tbl) do table.insert(tag.children, child) end end return tag end marigold.html = function(tbl, indent_level) indent_level = indent_level or 0 local indent = string.rep('\t', indent_level) -- generate attribute strings local attributes = {} for k, v in pairs(tbl.attributes) do table.insert(attributes, string.format(' %s="%s"', k, v)) end if test then -- sort alphabetically for well-defined testing table.sort(attributes) end local a = '' for _, attrib in ipairs(attributes) do a = a .. attrib end local open = string.format('<%s%s>', tbl.tag, a) local close = string.format('', tbl.tag) if #tbl.children == 0 then return string.format('%s%s%s%s', indent, open, tbl.content, close) end local children = '' for _, child in ipairs(tbl.children) do children = children .. marigold.html(child, indent_level+1) .. '\n' end return string.format('%s%s%s\n%s%s%s', indent, open, tbl.content, children, indent, close) end marigold.decode_percent = function(str) return string.gsub(str, "%%(%x%x)", function(digits) return string.char(tonumber(digits, 16)) end) end marigold.decode_query = function(str) local tbl = {} local cleanString = function(str) return marigold.decode_percent( string.gsub(str, "+", " ") ) end for k, v in string.gmatch(str, "([^=]-)=([^&]*)&?") do tbl[cleanString(k)] = cleanString(v) end return tbl end return marigold