From 539c87e88dbea35170bf5a40957586bc5d9a9270 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 27 Jan 2016 08:13:45 +0100 Subject: [resolvers] allow arbitrary sequence lookups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This primarily affects the “anon” lookup. However, since we cannot any longer determine the lookup success by crude means, the resolver signature had to be modified to indicate success or failure via the return value. This does no longer match the resolver implementation of Context but the interface has become much cleaner. --- src/luaotfload-resolvers.lua | 126 ++++++++++++++++++++++++++++--------------- 1 file changed, 84 insertions(+), 42 deletions(-) (limited to 'src/luaotfload-resolvers.lua') diff --git a/src/luaotfload-resolvers.lua b/src/luaotfload-resolvers.lua index 3d7f6b0..05a0656 100644 --- a/src/luaotfload-resolvers.lua +++ b/src/luaotfload-resolvers.lua @@ -62,14 +62,18 @@ local logreport = luaotfload.log.report local resolve_file resolve_file = function (specification) - local name = fonts.names.lookup_font_file (specification.name) + local name, _format, success = fonts.names.lookup_font_file (specification.name) local suffix = filesuffix (name) if fonts.formats[suffix] then specification.forced = stringlower (suffix) - specification.forcedname = fileremovesuffix(name) + specification.forcedname = fileremovesuffix (name) else specification.name = name end + if success ~= true then + logreport ("log", 1, "resolve", "file lookup of %q unsuccessful", name) + end + return success end --[[doc-- @@ -85,22 +89,22 @@ end local resolve_path resolve_path = function (specification) local name = specification.name - local exists, _ = lfsisfile(name) + local exists, _ = lfsisfile (name) if not exists then -- resort to file: lookup - logreport ("log", 0, "load", + logreport ("log", 1, "resolve", "path lookup of %q unsuccessful, falling back to file:", name) - resolve_file (specification) + return resolve_file (specification) + end + local suffix = filesuffix (name) + if fonts.formats [suffix] then + specification.forced = stringlower (suffix) + specification.name = fileremovesuffix (name) + specification.forcedname = name else - local suffix = filesuffix (name) - if fonts.formats[suffix] then - specification.forced = stringlower (suffix) - specification.name = fileremovesuffix(name) - specification.forcedname = name - else - specification.name = name - end + specification.name = name end + return true end --[[doc-- @@ -120,18 +124,17 @@ resolve_name = function (specification) end local resolved, subfont = resolver (specification) if resolved then - logreport ("log", 0, "load", "Lookup/name: %q -> \"%s%s\"", - specification.name, - resolved, + logreport ("log", 1, "resolve", "name lookup %q -> \"%s%s\"", + specification.name, resolved, subfont and stringformat ("(%d)", subfont) or "") specification.resolved = resolved specification.sub = subfont specification.forced = stringlower (filesuffix (resolved) or "") specification.forcedname = resolved specification.name = fileremovesuffix (resolved) - else - resolve_file (specification) + return true end + return resolve_file (specification) end --[[doc-- @@ -158,36 +161,74 @@ end --doc]]-- -local type1_formats = { "tfm", "ofm", "TFM", "OFM", } +local tex_formats = { "tfm", "ofm", "TFM", "OFM", } -local resolve_anon -resolve_anon = function (specification) +local resolve_tex_format = function (specification) local name = specification.name - for i=1, #type1_formats do - local format = type1_formats[i] + for i=1, #tex_formats do + local format = tex_formats [i] local suffix = filesuffix (name) - if resolvers.findfile(name, format) then + if resolvers.findfile (name, format) then local usename = suffix == format and fileremovesuffix (name) or name specification.forcedname = file.addsuffix (usename, format) specification.forced = format - return + return true end end - --- under some weird circumstances absolute paths get - --- passed to the definer; we have to catch them - --- before the name: resolver misinterprets them. - name = specification.specification - local exists, _ = lfsisfile(name) - if exists then --- garbage; we do this because we are nice, - --- not because it is correct - logreport ("log", 1, "load", "file %q exists", name) - logreport ("log", 1, "load", - "... overriding borked anon: lookup with path: lookup") - specification.name = name - resolve_path (specification) - return + return false +end + +local resolve_path_if_exists = function (specification) + local spec = specification.specification + local exists, _void = lfsisfile (spec) + if exists then + --- If this path is taken a file matching the specification + --- literally was found. In this situation, Luaotfload is + --- expected to load that file directly, even though we provide + --- explicit “file” and “path” lookups to address exactly this + --- situation. + logreport ("log", 1, "resolve", + "file %q exists, performing path lookup", spec) + specification.name = spec + return resolve_path (specification) + end + return false +end + +local resolve_methods = { + tex = resolve_tex_format, + path = resolve_path_if_exists, + name = resolve_name, +} + +local resolve_sequence = function (seq, specification) + for i = 1, #seq do + local id = seq [i] + local mth = resolve_methods [id] + logreport ("both", 0, "resolve", "step %d: apply method %q (%s)", i, id, mth) + if mth (specification) == true then + logreport ("both", 0, "resolve", + "%d: method %q indicated lookup success", i, id) + logreport ("both", 0, "resolve", + "method %q resolved %q -> %s (%s)", + id, specification.specification, + specification.name, + specification.forcedname) + return true + end end - resolve_name (specification) + logreport ("both", 0, "resolve", + "sequence of %d lookups yielded nothing appropriate", #seq) + return false +end + +local default_anon_sequence = { + "tex", "path", "name", +} + +local resolve_anon +resolve_anon = function (specification) + return resolve_sequence (default_anon_sequence, specification) end --[[doc-- @@ -207,16 +248,17 @@ resolve_kpse = function (specification) if resolvers.findfile (name, suffix) then specification.forced = stringlower (suffix) specification.forcedname = name - return + return true end end for t, format in next, fonts.formats do --- brute force if kpsefind_file (name, format) then specification.forced = t specification.name = name - return + return true end end + return false end --[[doc-- @@ -250,5 +292,5 @@ return { end, --- [.init] } ---- vim:ft=lua:ts=8:sw=4:et +--- vim:ft=lua:ts=8:sw=4:et:tw=79 -- cgit v1.2.3