--[[ lowlevel html functions Written for Alpine Configuration Framework (ACF) -- see www.alpinelinux.org Copyright (C) 2007 Nathan Angelacos Licensed under the terms of GPL2 ]]-- module (..., package.seeall) --[[ Cookie functions ]]------------------------------------------------------ cookie={} -- Set a cookie - returns a string suitable for setting a cookie -- if the value is the boolean "false", then set the cookie to expire cookie.set = function ( name, value, path ) local expires = "" if name == nil then return ("") end if value == false then expires = 'expires=Thu Jan 1 00:00:00 EST 1970' value = "" end if path == nil then path = "/" end return (string.format('Set-Cookie: %s=%s; path=%s; %s\n', tostring(name), tostring(value), path, expires)) end -- wrapper function to clear a cookie cookie.unset = function ( name, path) return cookie.set (name, false, path) end -- escape unsafe html characters function html_escape (text ) text = text or "" local str = string.gsub (text, "&", "&" ) str = string.gsub (str, "<", "<" ) return string.gsub (str, ">", ">" ) end -- return a name,value pair as a string. local nv_pair = function ( name, value) if ( name == nil ) then return ( value or "" ) end if ( type(value) == "boolean" ) then value = tostring(value) end if ( value == nil ) then return ( "" ) else return (string.format (' %s="%s" ', name , ( value or "" ) )) end end --[[ each of these functions take a table that has an associative array of the values we might care about: value -- this is the value in the form element, or the selected element name -- this is the name of the element cols, rows class id etc. ]]-- local generic_input = function ( field_type, v ) if type(v.value) == "table" then ret = {} local vals = v.value for n, val in ipairs(vals) do v.value = val table.insert(ret, generic_input(field_type, v)) end v.value = vals return table.concat(ret) end if ( field_type == nil ) then return nil end local str = string.format ( '" ) end --[[ Form functions ]]------------------------------------------------------ -- These expect something like a cfe to work (see mvc.lua) form = {} form.text = function ( v ) return generic_input ( "text", v ) end form.longtext = function ( v ) local str = "" .. (v.value or "" ) .. "" ) end function form.password ( v ) return generic_input ( "password", v ) end function form.hidden ( v ) return generic_input ( "hidden", v ) end function form.submit ( v ) return generic_input ( "submit", v ) end function form.action (v) return generic_input ("submit", v) end function form.file ( v ) return generic_input ( "file", v ) end function form.image ( v ) return generic_input ( "image", v ) end -- v.value is the selected item (or an array if multiple) -- v.option is an array of valid options -- NOTE use of value and values (plural) function form.select ( v ) if ( v.name == nil ) then return nil end local str = "" -- now the options local reverseval = {} if type(v.value) == "table" then for x,val in ipairs(v.value) do reverseval[val]=x end end local selected = false for i, k in ipairs ( v.option ) do local val = k local txt = nil if type(val) == "table" then txt=val[1] val=val[0] end str = str .. "" end if not selected then str = str .. '' end str = str .. "" return (str) end function form.checkbox ( v ) return generic_input ( "checkbox", v ) end -- NOTE: VALUE of a form is a table containing the form elements ... function form.start ( v) if ( v.action == nil ) then return nil end local method = v.method or "get" return ( string.format ( '
', nv_pair ( "class", v.class ), nv_pair ( "method", v.method), nv_pair ( "action", v.action ) ) ) end function form.stop ( ) return ("
") end -- For "h1, h2, p," etc -- WARNING - Text is printed verbatim - you may want to -- wrap the text in html_escape function entity (tag, text, class, id) return ( string.format ( "<%s%s%s>%s", tag, nv_pair ("class", class), nv_pair("id", id), text , tag) ) end function link ( v ) if ( v.value == nil ) then return nil end local str = nv_pair ( "href", v.value ) for i,k in ipairs( { "class", "id" }) do str = str .. nv_pair ( k, v[k] ) end return ( "" .. (v.label or "" ) .. "" ) end -- give a cfe and get back a string of what is inside -- great for troubleshotting and seeing what is really being passed to the view function cfe_unpack ( a ) if type(a) == "table" then value = session.serialize("cfe", a) value = "
" .. value .. "
" return value end end