diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/luaotfload-auxiliary.lua | 10 | ||||
| -rw-r--r-- | src/luaotfload-features.lua | 172 | ||||
| -rw-r--r-- | src/luaotfload-loaders.lua | 12 | ||||
| -rw-r--r-- | src/luaotfload-main.lua | 2 | 
4 files changed, 39 insertions, 157 deletions
diff --git a/src/luaotfload-auxiliary.lua b/src/luaotfload-auxiliary.lua index 35f8f2b..3d300e7 100644 --- a/src/luaotfload-auxiliary.lua +++ b/src/luaotfload-auxiliary.lua @@ -42,7 +42,15 @@ local luaotfload_callbacks  = { }  --- https://github.com/khaledhosny/luaotfload/issues/54  local rewrite_fontname = function (tfmdata, specification) -  tfmdata.name = [["]] .. specification .. [["]] +  local format = tfmdata.format or tfmdata.properties.format +  if format ~= "type1" then +    if stringfind (specification, " ") then +      tfmdata.name = stringformat ("%q", specification) +    else +      --- other specs should parse just fine +      tfmdata.name = specification +    end +  end  end  local rewriting = false diff --git a/src/luaotfload-features.lua b/src/luaotfload-features.lua index 79f1416..5e9bf7b 100644 --- a/src/luaotfload-features.lua +++ b/src/luaotfload-features.lua @@ -1322,146 +1322,6 @@ local noflags = { false, false, false, false }  local tohash = table.tohash -local function ancient_addfeature (data, feature, specifications) -    local descriptions = data.descriptions -    local resources    = data.resources -    local lookups      = resources.lookups -    local gsubfeatures = resources.features.gsub -    if gsubfeatures and gsubfeatures[feature] then -        -- already present -    else -        local sequences    = resources.sequences -        local fontfeatures = resources.features -        local unicodes     = resources.unicodes -        local lookuptypes  = resources.lookuptypes -        local splitter     = lpeg.splitter(" ",unicodes) -        local done         = 0 -        local skip         = 0 -        if not specifications[1] then -            -- so we accept a one entry specification -            specifications = { specifications } -        end -        -- subtables are tables themselves but we also accept flattened singular subtables -        for s=1,#specifications do -            local specification = specifications[s] -            local valid         = specification.valid -            if not valid or valid(data,specification,feature) then -                local initialize = specification.initialize -                if initialize then -                    -- when false is returned we initialize only once -                    specification.initialize = initialize(specification) and initialize or nil -                end -                local askedfeatures = specification.features or everywhere -                local subtables     = specification.subtables or { specification.data } or { } -                local featuretype   = types[specification.type or "substitution"] -                local featureflags  = specification.flags or noflags -                local featureorder  = specification.order or { feature } -                local added         = false -                local featurename   = stringformat("ctx_%s_%s",feature,s) -                local st = { } -                for t=1,#subtables do -                    local list = subtables[t] -                    local full = stringformat("%s_%s",featurename,t) -                    st[t] = full -                    if featuretype == "gsub_ligature" then -                        lookuptypes[full] = "ligature" -                        for code, ligature in next, list do -                            local unicode = tonumber(code) or unicodes[code] -                            local description = descriptions[unicode] -                            if description then -                                local slookups = description.slookups -                                if type(ligature) == "string" then -                                    ligature = { lpegmatch(splitter,ligature) } -                                end -                                local present = true -                                for i=1,#ligature do -                                    if not descriptions[ligature[i]] then -                                        present = false -                                        break -                                    end -                                end -                                if present then -                                    if slookups then -                                        slookups[full] = ligature -                                    else -                                        description.slookups = { [full] = ligature } -                                    end -                                    done, added = done + 1, true -                                else -                                    skip = skip + 1 -                                end -                            end -                        end -                    elseif featuretype == "gsub_single" then -                        lookuptypes[full] = "substitution" -                        for code, replacement in next, list do -                            local unicode = tonumber(code) or unicodes[code] -                            local description = descriptions[unicode] -                            if description then -                                local slookups = description.slookups -                                replacement = tonumber(replacement) or unicodes[replacement] -                                if descriptions[replacement] then -                                    if slookups then -                                        slookups[full] = replacement -                                    else -                                        description.slookups = { [full] = replacement } -                                    end -                                    done, added = done + 1, true -                                end -                            end -                        end -                    end -                end -                if added then -                    -- script = { lang1, lang2, lang3 } or script = { lang1 = true, ... } -                    for k, v in next, askedfeatures do -                        if v[1] then -                            askedfeatures[k] = tabletohash(v) -                        end -                    end -                    local sequence = { -                        chain     = 0, -                        features  = { [feature] = askedfeatures }, -                        flags     = featureflags, -                        name      = featurename, -                        order     = featureorder, -                        subtables = st, -                        type      = featuretype, -                    } -                    if specification.prepend then -                        insert(sequences,1,sequence) -                    else -                        insert(sequences,sequence) -                    end -                    -- register in metadata (merge as there can be a few) -                    if not gsubfeatures then -                        gsubfeatures  = { } -                        fontfeatures.gsub = gsubfeatures -                    end -                    local k = gsubfeatures[feature] -                    if not k then -                        k = { } -                        gsubfeatures[feature] = k -                    end -                    for script, languages in next, askedfeatures do -                        local kk = k[script] -                        if not kk then -                            kk = { } -                            k[script] = kk -                        end -                        for language, value in next, languages do -                            kk[language] = value -                        end -                    end -                end -            end -        end -        if trace_loading then -            report_otf("registering feature %a, affected glyphs %a, skipped glyphs %a",feature,done,skip) -        end -    end -end -  local function current_addfeature(data,feature,specifications)      local descriptions = data.descriptions      local resources    = data.resources @@ -1856,19 +1716,29 @@ end  otf.addfeature           = add_otf_feature  local install_extra_features = function (data, filename, raw) +    local metadata = data and data.metadata +    if not metadata then +        logreport ("both", 4, "features", +                   "no metadata received from font “%s”; not \z +                    installing extra features.", filename) +        return +    end +    local format = data.format +    if not format then +        logreport ("both", 4, "features", +                   "no format info for font “%s”/“%s”; not \z +                   installing extra features.", +                   fontname, filename) +        return +    end      for feature, specification in next, extrafeatures do -        local fontname -        local subfont -        local metadata = data.metadata -        if metadata then -            fontname = tostring (data.metadata.fontname) -            subfont  = tonumber (metadata.subfontindex) -        end          if not fontname then fontname = "<unknown>" end          if not subfont  then subfont  = -1          end +        local fontname = tostring (data.metadata.fontname) or "<unknown>" +        local subfont  = tonumber (metadata.subfontindex)  or -1          logreport ("both", 3, "features",                     "register synthetic feature “%s” for %s font “%s”(%d)", -                   feature, data.format, fontname, subfont) +                   feature, format, fontname, subfont)          otf.features.register { name = feature, description = specification[2] }          otf.enhancers.addfeature (data, feature, specification[1])      end @@ -1887,11 +1757,7 @@ return {          end          otf = fonts.handlers.otf - -        --- hack for backwards compat with TL2014 loader -        otf.enhancers.addfeature = otf.version < 2.8 and ancient_addfeature -                                                      or current_addfeature - +        otf.enhancers.addfeature = current_addfeature          otf.enhancers.register ("check extra features",                                  install_extra_features) diff --git a/src/luaotfload-loaders.lua b/src/luaotfload-loaders.lua index fb01821..d3828aa 100644 --- a/src/luaotfload-loaders.lua +++ b/src/luaotfload-loaders.lua @@ -41,6 +41,14 @@ local eval_reader = function (specification)    return eval ()  end +local unsupported_reader = function (format) +  return function (specification) +    logreport ("both", 0, "loaders", +               "font format “%s” unsupported; cannot load %s.", +               format, tostring (specification.name)) +  end +end +  local install_formats = function ()    local fonts = fonts    if not fonts then return false end @@ -72,8 +80,8 @@ local install_formats = function ()    return aux ("evl", eval_reader)       and aux ("lua", lua_reader) -     and aux ("pfa", function (spec) return readers.opentype (spec, "pfa", "type1") end) -     and aux ("pfb", function (spec) return readers.opentype (spec, "pfb", "type1") end) +     and aux ("pfa", unsupported_reader "pfa") +     and aux ("pfb", unsupported_reader "pfb")       and aux ("ofm", readers.tfm)  end diff --git a/src/luaotfload-main.lua b/src/luaotfload-main.lua index 3f1f602..92c1ff1 100644 --- a/src/luaotfload-main.lua +++ b/src/luaotfload-main.lua @@ -13,7 +13,7 @@ local luaotfload                  = luaotfload  luaotfload.log                    = luaotfload.log or { }  luaotfload.version                = "2.7"  luaotfload.loaders                = { } -luaotfload.min_luatex_version     = 95             --- i. e. 0.80 +luaotfload.min_luatex_version     = 95             --- i. e. 0.95  luaotfload.fontloader_package     = "reference"    --- default: from current Context  local authors = "\z  | 
