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