diff options
| -rw-r--r-- | luaotfload.dtx | 102 | 
1 files changed, 94 insertions, 8 deletions
| diff --git a/luaotfload.dtx b/luaotfload.dtx index eabc240..706ee1c 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1455,12 +1455,14 @@ local luatexbase = luatexbase  local type, next       = type, next  local setmetatable     = setmetatable -local find_file        = kpse.find_file +local kpsefind_file    = kpse.find_file +local kpseexpand_path  = kpse.expand_path +local kpseexpand_var   = kpse.expand_var  local lfsisfile        = lfs.isfile -local stringfind       = string.find -local stringformat     = string.format -local stringmatch      = string.match -local stringsub        = string.sub +local lfsisdir         = lfs.isdir +local lfsmkdir         = lfs.mkdir +local stringexplode    = string.explode +local stringgmatch     = string.gmatch  local add_to_callback, create_callback =        luatexbase.add_to_callback, luatexbase.create_callback @@ -1509,6 +1511,80 @@ if tex.luatexversion < luatex_version then  end  %    \end{macrocode} +%     Create $TEXMFCACHE if not present. This is necessary due to +%     two bugs in Luatex-Fonts that surface simultaneously if none +%     of the possible cache directories exists. We add a fixed version +%     of lfs.mkdirs() first. +% +%    \begin{macrocode} + +local ostype = os.type + +local mkdirs = function (path) +    local full +    for sub in stringgmatch(path, "([^\\/]+)") do +        if full then +            full = full .. "/" .. sub +        else +            if ostype == "windows" then +                full = sub +            else +                full = "/" .. sub +            end +        end +        if not lfsisdir(full) then +            lfsmkdir(full) +        end +    end +end + +--- <hack> + +local phantom_kpse, normal_expand_path +do --- take care of writable path +    local cachepath = kpseexpand_path"$TEXMFCACHE" +    if cachepath == "" then +        cachepath = kpseexpand_path"$TEXMFVAR" +    end +    if cachepath == "" then --- dir missing, create +        texio.write_nl("term and log", +            "(luaotfload: cache directory inaccessible)") +        local cachedest = kpseexpand_var"$TEXMFCACHE" +        local pathsep = ostype == "windows" and ";" or ":" +        if cachedest then +            cachedest = stringexplode(cachedest, pathsep) +        end +        for _, path in next, cachedest do +            if not lfsisdir(path) then +                texio.write_nl("term and log", +                    "(luaotfload: creating path " .. path) +                mkdirs(path) +                if  lfsisdir(path) then +                    local writable = kpseexpand_path("$TEXMFCACHE", true) +                    texio.write("term and log", " -- success)") +                    phantom_kpse = kpse.new "luatex" +                    goto writable_cache +                end +                texio.write("term and log", " FAILED!)") +            end +        end +    end +end + +::writable_cache:: +if phantom_kpse ~= nil then +    normal_expand_path = kpseexpand_path +    kpse.expand_path = function (spec) +        --- the second kpse instance is needed because kpathsea +        --- doesn’t update variables +        --- http://www.ntg.nl/pipermail/dev-luatex/2007-December/001172.html +        return phantom_kpse:expand_path(spec) +    end +end + +--- </hack> + +%    \end{macrocode}  % \subsection{Module loading}  % We load the files imported from \CONTEXT with this function.  % It automatically prepends the prefix \fileent{luaotfload-} to its @@ -1537,10 +1613,10 @@ local p_suffix       = (p_dot * (1 - p_dot - p_slash)^1 * P(-1)) / ""  local p_removesuffix = Cs((p_suffix + 1)^1)  local find_vf_file = function (name) -    local fullname = find_file(name, "ovf") +    local fullname = kpsefind_file(name, "ovf")      if not fullname then -        --fullname = find_file(file.removesuffix(name), "ovf") -        fullname = find_file(lpegmatch(p_removesuffix, name), "ovf") +        --fullname = kpsefind_file(file.removesuffix(name), "ovf") +        fullname = kpsefind_file(lpegmatch(p_removesuffix, name), "ovf")      end      if fullname then          log("loading virtual font file %s.", fullname) @@ -1746,6 +1822,16 @@ pop_namespaces(our_environment, false)-- true)  log("fontloader loaded in %0.3f seconds", os.gettimeofday()-starttime)  %    \end{macrocode} +%     Restore original \luafunction{kpse.expand_path} function. +% +%    \begin{macrocode} + +if normal_expand_path ~= nil then +    kpse.expand_path = normal_expand_path +    phantom_kpse     = nil +end + +%    \end{macrocode}  % \subsection{Callbacks}  % After the fontloader is ready we can restore the callback trap from  % \identifier{luatexbase}. | 
