summaryrefslogtreecommitdiff
path: root/mkluatexfontdb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mkluatexfontdb.lua')
-rw-r--r--mkluatexfontdb.lua177
1 files changed, 177 insertions, 0 deletions
diff --git a/mkluatexfontdb.lua b/mkluatexfontdb.lua
new file mode 100644
index 0000000..0363f00
--- /dev/null
+++ b/mkluatexfontdb.lua
@@ -0,0 +1,177 @@
+#!/usr/bin/env texlua
+-- This file is copyright 2010 Elie Roux and Khaled Hosny and is under CC0
+-- license (see http://creativecommons.org/publicdomain/zero/1.0/legalcode).
+--
+-- This file is a wrapper for the luaotfload-fonts.lua script.
+-- It is part of the luaotfload bundle, please see the luaotfload documentation
+-- for more info.
+
+--[[
+ first we import luaotfload-fonts.lua.
+ Basically it 'exports' three usefult things: the two overwritable variables
+ - luaotfload.fonts.basename: the filename of the database
+ - luaotfload.fonts.directory: the directory of the database
+ and the function
+ - luaotfload.fonts.generate: the function to generate the database
+]]
+
+kpse.set_program_name("luatex")
+
+require("luaextra")
+require("otfl-font-nms")
+require("alt_getopt")
+
+local name = 'update-luatex-font-database'
+local version = '1.07' -- same version number as luaotfload
+
+mkluatexfontdb = { } -- just for now, elie is rewriting it anyway
+local names = fonts.names
+names.basename = names.basename or "otfl-names.lua"
+names.version = names.version or 2.004
+
+local log = logs.report
+
+local function help_msg()
+ texio.write_nl(string.format([[Usage: %s [OPTION]...
+
+Rebuild the LuaTeX font database.
+
+Valid options:
+ -d --dbdir DIRECTORY writes the database in the specified directory
+ -f --force force re-indexing all fonts
+ -q --quiet don't output anything
+ -v --verbose=LEVEL be more verbose (print the searched directories)
+ -vv print the loaded fonts
+ -vvv print all steps of directory searching
+ -V --version prints the version and exits
+ -h --help prints this message
+ --fc-cache run fc-cache before updating database
+ (default is to run it if available)
+ --no-fc-cache do not run fc-cache
+ --sys writes the database for the whole system
+ (default is only for the user)
+
+The output database file is named otfl-fonts.lua.
+]], name))
+end
+
+local function version_msg()
+ texio.write_nl(string.format(
+ "%s version %s, database version %s.\n", name, version, names.version))
+end
+
+--[[
+ Command-line processing.
+ Here we fill cmdargs with the good values, and then analyze it, setting
+ luaotfload.fonts.log_level luaotfload.fonts.directory if necessary.
+]]
+
+local long_opts = {
+ dbdir = "d",
+ force = "f",
+ quiet = "q",
+ verbose = 1,
+ version = "V",
+ help = "h",
+ sys = 0,
+ ['fc-cache'] = 0,
+ ['no-fc-cache'] = 0,
+}
+
+local short_opts = "d:fqvVh"
+
+-- Function running fc-cache if needed.
+-- The argument is nil for default, 0 for no fc-cache and 1 for fc-cache.
+-- Default behaviour is to run fc-cache if available.
+local function do_run_fc_cache(c)
+ if c == 0 then return end
+ if not c then
+ -- TODO: detect if fc-cache is available
+ end
+ local toexec = 'fc-cache'
+ if system == 'windows' then
+ toexec = 'fc-cache.exe' -- TODO: to test on a non-cygwin Windows
+ end
+ log('executing %s...\n', toexec)
+ os.execute(toexec)
+end
+
+-- a temporary variable, containing the command line option concerning fc-cache
+local run_fc_cache = nil
+local force_reload = nil
+
+local function process_cmdline()
+ local opts, optind, optarg = alt_getopt.get_ordered_opts (arg, short_opts, long_opts)
+ local log_level = 1
+ for i,v in ipairs(opts) do
+ if v == "q" then
+ log_level = 0
+ elseif v == "v" then
+ if log_level > 0 then
+ log_level = log_level + 1
+ else
+ log_level = 2
+ end
+ elseif v == "V" then
+ version_msg()
+ os.exit(0)
+ elseif v == "h" then
+ help_msg()
+ os.exit(0)
+ elseif v == "d" then
+ mkluatexfontdb.directory = optarg [i]
+ elseif v == "f" then
+ force_reload = 1
+ elseif v == "fc-cache" then
+ run_fc_cache = 1
+ elseif v == "no-fc-cache" then
+ run_fc_cache = 0
+ elseif v == "sys" then
+ mkluatexfontdb.directory = kpse.expand_var("$TEXMFSYSVAR") .. mkluatexfontdb.subtexmfvardir
+ end
+ end
+ if string.match(arg[0], '-sys') then
+ mkluatexfontdb.directory = kpse.expand_var("$TEXMFSYSVAR") .. mkluatexfontdb.subtexmfvardir
+ end
+ names.log_level = log_level
+end
+
+process_cmdline()
+do_run_fc_cache(run_fc_cache)
+
+-- the path to add to TEXMFVAR or TEXMFSYSVAR to get the final directory in
+-- normal cases
+mkluatexfontdb.subtexmfvardir = "/tex/"
+
+-- the directory in which the database will be saved, can be overwritten
+mkluatexfontdb.directory = kpse.expand_var("$TEXMFVAR") .. mkluatexfontdb.subtexmfvardir
+
+
+local function generate(force)
+ log("generating font names database.")
+ local savepath = mkluatexfontdb.directory
+ if not lfs.isdir(savepath) then
+ log("creating directory %s", savepath)
+ lfs.mkdir(savepath)
+ if not lfs.isdir(savepath) then
+ texio.write_nl(string.format("Error: cannot create directory '%s', exiting.\n", savepath))
+ os.exit(1)
+ end
+ end
+ savepath = savepath .. '/' .. names.basename
+ local fh = io.open(savepath, 'a+')
+ if not fh then
+ texio.write_nl(string.format("Error: cannot write file '%s', exiting.\n", savepath))
+ os.exit(1)
+ end
+ fh:close()
+ local fontnames
+ fontnames = dofile(kpse.find_file(names.basename))
+ fontnames = names.update (fontnames, force)
+ log("%s fonts in %s families saved in the database",
+ #fontnames.mappings, #table.keys(fontnames.families))
+ io.savedata(savepath, table.serialize(fontnames, true))
+ log("saved font names database in %s\n", savepath)
+end
+
+generate(force_reload)