summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/data-fil.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/data-fil.lmt')
-rw-r--r--tex/context/base/mkxl/data-fil.lmt144
1 files changed, 144 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/data-fil.lmt b/tex/context/base/mkxl/data-fil.lmt
new file mode 100644
index 000000000..bbcc954b2
--- /dev/null
+++ b/tex/context/base/mkxl/data-fil.lmt
@@ -0,0 +1,144 @@
+if not modules then modules = { } end modules ['data-fil'] = {
+ 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"
+}
+
+local ioopen = io.open
+local isdir = lfs.isdir
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+local resolveprefix = resolvers.resolve
+local findfile = resolvers.findfile
+local scanfiles = resolvers.scanfiles
+local registerfilehash = resolvers.registerfilehash
+local appendhash = resolvers.appendhash
+
+local loadcachecontent = caches.loadcontent
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function resolvers.locators.file(specification)
+ local filename = specification.filename
+ local realname = resolveprefix(filename) -- no shortcut
+ if realname and realname ~= '' and isdir(realname) then
+ if trace_locating then
+ report_files("file locator %a found as %a",filename,realname)
+ end
+ appendhash('file',filename,true) -- cache
+ elseif trace_locating then
+ report_files("file locator %a not found",filename)
+ end
+end
+
+function resolvers.hashers.file(specification)
+ local pathname = specification.filename
+ local content = loadcachecontent(pathname,'files')
+ registerfilehash(pathname,content,content==nil)
+end
+
+function resolvers.generators.file(specification)
+ local pathname = specification.filename
+ local content = scanfiles(pathname,false,true) -- scan once
+ registerfilehash(pathname,content,true)
+end
+
+resolvers.concatinators.file = file.join
+
+local finders = resolvers.finders
+local notfound = finders.notfound
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: %a found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %a not found",filename)
+ end
+ return notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+local openers = resolvers.openers
+local notfound = openers.notfound
+local overloaded = false
+
+local function textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() return f:close() end,
+ }
+end
+
+function openers.helpers.textopener(...)
+ return textopener(...)
+end
+
+function openers.helpers.settextopener(opener)
+ if overloaded then
+ report_files("file opener: %s overloaded","already")
+ else
+ if trace_locating then
+ report_files("file opener: %s overloaded","once")
+ end
+ overloaded = true
+ textopener = opener
+ end
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = ioopen(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener: %a opened",filename)
+ end
+ return textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener: %a not found",filename)
+ end
+ return notfound()
+end
+
+local loaders = resolvers.loaders
+local notfound = loaders.notfound
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = ioopen(filename,"rb")
+ if f then
+ if trace_locating then
+ report_files("file loader: %a loaded",filename)
+ end
+ local s = f:read("*a") -- io.readall(f) is faster but we never have large files here
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader: %a not found",filename)
+ end
+ return notfound()
+end