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
|
if not modules then modules = { } end modules ['font-otc'] = {
version = 1.001,
comment = "companion to font-otf.lua (context)",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
local format, insert = string.format, table.insert
local type, next = type, next
local ctxcatcodes = tex.ctxcatcodes
-- we assume that the other otf stuff is loaded already
local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
local otf = fonts.otf
local tfm = fonts.tfm
-- for good old times (usage is to be avoided)
local tlig_list = {
endash = "hyphen hyphen",
emdash = "hyphen hyphen hyphen",
--~ quotedblleft = "quoteleft quoteleft",
--~ quotedblright = "quoteright quoteright",
--~ quotedblleft = "grave grave",
--~ quotedblright = "quotesingle quotesingle",
--~ quotedblbase = "comma comma",
}
local trep_list = {
--~ [0x0022] = 0x201D,
[0x0027] = 0x2019,
--~ [0x0060] = 0x2018,
}
-- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to
-- have always); some day we can write a "force always when true" trick for other
-- features as well
local tlig_feature = {
features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "tlig", comment = "added bij mkiv" }, },
name = "ctx_tlig",
subtables = { { name = "ctx_tlig_1" } },
type = "gsub_ligature",
flags = { },
}
local trep_feature = {
features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "trep", comment = "added bij mkiv" }, },
name = "ctx_trep",
subtables = { { name = "ctx_trep_1" } },
type = "gsub_single",
flags = { },
}
fonts.otf.enhancers["enrich with features"] = function(data,filename)
local glyphs = data.glyphs
local indices = data.map.map
for unicode, index in next, indices do
local glyph = glyphs[index]
local l = tlig_list[glyph.name]
if l then
local o = glyph.lookups or { }
o["ctx_tlig_1"] = { { "ligature", l, glyph.name } }
glyph.lookups = o
end
local r = trep_list[unicode]
if r then
local replacement = indices[r]
if replacement then
local o = glyph.lookups or { }
o["ctx_trep_1"] = { { "substitution", glyphs[replacement].name } } ---
glyph.lookups = o
end
end
end
data.gsub = data.gsub or { }
if trace_loading then
logs.report("load otf","enhance: registering tlig feature")
end
insert(data.gsub,1,table.fastcopy(tlig_feature))
if trace_loading then
logs.report("load otf","enhance: registering trep feature")
end
insert(data.gsub,1,table.fastcopy(trep_feature))
end
otf.tables.features['tlig'] = 'TeX Ligatures'
otf.tables.features['trep'] = 'TeX Replacements'
otf.features.register_base_substitution('tlig')
otf.features.register_base_substitution('trep')
-- the functionality is defined elsewhere
fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
fonts.initializers.base.otf.compose = fonts.initializers.common.compose
fonts.initializers.node.otf.compose = fonts.initializers.common.compose
-- bonus function
function otf.name_to_slot(name) -- todo: afm en tfm
local tfmdata = fonts.ids[font.current()]
if tfmdata and tfmdata.shared then
local otfdata = tfmdata.shared.otfdata
local unicode = otfdata.luatex.unicodes[name]
if type(unicode) == "number" then
return unicode
else
return unicode[1]
end
end
return nil
end
function otf.char(n) -- todo: afm en tfm
if type(n) == "string" then
n = otf.name_to_slot(n)
end
if n then
tex.sprint(ctxcatcodes,format("\\char%s ",n))
end
end
|