]> git.lyx.org Git - lyx.git/blobdiff - lib/scripts/legacy_lyxpreview2ppm.py
make sure docs are disted
[lyx.git] / lib / scripts / legacy_lyxpreview2ppm.py
index c08c9e63477ad21a250f72342b4f769c3b345d88..9b39354673a52da2dd5d34dc324f220af8b20687 100644 (file)
@@ -15,7 +15,7 @@
 # This legacy support will be removed one day...
 
 import glob, os, re, string, sys
-import pipes, shutil, tempfile
+import pipes, tempfile
 
 
 # Pre-compiled regular expressions.
@@ -36,7 +36,11 @@ def error(message):
 def find_exe(candidates, path):
     for prog in candidates:
         for directory in path:
-            full_path = os.path.join(directory, prog)
+            if os.name == "nt":
+                full_path = os.path.join(directory, prog + ".exe")
+            else:
+                full_path = os.path.join(directory, prog)
+
             if os.access(full_path, os.X_OK):
                 return full_path
 
@@ -147,20 +151,68 @@ def get_version_info():
     return string.atoi(match.group(1)), string.atoi(match.group(2))
 
 
+def copyfileobj(fsrc, fdst, rewind=0, length=16*1024):
+    """copy data from file-like object fsrc to file-like object fdst"""
+    if rewind:
+        fsrc.flush()
+        fsrc.seek(0)
+
+    while 1:
+        buf = fsrc.read(length)
+        if not buf:
+            break
+        fdst.write(buf)
+
+
+class TempFile:
+    """clone of tempfile.TemporaryFile to use with python < 2.0."""
+    # Cache the unlinker so we don't get spurious errors at shutdown
+    # when the module-level "os" is None'd out.  Note that this must
+    # be referenced as self.unlink, because the name TempFile
+    # may also get None'd out before __del__ is called.
+    unlink = os.unlink
+
+    def __init__(self):
+        self.filename = tempfile.mktemp()
+        self.file = open(self.filename,"w+b")
+        self.close_called = 0
+
+    def close(self):
+        if not self.close_called:
+            self.close_called = 1
+            self.file.close()
+            self.unlink(self.filename)
+
+    def __del__(self):
+        self.close()
+
+    def read(self, size = -1):
+        return self.file.read(size)
+
+    def write(self, line):
+        return self.file.write(line)
+
+    def seek(self, offset):
+        return self.file.seek(offset)
+
+    def flush(self):
+        return self.file.flush()
+
+
 def mkstemp():
+    """create a secure temporary file and return its object-like file"""
     major, minor = get_version_info()
 
-    if major >= 2 and minor >= 3:
-        return tempfile.mkstemp()
-
-    tmp_name = tempfile.mktemp()
-    return open(tmp_name, 'w'), tmp_name
+    if major >= 2 and minor >= 0:
+        return tempfile.TemporaryFile()
+    else:
+        return TempFile()
 
 
 def legacy_latex_file(latex_file, fg_color, bg_color):
     use_preview_re = re.compile("(\\\\usepackage\[[^]]+)(\]{preview})")
 
-    tmp, tmp_name = mkstemp()
+    tmp = mkstemp()
 
     success = 0
     for line in open(latex_file, 'r').readlines():
@@ -178,26 +230,22 @@ def legacy_latex_file(latex_file, fg_color, bg_color):
                   % (match.group(1), match.group(2), fg_color, bg_color))
 
     if success:
-        tmp.close()
-        shutil.copy(tmp_name, latex_file)
-    os.remove(tmp_name)
+        copyfileobj(tmp, open(latex_file,"wb"), 1)
 
     return success
 
 
 def crop_files(pnmcrop, basename):
     t = pipes.Template()
-    t.append("%s -left $IN" % pnmcrop, 'f-')
-    t.append("%s -right > $OUT" % pnmcrop, '-f')
-
-    tmp, tmp_name = mkstemp()
-    tmp.close()
-    os.remove(tmp_name)
+    t.append("%s -left" % pnmcrop, '--')
+    t.append("%s -right" % pnmcrop, '--')
 
     for file in glob.glob("%s*.ppm" % basename):
-        if t.copy(file, tmp_name):
-            shutil.copy(tmp_name, file)
-        os.remove(tmp_name)
+        tmp = mkstemp()
+        new = t.open(file, "r")
+        copyfileobj(new, tmp)
+        if not new.close():
+            copyfileobj(tmp, open(file,"wb"), 1)
 
 
 def legacy_conversion(argv):
@@ -219,7 +267,7 @@ def legacy_conversion(argv):
     path = string.split(os.getenv("PATH"), os.pathsep)
     latex   = find_exe_or_terminate(["pplatex", "latex2e", "latex"], path)
     dvips   = find_exe_or_terminate(["dvips"], path)
-    gs      = find_exe_or_terminate(["gs"], path)
+    gs      = find_exe_or_terminate(["gswin32", "gs"], path)
     pnmcrop = find_exe(["pnmcrop"], path)
 
     # Move color information into the latex file.