path.lua

changeset 7
038275cd92ed
parent 3
b2df1b3f2c83
equal deleted inserted replaced
6:219d7a7304f8 7:038275cd92ed
1 1
2 module("path", package.seeall) 2 --@module path
3 local path={}
3 4
4 require("tuple") 5 local tuple=require("tuple")
5 require("lfs") 6 local lfs=require("lfs")
6 require("err") 7 local err=require("err")
7 require("config") 8 local config=require("config")
8 9
9 local sep=config.dirsep 10 local sep=config.dirsep
10 11
11 function join(p, f) 12 function path.join(p, f)
12 if p=="" then 13 if p=="" then
13 return f 14 return f
14 else 15 else
15 return p..sep..f 16 return p..sep..f
16 end 17 end
17 end 18 end
18 19
19 function dirbasename(p) 20 function path.dirbasename(p)
20 local d, b = string.match(p, 21 local d, b = string.match(p,
21 "^(.*)"..sep.."+([^"..sep.."]+)"..sep.."*$") 22 "^(.*)"..sep.."+([^"..sep.."]+)"..sep.."*$")
22 if not b then 23 if not b then
23 return "", p 24 return "", p
24 else 25 else
25 return d, b 26 return d, b
26 end 27 end
27 end 28 end
28 29
29 function dirname(p) 30 function path.dirname(p)
30 return tuple.fst(dirbasename(p)) 31 return tuple.fst(dirbasename(p))
31 end 32 end
32 33
33 function dirname_slash(p) 34 function path.dirname_slash(p)
34 local dn=dirname(p) 35 local dn=dirname(p)
35 if dn=="" then 36 if dn=="" then
36 return dn 37 return dn
37 else 38 else
38 return dn..sep 39 return dn..sep
39 end 40 end
40 end 41 end
41 42
42 function basename(p) 43 function path.basename(p)
43 return tuple.snd(dirbasename(p)) 44 return tuple.snd(dirbasename(p))
44 end 45 end
45 46
46 function rmext(p) 47 function path.rmext(p)
47 return string.gsub(p, "%.[^.]*$", "") 48 return string.gsub(p, "%.[^.]*$", "")
48 end 49 end
49 50
50 -- would rather do this as an iterator, but can't 51 -- would rather do this as an iterator, but can't
51 -- coroutine.yield from gsub handler 52 -- coroutine.yield from gsub handler
52 function split(p) 53 function path.split(p)
53 local t={} 54 local t={}
54 local head="" 55 local head=""
55 local s, p2 = string.match(p, "^("..sep.."+)(.*)$") 56 local s, p2 = string.match(p, "^("..sep.."+)(.*)$")
56 if s then 57 if s then
57 table.insert(t, "/.") -- root 58 table.insert(t, "/.") -- root
61 function(d) table.insert(t, d); end) 62 function(d) table.insert(t, d); end)
62 return t 63 return t
63 end 64 end
64 65
65 --[[ 66 --[[
66 function parts(p) 67 function path.parts(p)
67 local s={i=1, t=split(p)} 68 local s={i=1, t=split(p)}
68 local function g(s) 69 local function g(s)
69 local v=s.t[s.i] 70 local v=s.t[s.i]
70 s.i=s.i+1 71 s.i=s.i+1
71 return v 72 return v
72 end 73 end
73 return g, s 74 return g, s
74 end 75 end
75 76
76 function makepath(p, head) 77 function path.makepath(p, head)
77 head=head or "" 78 head=head or ""
78 for d in parts(p) do 79 for d in parts(p) do
79 head=head..d 80 head=head..d
80 local a=lfs.attributes(head) 81 local a=lfs.attributes(head)
81 if not a then 82 if not a then
89 head=head..sep 90 head=head..sep
90 end 91 end
91 end 92 end
92 ]] 93 ]]
93 94
94 function simplify(p) 95 function path.simplify(p)
95 local capts={} 96 local capts={}
96 local start=string.match(p, "^(/)") 97 local start=string.match(p, "^(/)")
97 string.gsub(p, "([^/]+)", 98 string.gsub(p, "([^/]+)",
98 function(e) 99 function(e)
99 if e==".." and #capts > 1 then 100 if e==".." and #capts > 1 then
103 end 104 end
104 end) 105 end)
105 return (start or "")..table.concat(capts, "/") 106 return (start or "")..table.concat(capts, "/")
106 end 107 end
107 108
108 function to_root(p) 109 function path.to_root(p)
109 return string.rep("../",#(split(p))-1) 110 return string.rep("../",#(path.split(p))-1)
110 end 111 end
112
113 return path

mercurial