Skip to content
This repository has been archived by the owner on Sep 27, 2019. It is now read-only.

Commit

Permalink
Merge pull request #348 from phi-gamma/master
Browse files Browse the repository at this point in the history
Implement #263
  • Loading branch information
phi-gamma committed Apr 28, 2016
2 parents 6c52ede + e8e069a commit f502d52
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 31 deletions.
13 changes: 9 additions & 4 deletions doc/luaotfload-main.tex
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
\beginfrontmatter

\setdocumenttitle {The \identifier{luaotfload} package}
\setdocumentdate {2016/04/21 v2.7}
\setdocumentdate {2016/04/28 v2.7}
\setdocumentauthor {Elie Roux · Khaled Hosny · Philipp Gesang\\
Home: \hyperlink {https://github.com/lualatex/luaotfload}\\
Support: \email {[email protected]}}
Expand Down Expand Up @@ -363,9 +363,14 @@
before anything else, \identifier{luaotfload} attempts to load a
traditional \TEX Font Metric (\abbrev{tfm} or \abbrev{ofm}).
%
If this fails, it performs a \inlinecode {name:} lookup, which itself will
fall back to a \inlinecode {file:} lookup if no database entry matches
\meta{font name}.
If this fails, it performs a \inlinecode {path:} lookup, which itself will
fall back to a \inlinecode {file:} lookup.
%
Lastly, if none of the above succeeded, attempt to resolve the request as a
\inlinecode {name:} lookup by searching the font index for \meta{font name}.
%
The behavior of this “anonymous” lookup is configurable, see the configuation
manpage for details.

Furthermore, \identifier{luaotfload} supports the slashed (shorthand)
font style notation from \XETEX.
Expand Down
19 changes: 18 additions & 1 deletion doc/luaotfload.conf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Luaotfload configuration file
-----------------------------------------------------------------------

:Date: 2016-04-21
:Date: 2016-04-28
:Copyright: GPL v2.0
:Version: 2.7
:Manual section: 5
Expand Down Expand Up @@ -271,6 +271,8 @@ Section ``run``
+------------------+--------+------------------------------+
| variable | type | default |
+------------------+--------+------------------------------+
| anon-sequence | s | ``"tex,path,name"`` |
+------------------+--------+------------------------------+
| color-callback | s | ``"post_linebreak_filter"`` |
+------------------+--------+------------------------------+
| definer | s | ``"patch"`` |
Expand All @@ -282,6 +284,21 @@ Section ``run``
| fontloader | s | ``"default"`` |
+------------------+--------+------------------------------+

Unqualified font lookups are treated with the flexible “anonymous”
mechanism. This involves a chain of lookups applied successively until
the first one yields a match. By default, the lookup will first search
for TFM fonts using the Kpathsea library. If this wasn’t successful, an
attempt is made at interpreting the request as an absolute path (like
the ``[/path/to/font/foo.ttf]`` syntax) or a file name
(``file:foo.ttf``). Finally, the request is interpreted as a font name
and retrieved from the index (``name:Foo Regular``). This behavior can
be configured by specifying a list as the value to ``anon-sequence``.
Available items are ``tex``, ``path``, ``name`` -- representing the
lookups described above, respectively --, and ``file`` for searching a
filename but not an absolute path. Also, ``my`` lookups are valid
values but they should only be used from within TeX documents, because
there is no means of customizing a ``my`` lookups on the command line.

The ``color-callback`` option determines the stage at which fonts that
defined with a ``color=xxyyzz`` feature will be colorized. By default
this happens in a ``post_linebreak_filter`` but alternatively the
Expand Down
58 changes: 58 additions & 0 deletions src/luaotfload-configuration.lua
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,14 @@ local valid_formats = tabletohash {
"otf", "ttc", "ttf", "afm", "pfb"
}

local default_anon_sequence = {
"tex", "path", "name"
}

local valid_resolvers = tabletohash {
"tex", "path", "name", "file", "my"
}

local feature_presets = {
arab = tabletohash {
"ccmp", "locl", "isol", "fina", "fin2",
Expand Down Expand Up @@ -198,6 +206,7 @@ local default_config = {
use_fontforge = false,
},
run = {
anon_sequence = default_anon_sequence,
resolver = "cached",
definer = "patch",
log_level = 0,
Expand Down Expand Up @@ -502,6 +511,45 @@ local option_spec = {
use_fontforge = { in_t = boolean_t, },
},
run = {
anon_sequence = {
in_t = string_t,
out_t = table_t,
transform = function (s)
if s ~= "default" then
local bits = { lpegmatch (commasplitter, s) }
if next (bits) then
local seq = { }
local done = { }
for i = 1, #bits do
local bit = bits [i]
if valid_resolvers [bit] then
if not done [bit] then
done [bit] = true
seq [#seq + 1] = bit
else
logreport ("both", 0, "conf",
"ignoring duplicate resolver %s at position %d \z
in lookup sequence",
bit, i)
end
else
logreport ("both", 0, "conf",
"lookup sequence contains invalid item %s \z
at position %d.",
bit, i)
end
end
if next (seq) then
logreport ("both", 2, "conf",
"overriding anon lookup sequence %s.",
tableconcat (seq, ","))
return seq
end
end
end
return default_anon_sequence
end
},
live = { in_t = boolean_t, }, --- false for the tool, true for TeX run
resolver = {
in_t = string_t,
Expand Down Expand Up @@ -639,6 +687,15 @@ local format_keyval = function (var, val)
end
end

local format_list = function (var, val)
local elts = { }
for i = 1, #val do elts [i] = val [i] end
if next (elts) then
return stringformat (indent .. "%s = %s",
var, tableconcat (elts, ","))
end
end

local format_section = function (title)
return stringformat ("[%s]", dashed (title))
end
Expand Down Expand Up @@ -693,6 +750,7 @@ local formatters = {
lookups_file = { false, format_string },
},
run = {
anon_sequence = { false, format_list },
color_callback = { false, format_string },
definer = { false, format_string },
fontloader = { false, format_string },
Expand Down
51 changes: 32 additions & 19 deletions src/luaotfload-resolvers.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ if not luaotfload then error "this module requires Luaotfload" end
--doc]]--

local next = next
local tableconcat = table.concat
local kpsefind_file = kpse.find_file
local lfsisfile = lfs.isfile
local stringlower = string.lower
Expand Down Expand Up @@ -195,24 +196,39 @@ local resolve_path_if_exists = function (specification)
return false
end

--[[doc--
Custom file resolvers via callback.
--doc]]--

local resolve_my = function (specification)
luatexbase.call_callback ("luaotfload.resolve_font", specification)
end

local resolve_methods = {
tex = resolve_tex_format,
path = resolve_path_if_exists,
name = resolve_name,
file = resolve_file,
my = resolve_my,
}

local resolve_sequence = function (seq, specification)
for i = 1, #seq do
local id = seq [i]
local mth = resolve_methods [id]
logreport ("both", 3, "resolve", "step %d: apply method %q (%s)", i, id, mth)
if mth (specification) == true then
logreport ("both", 3, "resolve",
"%d: method %q resolved %q -> %s (%s).",
i, id, specification.specification,
specification.name,
specification.forcedname)
return true
if not mth then
logreport ("both", 0, "resolve",
"step %d: invalid lookup method %q", i, id)
else
logreport ("both", 3, "resolve", "step %d: apply method %q (%s)", i, id, mth)
if mth (specification) == true then
logreport ("both", 3, "resolve",
"%d: method %q resolved %q -> %s (%s).",
i, id, specification.specification,
specification.name,
specification.forcedname)
return true
end
end
end
logreport ("both", 0, "resolve",
Expand All @@ -226,7 +242,14 @@ local default_anon_sequence = {

local resolve_anon
resolve_anon = function (specification)
return resolve_sequence (default_anon_sequence, specification)
local seq = default_anon_sequence
if config and config.luaotfload then
local anonseq = config.luaotfload.run.anon_sequence
if anonseq and next (anonseq) then
seq = anonseq
end
end
return resolve_sequence (seq, specification)
end

--[[doc--
Expand Down Expand Up @@ -259,16 +282,6 @@ resolve_kpse = function (specification)
return false
end

--[[doc--
Also {\bfseries EXPERIMENTAL}: custom file resolvers via callback.
--doc]]--

local resolve_my = function (specification)
luatexbase.call_callback ("luaotfload.resolve_font", specification)
end

return {
init = function ( )
if luatexbase and luatexbase.create_callback then
Expand Down
19 changes: 12 additions & 7 deletions src/luaotfload-tool.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1160,16 +1160,21 @@ actions.query = function (job)
tmpspec.size = 655360 --- assume 10pt
end

local foundname, subfont, success
local foundname, subfont, success, needle

if tmpspec.lookup == "name"
or tmpspec.lookup == "anon" --- not *exactly* as resolvers.anon
then
foundname, _, success = fonts.names.lookup_font_name (tmpspec)
if foundname then
foundname, _, success = fonts.names.lookup_font_file (foundname)
if tmpspec.lookup == "name" then
if fonts.definers.resolvers.name (tmpspec) then
needle = tmpspec.resolved
end
elseif tmpspec.lookup == "anon" then
if fonts.definers.resolvers.anon (tmpspec) then
needle = tmpspec.resolved or tmpspec.name
end
elseif tmpspec.lookup == "file" then
needle = tmpspec.name
end

if needle then
foundname, _, success = fonts.names.lookup_font_file (tmpspec.name)
end

Expand Down

0 comments on commit f502d52

Please sign in to comment.