diff options
Diffstat (limited to 'otfl-font-nms.lua')
-rw-r--r-- | otfl-font-nms.lua | 70 |
1 files changed, 41 insertions, 29 deletions
diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua index 15466a1..305acdc 100644 --- a/otfl-font-nms.lua +++ b/otfl-font-nms.lua @@ -92,50 +92,65 @@ function fontloader.fullinfo(...) return t end -local function load_font(filename, fontnames, texmf, status) - local database = fontnames - local mappings = database.mappings or { } - local families = database.families or { } - local checksums = database.checksums or { } +local function load_font(filename, fontnames, status, newfontnames, newstatus, texmf) + local mappings = newfontnames.mappings or { } + local families = newfontnames.families or { } + local oldmappings = fontnames.mappings or { } + local oldfamilies = fontnames.families or { } if filename then - local db_lastmodif = status[filename] + local db_lastmodif = status[filename] and status[filename].timestamp local true_lastmodif = lfs.attributes(filename, "modification") + newstatus[filename] = {timestamp = true_lastmodif, mappings = {}} if db_lastmodif and db_lastmodif == true_lastmodif then - if trace_loading then - logs.report("font already indexed: %s", filename) + for _, i in ipairs(status[filename].mappings) do + mappings[#mappings+1] = oldmappings[i] + table.insert(newstatus[filename].mappings, #mappings) + if oldmappings[i].names.family then + if not families[oldmappings[i].names.family] then + families[oldmappings[i].names.family] = {} + end + table.insert(families[oldmappings[i].names.family], #mappings) + elseif trace_loading then + logs.report("font with broken names table: %s, ignored", filename) + end + if trace_loading then + logs.report("font already indexed: %s", filename) + end end - return fontnames + return end if trace_loading then logs.report("loading font: %s", filename) end - status[filename] = true_lastmodif + local checksum = file.checksum(filename) local info = fontloader.info(filename) if info then if type(info) == "table" and #info > 1 then for index,_ in ipairs(info) do local fullinfo = fontloader.fullinfo(filename, index-1) + fullinfo.checksum = checksum if texmf then fullinfo.filename = basename(filename) end mappings[#mappings+1] = fullinfo + table.insert(newstatus[filename].mappings, #mappings) if fullinfo.names.family then if not families[fullinfo.names.family] then families[fullinfo.names.family] = { } end table.insert(families[fullinfo.names.family], #mappings) - else - if trace_loading then - logs.report("font with broken names table: %s, ignored", filename) - end + elseif trace_loading then + logs.report("font with broken names table: %s, ignored", filename) end end else local fullinfo = fontloader.fullinfo(filename) + fullinfo.checksum = checksum if texmf then fullinfo.filename = basename(filename) end mappings[#mappings+1] = fullinfo + table.insert(newstatus[filename].mappings, #mappings) if fullinfo.names.family then if not families[fullinfo.names.family] then families[fullinfo.names.family] = { } @@ -153,7 +168,6 @@ local function load_font(filename, fontnames, texmf, status) end end end - return database end -- We need to detect the OS (especially cygwin) to convert paths. @@ -198,7 +212,7 @@ fonts.path_normalize = path_normalize -- in this script) -- - texmf is a boolean saying if we are scanning a texmf directory (always -- true in this script) -local function scan_dir(dirname, fontnames, recursive, texmf, status) +local function scan_dir(dirname, fontnames, status, newfontnames, newstatus, recursive, texmf) local list, found = { }, { } local nbfound = 0 for _,ext in ipairs { "otf", "ttf", "ttc", "dfont" } do @@ -226,14 +240,13 @@ local function scan_dir(dirname, fontnames, recursive, texmf, status) end for _,fnt in ipairs(list) do fnt = path_normalize(fnt) - fontnames = load_font(fnt, fontnames, texmf, status) + load_font(fnt, fontnames, status, newfontnames, newstatus, 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(fontnames, status) +local function scan_texmf_tree(fontnames, status, newfontnames, newstatus) if trace_progress then if expandpath("$OSFONTDIR"):is_empty() then logs.report("scanning TEXMF fonts:") @@ -253,12 +266,11 @@ local function scan_texmf_tree(fontnames, status) if not explored_dirs[d] then count = count + 1 progress(count, #fontdirs) - fontnames = scan_dir(d, fontnames, false, true, status) + scan_dir(d, fontnames, status, newfontnames, newstatus, false, true) explored_dirs[d] = true end end end - return fontnames end -- this function takes raw data returned by fc-list, parses it, normalizes the @@ -279,7 +291,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(fontnames, status) +local function scan_os_fonts(fontnames, status, newfontnames, newstatus) if expandpath("$OSFONTDIR"):is_empty() then if trace_progress then logs.report("scanning OS fonts:") @@ -297,17 +309,15 @@ local function scan_os_fonts(fontnames, status) for _,fnt in ipairs(list) do count = count + 1 progress(count, #list) - fontnames = load_font(fnt, fontnames, false, status) + load_font(fnt, fontnames, status, newfontnames, newstatus, false) end end - return fontnames end local function fontnames_init() return { mappings = { }, families = { }, - checksums = { }, version = names.version, } end @@ -322,7 +332,7 @@ end -- - fontnames is the final table to return -- - force is whether we rebuild it from scratch or not -- - status is a table containing the current status of the database -local function update(fontnames, force, status) +local function update(fontnames, status, force, purge) if force then fontnames = fontnames_init() status = status_init() @@ -336,9 +346,11 @@ local function update(fontnames, force, status) end end end - fontnames = scan_texmf_tree(fontnames, status) - fontnames = scan_os_fonts (fontnames, status) - return fontnames, status + local newfontnames = fontnames_init() + local newstatus = status_init() + scan_texmf_tree(fontnames, status, newfontnames, newstatus) + scan_os_fonts (fontnames, status, newfontnames, newstatus) + return newfontnames, newstatus end names.scan = scan_dir |