diff options
| -rw-r--r-- | otfl-font-nms.lua | 145 | ||||
| -rw-r--r-- | update-luatex-font-database.lua | 70 | 
2 files changed, 98 insertions, 117 deletions
| diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua index aeba0f1..7e08919 100644 --- a/otfl-font-nms.lua +++ b/otfl-font-nms.lua @@ -3,73 +3,44 @@  --  -- It is part of the luaotfload bundle, see luaotfload's README for legal  -- notice. - --- some usual initializations -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 and Elie Roux", -    copyright     = "Luaotfload Development Team", -    license       = "CC0" +if not modules then modules = { } end modules ['font-nms'] = { +    version   = 1.002, +    comment   = "companion to luaotfload.lua", +    author    = "Khaled Hosny and Elie Roux", +    copyright = "Luaotfload Development Team", +    license   = "GPL"  } -kpse.set_program_name("luatex") +fonts       = fonts       or { } +fonts.names = fonts.names or { } -local luaextra_file = kpse.find_file("luaextra.lua") -if not luaextra_file then -    texio.write_nl("Error: cannot find 'luaextra.lua', exiting.") -    os.exit(1) -end -dofile(luaextra_file) +local names = fonts.names  local splitpath, expandpath, glob, basename = file.split_path, kpse.expand_path, dir.glob, file.basename  local upper, format, rep = string.upper, string.format, string.rep -function kpse.do_file(name) -    return dofile(kpse.find_file(name)) -end - --- the file name of the font database -luaotfload.fonts.basename   = "otfl-names.lua" - --- the path to add to TEXMFVAR or TEXMFSYSVAR to get the final directory in --- normal cases -luaotfload.fonts.subtexmfvardir = "/tex/" - --- the directory in which the database will be saved, can be overwritten -luaotfload.fonts.directory = kpse.expand_var("$TEXMFVAR") .. luaotfload.fonts.subtexmfvardir - --- the version of the database, to be checked by the lookup function of --- luaotfload -luaotfload.fonts.version    = 2.004 -  -- Log facilities:  -- - level 0 is quiet  -- - level 1 is the progress bar  -- - level 2 prints the searched directories  -- - level 3 prints all the loaded fonts  -- - level 4 prints all informations when searching directories (debug only) -luaotfload.fonts.log_level  = 1 +names.log_level  = 1  local lastislog = 0 -function luaotfload.fonts.log(lvl, fmt, ...) -    if lvl <= luaotfload.fonts.log_level then +function names.log(lvl, fmt, ...) +    if lvl <= names.log_level then          lastislog = 1          texio.write_nl(format("luaotfload | %s", format(fmt,...)))      end  end -local log = luaotfload.fonts.log +local log = names.log  -- The progress bar  local function progress(current, total) -    if luaotfload.fonts.log_level == 1 then +    if names.log_level == 1 then  --      local width   = os.getenv("COLUMNS") -2 --doesn't work          local width   = 78          local percent = current/total @@ -129,16 +100,17 @@ function fontloader.fullinfo(...)      return t  end -local function load_font(filename, names, texmf) +local function load_font(filename, fontnames, texmf)      log(3, "Loading font: %s", filename) -    local mappings  = names.mappings  or { } -    local families  = names.families  or { } -    local checksums = names.checksums or { } +    local database  = fontnames +    local mappings  = database.mappings  or { } +    local families  = database.families  or { } +    local checksums = database.checksums or { }      if filename then          local checksum = file.checksum(filename)          if checksums[checksum] and checksums[checksum] == filename then              log(3, "Font already indexed: %s", filename) -            return +            return fontnames          end          checksums[checksum] = filename          local info = fontloader.info(filename) @@ -177,10 +149,8 @@ local function load_font(filename, names, texmf)          else              log(1, "Failed to load %s", filename)          end -    names.mappings  = names.mappings  or mappings -    names.families  = names.families  or families -    names.checksums = names.checksums or checksums      end +    return database  end  -- We need to detect the OS (especially cygwin) to convert paths. @@ -222,10 +192,7 @@ end  --       in this script)  -- - texmf is a boolean saying if we are scanning a texmf directory (always  --       true in this script) --- - scanned_fonts contains the list of alread scanned fonts, in order for them ---       not to be scanned twice. The function populates this list with the ---       fonts it scans. -local function scan_dir(dirname, names, recursive, texmf, scanned_fonts) +local function scan_dir(dirname, fontnames, recursive, texmf)      local list, found = { }, { }      local nbfound = 0      for _,ext in ipairs { "otf", "ttf", "ttc", "dfont" } do @@ -245,22 +212,19 @@ local function scan_dir(dirname, names, recursive, texmf, scanned_fonts)      log(2, "%d fonts found in '%s'", nbfound, dirname)      for _,fnt in ipairs(list) do          fnt = path_normalize(fnt) -        if not scanned_fonts[fnt] then -            load_font(fnt, names, texmf) -            scanned_fonts[fnt] = true -        end +        fontnames = load_font(fnt, fontnames, texmf)      end +    return fontnames  end  -- The function that scans all fonts in the texmf tree, through kpathsea  -- variables OPENTYPEFONTS and TTFONTS of texmf.cnf -local function scan_texmf_tree(names) +local function scan_texmf_tree(fontnames)      if expandpath("$OSFONTDIR"):is_empty() then          log(1, "Scanning TEXMF fonts:")      else          log(1, "Scanning TEXMF and OS fonts:")      end -    local scanned_fonts = {}      local fontdirs = expandpath("$OPENTYPEFONTS")      fontdirs = fontdirs .. string.gsub(expandpath("$TTFONTS"), "^\.", "")      if not fontdirs:is_empty() then @@ -273,12 +237,12 @@ local function scan_texmf_tree(names)              if not explored_dirs[d] then                  count = count + 1                  progress(count, #fontdirs) -                scan_dir(d, names, false, true, scanned_fonts) +                fontnames = scan_dir(d, fontnames, false, true)                  explored_dirs[d] = true              end          end      end -    return scanned_fonts +    return fontnames  end  -- this function takes raw data returned by fc-list, parses it, normalizes the @@ -299,7 +263,7 @@ end  -- only if OSFONTDIR is empty (which is the case under most Unix by default).  -- If OSFONTDIR is non-empty, this means that the system fonts it contains have  -- already been scanned, and thus we don't scan them again. -local function scan_os_fonts(names, scanned_fonts) +local function scan_os_fonts(fontnames)      if expandpath("$OSFONTDIR"):is_empty() then           log(1, "Scanning system fonts:")          log(2, "Executing 'fc-list : file'") @@ -313,12 +277,10 @@ local function scan_os_fonts(names, scanned_fonts)          for _,fnt in ipairs(list) do              count = count + 1              progress(count, #list) -            if not scanned_fonts[fnt] then -                load_font(fnt, names, false) -                scanned_fonts[fnt] = true -            end +            fontnames = load_font(fnt, fontnames, false)          end      end +    return fontnames  end  local function fontnames_init() @@ -326,50 +288,25 @@ local function fontnames_init()          mappings  = { },          families  = { },          checksums = { }, -        version   = luaotfload.fonts.version, +        version   = names.version,      }  end --- The main function, scans everything and writes the file. -local function reload(force) -    texio.write("luaotfload | Generating font names database.") -    local fnames +-- The main function, scans everything +local function update(fontnames,force)      if force then -        fnames = fontnames_init() +        fontnames = fontnames_init()      else -        fnames = kpse.do_file(luaotfload.fonts.basename) -	if fnames and fnames.version and fnames.version == luaotfload.fonts.version then +	if fontnames and fontnames.version and fontnames.version == names.version then          else              log(2, "Old font names database version, generating new one") -            fnames = fontnames_init() +            fontnames = fontnames_init()          end      end -    local savepath = luaotfload.fonts.directory -    savepath = path_normalize(savepath) -    if not lfs.isdir(savepath) then -        log(1, "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 .. '/' .. luaotfload.fonts.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() -    -- we save the scanned fonts in a variable in order for scan_os_fonts  -    -- not to rescan them -    local scanned_fonts = scan_texmf_tree(fnames) -    scan_os_fonts  (fnames, scanned_fonts) -    log(1, "%s fonts in %s families saved in the database",  -        #fnames.mappings, #table.keys(fnames.families)) -    io.savedata(savepath, table.serialize(fnames, true)) -    log(1, "Saved font names database in %s\n", savepath) +    fontnames = scan_texmf_tree(fontnames) +    fontnames = scan_os_fonts  (fontnames) +    return fontnames  end -luaotfload.fonts.scan   = scan_dir -luaotfload.fonts.reload = reload +names.scan   = scan_dir +names.update = update diff --git a/update-luatex-font-database.lua b/update-luatex-font-database.lua index d067c56..e236033 100644 --- a/update-luatex-font-database.lua +++ b/update-luatex-font-database.lua @@ -6,11 +6,6 @@  -- It is part of the luaotfload bundle, please see the luaotfload documentation  -- for more info. -kpse.set_program_name("luatex") - -local name = 'update-luatex-font-database' -local version = '1.07' -- same version number as luaotfload -  --[[   first we import luaotfload-fonts.lua.   Basically it 'exports' three usefult things: the two overwritable variables @@ -20,9 +15,22 @@ local version = '1.07' -- same version number as luaotfload   - luaotfload.fonts.generate: the function to generate the database  ]] -require("luaotfload-fonts") +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      = names.log +  local function help_msg()      texio.write_nl(string.format([[Usage: %s [OPTION]... @@ -49,7 +57,7 @@ end  local function version_msg()      texio.write_nl(string.format( -        "%s version %s, database version %s.\n", name, version, luaotfload.fonts.version)) +        "%s version %s, database version %s.\n", name, version, names.version))  end  --[[ @@ -84,7 +92,7 @@ local function do_run_fc_cache(c)      if system == 'windows' then          toexec = 'fc-cache.exe' -- TODO: to test on a non-cygwin Windows      end -    luaotfload.fonts.log(1, 'Executing %s...\n', toexec) +    names.log(1, 'Executing %s...\n', toexec)      os.execute(toexec)  end @@ -111,7 +119,7 @@ local function process_cmdline()              help_msg()              os.exit(0)          elseif v == "d" then -            luaotfload.fonts.directory = optarg [i] +            mkluatexfontdb.directory = optarg [i]          elseif v == "f" then              force_reload = 1          elseif v == "fc-cache" then @@ -119,15 +127,51 @@ local function process_cmdline()          elseif v == "no-fc-cache" then              run_fc_cache = 0          elseif v == "sys" then -            luaotfload.fonts.directory = kpse.expand_var("$TEXMFSYSVAR") .. luaotfload.fonts.subtexmfvardir +            mkluatexfontdb.directory = kpse.expand_var("$TEXMFSYSVAR") .. mkluatexfontdb.subtexmfvardir          end      end      if string.match(arg[0], '-sys') then -        luaotfload.fonts.directory = kpse.expand_var("$TEXMFSYSVAR") .. luaotfload.fonts.subtexmfvardir +        mkluatexfontdb.directory = kpse.expand_var("$TEXMFSYSVAR") .. mkluatexfontdb.subtexmfvardir      end -    luaotfload.fonts.log_level = log_level +    names.log_level = log_level  end  process_cmdline()  do_run_fc_cache(run_fc_cache) -luaotfload.fonts.reload(force_reload) + +-- 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) +    texio.write("luaotfload | Generating font names database.") +    local savepath = mkluatexfontdb.directory +    if not lfs.isdir(savepath) then +        log(1, "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(1, "%s fonts in %s families saved in the database",  +        #fontnames.mappings, #table.keys(fontnames.families)) +    io.savedata(savepath, table.serialize(fontnames, true)) +    log(1, "Saved font names database in %s\n", savepath) +end + +generate(force_reload) | 
