diff options
-rw-r--r-- | otfl-font-nms.lua | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua index bfc463a..c01922d 100644 --- a/otfl-font-nms.lua +++ b/otfl-font-nms.lua @@ -38,6 +38,7 @@ local splitpath, expandpath = file.split_path, kpse.expand_path local glob, basename = dir.glob, file.basename local upper, lower, format = string.upper, string.lower, string.format local gsub, match, rpadd = string.gsub, string.match, string.rpadd +local gmatch, sub = string.gmatch, string.sub local utfgsub = unicode.utf8.gsub local trace_short = false --tracing adapted to rebuilding of the database inside a document @@ -607,16 +608,57 @@ local function read_fcdata(data) end --[[ - Under Mac OSX, fc-list does not exist and there is no guaranty that OSFONTDIR - is correctly filled, so for now we use static paths. + TODO: doc ]] -local static_osx_dirs = { - kpse.expand_path('~') .. "/Library/Fonts", - "/Library/Fonts", - "/System/Library/Fonts", - "/Network/Library/Fonts", -} +--[[ + This function parses /etc/fonts/fonts.conf and returns all the dir it finds. + The code is minimal, please report any error it may generate. +]] + +local function read_fonts_conf() + local f = io.open("/etc/fonts/fonts.conf") + if not f then + error("Cannot open the file /etc/fonts/fonts.conf") + end + local results = {} + local incomments = false + for line in f:lines() do + -- spaghetti code... hmmm... + if incomments and sub(line, 1, 3) == '-->' then + incomments = false + elseif sub(line, 1, 4) == '<!--' then + incomments = true + texio.write_nl("comment !") + else + for dir in gmatch(line, '<dir>([^<]+)</dir>') do + -- now we need to replace ~ by kpse.expand_path('~') + if sub(dir, 1, 1) == '~' then + dir = kpse.expand_path('~') .. sub(dir, 2) + end + results[#results+1] = dir + end + end + end + f:close() + return results +end + +local function get_os_dirs() + if os.name == 'macosx' then + return { + kpse.expand_path('~') .. "/Library/Fonts", + "/Library/Fonts", + "/System/Library/Fonts", + "/Network/Library/Fonts", + } + elseif os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then + local windir = os.getenv("WINDIR") + return {windir..'\\Fonts',} + else + return read_fonts_conf() + end +end local function scan_os_fonts(fontnames, newfontnames) --[[ @@ -636,9 +678,10 @@ local function scan_os_fonts(fontnames, newfontnames) logs.info("searching in static system directories...") end count = 0 - for _,d in ipairs(static_osx_dirs) do + local os_dirs = get_os_dirs() + for _,d in ipairs(os_dirs) do count = count + 1 - progress(count, #static_osx_dirs) + progress(count, #os_dirs) scan_dir(d, fontnames, newfontnames, false) end else |