diff options
author | Elie Roux <elie.roux@telecom-bretagne.eu> | 2013-05-17 07:04:03 -0700 |
---|---|---|
committer | Elie Roux <elie.roux@telecom-bretagne.eu> | 2013-05-17 07:04:03 -0700 |
commit | 321d0c6d4242095f4193a8aa0bfc3fcfef6201d2 (patch) | |
tree | 52e30f45d945369b072893f029e0f5e59b5b116f /mkcharacters | |
parent | 1e629e2d39ceeca74aebc4786bcc79fe59a8ae16 (diff) | |
parent | aceb8a22bd3e7c53de492d3e806ae265942ccfa6 (diff) | |
download | luaotfload-321d0c6d4242095f4193a8aa0bfc3fcfef6201d2.tar.gz |
Merge pull request #77 from phi-gamma/master
address Robert’s feature request concerning ``\letterspacefont``
Diffstat (limited to 'mkcharacters')
-rwxr-xr-x | mkcharacters | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/mkcharacters b/mkcharacters new file mode 100755 index 0000000..a627ea9 --- /dev/null +++ b/mkcharacters @@ -0,0 +1,123 @@ +#!/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), <phg42.2a@gmail.com> +-- VERSION: 1.0 +-- 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 = "~phg/base/char-def.lua" +local import = { "direction", "mirror", } --> πολυγλωσσία/uax9 + +----------------------------------------------------------------------- +-- 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) + |