webmcp

annotate framework/env/encode/url.lua @ 562:328f120924a2

Removed if-clause when initializing file descriptor set to avoid compiler warning for mondelefant_conn_try_wait
author jbe
date Fri Feb 05 15:51:39 2021 +0100 (2021-02-05)
parents 1b380a0ab940
children
rev   line source
jbe/bsw@0 1 --[[--
jbe@267 2 url_string = -- a string containing an URL
jbe/bsw@0 3 encode.url{
jbe@267 4 external = external, -- external URL (instead of specifying base, module, etc. below)
jbe@267 5 base = base, -- optional string containing a base URL of a WebMCP application
jbe@267 6 static = static, -- an URL relative to the static file directory
jbe@267 7 module = module, -- a module name of the WebMCP application
jbe@267 8 view = view, -- a view name of the WebMCP application
jbe@267 9 action = action, -- an action name of the WebMCP application
jbe@267 10 id = id, -- optional id to be passed to the view or action to select a particular data record
jbe@267 11 params = params, -- optional parameters to be passed to the view or action
jbe@267 12 anchor = anchor -- anchor in URL
jbe/bsw@0 13 }
jbe/bsw@0 14
jbe/bsw@0 15 This function creates URLs to external locations, to static files within the WebMCP application or to a certain view or action inside a module.
jbe/bsw@0 16
jbe/bsw@0 17 --]]--
jbe/bsw@0 18
jbe/bsw@0 19 function encode.url(args)
jbe/bsw@0 20 local external = args.external
jbe/bsw@0 21 local base = args.base or request.get_relative_baseurl()
jbe/bsw@0 22 local static = args.static
jbe/bsw@0 23 local module = args.module
jbe/bsw@0 24 local view = args.view
jbe/bsw@0 25 local action = args.action
jbe/bsw@0 26 local id = args.id
jbe/bsw@0 27 local params = args.params or {}
bsw@80 28 local anchor = args.anchor
jbe/bsw@0 29 local result = {}
jbe/bsw@0 30 local id_as_param = false
jbe/bsw@0 31 local function add(...)
jbe/bsw@0 32 for i = 1, math.huge do
jbe/bsw@0 33 local v = select(i, ...)
jbe/bsw@0 34 if v == nil then break end
jbe/bsw@0 35 result[#result+1] = v
jbe/bsw@0 36 end
jbe/bsw@0 37 end
jbe/bsw@0 38 if external then
jbe/bsw@0 39 add(external)
jbe/bsw@0 40 else
jbe/bsw@0 41 add(base)
jbe/bsw@0 42 if not string.find(base, "/$") then
jbe/bsw@0 43 add("/")
jbe/bsw@0 44 end
jbe/bsw@0 45 if static then
jbe/bsw@0 46 add("static/")
jbe/bsw@0 47 add(static)
jbe/bsw@0 48 elseif module or view or action or id then
jbe/bsw@0 49 assert(module, "Module not specified.")
jbe/bsw@0 50 add(encode.url_part(module), "/")
jbe/bsw@0 51 if view and not action then
jbe/bsw@0 52 local view_base, view_suffix = string.match(
jbe/bsw@0 53 view,
jbe/bsw@0 54 "^([^.]*)(.*)$"
jbe/bsw@0 55 )
jbe/bsw@0 56 add(encode.url_part(view_base))
jbe/bsw@0 57 if args.id then
jbe/bsw@0 58 add("/", encode.url_part(id))
jbe/bsw@0 59 end
jbe/bsw@0 60 if view_suffix == "" then
jbe/bsw@0 61 add(".html")
jbe/bsw@0 62 else
jbe/bsw@0 63 add(view_suffix) -- view_suffix includes dot as first character
jbe/bsw@0 64 end
jbe/bsw@0 65 elseif action and not view then
jbe/bsw@0 66 add(encode.url_part(action))
jbe/bsw@0 67 id_as_param = true
jbe/bsw@0 68 elseif view and action then
jbe/bsw@0 69 error("Both a view and an action was specified.")
jbe/bsw@0 70 end
jbe/bsw@0 71 end
jbe/bsw@0 72 do
jbe/bsw@0 73 local new_params = request.get_perm_params()
jbe/bsw@0 74 for key, value in pairs(params) do
jbe/bsw@0 75 new_params[key] = value
jbe/bsw@0 76 end
jbe/bsw@0 77 params = new_params
jbe/bsw@0 78 end
jbe/bsw@0 79 end
jbe/bsw@0 80 if next(params) ~= nil or (id and id_as_param) then
jbe@452 81 if not (external and string.find(external, "%?")) then
jbe@452 82 add("?")
jbe@453 83 elseif external and not string.find(external, "&$") then
jbe@452 84 add("&")
jbe@452 85 end
jbe/bsw@0 86 if id and id_as_param then
jbe/bsw@0 87 add("_webmcp_id=", encode.url_part(id), "&")
jbe/bsw@0 88 end
jbe/bsw@0 89 for key, value in pairs(params) do
jbe/bsw@11 90 -- TODO: better way to detect arrays?
jbe/bsw@11 91 if string.match(key, "%[%]$") then
jbe/bsw@11 92 for idx, entry in ipairs(value) do
jbe/bsw@11 93 add(encode.url_part(key), "=", encode.url_part(entry), "&")
jbe/bsw@11 94 end
jbe/bsw@11 95 else
jbe/bsw@11 96 add(encode.url_part(key), "=", encode.url_part(value), "&")
jbe/bsw@11 97 end
jbe/bsw@0 98 end
jbe/bsw@0 99 result[#result] = nil -- remove last '&' or '?'
jbe/bsw@0 100 end
jbe@79 101 local string_result = table.concat(result)
jbe@79 102 if anchor ~= nil then
jbe@79 103 string_result = string.match(string_result, "^[^#]*")
jbe@79 104 if anchor then
bsw@80 105 string_result = string_result .. "#" .. encode.url_part(anchor)
jbe@79 106 end
jbe@79 107 end
jbe@79 108 return string_result
jbe/bsw@0 109 end

Impressum / About Us