summaryrefslogtreecommitdiff
path: root/luaotfload.lua
blob: 21aff954038f291a925396192201fcdeebac59b7 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
luaotfload          = { }

luaotfload.module = {
    name          = "luaotfload",
    version       = 1.001,
    date          = "2009/04/08",
    description   = "ConTeXt font loading system.",
    author        = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright     = "PRAGMA ADE / ConTeXt Development Team",
    license       = "see context related readme files"
}

luatextra.provides_module(luaotfload.module)

function luaotfload.loadmodule(name)
    local foundname = kpse.find_file('otfl-'..name,"tex")
    if not foundname then
      luatextra.module_error('luaotfload', string.format('file otfl-%s not found.', name))
      return 
    end
    dofile(foundname)
end

-- The following functions are made to map ConTeXt functions to luaextra functions.

string.strip = string.stripspaces

local splitters_s, splitters_m = { }, { }

function lpeg.splitat(separator,single)
    local splitter = (single and splitters_s[separator]) or splitters_m[separator]
    if not splitter then
        separator = lpeg.P(separator)
        if single then
            local other, any = lpeg.C((1 - separator)^0), lpeg.P(1)
            splitter = other * (separator * lpeg.C(any^0) + "")
            splitters_s[separator] = splitter
        else
            local other = lpeg.C((1 - separator)^0)
            splitter = other * (separator * other)^0
            splitters_m[separator] = splitter
        end
    end
    return splitter
end

file = fpath
file.extname = fpath.suffix

function table.compact(t)
    if t then
        for k,v in next, t do
            if not next(v) then
                t[k] = nil
            end
        end
    end
end

function table.sortedhashkeys(tab) -- fast one
    local srt = { }
    for key,_ in next, tab do
        srt[#srt+1] = key
    end
    table.sort(srt)
    return srt
end

-- The following modules contain code that is either not used
-- at all outside ConTeXt or will fail when enabled due to
-- lack of other modules.

-- First we load a few helper modules. This is about the miminum
-- needed to let the font modules do theuir work.

luaotfload.loadmodule('luat-dum.lua') -- not used in context at all
luaotfload.loadmodule('luat-con.lua') -- maybe some day we don't need this one

-- We do need some basic node support although the following
-- modules contain a little bit of code that is not used. It's
-- not worth weeding.

luaotfload.loadmodule('node-ini.lua')

-- function to set the good attribute numbers, they are not arbitrary values 
-- between 127 and 255 like in the ConTeXt base code

function attributes.private(name)
    local number = tex.attributenumber['otfl@'..name]
    if not number then 
        luatextra.module_error('luaotfload', string.format('asking for attribute %s, but not declared. Please report to the maintainer of luaotfload.', name))
    end
    return number
end

luaotfload.loadmodule('node-inj.lua') -- will be replaced (luatex > .50)
luaotfload.loadmodule('node-fnt.lua')
luaotfload.loadmodule('node-dum.lua')

-- Now come the font modules that deal with traditional TeX fonts
-- as well as open type fonts. We don't load the afm related code
-- from font-enc.lua and font-afm.lua as only ConTeXt deals with
-- it.
--
-- The font database file (if used at all) must be put someplace
-- visible for kpse and is not shared with ConTeXt. The mtx-fonts
-- script can be used to genate this file (using the --names
-- option).

luaotfload.loadmodule('font-ini.lua')
luaotfload.loadmodule('font-tfm.lua') -- will be split (we may need font-log)
--luaotfload.loadmodule('font-ott.lua') -- might be split
luaotfload.loadmodule('font-otf.lua')
luaotfload.loadmodule('font-otb.lua')
luaotfload.loadmodule('font-cid.lua')
luaotfload.loadmodule('font-otn.lua')
luaotfload.loadmodule('font-ota.lua') -- might be split
luaotfload.loadmodule('font-otc.lua')
do
  local temp = callback.register
  callback.register = function (...)
    return
  end 
  luaotfload.loadmodule('font-def.lua')
  callback.register = temp
end
luaotfload.loadmodule('font-xtx.lua')
luaotfload.loadmodule('font-dum.lua')

-- small patch
fonts.enc.known = {}

function luaotfload.register_callbacks()
    callback.add('ligaturing',           nodes.simple_font_dummy, 'luaotfload.ligaturing')
    callback.add('kerning',              nodes.simple_font_dummy, 'luaotfload.kerning')
    callback.add('pre_linebreak_filter', nodes.simple_font_handler, 'luaotfload.pre_linebreak_filter')
    callback.add('hpack_filter',         nodes.simple_font_handler, 'luaotfload.hpack_filter')
    callback.reset('define_font')
    callback.add('define_font' ,         fonts.define.read, 'luaotfload.define_font', 1)
end

function luaotfload.unregister_callbacks()
    callback.remove('ligaturing', 'luaotfload.ligaturing')
    callback.remove('kerning', 'luaotfload.kerning')
    callback.remove('pre_linebreak_filter', 'luaotfload.pre_linebreak_filter')
    callback.remove('hpack_filter', 'luaotfload.hpack_filter')
    callback.remove('define_font', 'luaotfload.define_font')
end