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