summaryrefslogtreecommitdiff
path: root/tex/context/base/font-aux.lua
blob: 0396554adeca18e68de64d4eacff6452b4c727a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
if not modules then modules = { } end modules ['font-aux'] = {
    version   = 1.001,
    comment   = "companion to font-ini.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

local number = tonumber
local wrap, yield = coroutine.wrap, coroutine.yield

local fonts, font = fonts, font

local iterators   = { }
fonts.iterators   = iterators

local currentfont = font.current
local identifiers = fonts.hashes.identifiers
local sortedkeys  = table.sortedkeys

-- for unicode, character   in fonts.iterators.characters  () do print(k,v) end
-- for unicode, description in fonts.iterators.descriptions() do print(k,v) end
-- for index,   glyph       in fonts.iterators.glyphs      () do print(k,v) end

local function checkeddata(data) -- beware, nullfont is the fallback in identifiers
    local t = type(data)
    if t == "table" then
        return data
    elseif t ~= "number" then
        data = currentfont()
    end
    return identifiers[data] -- has nullfont as fallback
end

function iterators.characters(data)
    data = checkeddata(data)
    local characters = data.characters
    if characters then
        local collected  = sortedkeys(characters)
        return wrap(function()
            for c=1,#collected do
                local cc = collected[c]
                local dc = characters[cc]
                if dc then
                    yield(cc,dc)
                end
            end
        end)
    else
        return wrap(function() end)
    end
end

function iterators.descriptions(data)
    data = checkeddata(data)
    local characters = data.characters
    local descriptions = data.descriptions
    if characters and descriptions then
        local collected = sortedkeys(characters)
        return wrap(function()
            for c=1,#collected do
                local cc = collected[c]
                local dc = descriptions[cc]
                if dc then
                    yield(cc,dc)
                end
            end
        end)
    else
        return wrap(function() end)
    end
end

local function getindices(data)
    data = checkeddata(data)
    local indices = { }
    local characters = data.characters
    if characters then
        for unicode, character in next, characters do
            indices[character.index or unicode] = unicode
        end
    end
    return indices
end

function iterators.glyphs(data)
    data = checkeddata(data)
    local descriptions = data.descriptions
    if descriptions then
        local indices = getindices(data)
        local collected = sortedkeys(indices)
        return wrap(function()
            for c=1,#collected do
                local cc = collected[c]
                local dc = descriptions[indices[cc]]
                if dc then
                    yield(cc,dc)
                end
            end
        end)
    else
        return wrap(function() end)
    end
end