diff options
| author | Philipp Gesang <phg42.2a@gmail.com> | 2014-07-13 15:30:16 +0200 | 
|---|---|---|
| committer | Philipp Gesang <phg42.2a@gmail.com> | 2014-07-13 15:30:16 +0200 | 
| commit | 13dd80306495936deedf9ba81e44e7eb258098a4 (patch) | |
| tree | fa315c4a27b4b42e4ba1769a0a5dec6d5cd288f6 /scripts/mkcharacters | |
| parent | a3cd328a3e0ef88b3ba3239664f53df70d1c7aef (diff) | |
| parent | 8956e54b744091acabd83207c75826b0b1087c47 (diff) | |
| download | luaotfload-13dd80306495936deedf9ba81e44e7eb258098a4.tar.gz | |
Merge pull request #228 from phi-gamma/master
merge version 2.5 (texlive2014) into master
Diffstat (limited to 'scripts/mkcharacters')
| -rwxr-xr-x | scripts/mkcharacters | 156 | 
1 files changed, 156 insertions, 0 deletions
diff --git a/scripts/mkcharacters b/scripts/mkcharacters new file mode 100755 index 0000000..abed2c9 --- /dev/null +++ b/scripts/mkcharacters @@ -0,0 +1,156 @@ +#!/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:  2.5 +--     MODIFIED: 2014-02-11 07:24:25+0100 +----------------------------------------------------------------------- +-- we create a stripped-down version of char-def.lua +----------------------------------------------------------------------- + +----------------------------------------------------------------------- +--                              config +----------------------------------------------------------------------- +local charfile      = "./build/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) + +--- vim:ft=lua:ts=2:et:sw=2  | 
