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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# -*- 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
import sys
from abc import ABCMeta, abstractproperty, abstractmethod
from datetime import datetime
from ranger.ext.human_readable import human_readable
from ranger.ext import spawn
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): # pylint: disable=abstract-method
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
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 CalledProcessError
try:
fileinfo = spawn.check_output(["file", "-bL", file.path]).strip()
except CalledProcessError:
return "unknown"
if sys.version_info[0] >= 3:
fileinfo = fileinfo.decode("utf-8")
return fileinfo
else:
raise NotImplementedError
class MtimeLinemode(LinemodeBase):
name = "mtime"
def filetitle(self, file, metadata):
return file.relative_path
def infostring(self, file, metadata):
return datetime.fromtimestamp(file.stat.st_mtime).strftime("%Y-%m-%d %H:%M")
class SizeMtimeLinemode(LinemodeBase):
name = "sizemtime"
def filetitle(self, file, metadata):
return file.relative_path
def infostring(self, file, metadata):
return "%s %s" % (human_readable(file.size),
datetime.fromtimestamp(file.stat.st_mtime).strftime("%Y-%m-%d %H:%M"))
|