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