diff options
Diffstat (limited to 'mkluatexfontdb.lua')
-rwxr-xr-x | mkluatexfontdb.lua | 260 |
1 files changed, 208 insertions, 52 deletions
diff --git a/mkluatexfontdb.lua b/mkluatexfontdb.lua index 2a25b29..e7796db 100755 --- a/mkluatexfontdb.lua +++ b/mkluatexfontdb.lua @@ -7,30 +7,42 @@ This file is a wrapper for the luaotfload's font names module. It is part of the luaotfload bundle, please see the luaotfload documentation for more info. --]] -kpse.set_program_name("luatex") +kpse.set_program_name"luatex" -function string.quoted(s) return string.format("%q",s) end -- XXX +local stringformat = string.format +local texiowrite_nl = texio.write_nl -- First we need to be able to load module (code copied from -- luatexbase-loader.sty): -local file = "luatexbase.loader.lua" -local path = assert(kpse.find_file(file, 'tex'), - "File '"..file.."' not found") -texio.write_nl("("..path..")") -dofile(path) +local loader_file = "luatexbase.loader.lua" +local loader_path = assert(kpse.find_file(loader_file, "lua"), + "File '"..loader_file.."' not found") -require("lualibs") -require("otfl-basics-gen.lua") -require("otfl-font-nms") -require("alt_getopt") +--texiowrite_nl("("..loader_path..")") +dofile(loader_path) -- FIXME this pollutes stdout with filenames -local name = 'mkluatexfontdb' -local version = '1.07' -- same version number as luaotfload +_G.config = _G.config or { } +local config = _G.config +config.lualibs = config.lualibs or { } +config.lualibs.prefer_merged = false +config.lualibs.load_extended = false + +require"lualibs" +require"otfl-basics-gen.lua" +require"otfl-luat-ovr.lua" --- this populates the logs.* namespace +require"otfl-font-nms" +require"alt_getopt" + +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 +local db_bin_out = file.replacesuffix(db_src_out, "luc") local function help_msg() - texio.write(string.format([[ + texiowrite_nl(stringformat([[ + Usage: %s [OPTION]... Rebuild the LuaTeX font database. @@ -43,67 +55,211 @@ Valid options: -vvv print all steps of directory searching -V --version print version and exit -h --help print this message + --find="font name" query the database for a font name + -F --fuzzy look for approximate matches if --find fails -The output database file is named otfl-names(.lua and .luc) and is placed under: + --log=stdout redirect log output to stdout +The font database will be saved to %s -]], name, names.path.dir)) + %s + +]], name, db_src_out, db_bin_out)) end local function version_msg() - texio.write(string.format( - "%s version %s, database version %s.\n", name, version, names.version)) + texiowrite_nl(stringformat( + "%s version %s, database version %s.\n", + name, version, names.version)) end ---[[ +--[[-- +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) + +action_pending.loglevel = true --- always set the loglevel +action_pending.generate = true --- this is the default action + +local actions = { } --- (jobspec -> (bool * bool)) list + +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) + if savedname then --- FIXME have names.save return bool + return true, true + end + return false, false +end + +actions.query = function (job) + + local query = job.query + local tmpspec = { + name = query, + lookup = "name", + specification = "name:" .. query, + optsize = 0, + } + + local foundname, _whatever, success = + fonts.names.resolve(nil, nil, tmpspec) + + if success then + logs.names_report(false, 0, + "resolve", "Font “%s” found!", query) + logs.names_report(false, 0, + "resolve", "Resolved file name “%s”:", foundname) + else + logs.names_report(false, 0, + "resolve", "Cannot find “%s”.", query) + if job.fuzzy == true then + logs.names_report(false, 2, + "resolve", "Looking for close matches, this may take a while ...") + local success = fonts.names.find_closest(query, job.fuzzy_limit) + end + end + return true, true +end + +--[[-- Command-line processing. -Here we fill cmdargs with the good values, and then analyze it. ---]] +mkluatexfontdb.lua relies on the script alt_getopt to process argv and +analyzes its output. -local long_opts = { - force = "f", - quiet = "q", - help = "h", - verbose = 1 , - version = "V", -} +TODO with extended lualibs we have the functionality from the +environment.* namespace that could eliminate the dependency on +alt_getopt. +--]]-- -local short_opts = "fqpvVh" +local process_cmdline = function ( ) -- unit -> jobspec + local result = { -- jobspec + force_reload = nil, + query = "", + log_level = 1, + } -local force_reload = nil + local long_options = { + force = "f", + help = "h", + log = 1, + quiet = "q", + verbose = 1 , + version = "V", + find = 1, + fuzzy = "F", + limit = 1, + } -local function process_cmdline() - local opts, optind, optarg = alt_getopt.get_ordered_opts (arg, short_opts, long_opts) - local log_level = 1 - for i,v in next, opts do + local short_options = "fFqvVh" + + local options, _, optarg = + alt_getopt.get_ordered_opts (arg, short_options, long_options) + + 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 + 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] + elseif v == "F" then + result.fuzzy = true + elseif v == "limit" then + local lim = optarg[n] + if lim then + result.fuzzy_limit = tonumber(lim) + end end end - names.set_log_level(log_level) + return result end -local function generate(force) - local fontnames, saved - fontnames = names.update(fontnames, force) - logs.report("fonts in the database", "%i", #fontnames.mappings) - saved = names.save(fontnames) - texio.write_nl("") +local main = function ( ) -- unit -> int + local retval = 0 + local job = process_cmdline() + +-- inspect(action_pending) +-- inspect(job) + + 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 + + texiowrite_nl"" + return retval end -process_cmdline() -generate(force_reload) +return main() + +-- vim:tw=71:sw=4:ts=4:expandtab |