diff options
Diffstat (limited to 'luaotfload-fonts.lua')
-rw-r--r-- | luaotfload-fonts.lua | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/luaotfload-fonts.lua b/luaotfload-fonts.lua new file mode 100644 index 0000000..f49aa7b --- /dev/null +++ b/luaotfload-fonts.lua @@ -0,0 +1,123 @@ +luaotfload = luaotfload or { } +luaotfload.fonts = { } + +luaotfload.fonts.module = { + name = "luaotfload.fonts", + version = 1.001, + date = "2010/01/12", + description = "luaotfload font database.", + author = "Khaled Hosny", + copyright = "Khaled Hosny", + license = "CC0" +} + +kpse.set_program_name("luatex") + +require("luaextra.lua") +require("otfl-luat-dum.lua") + +local upper, splitpath, expandpath, glob = string.upper, file.split_path, kpse.expand_path, dir.glob + +luaotfload.fonts.basename = "otfl-names.lua" +luaotfload.fonts.version = 1.001 +luaotfload.fonts.log = false + +local function log(...) + if luaotfload.fonts.log then + logs.simple(...) + end +end + +local function info(...) + logs.simple(...) +end + +local function clean(str) + return string.gsub(string.lower(str), "[^%a%d]", "") +end + +local function load_font(filename, names) + local mappings = names.mappings + local key + if filename then + local info = fontloader.info(filename) + if info then + if type(info) == "table" and #info > 1 then + for index,sub in ipairs(info) do + key = clean(sub.fullname) + if not mappings[key] then + mappings[key] = { sub.fullname, filename, index } + else + log("Font '%s' already exists.", key) + end + end + else + key = clean(info.fullname) + if not mappings[key] then + mappings[key] = { info.fullname, filename } + else + log("Font '%s' already exists.", key) + end + end + else + log("Failed to load %s", filename) + end + end +end + +local function scan_dir(dirname, names, recursive) + local list, found = { }, { } + for _,ext in ipairs { "otf", "ttf", "ttc", "dfont" } do + if recursive then pat = "/**." else pat = "/*." end + log("Scanning '%s' for '%s' fonts", dirname, ext) + found = glob(dirname .. pat .. ext) + log("%s fonts found", #found) + table.append(list, found) + + log("Scanning '%s' for '%s' fonts", dirname, upper(ext)) + found = glob(dirname .. pat .. upper(ext)) + log("%s fonts found", #found) + table.append(list, found) + end + for _,fnt in ipairs(list) do + load_font(fnt, names) + end +end + +local function scan_os_fonts(names) + local fontdirs + fontdirs = expandpath("$OSFONTDIR") + fontdirs = splitpath(fontdirs, ":") + for _,d in ipairs(fontdirs) do + scan_dir(d, names, true) + end +end + +local function scan_txmf_tree(names) + local fontdirs = expandpath("$OPENTYPEFONTS") + fontdirs = fontdirs .. expandpath("$TTFONTS") + fontdirs = splitpath(fontdirs, ":") + for _,d in ipairs(fontdirs) do + scan_dir(d, names) + end +end + +local function generate() + local fnames = { + mappings = { }, + version = luaotfload.fonts.version + } + + scan_os_fonts(fnames) + scan_txmf_tree(fnames) + logs.simple("%s fonts saved in the database", #table.keys(fnames.mappings)) + io.savedata(luaotfload.fonts.basename, table.serialize(fnames, true)) + logs.simple("Saved font names database in %s\n", luaotfload.fonts.basename) +end + +luaotfload.fonts.scan = scan_dir +luaotfload.fonts.generate = generate + +if arg[0] == "luaotfload-fonts.lua" then + generate() +end |