From eb9d41d52ea5168284472a7290bce7a579ba1794 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 24 Jul 2014 22:00:28 +0200 Subject: [conf,tool] implement configuration writer Now ``luaotfload-tool --dumpconf`` can be used to output the current configuration to a file. --- src/luaotfload-configuration.lua | 136 +++++++++++++++++++++++++++++++++++++-- src/luaotfload-tool.lua | 34 ++++++---- 2 files changed, 153 insertions(+), 17 deletions(-) diff --git a/src/luaotfload-configuration.lua b/src/luaotfload-configuration.lua index dfa222c..10e791a 100644 --- a/src/luaotfload-configuration.lua +++ b/src/luaotfload-configuration.lua @@ -5,7 +5,7 @@ -- REQUIREMENTS: Luaotfload 2.5 or above -- AUTHOR: Philipp Gesang (Phg), -- VERSION: same as Luaotfload --- MODIFIED: 2014-07-13 14:19:32+0200 +-- MODIFIED: 2014-07-24 21:49:31+0200 ------------------------------------------------------------------------------- -- @@ -24,16 +24,17 @@ config.luaotfload = { } local status_file = "luaotfload-status" local luaotfloadstatus = require (status_file) -local string = string -local stringsub = string.sub local stringexplode = string.explode -local stringstrip = string.strip local stringfind = string.find +local stringformat = string.format +local string = string +local stringstrip = string.strip +local stringsub = string.sub -local table = table local tableappend = table.append -local tablecopy = table.copy local tableconcat = table.concat +local tablecopy = table.copy +local table = table local tabletohash = table.tohash local math = math @@ -42,8 +43,10 @@ local mathfloor = math.floor local io = io local ioloaddata = io.loaddata local iopopen = io.popen +local iowrite = io.write local os = os +local osdate = os.date local osgetenv = os.getenv local lpeg = require "lpeg" @@ -474,6 +477,92 @@ local option_spec = { }, } +------------------------------------------------------------------------------- +--- FORMATTERS +------------------------------------------------------------------------------- + +local indent = " " +local format_string = function (var, val) + return stringformat (indent .. "%s = %s", var, val) +end + +local format_integer = function (var, val) + return stringformat (indent .. "%s = %d", var, val) +end + +local format_boolean = function (var, val) + return stringformat (indent .. "%s = %s", var, val == true and "true" or "false") +end + +local format_section = function (title) + return stringformat ("[%s]", title) +end + +local commented = function (str) + return ";" .. str +end + +local underscore_replacer = lpeg.replacer ("_", "-", true) + +local dashed = function (var) + --- INI spec dictates that dashes are valid in variable names, not + --- underscores. + return underscore_replacer (var) or var +end + +local conf_header = [==[ +;;----------------------------------------------------------------------------- +;; Luaotfload Configuration +;;----------------------------------------------------------------------------- +;; +;; This file was generated by luaotfload-tool +;; on %s. Configuration variables +;; are documented in the manual to luaotfload.conf(5). +;; +;;----------------------------------------------------------------------------- + +]==] + +local conf_footer = [==[ + +;; vim:filetype=dosini:expandtab:shiftwidth=2 +]==] + +--- Each dumpable variable (the ones mentioned in the man page) receives a +--- formatter that will be used in dumping the variable. Each value receives a +--- “commented” flag that indicates whether or not the line should be printed +--- as a comment. + +local formatters = { + db = { + compress = { false, format_boolean }, + formats = { false, format_string }, + max_fonts = { false, format_integer }, + scan_local = { false, format_boolean }, + skip_read = { false, format_boolean }, + strip = { false, format_boolean }, + update_live = { false, format_boolean }, + }, + misc = { + bisect = { false, format_boolean }, + statistics = { false, format_boolean }, + termwidth = { true , format_integer }, + version = { true , format_string }, + }, + paths = { + cache_dir = { false, format_string }, + names_dir = { false, format_string }, + index_file = { false, format_string }, + lookups_file = { false, format_string }, + }, + run = { + color_callback = { false, format_string }, + definer = { false, format_string }, + log_level = { false, format_integer }, + resolver = { false, format_string }, + }, +} + ------------------------------------------------------------------------------- --- MAIN FUNCTIONALITY ------------------------------------------------------------------------------- @@ -689,6 +778,40 @@ local apply_defaults = function () return reconfigure () end +local dump = function () + local sections = table.sortedkeys (config.luaotfload) + local confdata = { } + for i = 1, #sections do + local section = sections[i] + local vars = config.luaotfload[section] + local varnames = table.sortedkeys (vars) + local sformats = formatters[section] + if sformats then + confdata[#confdata + 1] = format_section (section) + for j = 1, #varnames do + local var = varnames[j] + local val = vars[var] + local comment, sformat = unpack (sformats[var] or { }) + if sformat then + local dashedvar = dashed (var) + if comment then + confdata[#confdata + 1] = commented (sformat (dashedvar, val)) + else + confdata[#confdata + 1] = sformat (dashedvar, val) + end + end + end + confdata[#confdata + 1] = "" + end + end + if next(confdata) then + iowrite (stringformat (conf_header, + osdate ("%Y-%m-d %H:%M:%S", os.time ()))) + iowrite (tableconcat (confdata, "\n")) + iowrite (conf_footer) + end +end + ------------------------------------------------------------------------------- --- EXPORTS ------------------------------------------------------------------------------- @@ -700,5 +823,6 @@ config.actions = { apply = apply, apply_defaults = apply_defaults, reconfigure = reconfigure, + dump = dump, } diff --git a/src/luaotfload-tool.lua b/src/luaotfload-tool.lua index 754f5c7..02c5a45 100755 --- a/src/luaotfload-tool.lua +++ b/src/luaotfload-tool.lua @@ -6,7 +6,7 @@ -- AUTHOR: Khaled Hosny, Élie Roux, Philipp Gesang -- VERSION: 2.5 -- LICENSE: GPL v2.0 --- MODIFIED: 2014-07-24 22:07:35+0200 +-- MODIFIED: 2014-07-24 22:10:32+0200 ----------------------------------------------------------------------- luaotfload = luaotfload or { } @@ -739,9 +739,10 @@ set. --]]-- local action_sequence = { - "config", "loglevel", "help", "version", - "diagnose", "blacklist", "cache", "flush", - "bisect", "generate", "list", "query", + "config" , "loglevel" , "help" , "version" , + "dumpconf" , "diagnose" , "blacklist" , "cache" , + "flush" , "bisect" , "generate" , "list" , + "query" , } local action_pending = tabletohash(action_sequence, false) @@ -781,6 +782,11 @@ actions.version = function (job) return true, false end +actions.dumpconf = function (job) + config.actions.dump () + return true, false +end + actions.help = function (job) help_msg (job.help_version or "luaotfload-tool") return true, false @@ -1413,6 +1419,7 @@ local process_cmdline = function ( ) -- unit -> jobspec cache = 1, conf = 1, diagnose = 1, + dumpconf = 0, ["dry-run"] = "D", ["flush-lookups"] = "l", fields = 1, @@ -1551,15 +1558,20 @@ local process_cmdline = function ( ) -- unit -> jobspec result.bisect = optarg[n] action_pending.bisect = true elseif v == "conf" then - local extra = stringexplode (optarg[n], ",+") - if extra then - local extra_config = result.extra_config - if extra_config then - table.append (extra_config, extra) - else - result.extra_config = extra + local confname = optarg[n] + if confname then + local extra = stringexplode (optarg[n], ",+") + if extra then + local extra_config = result.extra_config + if extra_config then + table.append (extra_config, extra) + else + result.extra_config = extra + end end end + elseif v == "dumpconf" then + action_pending["dumpconf"] = true elseif v == "print-conf" then result.print_config = true end -- cgit v1.2.3