2 Bookmarks storage manager - json.
4 Written by Broytman, Jul 2010. Copyright (C) 2010 PhiloSoft Design
11 import simplejson as json
13 from bkmk_objects import Folder, Bookmark, Ruler, Walker
16 class storage_json(Walker):
17 filename = "bookmarks_db.json"
19 def root_folder(self, f):
22 def start_folder(self, f, level):
25 def bookmark(self, b, level):
28 def ruler(self, r, level):
31 def store(self, root_folder):
32 root_folder.walk_depth(self)
34 outfile = open(self.filename, 'wb')
35 json.dump(self.dict, outfile)
41 infile = open(self.filename, 'rb')
42 bkmk_s = infile.read()
45 # Work around a bug in Mozilla - remove the trailing comma
46 bkmk_s = bkmk_s.strip().replace(',]', ']')
47 bookmarks_dict = json.loads(bkmk_s)
49 root_folder = Folder()
50 root_folder.header = ''
51 self.folder_stack = [root_folder]
52 self.current_folder = root_folder
54 self.load_folder(root_folder, bookmarks_dict)
56 raise RuntimeError('Excessive folder stack: %s' % self.folder_stack)
60 def load_folder(self, folder, _dict):
61 if _dict["type"] != "text/x-moz-place-container":
62 raise ValueError("Root object is not a Mozilla container")
64 folder.id = _dict["id"]
65 folder.index = _dict.get("index")
66 folder.parent_idx = _dict.get("parent")
68 folder.name = encode(_dict["title"])
69 folder.href = _dict.get("uri")
71 folder.add_date = _dict["dateAdded"]
72 folder.last_modified = _dict["lastModified"]
74 for record in _dict["children"]:
75 if record["type"] == "text/x-moz-place":
78 add_date=record.get("dateAdded"),
79 last_modified=record.get("lastModified"),
80 charset=record.get("charset"))
81 bookmark.id = record["id"]
82 bookmark.parent_idx = record["parent"]
83 bookmark.name = encode(record["title"])
84 self.current_folder.append(bookmark)
86 elif record["type"] == "text/x-moz-place-container":
88 add_date=record["dateAdded"], comment=None,
89 last_modified=record["lastModified"])
90 folder.id = record["id"]
91 folder.parent_idx = record["parent"]
92 folder.name = encode(record["title"])
93 self.current_folder.append(folder)
94 self.folder_stack.append(folder)
95 self.current_folder = folder
96 self.load_folder(folder, record)
98 elif record["type"] == "text/x-moz-place-separator":
100 ruler.add_date = record["dateAdded"]
101 ruler.id = record["id"]
102 ruler.index = record["index"]
103 ruler.last_modified = record["lastModified"]
104 ruler.parent_idx = record["parent"]
105 ruler.name = encode(record["title"])
106 self.current_folder.append(ruler)
109 raise ValueError('Unknown record type "%s"' % record["type"])
111 del self.folder_stack[-1]
112 if self.folder_stack:
113 self.current_folder = self.folder_stack[-1]
115 self.current_folder = None
118 return title.encode("UTF-8", "xmlcharrefreplace")