1 """Bookmarks storage module - FLAD (Flat ASCII Database)
3 Special version for compatibility with old (version 1) bkmk2db.
5 This file is a part of Bookmarks database and Internet robot.
8 __author__ = "Oleg Broytman <phd@phdru.name>"
9 __copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design"
10 __license__ = "GNU GPL"
12 __all__ = ['storage_flad']
15 from m_lib.flad import fladm
16 from bkmk_objects import Folder, Bookmark, Ruler, Walker
19 class storage_flad(Walker):
20 filename = "bookmarks_db.flad"
25 def root_folder(self, f):
26 header = f.header.replace(".", ".\n")
27 header = header.replace("<", "\n<", 3)[1:]
28 header_file = open("header", 'wt', encoding='utf-8')
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)
34 def start_folder(self, f, level):
35 self.outfile.write("""
41 """ % (level, f.name, f.add_date, f.comment, f.last_modified or ''))
43 def bookmark(self, b, level):
44 self.outfile.write("""
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 ''))
60 def ruler(self, r, level):
61 self.outfile.write("\nLevel: %s\nRuler: YES\n" % (level+1))
63 def store(self, root_folder):
64 self.outfile = open(self.filename, 'wt', encoding='utf-8')
65 root_folder.walk_depth(self)
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]
74 self.current_folder = self.folder_stack[-1]
76 self.current_folder = None
79 bookmarks_db = fladm.load_from_file(
80 self.filename, fladm.check_record, ["Level"])
82 root_folder = Folder()
83 self.folder_stack = [root_folder]
84 self.current_folder = root_folder
86 header_file = open("header", 'rt', encoding='utf-8')
87 header = header_file.read()
90 header = header.split("\n")
91 root_folder.header = ''.join(header[:5])
92 root_folder.name = ''.join(header[5:6])[4:-5]
93 root_folder.comment = ''.join(header[7:])[4:]
96 got_folder = 1 # Start as if we already have one folder
98 for record in bookmarks_db:
99 level = int(record["Level"])
101 if level == save_level:
103 elif level == save_level + 1:
105 raise ValueError("indent without folder")
106 elif level <= save_level - 1:
107 self.unindent(save_level, level)
109 raise ValueError("new level (%d) too big; must be %d - %d"
110 % (level, save_level-1, save_level+1))
113 # Test here to save got_folder for next loop
114 got_folder = "Folder" in record
117 comment = record["Comment"].replace("\\n", '\n')
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)
125 elif "Folder" in record:
127 record["AddDate"], record["Comment"],
128 record["LastModified"]
130 folder.name = record["Folder"]
131 self.current_folder.append(folder)
132 self.folder_stack.append(folder)
133 self.current_folder = folder
135 elif "Ruler" in record:
136 self.current_folder.append(Ruler())
140 'neither "URL" nor "Folder" nor "Ruler" in record '
145 self.unindent(save_level, 0)
147 raise ValueError("new level (%d) too little - must be >= 0"