typo-lan.lua / last modification: 2020-01-30 14:16
if not modules then modules = { } end modules ['typo-lan'] = {
    version   = 1.001,
    comment   = "companion to typo-lan.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

local type, next = type, next

local currentfont       = font.current
local setmetatableindex = table.setmetatableindex
local utfbyte           = utf.byte

local hashes            = fonts.hashes
local fontdata          = hashes.characters
local emwidths          = hashes.emwidths

local frequencies       = languages.frequencies or { }
languages.frequencies   = frequencies

local frequencydata     = { }
local frequencyfile     = string.formatters["lang-frq-%s.lua"]
local frequencycache    = { }

setmetatableindex(frequencydata, function(t,language)
    local fullname = resolvers.findfile(frequencyfile(language))
    local v = fullname ~= "" and dofile(fullname)
    if not v or not v.frequencies then
        v = t.en
    end
    t[language] = v
    return v
end)

setmetatableindex(frequencycache, function(t,language)
    local dataset = frequencydata[language]
    local frequencies = dataset.frequencies
    if not frequencies then
        return t.en
    end
    local v = { }
    setmetatableindex(v, function(t,font)
        local average = emwidths[font] / 2
        if frequencies then
            local characters = fontdata[font]
            local sum, tot = 0, 0
            for k, v in next, frequencies do
                local character = characters[k] -- characters[type(k) == "number" and k or utfbyte(k)]
                tot = tot + v
                sum = sum + v * (character and character.width or average)
            end
            average = sum / tot -- widths
        end
        t[font] = average
        return average
    end)
    t[language] = v
    return v
end)

function frequencies.getdata(language)
    return frequencydata[language]
end

function frequencies.averagecharwidth(language,font)
    return frequencycache[language or "en"][font or currentfont()]
end

interfaces.implement {
    name      = "averagecharwidth",
    actions   = { frequencies.averagecharwidth, context },
    arguments = "string"
}