summary refs log tree commit diff stats
path: root/ranger/bookmark.py
blob: e9bfcee1dcc53964a0634b8be20d7d3b8a5b40a9 (plain) (blame)
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
from string import ascii_letters, digits
ALLOWED_KEYS = ascii_letters + digits + "`'"

class NonexistantBookmark(Exception):
	pass

class Bookmarks(object):
	def __init__(self, path = None):
		import string, re, os
		self.dct = {}
		if path is None:
			self.path = os.path.expanduser("~/.ranger/bookmarks")
		self.load_pattern = re.compile(r"^[\d\w`']:.")
		self.enter_dir_function = None

	def load(self):
		import os
		self.dct.clear()

		if os.access(self.path, os.R_OK):
			f = open(self.path, 'r')
			for line in f:
				if self.load_pattern.match(line):
					key, value = line[0], line[2:-1]
					if key in ALLOWED_KEYS: 
						self.dct[key] = value

			f.close()

	def enter(self, key):
		if self.enter_dir_function is not None:
			self.enter_dir_function(self[key])
		else:
			raise RuntimeError('Not specified how to enter a directory')

	def remember(self, value):
		self["`"] = value
		self["'"] = value

	def __getitem__(self, key):
		if key in self.dct:
			return self.dct[key]
		else:
			raise NonexistantBookmark()

	def __setitem__(self, key, value):
		if key in ALLOWED_KEYS:
			self.dct[key] = value
			self.save()

	def __contains__(self, key):
		return key in self.dct

	def save(self):
		import os
		if os.access(self.path, os.W_OK):
			f = open(self.path, 'w')

			for key, value in self.dct.items():
				if type(key) == str\
						and type(value) == str \
						and key in ALLOWED_KEYS:
					f.write("{0}:{1}\n".format(str(key), str(value)))

			f.close()