2 Objects to represent bookmarks.html structure
4 Written by Oleg BroytMann. Copyright (C) 2000-2007 PhiloSoft Design.
8 BKMK_FORMAT = os.environ.get("BKMK_FORMAT", "MOZILLA")
15 def __init__(self, add_date=None, comment='', last_modified=None):
16 super(Folder, self).__init__()
17 self.comment = comment
18 self.add_date = add_date
19 self.last_modified = last_modified
21 def walk_depth(self, walker, level=0):
22 if hasattr(self, "header"): # root folder
24 walker.root_folder(self)
26 prune = walker.prune_folder(self)
28 walker.start_folder(self, level)
33 object.walk_depth(walker, level+1)
34 elif object.isBookmark:
35 walker.bookmark(object, level)
37 walker.ruler(object, level)
39 walker.end_folder(self, level)
46 def __init__(self, href, add_date, last_visit=None, last_modified=None,
47 keyword=None, comment='', icon=None, charset=None):
49 self.add_date = add_date
50 self.last_visit = last_visit
51 self.last_modified = last_modified
52 self.keyword = keyword
53 self.comment = comment
55 self.charset = charset
65 Interface class. Any instance that will be passed to Folder.walk_depth
66 may be derived from this class. It is not mandatory - unlike Java
67 Python does not require interface classes; but it is convenient to have
68 some methods predefined to no-op, in case you do not want to
69 provide end_folder etc.
72 def root_folder(self, r):
75 def start_folder(self, f, level):
78 def end_folder(self, f, level):
81 def bookmark(self, b, level):
84 def ruler(self, r, level):
87 def prune_folder(self, folder):
92 def __init__(self, outfile, prune=None):
93 self.outfile = outfile
96 def prune_folder(self, folder):
97 return self.prune == folder.name
101 def __init__(self, tempfname, log):
102 self.tempfname = tempfname
106 pass # Nothing to do on cleanup
109 # Helper class to make inverese links (nodes linked to their parent)
110 class InverseLinker(Walker):
111 def root_folder(self, r):
112 self.parent_stack = [r]
114 def start_folder(self, f, level):
115 f.parent = self.parent_stack[-1]
116 self.parent_stack.append(f) # Push the folder onto the stack of parents
118 def end_folder(self, f, level):
119 del self.parent_stack[-1] # Pop off the stack
121 def bookmark(self, b, level):
122 b.parent = self.parent_stack[-1]
124 def ruler(self, r, level):
125 r.parent = self.parent_stack[-1]
128 # Helper class to make linear represenatation of the tree
129 class Linear(Walker):
130 def root_folder(self, r):
132 self.linear = r.linear
134 def add_object(self, object):
135 self.linear.append(object)
137 def start_folder(self, f, level):
140 def bookmark(self, b, level):
143 def ruler(self, r, level):
147 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
148 def make_linear(root_folder):
149 linker = InverseLinker()
150 root_folder.walk_depth(linker)
153 root_folder.walk_depth(linear)
156 # Helper, opposite of make_linear - make a tree from the linked linear representation
157 def make_tree(linear):
158 root_folder = linear[0]
161 for object in linear:
162 object.parent.append(object)
166 def break_tree(linear):
169 for object in linear:
173 def quote_title(title):
174 if BKMK_FORMAT == "MOZILLA":
175 title = cgi.escape(title, 1).replace("'", "'")