2 Bookmarks storage module - FLAD (Flat ASCII Database)
3 special version for compatibility with old (version 1) bkmk2db
5 Written by BroytMann, Feb 2000 - Sep 2007. Copyright (C) 2000-2007 PhiloSoft Design
10 from m_lib.flad import fladm
11 from bkmk_objects import Folder, Bookmark, Ruler, Walker
14 class storage_flad(Walker):
15 filename = "bookmarks_db.flad"
20 def root_folder(self, f):
21 header = string.replace(f.header, ".", ".\n")
22 header = string.replace(header, "<", "\n<", 3)[1:]
23 header_file = open("header", 'w')
24 header_file.write(header + "\n")
25 header_file.write('<H1>%s</H1>\n\n' % f.name)
26 if f.comment: header_file.write('<DD>%s\n' % f.comment)
29 def start_folder(self, f, level):
30 self.outfile.write("""
36 """ % (level, f.name, f.add_date, f.comment, f.last_modified or ''))
38 def bookmark(self, b, level):
39 self.outfile.write("""
50 """ % (level+1, b.name, b.href, b.add_date, b.last_visit, b.last_modified,
51 b.keyword, b.comment.replace('\n', "\\n"), b.icon or '', b.charset or ''))
54 def ruler(self, r, level):
55 self.outfile.write("\nLevel: %s\nRuler: YES\n" % (level+1))
58 def store(self, root_folder):
59 self.outfile = open(self.filename, 'w')
60 root_folder.walk_depth(self)
64 def unindent(self, old_level, new_level):
65 while old_level > new_level:
66 old_level = old_level - 1
67 del self.folder_stack[-1]
70 self.current_folder = self.folder_stack[-1]
72 self.current_folder = None
75 bookmarks_db = fladm.load_from_file(self.filename, fladm.check_record, ["Level"])
77 root_folder = Folder()
78 self.folder_stack = [root_folder]
79 self.current_folder = root_folder
81 header_file = open("header", 'r')
82 header = header_file.read()
85 header = string.split(header, "\n")
86 root_folder.header = string.join(header[:5], '')
87 root_folder.name = header[5][4:-5]
88 root_folder.comment = string.join(header[7:], '')[4:]
91 got_folder = 1 # Start as if we already have one folder
93 for record in bookmarks_db:
94 level = int(record["Level"])
96 if level == save_level:
98 elif level == save_level + 1:
100 raise ValueError, "indent without folder"
101 elif level <= save_level - 1:
102 self.unindent(save_level, level)
104 raise ValueError, "new level (%d) too big; must be %d - %d" % (level, save_level-1, save_level+1)
107 got_folder = record.has_key("Folder") # Test here to save got_folder for next loop
109 if record.has_key("URL"):
110 comment = record["Comment"].replace("\\n", '\n')
111 bookmark = Bookmark(record["URL"], record["AddDate"],
112 record["LastVisit"], record["LastModified"],
113 record["Keyword"], comment)
114 bookmark.name = record["Title"]
115 self.current_folder.append(bookmark)
117 elif record.has_key("Folder"):
118 folder = Folder(record["AddDate"], record["Comment"], record["LastModified"])
119 folder.name = record["Folder"]
120 self.current_folder.append(folder)
121 self.folder_stack.append(folder)
122 self.current_folder = folder
124 elif record.has_key("Ruler"):
125 self.current_folder.append(Ruler())
128 raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record)
131 self.unindent(save_level, 0)
133 raise ValueError, "new level (%d) too little - must be >= 0" % save_level