2 Objects to represent bookmarks.html structure
4 Written by BroytMann, Mar 2000 - Sep 2007. Copyright (C) 2000-2007 PhiloSoft Design
8 from UserList import UserList
10 class Folder(UserList):
14 def __init__(self, add_date=None, comment='', last_modified=None):
15 UserList.__init__(self)
16 self.comment = comment
17 self.add_date = add_date
18 self.last_modified = last_modified
20 def walk_depth(self, walker, level=0):
21 if hasattr(self, "header"): # root folder
23 walker.root_folder(self)
25 prune = walker.prune_folder(self)
27 walker.start_folder(self, level)
30 for object in self.data:
32 object.walk_depth(walker, level+1)
33 elif object.isBookmark:
34 walker.bookmark(object, level)
36 walker.ruler(object, level)
38 walker.end_folder(self, level)
45 def __init__(self, href, add_date, last_visit=None, last_modified=None,
46 keyword=None, comment='', icon=None, charset=None):
48 self.add_date = add_date
49 self.last_visit = last_visit
50 self.last_modified = last_modified
51 self.keyword = keyword
52 self.comment = comment
54 self.charset = charset
64 Interface class. Any instance that will be passed to Folder.walk_depth
65 may be derived from this class. It is not mandatory - unlike Java
66 Python does not require interface classes; but it is convenient to have
67 some methods predefined to no-op, in case you do not want to
68 provide end_folder etc.
71 def root_folder(self, r):
74 def start_folder(self, f, level):
77 def end_folder(self, f, level):
80 def bookmark(self, b, level):
83 def ruler(self, r, level):
86 def prune_folder(self, folder):
91 def __init__(self, outfile, prune=None):
92 self.outfile = outfile
95 def prune_folder(self, folder):
96 return self.prune == folder.name
100 def __init__(self, tempfname, log):
101 self.tempfname = tempfname
105 pass # Nothing to do on cleanup
108 # Helper class to make inverese links (nodes linked to their parent)
109 class InverseLinker(Walker):
110 def root_folder(self, r):
111 self.parent_stack = [r]
113 def start_folder(self, f, level):
114 f.parent = self.parent_stack[-1]
115 self.parent_stack.append(f) # Push the folder onto the stack of parents
117 def end_folder(self, f, level):
118 del self.parent_stack[-1] # Pop off the stack
120 def bookmark(self, b, level):
121 b.parent = self.parent_stack[-1]
123 def ruler(self, r, level):
124 r.parent = self.parent_stack[-1]
127 # Helper class to make linear represenatation of the tree
128 class Linear(Walker):
129 def root_folder(self, r):
131 self.linear = r.linear
133 def add_object(self, object):
134 self.linear.append(object)
136 def start_folder(self, f, level):
139 def bookmark(self, b, level):
142 def ruler(self, r, level):
146 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
147 def make_linear(root_folder):
148 linker = InverseLinker()
149 root_folder.walk_depth(linker)
152 root_folder.walk_depth(linear)
155 # Helper, opposite of make_linear - make a tree from the linked linear representation
156 def make_tree(linear):
157 root_folder = linear[0]
160 for object in linear:
161 object.parent.append(object)