summaryrefslogtreecommitdiff
path: root/mkglyphlist
blob: 9ee1528fac16006d41725ed48fd250862d469488 (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
#!/usr/bin/env texlua
-----------------------------------------------------------------------
--         FILE:  mkglyphlist.lua
--        USAGE:  ./mkglyphlist.lua 
--  DESCRIPTION:  part of the luaotfload package
-- REQUIREMENTS:  lua, lpeg, luasocket, the lualibs package
--       AUTHOR:  Philipp Gesang (Phg), <phg42.2a@gmail.com>
--      VERSION:  1.0
--      CREATED:  04/23/2013 12:42:17 PM CEST
-----------------------------------------------------------------------
--                              config
-----------------------------------------------------------------------
local glyphfile     = "./glyphlist.txt"
local font_age      = "./font-age.lua"
local glyph_source  = "http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt"

-----------------------------------------------------------------------
--                             includes
-----------------------------------------------------------------------
require"lpeg"
require"socket"

kpse.set_program_name"luatex"
dofile(kpse.find_file("lualibs-lua.lua",   "lua"))
dofile(kpse.find_file("lualibs-lpeg.lua",  "lua"))
dofile(kpse.find_file("lualibs-table.lua", "lua")) --- for serialization

local C, Cf, Cg, Ct, P, R =
  lpeg.C, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.R

local http = socket.http

-----------------------------------------------------------------------
--                           functionality
-----------------------------------------------------------------------

local dec_of_hex = function (hex) return tonumber(hex, 16) end

local separator    = P";"
local gartenzaun   = P"#"
local eol          = P"\n\r" + P"\r\n" + P"\r" + P"\n"
local space        = P" "
local alphanum     = R("az", "AZ", "09")
local hexdigit     = R("af", "AF", "09")
local eof_tag      = gartenzaun * P"--end"
local header_line  = gartenzaun * (1-eol)^0 * eol
local codepoint    = hexdigit^1
local glyphname    = alphanum^1

local definition   = Cg(C(glyphname) * separator * (C(codepoint)/ dec_of_hex))
                   --- With combined glyphs we take only the first
                   --- value as char-def and font-age do, and skip
                   --- the rest.
                   * (space * codepoint)^0
                   * eol
local definitions  = Cf(Ct"" * definition^1, rawset)

local p_glyphs     = header_line^0 * definitions * eof_tag

local get_glyphs = function (data)
  local res = lpeg.match(p_glyphs, data)
  if not res then
    print("error: could not parse glyph list")
    os.exit(-1)
  end
  return res
end

local file_header = [==[
if not modules then modules = { } end modules ["font-age"] = {
  version     = 2.200,
  comment     = "part of the luaotfload package",
  author      = "luaotfload team / mkglyphlist",
  copyright   = "derived from %s",
  original    = "Adobe Glyph List, version 2.0, September 20, 2002",
  dataonly    = true,
}

if context then
  logs.report("fatal error","this module is not for context")
  os.exit(-1)
end

--[[doc--
Everything below has been autogenerated. Run mkglyphlist to rebuild
font-age.lua.
--doc]]--

]==]

local writedata = function (data)
  data = table.serialize(data, true)
  data = string.format(file_header, glyph_source) .. data
  local fh = io.open(font_age, "wb")
  if not fh then
    print(string.format("error: %s not writable", font_age))
    os.exit(-1)
  end
  print(string.format("saving %d bytes to %s", #data, font_age))
  fh:write(data)
  fh:close()
end


local get_raw get_raw = function (retry)
  local fh = io.open(glyphfile, "rb")
  if fh then
    local data = fh:read"*all"
    fh:close()
    if data then return data end
  elseif not retry then --- attempt download
    print"info: retrieving glyph list from"
    print(glyph_source)
    local glyphdata = http.request(glyph_source)
    if glyphdata then
      local fh = io.open(glyphfile, "wb")
      if not fh then
        print"error: glyph file not writable"
        os.exit(-1)
      end
      fh:write(glyphdata)
      fh:close()
      return get_raw(true)
    end
    print"error: download failed"
    os.exit(-1)
  end
  print("error: could not obtain glyph data from "..glyphfile)
  os.exit(-1)
end

local main = function ()
  if arg[1] then glyphfile = arg[1] end
  if arg[2] then font_age  = arg[2] end

  local data    = get_raw()
  local parsed  = get_glyphs(data)
  writedata(parsed)
  return 0
end


return main()