summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElie Roux <eroux@dedibox.ebzao.info>2010-01-20 15:48:56 +0100
committerElie Roux <eroux@dedibox.ebzao.info>2010-01-20 15:48:56 +0100
commit09093ef038f393ba643f0b18e7befc36d7394db1 (patch)
treebc5c2ec5c7eb7326420abbc835ada98cd574c830
parent939da416b5435352ca46975701a69b8c0965cda6 (diff)
downloadluaotfload-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.lua80
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
+