summaryrefslogtreecommitdiff
path: root/lualibs-url.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lualibs-url.lua')
-rw-r--r--lualibs-url.lua35
1 files changed, 18 insertions, 17 deletions
diff --git a/lualibs-url.lua b/lualibs-url.lua
index ab50028..4624a05 100644
--- a/lualibs-url.lua
+++ b/lualibs-url.lua
@@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local char, format, byte = string.char, string.format, string.byte
local concat = table.concat
local tonumber, type = tonumber, type
local P, C, R, S, Cs, Cc, Ct, Cf, Cg, V = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct, lpeg.Cf, lpeg.Cg, lpeg.V
@@ -45,6 +45,8 @@ local nothing = Cc("")
local escapedchar = (percent * C(hexdigit * hexdigit)) / tochar
local escaped = (plus / " ") + escapedchar
+local noslash = P("/") / ""
+
-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-- we also assume that when we have a scheme, we also have an authority
--
@@ -233,29 +235,23 @@ function url.construct(hash) -- dodo: we need to escape !
return lpegmatch(escaper,concat(fullurl))
end
-function url.filename(filename) -- why no lpeg here ?
- local t = hashed(filename)
- return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
+local pattern = Cs(noslash * R("az","AZ") * (S(":|")/":") * noslash * P(1)^0)
+
+function url.filename(filename)
+ local spec = hashed(filename)
+ local path = spec.path
+ return (spec.scheme == "file" and path and lpegmatch(pattern,path)) or filename
end
+-- print(url.filename("/c|/test"))
+-- print(url.filename("/c/test"))
+
local function escapestring(str)
return lpegmatch(escaper,str)
end
url.escape = escapestring
--- function url.query(str) -- separator could be an option
--- if type(str) == "string" then
--- local t = { }
--- for k, v in gmatch(str,"([^&=]*)=([^&=]*)") do
--- t[k] = v
--- end
--- return t
--- else
--- return str
--- end
--- end
-
function url.query(str)
if type(str) == "string" then
return lpegmatch(splitquery,str) or ""
@@ -283,14 +279,19 @@ end
-- /test/ | /test | test/ | test => test
+local pattern = Cs(noslash^0 * (1 - noslash * P(-1))^0)
+
function url.barepath(path)
if not path or path == "" then
return ""
else
- return (gsub(path,"^/?(.-)/?$","%1"))
+ return lpegmatch(pattern,path)
end
end
+-- print(url.barepath("/test"),url.barepath("test/"),url.barepath("/test/"),url.barepath("test"))
+-- print(url.barepath("/x/yz"),url.barepath("x/yz/"),url.barepath("/x/yz/"),url.barepath("x/yz"))
+
--~ print(url.filename("file:///c:/oeps.txt"))
--~ print(url.filename("c:/oeps.txt"))
--~ print(url.filename("file:///oeps.txt"))