2 Objects to represent bookmarks.html structure
4 Written by BroytMann, Mar 2000 - Jul 2003. Copyright (C) 2000-2003 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=None, last_modified=None,
47 self.comment = comment
49 self.add_date = add_date
50 self.last_visit = last_visit
51 self.last_modified = last_modified
61 Interface class. Any instance that will be passed to Folder.walk_depth
62 may be derived from this class. It is not mandatory - unlike Java
63 Python does not require interface classes; but it is convenient to have
64 some methods predefined to no-op, in case you do not want to
65 provide end_folder etc.
68 def root_folder(self, r):
71 def start_folder(self, f, level):
74 def end_folder(self, f, level):
77 def bookmark(self, b, level):
80 def ruler(self, r, level):
83 def prune_folder(self, folder):
88 def __init__(self, outfile, prune=None):
89 self.outfile = outfile
92 def prune_folder(self, folder):
93 return self.prune == folder.name
97 def __init__(self, tempfname, log):
98 self.tempfname = tempfname
102 pass # Nothing to do on cleanup
105 # Helper class to make inverese links (nodes linked to their parent)
106 class InverseLinker(Walker):
107 def root_folder(self, r):
108 self.parent_stack = [r]
110 def start_folder(self, f, level):
111 f.parent = self.parent_stack[-1]
112 self.parent_stack.append(f) # Push the folder onto the stack of parents
114 def end_folder(self, f, level):
115 del self.parent_stack[-1] # Pop off the stack
117 def bookmark(self, b, level):
118 b.parent = self.parent_stack[-1]
120 def ruler(self, r, level):
121 r.parent = self.parent_stack[-1]
124 # Helper class to make linear represenatation of the tree
125 class Linear(Walker):
126 def root_folder(self, r):
128 self.linear = r.linear
130 def add_object(self, object):
131 self.linear.append(object)
133 def start_folder(self, f, level):
136 def bookmark(self, b, level):
139 def ruler(self, r, level):
143 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
144 def make_linear(root_folder):
145 linker = InverseLinker()
146 root_folder.walk_depth(linker)
149 root_folder.walk_depth(linear)
152 # Helper, opposite of make_linear - make a tree from the linked linear representation
153 def make_tree(linear):
154 root_folder = linear[0]
157 for object in linear:
158 object.parent.append(object)