summaryrefslogtreecommitdiff
path: root/marigold.lua
diff options
context:
space:
mode:
Diffstat (limited to 'marigold.lua')
-rw-r--r--marigold.lua150
1 files changed, 150 insertions, 0 deletions
diff --git a/marigold.lua b/marigold.lua
new file mode 100644
index 0000000..a6223df
--- /dev/null
+++ b/marigold.lua
@@ -0,0 +1,150 @@
+-- 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('</%s>', 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