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
|
#!/usr/bin/env texlua
-----------------------------------------------------------------------
-- FILE: mkcharacters.lua
-- USAGE: ./mkcharacters.lua
-- DESCRIPTION: import parts of char-def.lua
-- REQUIREMENTS: lua, lpeg, 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)
|