diff options
| -rw-r--r-- | luaotfload-database.lua | 39 | ||||
| -rw-r--r-- | luaotfload-override.lua | 121 | ||||
| -rwxr-xr-x | luaotfload-tool.lua | 2 | 
3 files changed, 136 insertions, 26 deletions
| diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 594e647..3508f61 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -122,7 +122,10 @@ local make_luanames = function (path)             filereplacesuffix(path, "luc")  end -local report = logs.names_report +local report                = logs.names_report +local report_status         = logs.names_status +local report_status_start   = logs.names_status_start +local report_status_stop    = logs.names_status_stop  names.patterns          = { }  local patterns          = names.patterns @@ -390,7 +393,7 @@ load_names = function (dry_run)      local foundname, data = load_lua_file (names.path.index.lua)      if data then -        report ("both", 2, "db", +        report ("both", 1, "db",                  "Font names database loaded", "%s", foundname)          report ("info", 3, "db", "Loading took %0.f ms",                  1000*(os.gettimeofday()-starttime)) @@ -1543,7 +1546,7 @@ local create_blacklist = function (blacklist, whitelist)      local result = { }      local dirs   = { } -    report("info", 2, "db", "Blacklisting %q files and directories", +    report("info", 1, "db", "Blacklisting %q files and directories",             #blacklist)      for i=1, #blacklist do          local entry = blacklist[i] @@ -1554,7 +1557,7 @@ local create_blacklist = function (blacklist, whitelist)          end      end -    report("info", 2, "db", "Whitelisting %q files", #whitelist) +    report("info", 1, "db", "Whitelisting %q files", #whitelist)      for i=1, #whitelist do          result[whitelist[i]] = nil      end @@ -1808,6 +1811,7 @@ local scan_dir = function (dirname, fontnames, newfontnames,      local n_new = 0   --- total of fonts collected      local n_found = #found      report ("both", 4, "db", "%d font files detected", n_found) +    report_status_start (2, 4)      for j=1, n_found do          local fullname = found[j]          fullname = path_normalize(fullname) @@ -1816,8 +1820,7 @@ local scan_dir = function (dirname, fontnames, newfontnames,              report ("both", 1, "db",                      "Would have been loading %q", fullname)          else -            report ("both", 4, "db", -                    "Loading font %q", fullname) +            report_status ("both", "db", "Loading font %q", fullname)              local new = load_font (fullname, fontnames,                                     newfontnames, texmf)              if new == true then @@ -1825,8 +1828,8 @@ local scan_dir = function (dirname, fontnames, newfontnames,              end          end      end - -    report("both", 4, "db", "%d fonts found in '%s'", n_found, dirname) +    report_status_stop ("both", "db", "Done. %d fonts indexed in %q", +                        n_found, dirname)      return n_found, n_new  end @@ -1861,9 +1864,9 @@ local scan_texmf_fonts = function (fontnames, newfontnames, dry_run)      local osfontdir = kpseexpand_path "$OSFONTDIR"      if stringis_empty (osfontdir) then -        report ("info", 2, "db", "Scanning TEXMF fonts...") +        report ("info", 1, "db", "Scanning TEXMF fonts...")      else -        report ("info", 2, "db", "Scanning TEXMF and OS fonts...") +        report ("info", 1, "db", "Scanning TEXMF and OS fonts...")          if logs.get_loglevel () > 3 then              local osdirs = filesplitpath (osfontdir)              report ("info", 0, "db", @@ -2163,7 +2166,7 @@ local scan_os_fonts = function (fontnames, newfontnames,                                  dry_run)      local n_scanned, n_new = 0, 0 -    report ("info", 2, "db", "Scanning OS fonts...") +    report ("info", 1, "db", "Scanning OS fonts...")      report ("info", 3, "db",              "Searching in static system directories...") @@ -2187,7 +2190,7 @@ end  --- dbobj -> dbobj  local gen_fast_lookups = function (fontnames) -    report("both", 2, "db", "Creating filename map") +    report("both", 1, "db", "Creating filename map")      local mappings   = fontnames.mappings      local nmappings  = #mappings      --- this is needlessly complicated due to texmf priorization @@ -2246,7 +2249,7 @@ local gen_fast_lookups = function (fontnames)      end      if config.luaotfload.prioritize == "texmf" then -        report("both", 2, "db", "Preferring texmf fonts") +        report("both", 1, "db", "Preferring texmf fonts")          addmap(sys)          addmap(texmf)      else --- sys @@ -2267,7 +2270,7 @@ end  update_names = function (fontnames, force, dry_run)      if config.luaotfload.update_live == false then -        report("info", 2, "db", +        report("info", 1, "db",                 "Skipping database update")          --- skip all db updates          return fontnames or names.data @@ -2281,7 +2284,7 @@ update_names = function (fontnames, force, dry_run)      - “newfontnames” is the final table to return      - force is whether we rebuild it from scratch or not      ]] -    report("both", 2, "db", "Updating the font names database" +    report("both", 1, "db", "Updating the font names database"                           .. (force and " forcefully" or ""))      if force then @@ -2417,9 +2420,9 @@ end  --- string -> string -> string list -> bool -> bool  local purge_from_cache = function (category, path, list, all) -    report("info", 2, "cache", "Luaotfload cache: %s %s", +    report("info", 1, "cache", "Luaotfload cache: %s %s",          (all and "erase" or "purge"), category) -    report("info", 2, "cache", "location: %s",path) +    report("info", 1, "cache", "location: %s",path)      local n = 0      for i=1,#list do          local filename = list[i] @@ -2442,7 +2445,7 @@ local purge_from_cache = function (category, path, list, all)              end          end      end -    report("info", 2, "cache", "Removed lua files : %i", n) +    report("info", 1, "cache", "Removed lua files : %i", n)      return true  end diff --git a/luaotfload-override.lua b/luaotfload-override.lua index 1326182..368a3d1 100644 --- a/luaotfload-override.lua +++ b/luaotfload-override.lua @@ -32,6 +32,8 @@ local texio_write       = texio.write  local texiowrite        = texio.write  local type              = type +local dummyfunction     = function () end +  local texjob = false  if tex and (tex.jobname or tex.formatname) then      --- TeX @@ -52,7 +54,7 @@ We recreate the verbosity levels previously implemented in font-nms:  --doc]]-- -local loglevel = 1 --- default +local loglevel = 0 --- default  local logout   = "log"  --- int -> bool @@ -74,7 +76,9 @@ logs.getloglevel    = get_loglevel  logs.get_loglevel   = get_loglevel  logs.get_log_level  = get_loglevel -local writeln --- scope so we can change it +local writeln  --- pointer to terminal/log writer +local statusln --- terminal writer that reuses the current line +local first_status = true --- indicate the begin of a status region  local log_msg = [[  logging output redirected to %s @@ -126,6 +130,7 @@ local set_logout = function (s, finalizers)          texiowrite    = writefile          texiowrite_nl = writefile_nl          writeln       = writefile_nl +        statusln      = dummyfunction          finalizers[#finalizers+1] = function ()              chan:write (stringformat ("\nlogging finished at %s\n", @@ -162,18 +167,34 @@ end  io.stdout:setvbuf "no"  io.stderr:setvbuf "no" +local kill_line = "\r\x1b[K" +  if texjob == true then      writeln = function (str)          texiowrite_nl ("term", str)      end +    statusln = function (str) +        if first_status == false then +            texiowrite ("term", kill_line) +            texiowrite ("term", str) +        else +            texiowrite_nl ("term", str) +        end +    end  else      writeln = function (str)          iowrite(str)          iowrite "\n"      end +    statusln = function (str) +        if first_status == false then +            iowrite (kill_line) +        end +        iowrite (str) +    end  end -stdout = function (category, ...) +stdout = function (writer, category, ...)      local res = { module_name, "|", category, ":" }      local nargs = select("#", ...)      if nargs == 0 then @@ -184,7 +205,7 @@ stdout = function (category, ...)      else          res[#res+1] = stringformat(...)      end -    writeln(tableconcat(res, " ")) +    writer (tableconcat(res, " "))  end  --- at default (zero), we aim to be quiet @@ -227,9 +248,9 @@ local names_report = function (mode, lvl, ...)              log (...)          elseif mode == "both" and logout ~= "redirect" then              log (...) -            stdout (...) +            stdout (writeln, ...)          else -            stdout (...) +            stdout (writeln, ...)          end      end  end @@ -238,6 +259,93 @@ logs.names_report = names_report  --[[doc-- +    status_logger -- Overwrites the most recently printed line of the +    terminal. Its purpose is to provide feedback without spamming +    stdout with irrelevant messages, i.e. when building the database. + +    Status logging must be initialized by calling status_start() and +    properly reset via status_stop(). + +    The arguments low and high indicate the loglevel threshold at which +    linewise and full logging is triggered, respectively. E.g. + +            names_status (1, 4, "term", "Hello, world!") + +    will print nothing if the loglevel is less than one, reuse the +    current line if the loglevel ranges from one to three inclusively, +    and output the message on a separate line otherwise. + +--doc]]-- + +local status_logger = function (mode, ...) +    if mode == "log" then +        log (...) +    else +        if mode == "both" and logout ~= "redirect" then +            log (...) +            stdout (statusln, ...) +        else +            stdout (statusln, ...) +        end +        first_status = false +    end +end + +--[[doc-- + +    status_start -- Initialize status logging. This installs the status +        logger if the loglevel is in the specified range, and the normal +        logger otherwise.  It also resets the first line state which +        causing the next line printed using the status logger to not kill +        the current line. + +--doc]]-- + +local status_writer +local status_low  = 99 +local status_high = 99 + +local status_start = function (low, high) +    first_status = true +    status_low   = low +    status_high  = high + +    if os.type == "windows" then --- Assume broken terminal. +        status_writer = function (...) +            names_report (high, ...) +        end +        return +    end + +    if low <= loglevel and loglevel < high then +        status_writer = status_logger +    else +        status_writer = function (mode, ...) +            names_report (mode, high, ...) +        end +    end +end + +--[[doc-- + +    status_stop -- Finalize a status region by outputting a newline and +    printing a message. + +--doc]]-- + +local status_stop = function (...) +    if first_status == false then +        status_writer(...) +        writeln "" +    end +end + +logs.names_status = function (...) status_writer (...) end +logs.names_status_start = status_start +logs.names_status_stop  = status_stop + +--[[doc-- +      The fontloader comes with the Context logging mechanisms      inaccessible. Instead, it provides dumb fallbacks based      on the functions in texio.write*() that can be overridden @@ -274,7 +382,6 @@ texio.reporter = texioreporter  if fonts then --- need to be running TeX      if next(fonts.encodings.agl) then -        print(next, fonts.encodings.agl)          --- unnecessary because the file shouldn’t be loaded at this time          --- but we’re just making sure          fonts.encodings.agl = nil diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index c4670e8..eace7f6 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -1102,7 +1102,7 @@ local process_cmdline = function ( ) -- unit -> jobspec              if result.log_level > 0 then                  result.log_level = result.log_level + 1              else -                result.log_level = 2 +                result.log_level = 1              end          elseif v == "V" then              action_pending["version"] = true | 
