From 725d3ea39e6df5a7e274f320b6e52976d093e45e Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Fri, 2 Apr 2010 23:35:49 +0200 Subject: Import ConTeXt math modules Modules that provide OpenType and Unicode math related functionality, not very tested yet, but it seems to magically fix some of unicode-math issues. May be it should be trimmed a bit, since a good chunk of the code is of no use to us. --- otfl-font-enc.lua | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 otfl-font-enc.lua (limited to 'otfl-font-enc.lua') diff --git a/otfl-font-enc.lua b/otfl-font-enc.lua new file mode 100644 index 0000000..874f7c3 --- /dev/null +++ b/otfl-font-enc.lua @@ -0,0 +1,122 @@ +if not modules then modules = { } end modules ['font-enc'] = { + 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 match, gmatch, gsub = string.match, string.gmatch, string.gsub + +--[[ldx-- +

Because encodings are going to disappear, we don't bother defining +them in tables. But we may do so some day, for consistency.

+--ldx]]-- + +fonts.enc = fonts.enc or { } +fonts.enc.version = 1.03 +fonts.enc.cache = containers.define("fonts", "enc", fonts.enc.version, true) + +fonts.enc.known = { -- sort of obsolete + texnansi = true, + ec = true, + qx = true, + t5 = true, + t2a = true, + t2b = true, + t2c = true, + unicode = true +} + +function fonts.enc.is_known(encoding) + return containers.is_valid(fonts.enc.cache(),encoding) +end + +--[[ldx-- +

An encoding file looks like this:

+ + +/TeXnANSIEncoding [ +/.notdef +/Euro +... +/ydieresis +] def + + +

Beware! The generic encoding files don't always apply to the ones that +ship with fonts. This has to do with the fact that names follow (slightly) +different standards. However, the fonts where this applies to (for instance +Latin Modern or Gyre) come in OpenType variants too, so these +will be used.

+--ldx]]-- + +function fonts.enc.load(filename) + local name = file.removesuffix(filename) + local data = containers.read(fonts.enc.cache(),name) + if data then + return data + end + if name == "unicode" then + data = fonts.enc.make_unicode_vector() -- special case, no tex file for this + end + if data then + return data + end + local vector, tag, hash, unicodes = { }, "", { }, { } + local foundname = resolvers.find_file(filename,'enc') + if foundname and foundname ~= "" then + local ok, encoding, size = resolvers.loadbinfile(foundname) + if ok and encoding then + local enccodes = characters.enccodes + encoding = gsub(encoding,"%%(.-)\n","") + local tag, vec = match(encoding,"/(%w+)%s*%[(.*)%]%s*def") + local i = 0 + for ch in gmatch(vec,"/([%a%d%.]+)") do + if ch ~= ".notdef" then + vector[i] = ch + if not hash[ch] then + hash[ch] = i + else + -- duplicate, play safe for tex ligs and take first + end + if enccodes[ch] then + unicodes[enccodes[ch]] = i + end + end + i = i + 1 + end + end + end + local data = { + name=name, + tag=tag, + vector=vector, + hash=hash, + unicodes=unicodes + } + return containers.write(fonts.enc.cache(), name, data) +end + +--[[ldx-- +

There is no unicode encoding but for practical purposed we define +one.

+--ldx]]-- + +-- maybe make this a function: + +function fonts.enc.make_unicode_vector() + local vector, hash = { }, { } + for code, v in next, characters.data do + local name = v.adobename + if name then + vector[code], hash[name] = name, code + else + vector[code] = '.notdef' + end + end + for name, code in next, characters.synonyms do + vector[code], hash[name] = name, code + end + return containers.write(fonts.enc.cache(), 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash }) +end -- cgit v1.2.3