2 Objects to represent bookmarks.html structure
4 Written by Oleg Broytman. Copyright (C) 2000-2010 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_href=None, 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
54 self.icon_href = icon_href
56 self.charset = charset
66 Interface class. Any instance that will be passed to Folder.walk_depth
67 may be derived from this class. It is not mandatory - unlike Java
68 Python does not require interface classes; but it is convenient to have
69 some methods predefined to no-op, in case you do not want to
70 provide end_folder etc.
73 def root_folder(self, r):
76 def start_folder(self, f, level):
79 def end_folder(self, f, level):
82 def bookmark(self, b, level):
85 def ruler(self, r, level):
88 def prune_folder(self, folder):
93 def __init__(self, outfile, prune=None):
94 self.outfile = outfile
97 def prune_folder(self, folder):
98 return self.prune == folder.name
102 def __init__(self, tempfname, log):
103 self.tempfname = tempfname
107 pass # Nothing to do on cleanup
110 # Helper class to make inverese links (nodes linked to their parent)
111 class InverseLinker(Walker):
112 def root_folder(self, r):
113 self.parent_stack = [r]
115 def start_folder(self, f, level):
116 f.parent = self.parent_stack[-1]
117 self.parent_stack.append(f) # Push the folder onto the stack of parents
119 def end_folder(self, f, level):
120 del self.parent_stack[-1] # Pop off the stack
122 def bookmark(self, b, level):
123 b.parent = self.parent_stack[-1]
125 def ruler(self, r, level):
126 r.parent = self.parent_stack[-1]
129 # Helper class to make linear represenatation of the tree
130 class Linear(Walker):
131 def root_folder(self, r):
133 self.linear = r.linear
135 def add_object(self, object):
136 self.linear.append(object)
138 def start_folder(self, f, level):
141 def bookmark(self, b, level):
144 def ruler(self, r, level):
148 # Helper - make linked linear represenatation of the tree, suitable to be stored in sequential storage
149 def make_linear(root_folder):
150 linker = InverseLinker()
151 root_folder.walk_depth(linker)
154 root_folder.walk_depth(linear)
157 # Helper, opposite of make_linear - make a tree from the linked linear representation
158 def make_tree(linear):
159 root_folder = linear[0]
162 for object in linear:
163 object.parent.append(object)
167 def break_tree(linear):
170 for object in linear:
174 def quote_title(title):
175 if BKMK_FORMAT == "MOZILLA":
176 title = title.replace("'", "'")
179 def unquote_title(title):
180 if BKMK_FORMAT == "MOZILLA":
181 from HTMLParser import HTMLParser
182 title = HTMLParser().unescape(title.replace("&", '&'))
183 title = title.replace("'", "'")