summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtxlibs.lua
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/context/lua/mtxlibs.lua')
-rw-r--r--scripts/context/lua/mtxlibs.lua239
1 files changed, 239 insertions, 0 deletions
diff --git a/scripts/context/lua/mtxlibs.lua b/scripts/context/lua/mtxlibs.lua
new file mode 100644
index 000000000..59cfa3dc2
--- /dev/null
+++ b/scripts/context/lua/mtxlibs.lua
@@ -0,0 +1,239 @@
+if not modules then modules = { } end modules ['mtxlibs'] = {
+ version = 1.001,
+ comment = "a reasonable subset of mtxrun preloaded libraries",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This file can be used to load a the (relevant) helper libraries that are also used
+-- in ConTeXt. You can use it as:
+--
+-- -- if needed (outside texlua):
+--
+-- -- require("lpeg") -- mandate
+-- -- require("md5") -- handy
+-- -- require("lfs") -- recommended
+-- -- require("slunicode") -- sort of obsolete
+--
+-- -- the library:
+--
+-- require("mtxlibs")
+--
+-- An alternative is to merge all libraries into this one so that you don't have to
+-- distribute them.
+--
+-- mtxlibs --selfmerge
+--
+-- If you need additional libraries, you can do something like this:
+--
+-- lua mtxlibs.lua --selfmerge my-web-project.lua trac-lmx util-jsn
+-- lua mtxlibs.lua --selfmerge my-sql-project.lua util-sql util-sql-imp-library util-sql-imp-client
+--
+-- That way you only need to update one file in a project and are not dependent on changes
+-- in the core ConTeXT libraries. The libraries are maintained as part of ConTeXt and used
+-- in projects so relative stable. The code works in Lua 5.1 as well as in 5.2. Not all
+-- functionality makes sense for users who are not familiar with ConTeXt but for instance
+-- trackers and loggers are included because that way we have can provide users with a
+-- consistent ecosystem.
+--
+-- Much of the provided functionality is described in cld-mkiv.pdf and related manuals, on
+-- contextgarden.net as well in articles. The XML subsystem is described in its own manual.
+-- Templates and SQL (not preloaded) is also has its own manual.
+--
+-- The next section contains the merged code, with each block ending uop in its own
+-- closure. The code gets somewhat compacted to save space and speed up loading.
+--
+-- There are some dependencies between the several modules. Also, quite some functions are added
+-- to the regular Lua namespaces. In due time I'll isolate them in their own namespaces but with
+-- the for context handy option to expose them in the normal ones. I might make the dependencies
+-- less but it probably makes no sense to waste time on them.
+
+if not lpeg then require("lpeg") end
+-- not md5 then require("md5") end -- once we have the libs
+-- not lfs then require("lfs") end -- once we have the libs
+
+-- begin library merge
+
+-- end library merge
+
+local format, gsub, gmatch, match, find = string.format, string.gsub, string.gmatch, string.match, string.find
+local concat = table.concat
+
+local ownname = arg and arg[0] or 'mtxlibs.lua'
+local ownpath = gsub(match(ownname,"^(.+)[\\/].-$") or ".","\\","/")
+local owntree = ownpath
+
+local ownlibs = {
+
+ "l-lua.lua",
+ "l-lpeg.lua",
+ "l-function.lua",
+ "l-string.lua",
+ "l-table.lua",
+ "l-io.lua",
+ "l-number.lua",
+ "l-set.lua",
+ "l-os.lua",
+ "l-file.lua", -- limited functionality when no lfs
+ "l-md5.lua", -- not loaded when no md5 library
+ "l-url.lua",
+ "l-dir.lua", -- limited functionality when no lfs
+ "l-boolean.lua",
+ "l-unicode.lua", -- nowadays independent of slunicode
+ "l-math.lua",
+
+ "util-tab.lua",
+ "util-sto.lua",
+ "util-str.lua",
+ "util-mrg.lua",
+ -- "util-lua.lua", -- no need for compiling
+ "util-prs.lua",
+ -- "util-fmt.lua", -- no need for table formatters
+ -- "util-deb.lua", -- no need for debugging (and tracing)
+
+ "trac-inf.lua",
+ "trac-set.lua",
+ "trac-log.lua",
+ -- "trac-pro.lua", -- not relevant outside context
+
+ "util-tpl.lua",
+
+ "util-env.lua",
+ -- "luat-env.lua", -- not relevant outside context
+
+ "lxml-tab.lua",
+ "lxml-lpt.lua",
+ "lxml-mis.lua",
+ "lxml-aux.lua",
+ "lxml-xml.lua",
+
+}
+
+package.path = "t:/sources/?.lua;t:/sources/?;" .. package.path
+
+local ownlist = {
+ '.',
+ ownpath ,
+ ownpath .. "/../sources", -- HH's development path
+ owntree .. "/../../texmf-local/tex/context/base",
+ owntree .. "/../../texmf-context/tex/context/base",
+ owntree .. "/../../texmf-dist/tex/context/base",
+ owntree .. "/../../texmf/tex/context/base",
+ owntree .. "/../../../texmf-local/tex/context/base",
+ owntree .. "/../../../texmf-context/tex/context/base",
+ owntree .. "/../../../texmf-dist/tex/context/base",
+ owntree .. "/../../../texmf/tex/context/base",
+}
+
+if ownpath == "." then table.remove(ownlist,1) end
+
+own = {
+ name = ownname,
+ path = ownpath,
+ tree = owntree,
+ list = ownlist,
+ libs = ownlibs,
+}
+
+local function locate_libs()
+ local name = ownlibs[1]
+ local done = false
+ for i=1,#ownlist do
+ local path = ownlist[i]
+ local filename = path .. "/" .. name
+ local f = io.open(filename)
+ if f then
+ f:close()
+ package.path = package.path .. ";" .. path .. "/?.lua" -- in case l-* does a require
+ done = path
+ break
+ end
+ end
+ locate_libs = function() return done end
+ return done
+end
+
+local function load_libs()
+ local found = locate_libs()
+ if found then
+ for i=1,#ownlibs do
+ local basename = ownlibs[i]
+ local filename = found .. "/" .. basename
+ local codeblob = loadfile(filename)
+ if codeblob then
+ package.preload[basename] = codeblob() or true
+ end
+ end
+ end
+end
+
+if not unicode then
+ load_libs()
+end
+
+local merger = utilities and utilities.merger
+
+if not merger then
+ return
+end
+
+local arguments = environment.arguments
+local files = environment.files
+
+if environment.ownname ~= "mtxlibs.lua" then
+ return
+end
+
+local helpinfo = [[
+usage: mtxlibs [options]
+
+--merge
+--merge targetfile extralibs
+--selfclean
+
+and in a lua file:
+
+require("mtxlibs")
+]]
+
+local application = logs.application {
+ name = "mtxlibs",
+ banner = "ConTeXt Basic Lua Libraries 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+if arguments.selfmerge then
+
+ report("merging libraries")
+ local found = locate_libs()
+ if found then
+ local target = files[1]
+ if target == ownname then
+ report("target cannot be this file")
+ return
+ elseif target then
+ report("target: %s",target)
+ for i=1,#files do
+ ownlibs[#ownlibs+1] = file.addsuffix(files[i],"lua")
+ end
+ end
+ merger.selfmerge(ownname,ownlibs,{ found },target)
+ report("done")
+ else
+ report("no libraries found")
+ end
+
+elseif arguments.selfclean then
+
+ report("cleaning libraries")
+ merger.selfclean(ownname)
+ report("done")
+
+elseif arguments.help or files[1] == "help" then
+
+ application.help()
+
+end