From c909ab99d258e6a9132cdd2d14671fe5ea6b15ab Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 16 Apr 2013 18:27:04 +0200 Subject: make mkluatexfontdb script more modular --- mkluatexfontdb.lua | 175 ++++++++++++++++++++++++++++++++++++++++------------- 1 file 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 -- cgit v1.2.3