summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xmkluatexfontdb.lua175
1 files changed, 132 insertions, 43 deletions
diff --git a/mkluatexfontdb.lua b/mkluatexfontdb.lua
index 3e1caf3..5f27d92 100755
--- a/mkluatexfontdb.lua
+++ b/mkluatexfontdb.lua
@@ -15,16 +15,18 @@ local texiowrite_nl = texio.write_nl
-- First we need to be able to load module (code copied from
-- luatexbase-loader.sty):
local loader_file = "luatexbase.loader.lua"
-local loader_path = assert(kpse.find_file(loader_file, 'tex'),
+local loader_path = assert(kpse.find_file(loader_file, "lua"),
"File '"..loader_file.."' not found")
+
--texiowrite_nl("("..loader_path..")")
dofile(loader_path) -- FIXME this pollutes stdout with filenames
_G.config = _G.config or { }
local config = _G.config
-config.lualibs = config.lualibs or { }
-config.lualibs.prefer_merged = false
-config.lualibs.load_extended = false
+
+config.lualibs = config.lualibs or { }
+config.lualibs.prefer_merged = false
+config.lualibs.load_extended = false
require"lualibs"
require"otfl-basics-gen.lua"
@@ -32,8 +34,8 @@ require"otfl-luat-ovr.lua" --- this populates the logs.* namespace
require"otfl-font-nms"
require"alt_getopt"
-local name = 'mkluatexfontdb'
-local version = '2.1' -- same version number as luaotfload
+local name = "mkluatexfontdb"
+local version = "2.2" -- same version number as luaotfload
local names = fonts.names
local db_src_out = names.path.dir.."/"..names.path.basename
@@ -64,74 +66,161 @@ end
local function version_msg()
texiowrite_nl(stringformat(
- "%s version %s, database version %s.\n", name, version, names.version))
+ "%s version %s, database version %s.\n",
+ name, version, names.version))
end
---[[
-Command-line processing.
-Here we fill cmdargs with the good values, and then analyze it.
---]]
+--[[--
+Running the scripts triggers one or more actions that have to be
+executed in the correct order. To avoid duplication we track them in a
+set.
+--]]--
+
+local action_sequence = { "loglevel", "help", "version", "generate", "query" }
+local action_pending = table.tohash(action_sequence, false)
-local long_options = {
- force = "f",
- help = "h",
- log = 1,
- quiet = "q",
- verbose = 1 ,
- version = "V",
-}
+action_pending.loglevel = true --- always set the loglevel
+action_pending.generate = true --- this is the default action
-local short_options = "fqvVh"
+local actions = { } --- (jobspec -> (bool * bool)) list
-local force_reload = nil
+actions.loglevel = function (job)
+ logs.set_loglevel(job.log_level)
+ logs.names_report("log", 2,
+ "setting log level", "%d", job.log_level)
+ return true, true
+end
+
+actions.version = function (job)
+ version_msg()
+ return true, false
+end
+
+actions.help = function (job)
+ help_msg()
+ return true, false
+end
+
+actions.generate = function (job)
+ local fontnames, savedname
+ fontnames = names.update(fontnames, job.force_reload)
+ logs.names_report("log", 0, "fonts in the database",
+ "%i", #fontnames.mappings)
+ savedname = names.save(fontnames)
+ texiowrite_nl""
+ if savedname then --- FIXME have names.save return bool
+ return true, true
+ end
+ return false, false
+end
+
+actions.query = function (job)
+ return true, true
+end
+
+--[[--
+Command-line processing.
+mkluatexfontdb.lua relies on the script alt_getopt to process argv and
+analyzes its output.
+
+TODO with extended lualibs we have the functionality from the
+environment.* namespace that could eliminate the dependency on
+alt_getopt.
+--]]--
+
+local process_cmdline = function ( ) -- unit -> jobspec
+ local result = { -- jobspec
+ force_reload = nil,
+ query = "",
+ log_level = 1,
+ }
+
+ local long_options = {
+ force = "f",
+ help = "h",
+ log = 1,
+ quiet = "q",
+ verbose = 1 ,
+ version = "V",
+ find = 1,
+ }
+
+ local short_options = "fqvVh"
-local function process_cmdline()
local options, _, optarg =
alt_getopt.get_ordered_opts (arg, short_options, long_options)
- local log_level = 1
+
local nopts = #options
for n=1, nopts do
local v = options[n]
if v == "q" then
- log_level = 0
+ result.log_level = 0
elseif v == "v" then
- if log_level > 0 then
- log_level = log_level + 1
+ if result.log_level > 0 then
+ result.log_level = result.log_level + 1
else
- log_level = 2
+ result.log_level = 2
end
elseif v == "V" then
- version_msg()
- os.exit(0)
+ action_pending["version"] = true
elseif v == "h" then
- help_msg()
- os.exit(0)
+ action_pending["help"] = true
elseif v == "f" then
- force_reload = 1
+ result.force_reload = 1
elseif v == "verbose" then
local lvl = optarg[n]
if lvl then
- log_level = tonumber(lvl)
+ result.log_level = tonumber(lvl)
end
elseif v == "log" then
local str = optarg[n]
if str then
logs.set_logout(str)
end
+ elseif v == "find" then
+ action_pending["query"] = true
+ result.query = optarg[n]
end
end
- logs.set_loglevel(log_level)
+ return result
end
-local function generate(force)
- local fontnames, saved
- fontnames = names.update(fontnames, force)
- logs.names_report("log", 0, "fonts in the database",
- "%i", #fontnames.mappings)
- saved = names.save(fontnames)
- texiowrite_nl("")
+local main = function ( ) -- unit -> int
+ local retval = 0
+ local job = process_cmdline()
+
+-- inspect(action_pending)
+
+ for i=1, #action_sequence do
+ local actionname = action_sequence[i]
+ local exit = false
+ if action_pending[actionname] then
+ logs.names_report("log", 3, "preparing for task",
+ "%s", actionname)
+
+ local action = actions[actionname]
+ local success, continue = action(job)
+
+ if not success then
+ logs.names_report(false, 0, "could not finish task",
+ "%s", actionname)
+ retval = -1
+ exit = true
+ elseif not continue then
+ logs.names_report(false, 3, "task completed, exiting",
+ "%s", actionname)
+ exit = true
+ else
+ logs.names_report(false, 3, "task completed successfully",
+ "%s", actionname)
+ end
+ end
+ if exit then break end
+ end
+
+ return retval
end
-process_cmdline()
-generate(force_reload)
+return main()
+
-- vim:tw=71:sw=4:ts=4:expandtab