diff options
author | Elie Roux <eroux@dedibox.ebzao.info> | 2010-01-20 15:48:56 +0100 |
---|---|---|
committer | Elie Roux <eroux@dedibox.ebzao.info> | 2010-01-20 15:48:56 +0100 |
commit | 09093ef038f393ba643f0b18e7befc36d7394db1 (patch) | |
tree | bc5c2ec5c7eb7326420abbc835ada98cd574c830 | |
parent | 939da416b5435352ca46975701a69b8c0965cda6 (diff) | |
download | luaotfload-09093ef038f393ba643f0b18e7befc36d7394db1.tar.gz |
A bit of adaptation to the buggy OS
Windows is a pain, as usual... I'm blocked on a bug where the command
line passed to popen is reshaped to contain linebreaks instead of
spaces, so the fc-cat of TeXLive cannot be called if TeXLive is under
C:/Program Files/ (grrr). I should report it to LuaTeX or TeXLive,
more certainly to MS but...
-rw-r--r-- | luaotfload-fonts.lua | 80 |
1 files changed, 75 insertions, 5 deletions
diff --git a/luaotfload-fonts.lua b/luaotfload-fonts.lua index 71f9a1c..afcf37a 100644 --- a/luaotfload-fonts.lua +++ b/luaotfload-fonts.lua @@ -188,9 +188,30 @@ local function scan_dir(dirname, names, recursive, texmf) end end +local system = LUAROCKS_UNAME_S or io.popen("uname -s"):read("*l") +if system then + if system:match("^CYGWIN") then + system = 'cygwin' + elseif system:match("^Windows") then + system = 'windows' + else + system = 'unix' + end +else + system = 'unix' -- ? +end +log(1, "detecting system: %s", system) + local texmfdist = kpse.expand_var("$TEXMFDIST") local texmfmain = kpse.expand_var("$TEXMFMAIN") local texmflocal = kpse.expand_var("$TEXMFLOCAL") +-- We lowercase everything under Windows, in order to get a bit of consistency +if system == 'windows' or system == 'cygwin' then + texmfdist = string.lower(texmfdist) + texmfmain = string.lower(texmfmain) + texmflocal = string.lower(texmflocal) +end + local function is_texmf(dir) if dir:find(texmfdist) or dir:find(texmfmain) or dir:find(texmflocal) then @@ -199,7 +220,7 @@ local function is_texmf(dir) return false end -local function read_fcdata(fontdirs, data) +local function read_fcdata(fontdirs, data, translate) local to_add = nil local done = nil for line in data:lines() do @@ -209,7 +230,7 @@ local function read_fcdata(fontdirs, data) if match:find("ype1") then to_add = nil else - to_add = match + to_add = translate(match) end elseif to_add then match = line:match('^"[^"]+%.[^"]+"') @@ -228,18 +249,63 @@ local function read_fcdata(fontdirs, data) end end +local function cygwin_translate(name) + local res = string.lower(io.popen(string.format("cygpath.exe --mixed %s", name)):read("*all")) + -- a very strange thing: spaces are replaced by \n and there is a trailing \n at the end + res = res:gsub("\n$", '') + res = res:gsub("\n", ' ') + return res +end + +local function windows_translate(name) + return string.lower(name) +end + +local function no_translate(name) + return name +end + local function append_fccatdirs(fontdirs) + -- under cygwin we have the choice between the + -- fc-cat of cygwin and the fc-cat of TeXLive. + -- we try the fc-cat from TeXLive. + local translate = no_translate + if system == 'cygwin' then + local path = kpse.expand_var("$TEXMFMAIN")..'/../bin/win32/fc-cat.exe' + if lfs.isfile(path) then + log(1, "executing `%s' -v\n", path) + -- This line doesn't work at all, it replaces a space by a \n, can't understand why... + -- the bug should be reported somewhere... TeXLive or LuaTeX? + --local data = io.popen(string.format("%s -v", path), 'r') + local data = io.popen(path.." -v", 'r') + local result = read_fcdata(fontdirs, data, windows_translate) + data:close() + if result then + return result + else + translate = cygwin_translate + log(1, "fail") + end + else + log(1, "unable to find TeXLive's fc-cat.exe") + translate = cygwin_translate + end + --translate = cygwin_translate + elseif system == 'windows' then + translate = windows_translate + end log(1, "executing `fc-cat -v'\n") local data = io.popen("fc-cat -v", 'r') - local result = read_fcdata(fontdirs, data) + local result = read_fcdata(fontdirs, data, translate) data:close() + -- this part may be removed (needs further tests though, under non-cygwin Windows systems) if not result then log(1, "fail, now trying `fc-cat.exe -v'\n") data = io.popen("fc-cat.exe -v", 'r') - result = read_fcdata(fontdirs, data) + result = read_fcdata(fontdirs, data, translate) data:close() if not result then - info("Unable to execute fc-cat nor fc-cat.exe, system fonts may not be available") + info("Unable to execute fc-cat nor fc-cat.exe, system fonts will not be available") return fontdirs end end @@ -249,6 +315,9 @@ end local function scan_all(names) local fontdirs = string.gsub(expandpath("$OPENTYPEFONTS"), "^\.[;:]", "") fontdirs = fontdirs .. string.gsub(expandpath("$TTFONTS"), "^\.", "") + if system == 'windows' or system == 'cygwin' then + fontdirs = string.lower(fontdirs) + end if not fontdirs:is_empty() then fontdirs = splitpath(fontdirs) fontdirs = table.tohash(fontdirs) @@ -290,3 +359,4 @@ luaotfload.fonts.generate = generate if arg[0] == "luaotfload-fonts.lua" then generate() end + |