summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/libs-ini.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/libs-ini.lmt')
-rw-r--r--tex/context/base/mkxl/libs-ini.lmt206
1 files changed, 206 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/libs-ini.lmt b/tex/context/base/mkxl/libs-ini.lmt
new file mode 100644
index 000000000..4ce0e8e50
--- /dev/null
+++ b/tex/context/base/mkxl/libs-ini.lmt
@@ -0,0 +1,206 @@
+if not modules then modules = { } end modules ['libs-ini'] = {
+ 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"
+}
+
+-- This is a loader for optional libraries in luametatex with context lmtx. It's
+-- kind of experimental. We also use a different locator than in mkiv because we
+-- don't support loading lua libraries and swiglibs any more. Of course one can try
+-- the regular lua loaders but we just assume that a user then knows what (s)he is
+-- doing. At some point this variant will divert more from the original loader
+-- file 'libs-ini.lua'.
+
+local type, unpack = type, unpack
+local find = string.find
+
+-- here we implement the resolver
+
+local nameonly = file.nameonly
+local joinfile = file.join
+local addsuffix = file.addsuffix
+local qualifiedpath = file.is_qualified_path
+
+local isfile = lfs.isfile
+
+local findfile = resolvers.findfile
+local expandpaths = resolvers.expandedpathlistfromvariable
+
+local report = logs.reporter("resolvers","libraries")
+local trace = false
+local silent = false
+
+trackers.register("resolvers.lib", function(v) trace = v end)
+trackers.register("resolvers.lib.silent", function(v) silent = v end)
+
+local function findlib(required) -- todo: cache
+ local suffix = os.libsuffix or "so"
+ if not qualifiedpath(required) then
+ local list = directives.value("system.librarynames" )
+ local only = nameonly(required)
+ if type(list) == "table" then
+ list = list[only]
+ if type(list) ~= "table" then
+ list = { only }
+ end
+ else
+ list = { only }
+ end
+ if trace then
+ report("using lookup list for library %a: % | t",only,list)
+ end
+ for i=1,#list do
+ local name = list[i]
+ local found = findfile(name,"lib")
+ if not found or found == "" then
+ found = findfile(addsuffix(name,suffix),"lib")
+ end
+ if found and found ~= "" then
+ if trace then
+ report("library %a resolved via %a path to %a",name,"tds lib",found)
+ end
+ return found
+ end
+ end
+ if expandpaths then
+ local list = expandpaths("PATH")
+ local base = addsuffix(only,suffix)
+ for i=1,#list do
+ local full = joinfile(list[i],base)
+ local found = isfile(full) and full
+ if found and found ~= "" then
+ if trace then
+ report("library %a resolved via %a path to %a",full,"system",found)
+ end
+ return found
+ end
+ end
+ end
+ elseif isfile(addsuffix(required,suffix)) then
+ if trace then
+ report("library with qualified name %a %sfound",required,"")
+ end
+ return required
+ else
+ if trace then
+ report("library with qualified name %a %sfound",required,"not ")
+ end
+ end
+ return false
+end
+
+local foundlibraries = table.setmetatableindex(function(t,k)
+ local v = findlib(k)
+ t[k] = v
+ return v
+end)
+
+function resolvers.findlib(required)
+ return foundlibraries[required]
+end
+
+-- here we implement the loader
+
+local libraries = { }
+resolvers.libraries = libraries
+
+local report = logs.reporter("optional")
+
+if optional then optional.loaded = { } end
+
+function libraries.validoptional(name)
+ local thelib = optional and optional[name]
+ if not thelib then
+ -- forget about it, no message here
+ elseif thelib.initialize then
+ return thelib
+ else
+ report("invalid optional library %a",libname)
+ end
+end
+
+function libraries.optionalloaded(name,libnames)
+ local thelib = optional and optional[name]
+ if not thelib then
+ report("no optional %a library found",name)
+ else
+ local thelib_initialize = thelib.initialize
+ if not thelib_initialize then
+ report("invalid optional library %a",name)
+ else
+ if type(libnames) == "string" then
+ libnames = { libnames }
+ end
+ if type(libnames) == "table" then
+ for i=1,#libnames do
+ local libname = libnames[i]
+ local filename = foundlibraries[libname]
+ if filename and filename ~= "" then
+ libnames[i] = filename
+ else
+ report("unable to locate library %a",libname)
+ return
+ end
+ end
+ local initialized = thelib_initialize(unpack(libnames))
+ if not initialized then
+ report("unable to initialize library '% + t'",libnames)
+ elseif not silent then
+ report("using library '% + t'",libnames)
+ end
+ return initialized
+ end
+ end
+ end
+end
+
+-- local patterns = {
+-- "libs-imp-%s.mkxl",
+-- "libs-imp-%s.mklx",
+-- }
+--
+-- local function action(name,foundname)
+-- -- could be one command
+-- context.startreadingfile()
+-- context.input(foundname)
+-- context.stopreadingfile()
+-- end
+--
+-- interfaces.implement {
+-- name = "uselibrary",
+-- arguments = "string"
+-- actions = function(name)
+-- resolvers.uselibrary {
+-- category = "color definition",
+-- name = name,
+-- patterns = patterns,
+-- action = action,
+-- onlyonce = true,
+-- }
+-- end
+-- }
+
+-- We overload the standard 'require' function. Because we're in LuaMetaTeX we are
+-- more likely to find 'lmt' files when we deal with the TeX and MetaPost part but
+-- user files likely have the 'lua' suffix.
+
+do
+
+ local dofile = dofile
+ local savedrequire = require
+
+ function require(name,version)
+ if find(name,"%.lua$") or find(name,"%.lmt$") then
+ local m = dofile(findfile(name))
+ if m then
+ package.loaded[name] = m
+ return m
+ end
+ else
+ return savedrequire(name)
+ end
+ end
+
+end