]> git.phdru.name Git - bookmarks_db.git/blob - Storage/bkmk_stflad.py
9bd8751c278b9fa6becbee0d552455a43049c8de
[bookmarks_db.git] / Storage / bkmk_stflad.py
1 """
2    Bookmarks storage module - FLAD (Flat ASCII Database)
3       special version for compatibility with old (version 1) bkmk2db
4
5    Written by Broytman. Copyright (C) 2000-2010 PhiloSoft Design
6 """
7
8
9 import string
10 from m_lib.flad import fladm
11 from bkmk_objects import Folder, Bookmark, Ruler, Walker
12
13
14 class storage_flad(Walker):
15    filename = "bookmarks_db.flad"
16
17    def __init__(self):
18       self.first_object = 1
19
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)
27       header_file.close()
28
29    def start_folder(self, f, level):
30       self.outfile.write("""
31 Level: %d
32 Folder: %s
33 AddDate: %s
34 Comment: %s
35 LastModified: %s
36 """ % (level, f.name, f.add_date, f.comment, f.last_modified or ''))
37
38    def bookmark(self, b, level):
39       self.outfile.write("""
40 Level: %d
41 Title: %s
42 URL: %s
43 AddDate: %s
44 LastVisit: %s
45 LastModified: %s
46 Keyword: %s
47 Comment: %s
48 IconURI: %s
49 Icon: %s
50 Charset: %s
51 """ % (level+1, b.name, b.href, b.add_date, b.last_visit, b.last_modified,
52          b.keyword, b.comment.replace('\n', "\\n"),
53          b.icon_href or '', b.icon or '', b.charset or ''))
54
55
56    def ruler(self, r, level):
57       self.outfile.write("\nLevel: %s\nRuler: YES\n" % (level+1))
58
59
60    def store(self, root_folder):
61       self.outfile = open(self.filename, 'w')
62       root_folder.walk_depth(self)
63       self.outfile.close()
64
65
66    def unindent(self, old_level, new_level):
67       while old_level > new_level:
68          old_level = old_level - 1
69          del self.folder_stack[-1]
70
71       if self.folder_stack:
72          self.current_folder = self.folder_stack[-1]
73       else:
74          self.current_folder = None
75
76    def load(self):
77       bookmarks_db = fladm.load_from_file(self.filename, fladm.check_record, ["Level"])
78
79       root_folder = Folder()
80       self.folder_stack = [root_folder]
81       self.current_folder = root_folder
82
83       header_file = open("header", 'r')
84       header = header_file.read()
85       header_file.close()
86
87       header = string.split(header, "\n")
88       root_folder.header = string.join(header[:5], '')
89       root_folder.name = header[5][4:-5]
90       root_folder.comment = string.join(header[7:], '')[4:]
91
92       save_level = 0
93       got_folder = 1 # Start as if we already have one folder
94
95       for record in bookmarks_db:
96          level = int(record["Level"])
97
98          if level == save_level:
99             pass
100          elif level == save_level + 1:
101             if not got_folder:
102                raise ValueError, "indent without folder"
103          elif level <= save_level - 1:
104             self.unindent(save_level, level)
105          else:
106             raise ValueError, "new level (%d) too big; must be %d - %d" % (level, save_level-1, save_level+1)
107
108          save_level = level
109          got_folder = record.has_key("Folder") # Test here to save got_folder for next loop
110
111          if record.has_key("URL"):
112             comment = record["Comment"].replace("\\n", '\n')
113             bookmark = Bookmark(record["URL"], record["AddDate"],
114                record["LastVisit"], record["LastModified"],
115                record["Keyword"], comment)
116             bookmark.name = record["Title"]
117             self.current_folder.append(bookmark)
118
119          elif record.has_key("Folder"):
120             folder = Folder(record["AddDate"], record["Comment"], record["LastModified"])
121             folder.name = record["Folder"]
122             self.current_folder.append(folder)
123             self.folder_stack.append(folder)
124             self.current_folder = folder
125
126          elif record.has_key("Ruler"):
127             self.current_folder.append(Ruler())
128
129          else:
130             raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record)
131
132       if save_level >= 0:
133          self.unindent(save_level, 0)
134       else:
135          raise ValueError, "new level (%d) too little - must be >= 0" % save_level
136
137       return root_folder