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
|
#!/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.4
-- 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)
--- vim:ft=lua:ts=2:et:sw=2
|