summaryrefslogtreecommitdiff
path: root/mkcharacters
blob: a1c420481c3735e38933d1b739a4cea77d99686d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/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.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       = "~phg/base/char-def.lua"
local import        = {
  "direction", "mirror", --> πολυγλωσσία/uax9
  "category",            --> https://gist.github.com/phi-gamma/5812290
}

-----------------------------------------------------------------------
--                             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)