diff options
| author | Philipp Gesang <phg42.2a@gmail.com> | 2013-07-31 21:50:07 +0200 | 
|---|---|---|
| committer | Philipp Gesang <phg42.2a@gmail.com> | 2013-07-31 21:50:07 +0200 | 
| commit | f84c7341ed8f83c0624be6be2ea796d4bbb97ae9 (patch) | |
| tree | d6dc7feb28af7e3027ae5263a8a538ff5a62a2df | |
| parent | e2ca2159f6952db10ad35dc961e0fa51832033bc (diff) | |
| download | luaotfload-f84c7341ed8f83c0624be6be2ea796d4bbb97ae9.tar.gz | |
[db] make pfb scanning optional
| -rw-r--r-- | luaotfload-database.lua | 121 | ||||
| -rwxr-xr-x | luaotfload-tool.lua | 6 | ||||
| -rw-r--r-- | luaotfload.dtx | 3 | 
3 files changed, 88 insertions, 42 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 20ff1bf..f53d19f 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -93,6 +93,8 @@ local names          = fonts.names  config                         = config or { }  config.luaotfload              = config.luaotfload or { }  config.luaotfload.resolver     = config.luaotfload.resolver or "normal" +config.luaotfload.include_t1   = config.luaotfload.include_t1 == true +  if config.luaotfload.update_live ~= false then      --- this option allows for disabling updates      --- during a TeX run @@ -1519,26 +1521,43 @@ read_blacklist = function ()      names.blacklist = create_blacklist(blacklist, whitelist)  end -local font_extensions     = { "otf", "ttf", "ttc", "dfont", "pfb" } -local font_extensions_set = tabletohash (font_extensions) -local p_font_extensions +local ordinary_extensions   = { "otf", "ttf", "ttc", "dfont" } +local type1_extensions      = { "pfb", --[[afm]] } +----- font_extensions_set = tabletohash (font_extensions) +local get_font_filter +  do -    local extns -    --tablesort (font_extensions) --- safeguard -    for i=#font_extensions, 1, -1 do -        local e = font_extensions[i] -        if not extns then -            extns = P(e) +    local luaotfloadconfig = config.luaotfload + +    local extension_pattern = function (list) +        local pat +        for i=#list, 1, -1 do +            local e = list[i] +            if not pat then +                pat = P(e) +            else +                pat = pat + P(e) +            end +        end +        return pat * P(-1) +    end + +    local extns    = extension_pattern (ordinary_extensions) +    local t1extns  = extns + extension_pattern (type1_extensions) +    local ordinary = (1 - extns)^1   * extns +    local with_t1  = (1 - t1extns)^1 * t1extns + +    get_font_filter = function () +        if luaotfloadconfig.include_t1 == true then +            return with_t1          else -            extns = extns + P(e) +            return ordinary          end      end -    extns = extns * P(-1) -    p_font_extensions = (1 - extns)^1 * extns  end  local process_dir_tree -process_dir_tree = function (acc, dirs) +process_dir_tree = function (acc, dirs, criterium)      if not next (dirs) then --- done          return acc      end @@ -1561,21 +1580,20 @@ process_dir_tree = function (acc, dirs)                  then                      dirs[#dirs+1] = fullpath                  elseif lfsisfile (fullpath) then -                    if lpegmatch (p_font_extensions, -                                  stringlower (ent)) +                    if lpegmatch (criterium, stringlower (ent))                      then                          newfiles[#newfiles+1] = fullpath                      end                  end              end          end -        return process_dir_tree (tableappend (acc, newfiles), dirs) +        return process_dir_tree (tableappend (acc, newfiles), dirs, criterium)      end      --- cannot cd; skip -    return process_dir_tree (acc, dirs) +    return process_dir_tree (acc, dirs, criterium)  end -local process_dir = function (dir) +local process_dir = function (dir, criterium)      local pwd = lfscurrentdir ()      if lfschdir (dir) then          lfschdir (pwd) @@ -1586,8 +1604,7 @@ local process_dir = function (dir)              if ent ~= "." and ent ~= ".." and not blacklist[ent] then                  local fullpath = dir .. "/" .. ent                  if lfsisfile (fullpath) then -                    if lpegmatch (p_font_extensions, -                                  stringlower (ent)) +                    if lpegmatch (criterium, stringlower (ent))                      then                          files[#files+1] = fullpath                      end @@ -1601,11 +1618,12 @@ end  --- string -> bool -> string list  local find_font_files = function (root, recurse) +    local criterium = get_font_filter ()      if lfsisdir (root) then          if recurse == true then -            return process_dir_tree ({}, { root }) +            return process_dir_tree ({}, { root }, criterium)          else --- kpathsea already delivered the necessary subdirs -            return process_dir (root) +            return process_dir (root, criterium)          end      end  end @@ -1679,6 +1697,8 @@ local filter_out_pwd = function (dirs)      return result  end +local path_separator = ostype == "windows" and ";" or ":" +  --[[doc--      scan_texmf_fonts() scans all fonts in the texmf tree through the      kpathsea variables OPENTYPEFONTS and TTFONTS of texmf.cnf. @@ -1688,8 +1708,10 @@ end  --- dbobj -> dbobj -> bool? -> (int * int)  local scan_texmf_fonts = function (fontnames, newfontnames, dry_run) +      local n_scanned, n_new, fontdirs = 0, 0      local osfontdir = kpseexpand_path "$OSFONTDIR" +      if stringis_empty (osfontdir) then          report ("info", 2, "db", "Scanning TEXMF fonts...")      else @@ -1703,11 +1725,11 @@ local scan_texmf_fonts = function (fontnames, newfontnames, dry_run)              end          end      end +      fontdirs = kpseexpand_path "$OPENTYPEFONTS" -    fontdirs = fontdirs .. (ostype == "windows" and ";" or ":") -            .. kpseexpand_path "$TTFONTS" -    fontdirs = fontdirs .. (ostype == "windows" and ";" or ":") -            .. kpseexpand_path "$T1FONTS" +    fontdirs = fontdirs .. path_separator .. kpseexpand_path "$TTFONTS" +    fontdirs = fontdirs .. path_separator .. kpseexpand_path "$T1FONTS" +      if not stringis_empty (fontdirs) then          local tasks = filter_out_pwd (filesplitpath (fontdirs))          report ("info", 3, "db", @@ -1719,6 +1741,7 @@ local scan_texmf_fonts = function (fontnames, newfontnames, dry_run)              n_new     = n_new     + new          end      end +      return n_scanned, n_new  end @@ -1973,22 +1996,36 @@ local function get_os_dirs ()      return {}  end ---- dbobj -> dbobj -> bool? -> (int * int) -local scan_os_fonts = function (fontnames, newfontnames, dry_run) -    local n_scanned, n_new = 0, 0 -    --[[ -    This function scans the OS fonts through -      - fontcache for Unix (reads the fonts.conf file and scans the +--[[doc-- + +    scan_os_fonts() scans the OS fonts through +      - fontconfig for Unix (reads the fonts.conf file[s] and scans the          directories)        - a static set of directories for Windows and MacOSX -    ]] -    report("info", 2, "db", "Scanning OS fonts...") -    report("info", 3, "db", "Searching in static system directories...") -    for _, d in next, get_os_dirs() do -        local found, new = scan_dir(d, fontnames, newfontnames, dry_run) + +    **NB**: If $OSFONTDIR is nonempty, as it appears to be by default +            on Windows setups, the system fonts will have already been +            processed while scanning the TEXMF. Thus, this function is +            never called. + +--doc]]-- + +--- dbobj -> dbobj -> bool? -> (int * int) +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", 3, "db", +            "Searching in static system directories...") + +    for _, d in next, get_os_dirs () do +        local found, new = scan_dir (d, fontnames, +                                     newfontnames, dry_run)          n_scanned = n_scanned + found          n_new     = n_new     + new      end +      return n_scanned, n_new  end @@ -2080,14 +2117,17 @@ end  --- dbobj? -> bool? -> bool? -> dbobj  update_names = function (fontnames, force, dry_run) +      if config.luaotfload.update_live == false then          report("info", 2, "db",                 "skipping database update")          --- skip all db updates          return fontnames or names.data      end +      local starttime = os.gettimeofday()      local n_scanned, n_new = 0, 0 +      --[[      The main function, scans everything      - “newfontnames” is the final table to return @@ -2112,11 +2152,11 @@ update_names = function (fontnames, force, dry_run)      read_blacklist()      local scanned, new -    scanned, new = scan_texmf_fonts(fontnames, newfontnames, dry_run) +    scanned, new = scan_texmf_fonts (fontnames, newfontnames, dry_run)      n_scanned = n_scanned + scanned      n_new     = n_new     + new -    scanned, new = scan_os_fonts(fontnames, newfontnames, dry_run) +    scanned, new = scan_os_fonts (fontnames, newfontnames, dry_run)      n_scanned = n_scanned + scanned      n_new     = n_new     + new @@ -2375,7 +2415,8 @@ else      names.resolve     = resolve      names.resolvespec = resolve  end -names.find_closest      = find_closest + +names.find_closest = find_closest  -- for testing purpose  names.read_fonts_conf = read_fonts_conf diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 3846700..1e88d4f 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -108,6 +108,7 @@ config.luaotfload.names_dir   = config.luaotfload.names_dir or "names"  config.luaotfload.cache_dir   = config.luaotfload.cache_dir or "fonts"  config.luaotfload.index_file  = config.luaotfload.index_file                               or "luaotfload-names.lua" +config.luaotfload.include_t1  = config.luaotfload.include_t1 == true  do -- we don’t have file.basename and the likes yet, so inline parser ftw      local slash        = P"/" @@ -1025,8 +1026,9 @@ local process_cmdline = function ( ) -- unit -> jobspec          ["prefer-texmf"]   = "p",          quiet              = "q",          ["show-blacklist"] = "b", +        type1              = 0,          update             = "u", -        verbose            = 1  , +        verbose            = 1,          version            = "V",          warnings           = "w",      } @@ -1108,6 +1110,8 @@ local process_cmdline = function ( ) -- unit -> jobspec          elseif v == "diagnose" then              action_pending["diagnose"] = true              result.asked_diagnostics = optarg[n] +        elseif v == "type1" then +            config.luaotfload.include_t1 = true          end      end diff --git a/luaotfload.dtx b/luaotfload.dtx index e42c14e..f23be81 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1545,10 +1545,11 @@ config.luaotfload.prioritize      = config.luaotfload.prioritize       or "sys"  config.luaotfload.names_dir       = config.luaotfload.names_dir        or "names"  config.luaotfload.cache_dir       = config.luaotfload.cache_dir        or "fonts"  config.luaotfload.index_file      = config.luaotfload.index_file       or "luaotfload-names.lua" +config.luaotfload.include_t1      = config.luaotfload.include_t1       or false  luaotfload.module = {      name          = "luaotfload", -    version       = 2.40001, +    version       = 2.40002,      date          = "2013/07/28",      description   = "OpenType layout system.",      author        = "Elie Roux & Hans Hagen",  | 
