diff options
| -rw-r--r-- | src/luaotfload-database.lua | 440 | 
1 files changed, 226 insertions, 214 deletions
diff --git a/src/luaotfload-database.lua b/src/luaotfload-database.lua index f4aab16..d9d7594 100644 --- a/src/luaotfload-database.lua +++ b/src/luaotfload-database.lua @@ -45,7 +45,7 @@ local stripslashes             = parsers.stripslashes  local splitcomma               = parsers.splitcomma  local log                      = luaotfload.log -local report                   = log.report +local logreport                = log and log.report or print -- overriden later on  local report_status            = log.names_status  local report_status_start      = log.names_status_start  local report_status_stop       = log.names_status_stop @@ -119,19 +119,10 @@ local tablefastcopy            = table.fastcopy  local tabletofile              = table.tofile  local tabletohash              = table.tohash  local tableserialize           = table.serialize ---- the font loader namespace is “fonts”, same as in Context ---- we need to put some fallbacks into place for when running ---- as a script -fonts                          = fonts          or { } -fonts.names                    = fonts.names    or { } -fonts.definers                 = fonts.definers or { } - -local names                    = fonts.names +local names                    = fonts and fonts.names or { } +  local name_index               = nil --> upvalue for names.data  local lookup_cache             = nil --> for names.lookups -names.version                  = 2.51 -names.data                     = nil      --- contains the loaded database -names.lookups                  = nil      --- contains the lookup cache  --- string -> (string * string)  local make_luanames = function (path) @@ -485,12 +476,12 @@ load_names = function (dry_run, no_rebuild)      local foundname, data = load_lua_file (config.luaotfload.paths.index_path_lua)      if data then -        report ("log", 0, "db", -                "Font names database loaded from %s", foundname) -        report ("term", 3, "db", -                "Font names database loaded from %s", foundname) -        report ("info", 3, "db", "Loading took %0.f ms.", -                1000 * (osgettimeofday () - starttime)) +        logreport ("log", 0, "db", +                   "Font names database loaded from %s", foundname) +        logreport ("term", 3, "db", +                   "Font names database loaded from %s", foundname) +        logreport ("info", 3, "db", "Loading took %0.f ms.", +                   1000 * (osgettimeofday () - starttime))          local db_version, names_version          if data.meta then @@ -503,32 +494,32 @@ load_names = function (dry_run, no_rebuild)          end          names_version = names.version          if db_version ~= names_version then -            report ("both", 0, "db", -                    [[Version mismatch; expected %4.3f, got %4.3f.]], -                    names_version, db_version) +            logreport ("both", 0, "db", +                       [[Version mismatch; expected %4.3f, got %4.3f.]], +                       names_version, db_version)              if not fonts_reloaded then -                report ("both", 0, "db", [[Force rebuild.]]) +                logreport ("both", 0, "db", [[Force rebuild.]])                  data = update_names ({ }, true, false)                  if not data then -                    report ("both", 0, "db", -                            "Database creation unsuccessful.") +                    logreport ("both", 0, "db", +                               "Database creation unsuccessful.")                  end              end          end      else          if no_rebuild == true then -            report ("both", 2, "db", -                    [[Database does not exist, skipping rebuild though.]]) +            logreport ("both", 2, "db", +                       [[Database does not exist, skipping rebuild though.]])              return false          end -        report ("both", 0, "db", -                [[Font names database not found, generating new one.]]) -        report ("both", 0, "db", -                [[This can take several minutes; please be patient.]]) +        logreport ("both", 0, "db", +                   [[Font names database not found, generating new one.]]) +        logreport ("both", 0, "db", +                   [[This can take several minutes; please be patient.]])          data = update_names (initialize_namedata (get_font_filter ()),                               nil, dry_run)          if not data then -            report ("both", 0, "db", "Database creation unsuccessful.") +            logreport ("both", 0, "db", "Database creation unsuccessful.")          end      end      return data @@ -559,12 +550,12 @@ local load_lookups  load_lookups = function ( )      local foundname, data = load_lua_file(config.luaotfload.paths.lookup_path_lua)      if data then -        report("log", 0, "cache", "Lookup cache loaded from %s.", foundname) -        report("term", 3, "cache", -               "Lookup cache loaded from %s.", foundname) +        logreport ("log", 0, "cache", "Lookup cache loaded from %s.", foundname) +        logreport ("term", 3, "cache", +                   "Lookup cache loaded from %s.", foundname)      else -        report("both", 1, "cache", -               "No lookup cache, creating empty.") +        logreport ("both", 1, "cache", +                   "No lookup cache, creating empty.")          data = { }      end      lookup_cache = data @@ -780,23 +771,24 @@ local lookup_font_name_cached  lookup_font_name_cached = function (specification)      if not lookup_cache then load_lookups () end      local request = hash_request(specification) -    report("both", 4, "cache", "Looking for %q in cache ...", -           request) +    logreport ("both", 4, "cache", "Looking for %q in cache ...", +               request)      local found = lookup_cache [request]      --- case 1) cache positive ----------------------------------------      if found then --- replay fields from cache hit -        report("info", 4, "cache", "Found!") +        logreport ("info", 4, "cache", "Found!")          local basename = found[1]          --- check the presence of the file in case it’s been removed          local success = verify_font_file (basename)          if success == true then              return basename, found[2], true          end -        report("both", 4, "cache", "Cached file not found; resolving again.") +        logreport ("both", 4, "cache", +                   "Cached file not found; resolving again.")      else -        report("both", 4, "cache", "Not cached; resolving.") +        logreport ("both", 4, "cache", "Not cached; resolving.")      end      --- case 2) cache negative ---------------------------------------- @@ -807,16 +799,16 @@ lookup_font_name_cached = function (specification)      end      --- ... then we add the fields to the cache ... ...      local entry = { filename, subfont } -    report("both", 4, "cache", "New entry: %s.", request) +    logreport ("both", 4, "cache", "New entry: %s.", request)      lookup_cache [request] = entry      --- obviously, the updated cache needs to be stored.      --- TODO this should trigger a save only once the      ---      document is compiled (finish_pdffile callback?) -    report("both", 5, "cache", "Saving updated cache.") +    logreport ("both", 5, "cache", "Saving updated cache.")      local success = save_lookups ()      if not success then --- sad, but not critical -        report("both", 0, "cache", "Error writing cache.") +        logreport ("both", 0, "cache", "Error writing cache.")      end      return filename, subfont  end @@ -973,8 +965,8 @@ local lookup_familyname = function (specification, name, style, askedsize)      if not success then          return nil, nil      end -    report ("info", 2, "db", "Match found: %s(%d).", -            resolved, subfont or 0) +    logreport ("info", 2, "db", "Match found: %s(%d).", +               resolved, subfont or 0)      return resolved, subfont  end @@ -1140,9 +1132,9 @@ reload_db = function (why, caller, ...)      local namedata  = name_index      local formats   = tableconcat (namedata.meta.formats, ",") -    report ("both", 0, "db", -            "Reload initiated (formats: %s); reason: %q.", -            formats, why) +    logreport ("both", 0, "db", +               "Reload initiated (formats: %s); reason: %q.", +               formats, why)      set_font_filter (formats)      namedata = update_names (namedata, false, false) @@ -1153,7 +1145,7 @@ reload_db = function (why, caller, ...)          return caller (...)      end -    report ("both", 0, "db", "Database update unsuccessful.") +    logreport ("both", 0, "db", "Database update unsuccessful.")  end  --- string -> string -> int @@ -1237,15 +1229,15 @@ find_closest = function (name, limit)      if n_distances > 0 then --- got some data          tablesort(distances)          limit = mathmin(n_distances, limit) -        report(false, 1, "query", -               "Displaying %d distance levels.", limit) +        logreport (false, 1, "query", +                   "Displaying %d distance levels.", limit)          for i = 1, limit do              local dist     = distances[i]              local namelst  = by_distance[dist] -            report(false, 0, "query", -                   "Distance from \"%s\": %s\n    " -                   .. tableconcat (namelst, "\n    "), +            logreport (false, 0, "query", +                       "Distance from \"%s\": %s\n    " +                       .. tableconcat (namelst, "\n    "),                     name, dist)          end @@ -1273,7 +1265,7 @@ local load_font_file = function (filename, subfont)      local rawfont, _msg = fontloaderopen (filename, subfont)      --local rawfont, _msg = fontloaderinfo (filename, subfont)      if not rawfont then -        report ("log", 1, "db", "ERROR: failed to open %s.", filename) +        logreport ("log", 1, "db", "ERROR: failed to open %s.", filename)          return      end      return rawfont @@ -1316,8 +1308,8 @@ local get_english_names = function (metadata)      end      -- no (English) names table, probably a broken font -    report("both", 3, "db", -            "%s: missing or broken English names table.", basename) +    logreport ("both", 3, "db", +               "%s: missing or broken English names table.", basename)      return { fontname = metadata.fontname,               fullname = metadata.fullname, }  end @@ -1343,9 +1335,9 @@ local get_raw_info = function (metadata, basename)          --- Broken names table, e.g. avkv.ttf with UTF-16 strings;          --- we put some dummies in place like the fontloader          --- (font-otf.lua) does. -        report("both", 3, "db", -               "%s has invalid postscript font names, using dummies.", -               basename) +        logreport ("both", 3, "db", +                   "%s has invalid postscript font names, using dummies.", +                   basename)          fontname = "bad-fontname-" .. basename          fullname = "bad-fullname-" .. basename      end @@ -1619,7 +1611,7 @@ local compare_timestamps = function (fullname,      if targetentrystatus ~= nil      and targetentrystatus.timestamp == targettimestamp then -        report ("log", 3, "db", "Font %q already read.", fullname) +        logreport ("log", 3, "db", "Font %q already read.", fullname)          return false      end @@ -1641,7 +1633,7 @@ local compare_timestamps = function (fullname,              targetentrystatus.index [targetindex + 1] = location          end -        report ("log", 3, "db", "Font %q already indexed.", fullname) +        logreport ("log", 3, "db", "Font %q already indexed.", fullname)          return false      end @@ -1721,8 +1713,8 @@ local read_font_names = function (fullname,      --- 1) skip if blacklisted      if names.blacklist[fullname] or names.blacklist[basename] then -        report("log", 2, "db", -               "Ignoring blacklisted font %q.", fullname) +        logreport ("log", 2, "db", +                   "Ignoring blacklisted font %q.", fullname)          return false      end @@ -1745,8 +1737,8 @@ local read_font_names = function (fullname,      local loader    = loaders [format] --- ot_fullinfo, t1_fullinfo      if not loader then -        report ("both", 0, "db", -                "Unknown format: %q, skipping.", format) +        logreport ("both", 0, "db", +                   "Unknown format: %q, skipping.", format)          return false      end @@ -1755,8 +1747,8 @@ local read_font_names = function (fullname,      local info = fontloaderinfo (fullname)      if not info then -        report ("log", 1, "db", -                "Failed to read basic information from %q", basename) +        logreport ("log", 1, "db", +                   "Failed to read basic information from %q", basename)          return false      end @@ -1830,9 +1822,7 @@ end  fonts.path_normalize = path_normalize -names.blacklist = { } - -local blacklist   = names.blacklist +local blacklist = { }  local p_blacklist --- prefixes of dirs  --- string list -> string list @@ -1861,8 +1851,8 @@ local create_blacklist = function (blacklist, whitelist)      local result = { }      local dirs   = { } -    report("info", 2, "db", "Blacklisting %d files and directories.", -           #blacklist) +    logreport ("info", 2, "db", "Blacklisting %d files and directories.", +               #blacklist)      for i=1, #blacklist do          local entry = blacklist[i]          if lfsisdir(entry) then @@ -1872,7 +1862,7 @@ local create_blacklist = function (blacklist, whitelist)          end      end -    report("info", 2, "db", "Whitelisting %d files.", #whitelist) +    logreport ("info", 2, "db", "Whitelisting %d files.", #whitelist)      for i=1, #whitelist do          result[whitelist[i]] = nil      end @@ -1914,9 +1904,9 @@ read_blacklist = function ()                  if first_chr == "%" or stringis_empty(line) then                      -- comment or empty line                  elseif first_chr == "-" then -                    report ("both", 3, "db", -                            "Whitelisted file %q via %q.", -                            line, path) +                    logreport ("both", 3, "db", +                               "Whitelisted file %q via %q.", +                               line, path)                      whitelist[#whitelist+1] = stringsub(line, 2, -1)                  else                      local cmt = stringfind(line, "%%") @@ -1924,9 +1914,9 @@ read_blacklist = function ()                          line = stringsub(line, 1, cmt - 1)                      end                      line = stringstrip(line) -                    report ("both", 3, "db", -                            "Blacklisted file %q via %q.", -                            line, path) +                    logreport ("both", 3, "db", +                               "Blacklisted file %q via %q.", +                               line, path)                      blacklist[#blacklist+1] = line                  end              end @@ -2123,24 +2113,24 @@ end  --- string -> string -> string * string list  local collect_font_filenames_dir = function (dirname, location)      if lpegmatch (p_blacklist, dirname) then -        report ("both", 4, "db", -                "Skipping blacklisted directory %s.", dirname) +        logreport ("both", 4, "db", +                   "Skipping blacklisted directory %s.", dirname)          --- ignore          return { }      end      local found = find_font_files (dirname, location ~= "texmf" and location ~= "local")      if not found then -        report ("both", 4, "db", -                "No such directory: %q; skipping.", dirname) +        logreport ("both", 4, "db", +                   "No such directory: %q; skipping.", dirname)          return { }      end      local nfound = #found      local files  = { } -    report ("both", 4, "db", -            "%d font files detected in %s.", -            nfound, dirname) +    logreport ("both", 4, "db", +               "%d font files detected in %s.", +               nfound, dirname)      for j = 1, nfound do          local fullname = found[j]          files[#files + 1] = { path_normalize (fullname), location } @@ -2184,14 +2174,14 @@ local collect_font_filenames_texmf = function ()      local osfontdir = kpseexpand_path "$OSFONTDIR"      if stringis_empty (osfontdir) then -        report ("info", 1, "db", "Scanning TEXMF for fonts...") +        logreport ("info", 1, "db", "Scanning TEXMF for fonts...")      else -        report ("info", 1, "db", "Scanning TEXMF and $OSFONTDIR for fonts...") +        logreport ("info", 1, "db", "Scanning TEXMF and $OSFONTDIR for fonts...")          if log.get_loglevel () > 3 then              local osdirs = filesplitpath (osfontdir) -            report ("info", 0, "db", "$OSFONTDIR has %d entries:", #osdirs) +            logreport ("info", 0, "db", "$OSFONTDIR has %d entries:", #osdirs)              for i = 1, #osdirs do -                report ("info", 0, "db", "[%d] %s", i, osdirs[i]) +                logreport ("info", 0, "db", "[%d] %s", i, osdirs[i])              end          end      end @@ -2205,14 +2195,14 @@ local collect_font_filenames_texmf = function ()      end      local tasks = filter_out_pwd (filesplitpath (fontdirs)) -    report ("info", 3, "db", -            "Initiating scan of %d directories.", #tasks) +    logreport ("info", 3, "db", +               "Initiating scan of %d directories.", #tasks)      local files = { }      for _, dir in next, tasks do          files = tableappend (files, collect_font_filenames_dir (dir, "texmf"))      end -    report ("term", 3, "db", "Collected %d files.", #files) +    logreport ("term", 3, "db", "Collected %d files.", #files)      return files  end @@ -2247,14 +2237,14 @@ end  --- string list -> size_t  local count_removed = function (old) -    report("log", 4, "db", "Checking removed files.") +    logreport ("log", 4, "db", "Checking removed files.")      local nrem = 0      local nold = #old      for i = 1, nold do          local f = old[i]          if not kpsereadable_file (f) then -            report("log", 2, "db", -                   "File %s does not exist in file system.") +            logreport ("log", 2, "db", +                      "File %s does not exist in file system.")              nrem = nrem + 1          end      end @@ -2281,7 +2271,7 @@ local retrieve_namedata = function (files, currentnames, targetnames, dry_run)      local nfiles    = #files      local nnew      = 0 -    report ("info", 1, "db", "Scanning %d collected font files ...", nfiles) +    logreport ("info", 1, "db", "Scanning %d collected font files ...", nfiles)      local bylocation = { texmf     = { 0, 0 }                         , ["local"] = { 0, 0 } @@ -2294,12 +2284,12 @@ local retrieve_namedata = function (files, currentnames, targetnames, dry_run)          count[1]                   = count[1] + 1          if dry_run == true then              local truncated = truncate_string (fullname, 43) -            report ("log", 2, "db", "Would have been loading %s.", fullname) +            logreport ("log", 2, "db", "Would have been loading %s.", fullname)              report_status ("term", "db", "Would have been loading %s", truncated)              --- skip the read_font_names part          else              local truncated = truncate_string (fullname, 32) -            report ("log", 2, "db", "Loading font %s.", fullname) +            logreport ("log", 2, "db", "Loading font %s.", fullname)              report_status ("term", "db", "Loading font %s", truncated)              local new = read_font_names (fullname, currentnames,                                           targetnames, location) @@ -2311,8 +2301,8 @@ local retrieve_namedata = function (files, currentnames, targetnames, dry_run)      end      report_status_stop ("term", "db", "Scanned %d files, %d new.", nfiles, nnew)      for location, count in next, bylocation do -        report ("term", 4, "db", "   * %s: %d files, %d new", -                location, count[1], count[2]) +        logreport ("term", 4, "db", "   * %s: %d files, %d new", +                   location, count[1], count[2])      end      return nnew  end @@ -2321,15 +2311,15 @@ end  local collect_font_filenames_system = function ()      local n_scanned, n_new = 0, 0 -    report ("info", 1, "db", "Scanning system fonts...") -    report ("info", 2, "db", -            "Searching in static system directories...") +    logreport ("info", 1, "db", "Scanning system fonts...") +    logreport ("info", 2, "db", +               "Searching in static system directories...")      local files = { }      for _, dir in next, get_os_dirs () do          tableappend (files, collect_font_filenames_dir (dir, "system"))      end -    report ("term", 3, "db", "Collected %d files.", #files) +    logreport ("term", 3, "db", "Collected %d files.", #files)      return files  end @@ -2355,25 +2345,25 @@ end  --- unit -> string * string list  local collect_font_filenames_local = function ()      local pwd = lfscurrentdir () -    report ("both", 1, "db", "Scanning for fonts in $PWD (%q) ...", pwd) +    logreport ("both", 1, "db", "Scanning for fonts in $PWD (%q) ...", pwd)      local files  = collect_font_filenames_dir (pwd, "local")      local nfiles = #files      if nfiles > 0 then          targetnames.meta["local"] = true --- prevent saving to disk -        report ("term", 1, "db", "Found %d files.", pwd) +        logreport ("term", 1, "db", "Found %d files.", pwd)      else -        report ("term", 1, "db", -                "Couldn’t find a thing here. What a waste.", pwd) +        logreport ("term", 1, "db", +                   "Couldn’t find a thing here. What a waste.", pwd)      end -    report ("term", 3, "db", "Collected %d files.", #files) +    logreport ("term", 3, "db", "Collected %d files.", #files)      return files  end  --- fontentry list -> filemap  generate_filedata = function (mappings) -    report ("both", 2, "db", "Creating filename map.") +    logreport ("both", 2, "db", "Creating filename map.")      local nmappings  = #mappings @@ -2435,10 +2425,10 @@ generate_filedata = function (mappings)          if inbase then              local present = inbase [basename]              if present then -                report ("both", 4, "db", -                        "Conflicting basename: %q already indexed \z -                         in category %s, ignoring.", -                        barename, location) +                logreport ("both", 4, "db", +                           "Conflicting basename: %q already indexed \z +                            in category %s, ignoring.", +                           barename, location)                  conflicts.basenames = conflicts.basenames + 1                  --- track conflicts per font @@ -2465,10 +2455,10 @@ generate_filedata = function (mappings)          if inbare then              local present = inbare [barename]              if present then -                report ("both", 4, "db", -                        "Conflicting barename: %q already indexed \z -                         in category %s/%s, ignoring.", -                        barename, location, format) +                logreport ("both", 4, "db", +                           "Conflicting barename: %q already indexed \z +                            in category %s/%s, ignoring.", +                           barename, location, format)                  conflicts.barenames = conflicts.barenames + 1                  --- track conflicts per font @@ -2650,7 +2640,7 @@ end  collect_families = function (mappings) -    report ("info", 2, "db", "Analyzing families.") +    logreport ("info", 2, "db", "Analyzing families.")      local families = {          ["local"]  = { }, @@ -2746,7 +2736,7 @@ local style_categories   = { "r", "b", "i", "bi" }  local bold_categories    = {      "b",      "bi" }  group_modifiers = function (mappings, families) -    report ("info", 2, "db", "Analyzing shapes, weights, and styles.") +    logreport ("info", 2, "db", "Analyzing shapes, weights, and styles.")      for location, location_data in next, families do          for format, format_data in next, location_data do              for familyname, collected in next, format_data do @@ -2845,7 +2835,7 @@ end  order_design_sizes = function (families) -    report ("info", 2, "db", "Ordering design sizes.") +    logreport ("info", 2, "db", "Ordering design sizes.")      for location, data in next, families do          for format, data in next, data do @@ -2870,7 +2860,7 @@ end  --- unit -> string * string list  local collect_font_filenames = function () -    report ("info", 4, "db", "Scanning the filesystem for font files.") +    logreport ("info", 4, "db", "Scanning the filesystem for font files.")      local filenames = { }      local bisect    = config.luaotfload.misc.bisect @@ -2900,7 +2890,7 @@ end  --- int -> string  local nth_font_filename = function (n) -    report ("info", 4, "db", "Picking font file no. %d.", n) +    logreport ("info", 4, "db", "Picking font file no. %d.", n)      if not p_blacklist then          read_blacklist ()      end @@ -2915,7 +2905,7 @@ end  --doc]]--  local font_slice = function (lo, hi) -    report ("info", 4, "db", "Retrieving font files nos. %d--%d.", lo, hi) +    logreport ("info", 4, "db", "Retrieving font files nos. %d--%d.", lo, hi)      if not p_blacklist then          read_blacklist ()      end @@ -2937,7 +2927,7 @@ end  --- unit -> int  local count_font_files = function () -    report ("info", 4, "db", "Counting font files.") +    logreport ("info", 4, "db", "Counting font files.")      if not p_blacklist then          read_blacklist ()      end @@ -3063,31 +3053,31 @@ local collect_statistics = function (mappings)                      itemlist = tableconcat (itemlist, ", ")                  end -                report ("both", 0, "db", -                        "       · %4d × %s.", -                        freq, itemlist) +                logreport ("both", 0, "db", +                           "       · %4d × %s.", +                           freq, itemlist)              end          end -        report ("both", 0, "", "~~~~ font index statistics ~~~~") -        report ("both", 0, "db", -                "   · Collected %d fonts (%d names) in %d families.", -                #mappings, n_fullname, n_family) +        logreport ("both", 0, "", "~~~~ font index statistics ~~~~") +        logreport ("both", 0, "db", +                   "   · Collected %d fonts (%d names) in %d families.", +                   #mappings, n_fullname, n_family)          pprint_top (families, 4, true) -        report ("both", 0, "db", -                "   · %d different “subfamily” kinds.", -                setsize (subfamily)) +        logreport ("both", 0, "db", +                   "   · %d different “subfamily” kinds.", +                   setsize (subfamily))          pprint_top (subfamily, 4) -        report ("both", 0, "db", -                "   · %d different “prefmodifiers” kinds.", -                setsize (prefmodifiers)) +        logreport ("both", 0, "db", +                   "   · %d different “prefmodifiers” kinds.", +                   setsize (prefmodifiers))          pprint_top (prefmodifiers, 4) -        report ("both", 0, "db", -                "   · %d different “fontstyle_name” kinds.", -                setsize (fontstyle_name)) +        logreport ("both", 0, "db", +                   "   · %d different “fontstyle_name” kinds.", +                   setsize (fontstyle_name))          pprint_top (fontstyle_name, 4)      end @@ -3121,7 +3111,7 @@ update_names = function (currentnames, force, dry_run)      local conf = config.luaotfload      if conf.run.live ~= false and conf.db.update_live == false then -        report ("info", 2, "db", "Skipping database update.") +        logreport ("info", 2, "db", "Skipping database update.")          --- skip all db updates          return currentnames or name_index      end @@ -3133,15 +3123,16 @@ update_names = function (currentnames, force, dry_run)      - “targetnames” is the final table to return      - force is whether we rebuild it from scratch or not      ]] -    report("both", 1, "db", "Updating the font names database" -                         .. (force and " forcefully." or ".")) +    logreport ("both", 1, "db", +               "Updating the font names database" +               .. (force and " forcefully." or "."))      if config.luaotfload.db.skip_read == true then          --- the difference to a “dry run” is that we don’t search          --- for font files entirely. we also ignore the “force”          --- parameter since it concerns only the font files. -        report ("info", 2, "db", -                "Ignoring font files, reusing old data.") +        logreport ("info", 2, "db", +                   "Ignoring font files, reusing old data.")          currentnames = load_names (false)          targetnames  = currentnames      else @@ -3152,8 +3143,9 @@ update_names = function (currentnames, force, dry_run)                  currentnames = load_names (dry_run)              end              if currentnames.meta.version ~= names.version then -                report ("both", 1, "db", "No font names database or old " -                                    .. "one found; generating new one.") +                logreport ("both", 1, "db", +                           "No font names database or old \z +                            one found; generating new one.")                  currentnames = initialize_namedata (get_font_filter ())              end          end @@ -3176,9 +3168,9 @@ update_names = function (currentnames, force, dry_run)                                     targetnames,                                     dry_run) -        report ("info", 3, "db", -                "Found %d font files; %d new, %d stale entries.", -                #font_filenames, n_new, n_rem) +        logreport ("info", 3, "db", +                   "Found %d font files; %d new, %d stale entries.", +                   #font_filenames, n_new, n_rem)      end      --- pass 3 (optional): collect some stats about the raw font info @@ -3204,27 +3196,27 @@ update_names = function (currentnames, force, dry_run)      --- pass 7: order design size tables      targetnames.families    = order_design_sizes (targetnames.families) -    report ("info", 3, "db", -            "Rebuilt in %0.f ms.", -            1000 * (osgettimeofday () - starttime)) +    logreport ("info", 3, "db", +               "Rebuilt in %0.f ms.", +               1000 * (osgettimeofday () - starttime))      name_index = targetnames      if dry_run ~= true then          if n_new + n_rem == 0 then -            report ("info", 2, "db", -                    "No new or removed fonts, skip saving to disk.") +            logreport ("info", 2, "db", +                       "No new or removed fonts, skip saving to disk.")          else              local success, reason = save_names ()              if not success then -                report ("both", 0, "db", -                        "Failed to save database to disk: %s", -                        reason) +                logreport ("both", 0, "db", +                           "Failed to save database to disk: %s", +                           reason)              end          end          if flush_lookup_cache () and save_lookups () then -            report ("both", 2, "cache", "Lookup cache emptied.") +            logreport ("both", 2, "cache", "Lookup cache emptied.")              return targetnames          end      end @@ -3241,18 +3233,18 @@ save_lookups = function ( )          caches.compile (lookup_cache, luaname, lucname)          --- double check ...          if lfsisfile (luaname) and lfsisfile (lucname) then -            report ("both", 3, "cache", "Lookup cache saved.") +            logreport ("both", 3, "cache", "Lookup cache saved.")              return true          end -        report ("info", 0, "cache", "Could not compile lookup cache.") +        logreport ("info", 0, "cache", "Could not compile lookup cache.")          return false      end -    report ("info", 0, "cache", "Lookup cache file not writable.") +    logreport ("info", 0, "cache", "Lookup cache file not writable.")      if not fileiswritable (luaname) then -        report ("info", 0, "cache", "Failed to write %s.", luaname) +        logreport ("info", 0, "cache", "Failed to write %s.", luaname)      end      if not fileiswritable (lucname) then -        report ("info", 0, "cache", "Failed to write %s.", lucname) +        logreport ("info", 0, "cache", "Failed to write %s.", lucname)      end      return false  end @@ -3281,33 +3273,33 @@ save_names = function (currentnames)              tabletofile (luaname, currentnames, true)              caches.compile (currentnames, luaname, lucname)          end -        report ("info", 2, "db", "Font index saved at ...") +        logreport ("info", 2, "db", "Font index saved at ...")          local success = false          if lfsisfile (luaname) then -            report ("info", 2, "db", "Text: " .. luaname) +            logreport ("info", 2, "db", "Text: " .. luaname)              success = true          end          if lfsisfile (gzname) then -            report ("info", 2, "db", "Gzip: " .. gzname) +            logreport ("info", 2, "db", "Gzip: " .. gzname)              success = true          end          if lfsisfile (lucname) then -            report ("info", 2, "db", "Byte: " .. lucname) +            logreport ("info", 2, "db", "Byte: " .. lucname)              success = true          end          if success then              return true          else -            report ("info", 0, "db", "Could not compile font index.") +            logreport ("info", 0, "db", "Could not compile font index.")              return false          end      end -    report ("info", 0, "db", "Index file not writable") +    logreport ("info", 0, "db", "Index file not writable")      if not fileiswritable (luaname) then -        report ("info", 0, "db", "Failed to write %s.", luaname) +        logreport ("info", 0, "db", "Failed to write %s.", luaname)      end      if not fileiswritable (lucname) then -        report ("info", 0, "db", "Failed to write %s.", lucname) +        logreport ("info", 0, "db", "Failed to write %s.", lucname)      end      return false  end @@ -3321,7 +3313,7 @@ end  --- string -> string -> string list -> string list -> string list -> unit  local print_cache = function (category, path, luanames, lucnames, rest)      local report_indeed = function (...) -        report("info", 0, "cache", ...) +        logreport ("info", 0, "cache", ...)      end      report_indeed("Luaotfload cache: %s", category)      report_indeed("location: %s", path) @@ -3333,15 +3325,15 @@ end  --- string -> string -> string list -> bool -> bool  local purge_from_cache = function (category, path, list, all) -    report("info", 1, "cache", "Luaotfload cache: %s %s", -        (all and "erase" or "purge"), category) -    report("info", 1, "cache", "location: %s",path) +    logreport ("info", 1, "cache", "Luaotfload cache: %s %s", +               (all and "erase" or "purge"), category) +    logreport ("info", 1, "cache", "location: %s", path)      local n = 0      for i=1,#list do          local filename = list[i]          if stringfind(filename,"luatex%-cache") then -- safeguard              if all then -                report("info", 5, "cache", "Removing %s.", filename) +                logreport ("info", 5, "cache", "Removing %s.", filename)                  osremove(filename)                  n = n + 1              else @@ -3350,7 +3342,7 @@ local purge_from_cache = function (category, path, list, all)                      local checkname = file.replacesuffix(                          filename, "lua", "luc")                      if lfsisfile(checkname) then -                        report("info", 5, "cache", "Removing %s.", filename) +                        logreport ("info", 5, "cache", "Removing %s.", filename)                          osremove(filename)                          n = n + 1                      end @@ -3358,7 +3350,7 @@ local purge_from_cache = function (category, path, list, all)              end          end      end -    report("info", 1, "cache", "Removed lua files : %i", n) +    logreport ("info", 1, "cache", "Removed lua files : %i", n)      return true  end @@ -3435,7 +3427,7 @@ local erase_cache = function ( )  end  local separator = function ( ) -    report("info", 0, string.rep("-", 67)) +    logreport ("info", 0, string.rep("-", 67))  end  --- unit -> unit @@ -3464,35 +3456,55 @@ end  --- export functionality to the namespace “fonts.names”  ----------------------------------------------------------------------- -names.set_font_filter             = set_font_filter -names.flush_lookup_cache          = flush_lookup_cache -names.save_lookups                = save_lookups -names.load                        = load_names -names.access_font_index           = access_font_index -names.data                        = function () return name_index end -names.save                        = save_names -names.update                      = update_names -names.lookup_font_file            = lookup_font_file -names.lookup_font_name            = lookup_font_name -names.lookup_font_name_cached     = lookup_font_name_cached -names.getfilename                 = lookup_fullpath -names.lookup_fullpath             = lookup_fullpath -names.read_blacklist              = read_blacklist -names.sanitize_fontname           = sanitize_fontname -names.getmetadata                 = getmetadata -names.set_location_precedence     = set_location_precedence -names.count_font_files            = count_font_files -names.nth_font_filename           = nth_font_filename -names.font_slice                  = font_slice - ---- font cache -names.purge_cache    = purge_cache -names.erase_cache    = erase_cache -names.show_cache     = show_cache - -names.find_closest = find_closest - --- for testing purpose -names.read_fonts_conf = read_fonts_conf +local export = { +    set_font_filter             = set_font_filter, +    flush_lookup_cache          = flush_lookup_cache, +    save_lookups                = save_lookups, +    load                        = load_names, +    access_font_index           = access_font_index, +    data                        = function () return name_index end, +    save                        = save_names, +    update                      = update_names, +    lookup_font_file            = lookup_font_file, +    lookup_font_name            = lookup_font_name, +    lookup_font_name_cached     = lookup_font_name_cached, +    getfilename                 = lookup_fullpath, +    lookup_fullpath             = lookup_fullpath, +    read_blacklist              = read_blacklist, +    sanitize_fontname           = sanitize_fontname, +    getmetadata                 = getmetadata, +    set_location_precedence     = set_location_precedence, +    count_font_files            = count_font_files, +    nth_font_filename           = nth_font_filename, +    font_slice                  = font_slice, +    --- font cache +    purge_cache                 = purge_cache, +    erase_cache                 = erase_cache, +    show_cache                  = show_cache, +    find_closest                = find_closest, +    -- for testing purpose +    read_fonts_conf             = read_fonts_conf, +} + +return { +    init = function () +        --- the font loader namespace is “fonts”, same as in Context +        --- we need to put some fallbacks into place for when running +        --- as a script +        log             = luaotfload.log +        logreport       = log.report +        fonts           = fonts or { } +        local fonts     = fonts +        fonts.names     = fonts.names or names +        fonts.definers  = fonts.definers or { } + +        names.blacklist = blacklist +        names.version   = 2.51 +        names.data      = nil      --- contains the loaded database +        names.lookups   = nil      --- contains the lookup cache + +        for sym, ref in next, export do names[sym] = ref end +    end +}  -- vim:tw=71:sw=4:ts=4:expandtab  | 
