1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# -*- coding: utf-8 -*-
# This file is part of ranger, the console file manager.
# License: GNU GPL version 3, see the file "AUTHORS" for details.
# Author: Wojciech Siewierski <wojciech.siewierski@onet.pl>, 2015
from abc import *
DEFAULT_LINEMODE = "filename"
class LinemodeBase(object):
"""Supplies the file line contents for BrowserColumn.
Attributes:
name (required!) - Name by which the linemode is referred to by the user
uses_metadata - True if metadata should to be loaded for this linemode
required_metadata -
If any of these metadata fields are absent, fall back to
the default linemode
"""
__metaclass__ = ABCMeta
uses_metadata = False
required_metadata = []
name = abstractproperty()
@abstractmethod
def filetitle(self, file, metadata):
"""The left-aligned part of the line."""
raise NotImplementedError
def infostring(self, file, metadata):
"""The right-aligned part of the line.
If `NotImplementedError' is raised (e.g. this method is just
not implemented in the actual linemode), the caller should
provide its own implementation (which in this case means
displaying the hardlink count of the directories, size of the
files and additionally a symlink marker for symlinks). Useful
because only the caller (BrowserColumn) possesses the data
necessary to display that information.
"""
raise NotImplementedError
class DefaultLinemode(LinemodeBase):
name = "filename"
def filetitle(self, file, metadata):
return file.relative_path
class TitleLinemode(LinemodeBase):
name = "metatitle"
uses_metadata = True
required_metadata = ["title"]
def filetitle(self, file, metadata):
name = metadata.title or file.basename
if metadata.year:
return "%s - %s" % (metadata.year, name)
else:
return name
def infostring(self, file, metadata):
if metadata.authors:
authorstring = metadata.authors
if ',' in authorstring:
authorstring = authorstring[0:authorstring.find(",")]
return authorstring
return ""
class PermissionsLinemode(LinemodeBase):
name = "permissions"
def filetitle(self, file, metadata):
return "%s %s %s %s" % (file.get_permission_string(),
file.user, file.group, file.relative_path)
def infostring(self, file, metadata):
return ""
class FileInfoLinemode(LinemodeBase):
name = "fileinfo"
def filetitle(self, file, metadata):
return file.relative_path
def infostring(self, file, metadata):
if not file.is_directory:
from subprocess import check_output
fileinfo = check_output(["file", "-bL", file.path]).strip()
return fileinfo
else:
raise NotImplementedError
|