diff options
Diffstat (limited to 'ranger/container/file.py')
-rw-r--r-- | ranger/container/file.py | 90 |
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) |