summaryrefslogtreecommitdiff
path: root/scripts/mkcharacters
blob: 59582f211cba3de5515c0ff4aced9883db8b86c9 (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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/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>
-----------------------------------------------------------------------
-- we create a stripped-down version of char-def.lua
-----------------------------------------------------------------------

-----------------------------------------------------------------------
--                              config
-----------------------------------------------------------------------
local charfile      = "./build/luaotfload-characters.lua"
local chardef       = arg[1]

---  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 then
  chardef = kpse.expand_path("~/context/tex/texmf-context/tex/context/base/")
          .. "/char-def.lua"
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

io.write(string.format("extracting data from char-def.lua at %s\n",
                       chardef))

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