diff options
author | Hans Hagen <pragma@wxs.nl> | 2014-07-04 15:55:00 +0200 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2014-07-04 15:55:00 +0200 |
commit | db237f90e36d8862262f16f579eb98c1948faa03 (patch) | |
tree | 0c199e9a22f2c5469489f847a34443d685dcfa47 /tex/context/base/data-tre.lua | |
parent | a220826721f9023e2a97c46bf61463651b289c64 (diff) | |
download | context-db237f90e36d8862262f16f579eb98c1948faa03.tar.gz |
beta 2014.07.04 15:55
Diffstat (limited to 'tex/context/base/data-tre.lua')
-rw-r--r-- | tex/context/base/data-tre.lua | 85 |
1 files changed, 63 insertions, 22 deletions
diff --git a/tex/context/base/data-tre.lua b/tex/context/base/data-tre.lua index 3f11ca878..940701c3f 100644 --- a/tex/context/base/data-tre.lua +++ b/tex/context/base/data-tre.lua @@ -6,11 +6,23 @@ if not modules then modules = { } end modules ['data-tre'] = { license = "see context related readme files" } --- \input tree://oeps1/**/oeps.tex +-- tree://e:/temporary/mb-mp/**/drawing.jpg" +-- tree://e:/temporary/mb-mp/**/Drawing.jpg" +-- tree://t:./**/tufte.tex" +-- tree://t:/./**/tufte.tex" +-- tree://t:/**/tufte.tex" +-- dirlist://e:/temporary/mb-mp/**/drawing.jpg" +-- dirlist://e:/temporary/mb-mp/**/Drawing.jpg" +-- dirlist://e:/temporary/mb-mp/**/just/some/place/drawing.jpg" +-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg" +-- dirlist://e:/temporary/mb-mp/**/images/drawing.jpg?option=fileonly" +-- dirlist://///storage-2/resources/mb-mp/**/drawing.jpg" +-- dirlist://e:/**/drawing.jpg" local find, gsub, lower = string.find, string.gsub, string.lower local basename, dirname, joinname = file.basename, file.dirname, file .join local globdir, isdir = dir.glob, lfs.isdir +local P, lpegmatch = lpeg.P, lpeg.match local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end) @@ -19,6 +31,7 @@ local report_trees = logs.reporter("resolvers","trees") local resolvers = resolvers local resolveprefix = resolvers.resolve local notfound = resolvers.finders.notfound +local lookup = resolvers.get_from_content -- A tree search is rather dumb ... there is some basic caching of searched trees -- but nothing is cached over runs ... it's also a wildcard one so we cannot use @@ -87,37 +100,65 @@ end -- deal and we don't want too much overhead. local collectors = { } +local splitter = lpeg.splitat("/**/") +local stripper = lpeg.replacer { [P("/") * P("*")^1 * P(-1)] = "" } table.setmetatableindex(collectors, function(t,k) - local rootname = gsub(k,"[/%*]+$","") + local rootname = lpegmatch(stripper,k) local dataname = joinname(rootname,"dirlist") - local data = caches.loadcontent(dataname,"files",dataname) - local content = data and data.content - local lookup = resolvers.get_from_content + local content = caches.loadcontent(dataname,"files",dataname) if not content then content = resolvers.scanfiles(rootname) caches.savecontent(dataname,"files",content,dataname) end - local files = content.files - local v = function(filename) - local path, name = lookup(content,filename) - if not path then - return filename - elseif type(path) == "table" then - -- maybe a warning that the first name is taken - path = path[1] - end - return joinname(rootname,path,name) - end - t[k] = v - return v + t[k] = content + return content end) function resolvers.finders.dirlist(specification) -- can be called directly too - local spec = specification.filename - if spec ~= "" then - local path, name = dirname(spec), basename(spec) - return path and collectors[path](name) or notfound() + local filename = specification.filename + if filename ~= "" then + local root, rest = lpegmatch(splitter,filename) + if root and rest then + local path, name = dirname(rest), basename(rest) + if name ~= rest then + local content = collectors[root] + local p, n = lookup(content,name) + if not p then + return notfound() + end + local pattern = ".*/" .. path .. "$" + local istable = type(p) == "table" + if istable then + for i=1,#p do + local pi = p[i] + if pi == path or find(pi,pattern) then + return joinname(root,pi,n) + end + end + else + if p == path or find(p,pattern) then + return joinname(root,p,n) + end + end + local queries = specification.queries + if queries and queries.option == "fileonly" then + return joinname(root,istable and p[1] or p,n) + end + return notfound() + end + end + local path, name = dirname(filename), basename(filename) + local root = lpegmatch(stripper,path) + local content = collectors[path] + local p, n = lookup(content,name) + if not p then + return notfound() + elseif type(p) == "table" then + -- maybe a warning that the first name is taken + p = p[1] + end + return joinname(root,p,n) end return notfound() end |