From 88f95fa579f23ed08c72eb936d5866edc291edfd Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Sun, 13 Jul 2014 14:29:10 +0200 Subject: [features,conf] configure default font features through configuration file --- src/luaotfload-configuration.lua | 141 ++++++++++++++++++++++++++++++++++++--- src/luaotfload-features.lua | 66 ++---------------- 2 files changed, 137 insertions(+), 70 deletions(-) diff --git a/src/luaotfload-configuration.lua b/src/luaotfload-configuration.lua index e302ca6..1e1e907 100644 --- a/src/luaotfload-configuration.lua +++ b/src/luaotfload-configuration.lua @@ -2,10 +2,10 @@ ------------------------------------------------------------------------------- -- FILE: luaotfload-configuration.lua -- DESCRIPTION: config file reader --- REQUIREMENTS: Luaotfload > 2.4 +-- REQUIREMENTS: Luaotfload 2.5 or above -- AUTHOR: Philipp Gesang (Phg), -- VERSION: same as Luaotfload --- CREATED: 2014-04-21 14:03:52+0200 +-- MODIFIED: 2014-07-13 14:19:32+0200 ------------------------------------------------------------------------------- -- @@ -47,7 +47,8 @@ local osgetenv = os.getenv local lpeg = require "lpeg" local lpegmatch = lpeg.match -local lpegsplitter = lpeg.splitat "," +local commasplitter = lpeg.splitat "," +local equalssplitter = lpeg.splitat "=" local kpse = kpse local kpseexpand_path = kpse.expand_path @@ -99,6 +100,33 @@ local valid_formats = tabletohash { "otf", "ttc", "ttf", "dfont", "afm", "pfb", "pfa", } +local feature_presets = { + arab = { + "ccmp", "locl", "isol", "fina", "fin2", + "fin3", "medi", "med2", "init", "rlig", + "calt", "liga", "cswh", "mset", "curs", + "kern", "mark", "mkmk", + }, + deva = { + "ccmp", "locl", "init", "nukt", "akhn", + "rphf", "blwf", "half", "pstf", "vatu", + "pres", "blws", "abvs", "psts", "haln", + "calt", "blwm", "abvm", "dist", "kern", + "mark", "mkmk", + }, + khmr = { + "ccmp", "locl", "pref", "blwf", "abvf", + "pstf", "pres", "blws", "abvs", "psts", + "clig", "calt", "blwm", "abvm", "dist", + "kern", "mark", "mkmk", + }, + thai = { + "ccmp", "locl", "liga", "kern", "mark", + "mkmk", + }, +} + + ------------------------------------------------------------------------------- --- DEFAULTS @@ -136,6 +164,36 @@ local default_config = { index_path_lua = nil, index_path_luc = nil, }, + default_features = { + global = { mode = "node" }, + dflt = { + "ccmp", "locl", "rlig", "liga", "clig", + "kern", "mark", "mkmk", 'itlc', + }, + + arab = feature_presets.arab, + syrc = feature_presets.arab, + mong = feature_presets.arab, + nko = feature_presets.arab, + + deva = feature_presets.deva, + beng = feature_presets.deva, + guru = feature_presets.deva, + gujr = feature_presets.deva, + orya = feature_presets.deva, + taml = feature_presets.deva, + telu = feature_presets.deva, + knda = feature_presets.deva, + mlym = feature_presets.deva, + sinh = feature_presets.deva, + + khmr = feature_presets.khmr, + tibt = feature_presets.khmr, + thai = feature_presets.thai, + lao = feature_presets.thai, + + hang = { "ccmp", "ljmo", "vjmo", "tjmo", }, + }, } ------------------------------------------------------------------------------- @@ -234,12 +292,32 @@ local build_cache_paths = function () return true end + +local set_default_features = function () + local default_features = config.luaotfload.default_features + luaotfload.features = luaotfload.features or { + global = { }, + defaults = { }, + } + current_features = luaotfload.features + for var, val in next, default_features do + if var == "global" then + current_features.global = val + else + current_features.defaults[var] = val + end + end + return true +end + + reconf_tasks = { - { "Set the log level" , set_loglevel }, - { "Build cache paths" , build_cache_paths }, - { "Check terminal dimensions" , check_termwidth }, - { "Set the font filter" , set_font_filter }, - { "Install font name resolver", set_name_resolver }, + { "Set the log level" , set_loglevel }, + { "Build cache paths" , build_cache_paths }, + { "Check terminal dimensions" , check_termwidth }, + { "Set the font filter" , set_font_filter }, + { "Install font name resolver", set_name_resolver }, + { "Set default features" , set_default_features }, } ------------------------------------------------------------------------------- @@ -259,13 +337,26 @@ local tointeger = function (n) end end +local toarray = function (s) + local fields = { lpegmatch (commasplitter, s) } + local ret = { } + for i = 1, #fields do + local field = stringstrip (fields[i]) + if field and field ~= "" then + ret[#ret + 1] = field + end + end + return ret +end + + local option_spec = { db = { formats = { in_t = string_t, out_t = string_t, transform = function (f) - local fields = { lpegmatch (lpegsplitter, f) } + local fields = toarray (f) --- check validity if not fields then @@ -278,7 +369,7 @@ local option_spec = { local known = { } local result = { } for i = 1, #fields do - local field = stringstrip (fields[i]) + local field = fields[i] if known[field] ~= true then --- yet unknown, tag as seen known[field] = true @@ -361,6 +452,34 @@ local option_spec = { index_path_lua = { in_t = string_t, }, index_path_luc = { in_t = string_t, }, }, + default_features = { + global = { + in_t = string_t, + out_t = table_t, + transform = function (s) + --- Split key=value arguments into hash. + local result = { } + local fields = toarray (s) + for _, field in next, fields do + local var, val = lpegmatch (equalssplitter, field) + if var and val then + if val == "true" then + result[var] = true + else + result[var] = val + end + end + end + return result + end, + }, + dflt = { in_t = string_t, out_t = table_t, transform = toarray, }, + arab = { in_t = string_t, out_t = table_t, transform = toarray, }, + deva = { in_t = string_t, out_t = table_t, transform = toarray, }, + khmr = { in_t = string_t, out_t = table_t, transform = toarray, }, + thai = { in_t = string_t, out_t = table_t, transform = toarray, }, + hang = { in_t = string_t, out_t = table_t, transform = toarray, }, + }, } ------------------------------------------------------------------------------- @@ -447,7 +566,7 @@ local process_options = function (opts) local vspec = spec[var] local t_val = type (val) if not vspec then - logreport ("both", 0, "conf", + logreport ("both", 2, "conf", "Section %d (%s): invalid configuration variable %q (%q); ignoring.", i, title, var, tostring (val)) diff --git a/src/luaotfload-features.lua b/src/luaotfload-features.lua index 4ad188f..0dc7d0a 100644 --- a/src/luaotfload-features.lua +++ b/src/luaotfload-features.lua @@ -65,58 +65,6 @@ local stringformat = string.format local stringis_empty = string.is_empty local mathceil = math.ceil -local defaults = { - dflt = { - "ccmp", "locl", "rlig", "liga", "clig", - "kern", "mark", "mkmk", 'itlc', - }, - arab = { - "ccmp", "locl", "isol", "fina", "fin2", - "fin3", "medi", "med2", "init", "rlig", - "calt", "liga", "cswh", "mset", "curs", - "kern", "mark", "mkmk", - }, - deva = { - "ccmp", "locl", "init", "nukt", "akhn", - "rphf", "blwf", "half", "pstf", "vatu", - "pres", "blws", "abvs", "psts", "haln", - "calt", "blwm", "abvm", "dist", "kern", - "mark", "mkmk", - }, - khmr = { - "ccmp", "locl", "pref", "blwf", "abvf", - "pstf", "pres", "blws", "abvs", "psts", - "clig", "calt", "blwm", "abvm", "dist", - "kern", "mark", "mkmk", - }, - thai = { - "ccmp", "locl", "liga", "kern", "mark", - "mkmk", - }, - hang = { - "ccmp", "ljmo", "vjmo", "tjmo", - }, -} - -local global_defaults = { mode = "node" } - -defaults.beng = defaults.deva -defaults.guru = defaults.deva -defaults.gujr = defaults.deva -defaults.orya = defaults.deva -defaults.taml = defaults.deva -defaults.telu = defaults.deva -defaults.knda = defaults.deva -defaults.mlym = defaults.deva -defaults.sinh = defaults.deva - -defaults.syrc = defaults.arab -defaults.mong = defaults.arab -defaults.nko = defaults.arab - -defaults.tibt = defaults.khmr - -defaults.lao = defaults.thai ---[[ begin excerpt from font-ott.lua ]] @@ -800,8 +748,8 @@ local set_default_features = function (speclist) or "dflt" if support_incomplete[script] then report("log", 0, "load", - "support for the requested script: " - .. "%q may be incomplete", script) + "Support for the requested script: " + .. "%q may be incomplete.", script) end else script = "dflt" @@ -809,15 +757,15 @@ local set_default_features = function (speclist) speclist.script = script report("log", 1, "load", - "auto-selecting default features for script: %s", + "Auto-selecting default features for script: %s.", script) - local requested = defaults[script] + local requested = luaotfload.features.defaults[script] if not requested then report("log", 1, "load", - "no defaults for script %q, falling back to \"dflt\"", + "No default features for script %q, falling back to \"dflt\".", script) - requested = defaults.dflt + requested = luaotfload.features.defaults.dflt end for i=1, #requested do @@ -825,7 +773,7 @@ local set_default_features = function (speclist) if speclist[feat] ~= false then speclist[feat] = true end end - for feat, state in next, global_defaults do + for feat, state in next, luaotfload.features.global do --- This is primarily intended for setting node --- mode unless “base” is requested, as stated --- in the manual. -- cgit v1.2.3