68 lines
1.5 KiB
Python
68 lines
1.5 KiB
Python
# vim: set fileencoding=utf-8
|
|
|
|
import fnmatch
|
|
import os
|
|
import stat
|
|
|
|
from ranger.api import register_linemode
|
|
from ranger.core.linemode import LinemodeBase
|
|
|
|
from .icons import file_node_extensions, file_node_exact_matches, file_node_pattern_matches
|
|
|
|
|
|
def get_icon(file):
|
|
basename = os.path.basename(file.relative_path)
|
|
|
|
em_icon = file_node_exact_matches.get(basename.lower())
|
|
if em_icon is not None:
|
|
return em_icon
|
|
|
|
for pattern, pm_icon in file_node_pattern_matches.items():
|
|
if fnmatch.filter([basename], pattern):
|
|
return pm_icon
|
|
|
|
default = '' if file.is_directory else ''
|
|
return file_node_extensions.get(file.extension, default)
|
|
|
|
|
|
def get_symbol(file):
|
|
if file.is_link:
|
|
if not file.exists:
|
|
return '!'
|
|
if file.stat and stat.S_ISDIR(file.stat.st_mode):
|
|
return '~'
|
|
return '@'
|
|
|
|
if file.is_socket:
|
|
return '='
|
|
|
|
if file.is_fifo:
|
|
return '|'
|
|
|
|
if not file.is_directory and file.stat:
|
|
mode = file.stat.st_mode
|
|
if mode & stat.S_IXUSR:
|
|
return '*'
|
|
if stat.S_ISCHR(mode):
|
|
return '-'
|
|
if stat.S_ISBLK(mode):
|
|
return '+'
|
|
|
|
# if file.is_directory:
|
|
# return '/'
|
|
|
|
return ''
|
|
|
|
|
|
@register_linemode
|
|
class DevIcons2Linemode(LinemodeBase):
|
|
name = 'devicons2'
|
|
uses_metadata = False
|
|
|
|
def filetitle(self, file, metadata):
|
|
return '{0} {1}{2}'.format(
|
|
get_icon(file),
|
|
file.relative_path,
|
|
get_symbol(file),
|
|
)
|