#!/usr/bin/env texlua ----------------------------------------------------------------------- -- FILE: mkcharacters.lua -- USAGE: ./mkcharacters.lua -- DESCRIPTION: import parts of char-def.lua -- REQUIREMENTS: lua, ConTeXt, the lualibs package -- AUTHOR: Philipp Gesang (Phg), -- VERSION: 1.1 -- CREATED: 2013-05-17 12:41:39+0200 ----------------------------------------------------------------------- -- we create a stripped-down version of char-def.lua ----------------------------------------------------------------------- ----------------------------------------------------------------------- -- config ----------------------------------------------------------------------- local charfile = "./luaotfload-characters.lua" local chardef = "/home/phg/base/char-def.lua" --- for every code point char-def.lua provides a set of fields. they --- are: --- --- * adobename --- * category --- * cjkwd --- * comment --- * contextname --- * description --- * direction --- * lccode --- * linebreak --- * mathclass --- * mathextensible --- * mathfiller --- * mathname --- * mathspec --- * mathstretch --- * mathsymbol --- * mirror --- * shcode --- * specials --- * textclass --- * uccode --- * unicodeslot --- * variants local import = { "direction", "mirror", --> πολυγλωσσία/uax9 "category", --> https://gist.github.com/phi-gamma/5812290 "textclass", --> https://gist.github.com/phi-gamma/6488187 } ----------------------------------------------------------------------- -- includes ----------------------------------------------------------------------- kpse.set_program_name"luatex" for _, lib in next, { "lualibs-lua.lua", "lualibs-lpeg.lua", "lualibs-table.lua", } do local found = assert(kpse.find_file(lib, "lua"), "Could not locate " .. lib .. ".\n" .. "Please install the lualibs package.") require(found) end if not (chardef and lfs.isfile(chardef)) then --- we could grab the file from contextgarden but as Context is part --- of TL it’s not worth bothering chardef = assert(kpse.find_file("char-def.lua", "lua"), "Could not find ConTeXt.") end ----------------------------------------------------------------------- -- functionality ----------------------------------------------------------------------- local get_characters = function ( ) local data local inchan = io.open(chardef, "r") if not inchan then io.write("Could not open file for reading: "..chardef.."\n.") goto fail end data = inchan:read "*all" inchan:close() data = loadstring(data) if data then data() --> characters.data data = nil collectgarbage "collect" if characters.data and next(characters.data) then return characters.data end io.write "Character table empty.\n" goto fail end io.write(chardef .. " is not a valid Lua file.\n") ::fail:: io.write "Emergency exit.\n" os.exit(1) end local extract_fields_indeed extract_fields_indeed = function (data, acc, lastidx) local idx, char = next(data, lastidx) if idx then local imported = { } for i=1, #import do local field = import[i] imported[field] = char[field] end acc[idx] = imported return extract_fields_indeed(data, acc, idx) end return acc end local extract_fields = function (data) return extract_fields_indeed(data, {}, nil) end local writedata = function (data) local outchan = io.open(charfile, "w") if not outchan then io.write("Could not open "..charfile.." for writing.\n") return false end outchan:write(data) outchan:close() return true end do local chardata = get_characters() local stripped = extract_fields(chardata) local serialized = table.serialize(stripped, true, { compact = true, noquotes = true, hexify = true, --- for consistency with char-def }) if writedata(serialized) then goto done end goto fail end ::done:: os.exit(0) ::fail:: io.write "Emergency exit.\n" os.exit(1)