summaryrefslogtreecommitdiff
path: root/tex/context/base/l-dir.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
commit8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch)
tree94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/l-dir.lua
parentf5aed2e51223c36c84c5f25a6cad238b2af59087 (diff)
downloadcontext-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/l-dir.lua')
-rw-r--r--tex/context/base/l-dir.lua593
1 files changed, 0 insertions, 593 deletions
diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua
deleted file mode 100644
index 81ac65e50..000000000
--- a/tex/context/base/l-dir.lua
+++ /dev/null
@@ -1,593 +0,0 @@
-if not modules then modules = { } end modules ['l-dir'] = {
- version = 1.001,
- comment = "companion to luat-lib.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- todo: dir.expandname will be sped up and merged with cleanpath and collapsepath
--- todo: keep track of currentdir (chdir, pushdir, popdir)
-
-local type, select = type, select
-local find, gmatch, match, gsub, sub = string.find, string.gmatch, string.match, string.gsub, string.sub
-local concat, insert, remove, unpack = table.concat, table.insert, table.remove, table.unpack
-local lpegmatch = lpeg.match
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
-
-dir = dir or { }
-local dir = dir
-local lfs = lfs
-
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-local isdir = lfs.isdir -- not robust, will be overloaded anyway
-local isfile = lfs.isfile -- not robust, will be overloaded anyway
-local currentdir = lfs.currentdir
-local chdir = lfs.chdir
-local mkdir = lfs.mkdir
-
-local onwindows = os.type == "windows" or find(os.getenv("PATH"),";",1,true)
-
--- in case we load outside luatex
-
-if onwindows then
-
- -- lfs.isdir does not like trailing /
- -- lfs.dir accepts trailing /
-
- local tricky = S("/\\") * P(-1)
-
- isdir = function(name)
- if lpegmatch(tricky,name) then
- return attributes(name,"mode") == "directory"
- else
- return attributes(name.."/.","mode") == "directory"
- end
- end
-
- isfile = function(name)
- return attributes(name,"mode") == "file"
- end
-
- lfs.isdir = isdir
- lfs.isfile = isfile
-
-else
-
- isdir = function(name)
- return attributes(name,"mode") == "directory"
- end
-
- isfile = function(name)
- return attributes(name,"mode") == "file"
- end
-
- lfs.isdir = isdir
- lfs.isfile = isfile
-
-end
-
--- handy
-
-function dir.current()
- return (gsub(currentdir(),"\\","/"))
-end
-
--- somewhat optimized
-
-local function glob_pattern_function(path,patt,recurse,action)
- if isdir(path) then
- local usedpath
- if path == "/" then
- usedpath = "/."
- elseif not find(path,"/$") then
- usedpath = path .. "/."
- path = path .. "/"
- else
- usedpath = path
- end
- local dirs
- for name in walkdir(usedpath) do
- if name ~= "." and name ~= ".." then
- local full = path .. name
- local mode = attributes(full,'mode')
- if mode == 'file' then
- if not patt or find(full,patt) then
- action(full)
- end
- elseif recurse and mode == "directory" then
- if not dirs then
- dirs = { full }
- else
- dirs[#dirs+1] = full
- end
- end
- end
- end
- if dirs then
- for i=1,#dirs do
- glob_pattern_function(dirs[i],patt,recurse,action)
- end
- end
- end
-end
-
-local function glob_pattern_table(path,patt,recurse,result)
- if not result then
- result = { }
- end
- if isdir(path) then
- local usedpath
- if path == "/" then
- usedpath = "/."
- elseif not find(path,"/$") then
- usedpath = path .. "/."
- path = path .. "/"
- else
- usedpath = path
- end
- local dirs
- for name in walkdir(usedpath) do
- if name ~= "." and name ~= ".." then
- local full = path .. name
- local mode = attributes(full,'mode')
- if mode == 'file' then
- if not patt or find(full,patt) then
- result[#result+1] = full
- end
- elseif recurse and mode == "directory" then
- if not dirs then
- dirs = { full }
- else
- dirs[#dirs+1] = full
- end
- end
- end
- end
- if dirs then
- for i=1,#dirs do
- glob_pattern_table(dirs[i],patt,recurse,result)
- end
- end
- end
- return result
-end
-
-local function globpattern(path,patt,recurse,method)
- local kind = type(method)
- if patt and sub(patt,1,-3) == path then
- patt = false
- end
- if kind == "function" then
- return glob_pattern_function(path,patt,recurse,method)
- elseif kind == "table" then
- return glob_pattern_table(path,patt,recurse,method)
- else
- return glob_pattern_table(path,patt,recurse,{ })
- end
-end
-
-dir.globpattern = globpattern
-
--- never or seldom used so far:
-
-local function collectpattern(path,patt,recurse,result)
- local ok, scanner
- result = result or { }
- if path == "/" then
- ok, scanner, first = xpcall(function() return walkdir(path..".") end, function() end) -- kepler safe
- else
- ok, scanner, first = xpcall(function() return walkdir(path) end, function() end) -- kepler safe
- end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then
- path = path .. '/'
- end
- for name in scanner, first do
- if name == "." then
- -- skip
- elseif name == ".." then
- -- skip
- else
- local full = path .. name
- local attr = attributes(full)
- local mode = attr.mode
- if mode == 'file' then
- if find(full,patt) then
- result[name] = attr
- end
- elseif recurse and mode == "directory" then
- attr.list = collectpattern(full,patt,recurse)
- result[name] = attr
- end
- end
- end
- end
- return result
-end
-
-dir.collectpattern = collectpattern
-
-local separator, pattern
-
-if onwindows then -- we could sanitize here
-
- local slash = S("/\\") / "/"
-
--- pattern = Ct {
- pattern = {
- [1] = (Cs(P(".") + slash^1) + Cs(R("az","AZ") * P(":") * slash^0) + Cc("./")) * V(2) * V(3),
- [2] = Cs(((1-S("*?/\\"))^0 * slash)^0),
- [3] = Cs(P(1)^0)
- }
-
-else -- assume unix
-
--- pattern = Ct {
- pattern = {
- [1] = (C(P(".") + P("/")^1) + Cc("./")) * V(2) * V(3),
- [2] = C(((1-S("*?/"))^0 * P("/"))^0),
- [3] = C(P(1)^0)
- }
-
-end
-
-local filter = Cs ( (
- P("**") / ".*" +
- P("*") / "[^/]*" +
- P("?") / "[^/]" +
- P(".") / "%%." +
- P("+") / "%%+" +
- P("-") / "%%-" +
- P(1)
-)^0 )
-
-local function glob(str,t)
- if type(t) == "function" then
- if type(str) == "table" then
- for s=1,#str do
- glob(str[s],t)
- end
- elseif isfile(str) then
- t(str)
- else
- local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter
- if root and path and base then
- local recurse = find(base,"**",1,true) -- find(base,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
- globpattern(start,result,recurse,t)
- end
- end
- else
- if type(str) == "table" then
- local t = t or { }
- for s=1,#str do
- glob(str[s],t)
- end
- return t
- elseif isfile(str) then
- if t then
- t[#t+1] = str
- return t
- else
- return { str }
- end
- else
- local root, path, base = lpegmatch(pattern,str) -- we could use the file splitter
- if root and path and base then
- local recurse = find(base,"**",1,true) -- find(base,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
- return globpattern(start,result,recurse,t)
- else
- return { }
- end
- end
- end
-end
-
-dir.glob = glob
-
--- local c = os.clock()
--- local t = dir.glob("e:/**")
--- local t = dir.glob("t:/sources/**")
--- local t = dir.glob("t:/**")
--- print(os.clock()-c,#t)
-
--- for i=1,3000 do print(t[i]) end
--- for i=1,10 do print(t[i]) end
-
--- list = dir.glob("**/*.tif")
--- list = dir.glob("/**/*.tif")
--- list = dir.glob("./**/*.tif")
--- list = dir.glob("oeps/**/*.tif")
--- list = dir.glob("/oeps/**/*.tif")
-
-local function globfiles(path,recurse,func,files) -- func == pattern or function
- if type(func) == "string" then
- local s = func
- func = function(name) return find(name,s) end
- end
- files = files or { }
- local noffiles = #files
- for name in walkdir(path) do
- if find(name,"^%.") then
- --- skip
- else
- local mode = attributes(name,'mode')
- if mode == "directory" then
- if recurse then
- globfiles(path .. "/" .. name,recurse,func,files)
- end
- elseif mode == "file" then
- if not func or func(name) then
- noffiles = noffiles + 1
- files[noffiles] = path .. "/" .. name
- end
- end
- end
- end
- return files
-end
-
-dir.globfiles = globfiles
-
--- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
--- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
--- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
--- t = dir.glob("f:/minimal/tex/**/*")
--- print(dir.ls("f:/minimal/tex/**/*"))
--- print(dir.ls("*.tex"))
-
-function dir.ls(pattern)
- return concat(glob(pattern),"\n")
-end
-
--- mkdirs("temp")
--- mkdirs("a/b/c")
--- mkdirs(".","/a/b/c")
--- mkdirs("a","b","c")
-
-local make_indeed = true -- false
-
-if onwindows then
-
- function dir.mkdirs(...)
- local n = select("#",...)
- local str
- if n == 1 then
- str = select(1,...)
- if isdir(str) then
- return str, true
- end
- else
- str = ""
- for i=1,n do
- local s = select(i,...)
- if s == "" then
- -- skip
- elseif str == "" then
- str = s
- else
- str = str .. "/" .. s
- end
- end
- end
- local pth = ""
- local drive = false
- local first, middle, last = match(str,"^(//)(//*)(.*)$")
- if first then
- -- empty network path == local path
- else
- first, last = match(str,"^(//)/*(.-)$")
- if first then
- middle, last = match(str,"([^/]+)/+(.-)$")
- if middle then
- pth = "//" .. middle
- else
- pth = "//" .. last
- last = ""
- end
- else
- first, middle, last = match(str,"^([a-zA-Z]:)(/*)(.-)$")
- if first then
- pth, drive = first .. middle, true
- else
- middle, last = match(str,"^(/*)(.-)$")
- if not middle then
- last = str
- end
- end
- end
- end
- for s in gmatch(last,"[^/]+") do
- if pth == "" then
- pth = s
- elseif drive then
- pth, drive = pth .. s, false
- else
- pth = pth .. "/" .. s
- end
- if make_indeed and not isdir(pth) then
- mkdir(pth)
- end
- end
- return pth, (isdir(pth) == true)
- end
-
- -- print(dir.mkdirs("","","a","c"))
- -- print(dir.mkdirs("a"))
- -- print(dir.mkdirs("a:"))
- -- print(dir.mkdirs("a:/b/c"))
- -- print(dir.mkdirs("a:b/c"))
- -- print(dir.mkdirs("a:/bbb/c"))
- -- print(dir.mkdirs("/a/b/c"))
- -- print(dir.mkdirs("/aaa/b/c"))
- -- print(dir.mkdirs("//a/b/c"))
- -- print(dir.mkdirs("///a/b/c"))
- -- print(dir.mkdirs("a/bbb//ccc/"))
-
-else
-
- function dir.mkdirs(...)
- local n = select("#",...)
- local str, pth
- if n == 1 then
- str = select(1,...)
- if isdir(str) then
- return str, true
- end
- else
- str = ""
- for i=1,n do
- local s = select(i,...)
- if s and s ~= "" then -- we catch nil and false
- if str ~= "" then
- str = str .. "/" .. s
- else
- str = s
- end
- end
- end
- end
- str = gsub(str,"/+","/")
- if find(str,"^/") then
- pth = "/"
- for s in gmatch(str,"[^/]+") do
- local first = (pth == "/")
- if first then
- pth = pth .. s
- else
- pth = pth .. "/" .. s
- end
- if make_indeed and not first and not isdir(pth) then
- mkdir(pth)
- end
- end
- else
- pth = "."
- for s in gmatch(str,"[^/]+") do
- pth = pth .. "/" .. s
- if make_indeed and not isdir(pth) then
- mkdir(pth)
- end
- end
- end
- return pth, (isdir(pth) == true)
- end
-
- -- print(dir.mkdirs("","","a","c"))
- -- print(dir.mkdirs("a"))
- -- print(dir.mkdirs("/a/b/c"))
- -- print(dir.mkdirs("/aaa/b/c"))
- -- print(dir.mkdirs("//a/b/c"))
- -- print(dir.mkdirs("///a/b/c"))
- -- print(dir.mkdirs("a/bbb//ccc/"))
-
-end
-
-dir.makedirs = dir.mkdirs
-
-
-do
-
- -- we can only define it here as it uses dir.chdir and we also need to
- -- make sure we use the non sandboxed variant because otherwise we get
- -- into a recursive loop due to usage of expandname in the file resolver
-
- local chdir = sandbox and sandbox.original(chdir) or chdir
-
- if onwindows then
-
- local xcurrentdir = dir.current
-
- function dir.expandname(str) -- will be merged with cleanpath and collapsepath\
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = xcurrentdir() .. "/" -- xcurrentdir sanitizes
- end
- if not first then
- first, last = match(str,"^(//)/*(.*)$")
- end
- if not first then
- first, last = match(str,"^([a-zA-Z]:)(.*)$")
- if first and not find(last,"^/") then
- local d = currentdir() -- push / pop
- if chdir(first) then
- first = xcurrentdir() -- xcurrentdir sanitizes
- end
- chdir(d)
- end
- end
- if not first then
- first, last = xcurrentdir(), str
- end
- last = gsub(last,"//","/")
- last = gsub(last,"/%./","/")
- last = gsub(last,"^/*","")
- first = gsub(first,"/*$","")
- if last == "" or last == "." then
- return first
- else
- return first .. "/" .. last
- end
- end
-
- else
-
- function dir.expandname(str) -- will be merged with cleanpath and collapsepath
- if not find(str,"^/") then
- str = currentdir() .. "/" .. str
- end
- str = gsub(str,"//","/")
- str = gsub(str,"/%./","/")
- str = gsub(str,"(.)/%.$","%1")
- return str
- end
-
- end
-
-end
-
-file.expandname = dir.expandname -- for convenience
-
-local stack = { }
-
-function dir.push(newdir)
- insert(stack,currentdir())
- if newdir and newdir ~= "" then
- chdir(newdir)
- end
-end
-
-function dir.pop()
- local d = remove(stack)
- if d then
- chdir(d)
- end
- return d
-end
-
-local function found(...) -- can have nil entries
- for i=1,select("#",...) do
- local path = select(i,...)
- local kind = type(path)
- if kind == "string" then
- if isdir(path) then
- return path
- end
- elseif kind == "table" then
- -- here we asume no holes, i.e. an indexed table
- local path = found(unpack(path))
- if path then
- return path
- end
- end
- end
- -- return nil -- if we want print("crappath") to show something
-end
-
-dir.found = found