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 = ''):
47 self.comment = comment
49 self.add_date = add_date
50 self.last_visit = last_visit
51 self.last_modified = last_modified
52 self.keyword = keyword
62 Interface class. Any instance that will be passed to Folder.walk_depth
63 may be derived from this class. It is not mandatory - unlike Java
64 Python does not require interface classes; but it is convenient to have
65 some methods predefined to no-op, in case you do not want to
66 provide end_folder etc.
69 def root_folder(self, r):
72 def start_folder(self, f, level):
75 def end_folder(self, f, level):
78 def bookmark(self, b, level):
81 def ruler(self, r, level):
84 def prune_folder(self, folder):
89 def __init__(self, outfile, prune=None):
90 self.outfile = outfile
93 def prune_folder(self, folder):
94 return self.prune == folder.name
98 def __init__(self, tempfname, log):
99 self.tempfname = tempfname
103 pass # Nothing to do on cleanup
106 # Helper class to make inverese links (nodes linked to their parent)
107 class InverseLinker(Walker):
108 def root_folder(self, r):
109 self.parent_stack = [r]
111 def start_folder(self, f, level):
112 f.parent = self.parent_stack[-1]
113 self.parent_stack.append(f) # Push the folder onto the stack of parents
115 def end_folder(self, f, level):
116 del self.parent_stack[-1] # Pop off the stack
118 def bookmark(self, b, level):
119 b.parent = self.parent_stack[-1]
121 def ruler(self, r, level):
122 r.parent = self.parent_stack[-1]
125 # Helper class to make linear represenatation of the tree
126 class Linear(Walker):
127 def root_folder(self, r):
129 self.linear = r.linear
131 def add_object(self, object):
132 self.linear.append(object)
134 def start_folder(self, f, level):
137 def bookmark(self, b, level):
140 def ruler(self, r, level):
144 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
145 def make_linear(root_folder):
146 linker = InverseLinker()
147 root_folder.walk_depth(linker)
150 root_folder.walk_depth(linear)
153 # Helper, opposite of make_linear - make a tree from the linked linear representation
154 def make_tree(linear):
155 root_folder = linear[0]
158 for object in linear:
159 object.parent.append(object)