summary refs log tree commit diff stats
path: root/ranger/container/file.py
diff options
context:
space:
mode:
Diffstat (limited to 'ranger/container/file.py')
-rw-r--r--ranger/container/file.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/ranger/container/file.py b/ranger/container/file.py
new file mode 100644
index 00000000..b6a96a20
--- /dev/null
+++ b/ranger/container/file.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2009-2013  Roman Zimbelmann <hut@lavabit.com>
+# This software is distributed under the terms of the GNU GPL version 3.
+
+import re
+from ranger.container.fsobject import FileSystemObject
+from ranger.core.shared import SettingsAware
+
+N_FIRST_BYTES = 256
+control_characters = set(chr(n) for n in
+        set(range(0, 9)) | set(range(14, 32)))
+
+# Don't even try to preview files which mach this regular expression:
+PREVIEW_BLACKLIST = re.compile(r"""
+        # look at the extension:
+        \.(
+            # one character extensions:
+                [oa]
+            # media formats:
+                | avi | mpe?g | mp\d | og[gmv] | wm[av] | mkv | flv
+                | vob | wav | mpc | flac | divx? | xcf | pdf
+            # binary files:
+                | torrent | class | so | img | py[co] | dmg
+        )
+        # ignore filetype-independent suffixes:
+            (\.part|\.bak|~)?
+        # ignore fully numerical file extensions:
+            (\.\d+)*?
+        $
+""", re.VERBOSE | re.IGNORECASE)
+
+# Preview these files (almost) always:
+PREVIEW_WHITELIST = re.compile(r"""
+        \.(
+            txt | py | c
+        )
+        # ignore filetype-independent suffixes:
+            (\.part|\.bak|~)?
+        $
+""", re.VERBOSE | re.IGNORECASE)
+
+class File(FileSystemObject, SettingsAware):
+    is_file = True
+    preview_data = None
+    preview_known = False
+    preview_loading = False
+
+    @property
+    def firstbytes(self):
+        try:
+            return self._firstbytes
+        except:
+            try:
+                f = open(self.path, 'r')
+                self._firstbytes = f.read(N_FIRST_BYTES)
+                f.close()
+                return self._firstbytes
+            except:
+                pass
+
+    def is_binary(self):
+        if self.firstbytes and control_characters & set(self.firstbytes):
+            return True
+        return False
+
+    def has_preview(self):
+        if not self.fm.settings.preview_files:
+            return False
+        if self.is_socket or self.is_fifo or self.is_device:
+            return False
+        if not self.accessible:
+            return False
+        if self.fm.settings.preview_script and \
+                self.fm.settings.use_preview_script:
+            return True
+        if self.image and self.fm.settings.preview_images:
+            return True
+        if self.container:
+            return False
+        if PREVIEW_WHITELIST.search(self.basename):
+            return True
+        if PREVIEW_BLACKLIST.search(self.basename):
+            return False
+        if self.path == '/dev/core' or self.path == '/proc/kcore':
+            return False
+        if self.is_binary():
+            return False
+        return True
+
+    def get_preview_source(self, width, height):
+        return self.fm.get_preview(self, width, height)