summary refs log tree commit diff stats
path: root/ranger/container/tags.py
diff options
context:
space:
mode:
Diffstat (limited to 'ranger/container/tags.py')
-rw-r--r--ranger/container/tags.py55
1 files changed, 40 insertions, 15 deletions
diff --git a/ranger/container/tags.py b/ranger/container/tags.py
index 9ef8a1b2..ed015d16 100644
--- a/ranger/container/tags.py
+++ b/ranger/container/tags.py
@@ -14,8 +14,12 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from os.path import isdir, exists, dirname, abspath, realpath, expanduser
+import string
+
+ALLOWED_KEYS = string.ascii_letters + string.digits + string.punctuation
 
 class Tags(object):
+
 	def __init__(self, filename):
 
 		self._filename = realpath(abspath(expanduser(filename)))
@@ -28,33 +32,47 @@ class Tags(object):
 	def __contains__(self, item):
 		return item in self.tags
 
-	def add(self, *items):
+	def add(self, *items, **others):
+		if 'mark' in others:
+			mark = others['mark']
+		else:
+			mark = '*'
 		self.sync()
 		for item in items:
-			self.tags.add(item)
+			self.tags[item] = mark
 		self.dump()
 
 	def remove(self, *items):
 		self.sync()
 		for item in items:
 			try:
-				self.tags.remove(item)
+				del(self.tags[item])
 			except KeyError:
 				pass
 		self.dump()
 
-	def toggle(self, *items):
+	def toggle(self, *items, **others):
+		if 'mark' in others:
+			mark = others['mark']
+		else:
+			mark = '*'
 		self.sync()
 		for item in items:
-			if item in self:
-				try:
-					self.tags.remove(item)
-				except KeyError:
-					pass
-			else:
-				self.tags.add(item)
+			try:
+				if item in self and self.tags[item] == mark:
+					del(self.tags[item])
+				else:
+					self.tags[item] = mark
+			except KeyError:
+				pass
 		self.dump()
 
+	def marker(self, item):
+		if item in self.tags:
+			return self.tags[item]
+		else:
+			return '*'
+
 	def sync(self):
 		try:
 			f = open(self._filename, 'r')
@@ -74,13 +92,20 @@ class Tags(object):
 			f.close()
 
 	def _compile(self, f):
-		for line in self.tags:
-			f.write(line + '\n')
+		for path, mark in self.tags.items():
+			if mark in ALLOWED_KEYS:
+				f.write('{0}:{1}\n'.format(mark, path))
 
 	def _parse(self, f):
-		result = set()
+		result = dict()
 		for line in f:
-			result.add(line.strip())
+			line = line.strip()
+			if len(line) > 2 and line[1] == ':':
+				mark, path = line[0], line[2:]
+				if mark in ALLOWED_KEYS:
+					result[path] = mark
+			else:
+				result[line] = '*'
 		return result
 
 	def __nonzero__(self):