diff options
-rw-r--r-- | luaotfload-fonts.lua | 123 | ||||
-rw-r--r-- | otfl-fonts.lua | 79 |
2 files changed, 123 insertions, 79 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 diff --git a/otfl-fonts.lua b/otfl-fonts.lua deleted file mode 100644 index 6d9ae18..0000000 --- a/otfl-fonts.lua +++ /dev/null @@ -1,79 +0,0 @@ -otfl = otfl or { } -otfl.fonts = { } - -otfl.fonts.module = { - name = "otfl.fonts", - version = 1.001, - date = "2010/01/10", - description = "luaotfload font database.", - author = "Khaled Hosny", - copyright = "Khaled Hosny", - license = "CC0" -} - -otfl.fonts.basename = "otfl-names.lua" - -kpse.set_program_name("luatex") - -require("luaextra.lua") -require("otfl-luat-dum.lua") - -local fnames = fnames or { } -fnames.mappings = fnames.mappings or { } -fnames.version = 1.001 - -local function clean(str) - if str then - return string.gsub(string.lower(str),"[^%a%d]","") - end -end - -function otfl.fonts.load(filename,names,force) - local mappings = names.mappings - local key - if filename then - local i = fontloader.info(filename) - if i then - if type(i) == "table" and #i > 1 then - for k,v in ipairs(i) do - key = clean(v.fullname) - if not mappings[key] or force then - mappings[key] = { v.fullname, filename, k } - end - end - - else - key = clean(i.fullname) - if not mappings[key] or force then - mappings[key] = { i.fullname, filename } - end - end - else - logs.simple("Failed to load %s", filename) - end - end -end - -function otfl.fonts.reload(list,names) - for _,v in ipairs(list) do - otfl.fonts.load(v,names,force) - end -end - -function otfl.fonts.fontlist() - local fc = io.popen("fc-list : file") - local l = {} - string.gsub(fc:read("*a"), "(.-): \n", function(h) table.insert(l, h) return "" end) - fc:close() - return l -end - -local function main() - local flist = otfl.fonts.fontlist() - otfl.fonts.reload(flist,fnames) - logs.simple("%s fonts found, %s saved in the database", #flist, #table.keys(fnames.mappings)) - io.savedata(otfl.fonts.basename, table.serialize(fnames, true)) - logs.simple("Saved names database in %s\n", otfl.fonts.basename) -end - -main() |