webmcp

view framework/env/encode/url.lua @ 11:d76a8857ba62

Added ui.partial and other functions, which allow partial content replacement using XMLHttpRequests; Image support for ui.link

Also includes following changes:
- Fix for rocketcgi library to accept POST data content-types, which contain additional charset information.
- Support arrays passed as params to encode.url (only for keys ending with "[]")
- Version information changed to "1.0.7"

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

Impressum / About Us