2 Objects to represent bookmarks.html structure
4 Written by BroytMann, Mar 2000 - Jul 2002. Copyright (C) 2000-2002 PhiloSoft Design
8 from UserList import UserList
10 class Folder(UserList):
14 def __init__(self, add_date = None, comment = ''):
15 UserList.__init__(self)
16 self.comment = comment
17 self.add_date = add_date
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, last_modified, comment = ''):
46 self.comment = comment
48 self.add_date = add_date
49 self.last_visit = last_visit
50 self.last_modified = last_modified
60 Interface class. Any instance that will be passed to Folder.walk_depth
61 may be derived from this class. It is not mandatory - unlike Java
62 Python does not require interface classes; but it is convenient to have
63 some methods predefined to no-op, in case you do not want to
64 provide end_folder etc.
67 def root_folder(self, r):
70 def start_folder(self, f, level):
73 def end_folder(self, f, level):
76 def bookmark(self, b, level):
79 def ruler(self, r, level):
82 def prune_folder(self, folder):
87 def __init__(self, outfile, prune=None):
88 self.outfile = outfile
91 def prune_folder(self, folder):
92 return self.prune == folder.name
96 def __init__(self, tempfname, log):
97 self.tempfname = tempfname
101 pass # Nothing to do on cleanup
104 # Helper class to make inverese links (nodes linked to their parent)
105 class InverseLinker(Walker):
106 def root_folder(self, r):
107 self.parent_stack = [r]
109 def start_folder(self, f, level):
110 f.parent = self.parent_stack[-1]
111 self.parent_stack.append(f) # Push the folder onto the stack of parents
113 def end_folder(self, f, level):
114 del self.parent_stack[-1] # Pop off the stack
116 def bookmark(self, b, level):
117 b.parent = self.parent_stack[-1]
119 def ruler(self, r, level):
120 r.parent = self.parent_stack[-1]
123 # Helper class to make linear represenatation of the tree
124 class Linear(Walker):
125 def root_folder(self, r):
127 self.linear = r.linear
129 def add_object(self, object):
130 self.linear.append(object)
132 def start_folder(self, f, level):
135 def bookmark(self, b, level):
138 def ruler(self, r, level):
142 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
143 def make_linear(root_folder):
144 linker = InverseLinker()
145 root_folder.walk_depth(linker)
148 root_folder.walk_depth(linear)
151 # Helper, opposite of make_linear - make a tree from the linked linear representation
152 def make_tree(linear):
153 root_folder = linear[0]
156 for object in linear:
157 object.parent.append(object)