40 f = fileNameOrDevice |
41 f = fileNameOrDevice |
41 else: |
42 else: |
42 f = QFile(fileNameOrDevice) |
43 f = QFile(fileNameOrDevice) |
43 if root is None or not f.open(QIODevice.OpenModeFlag.WriteOnly): |
44 if root is None or not f.open(QIODevice.OpenModeFlag.WriteOnly): |
44 return False |
45 return False |
45 |
46 |
46 self.__dev = f |
47 self.__dev = f |
47 return self.__write(root) |
48 return self.__write(root) |
48 |
49 |
49 def __write(self, root): |
50 def __write(self, root): |
50 """ |
51 """ |
51 Private method to write an Netscape HTML bookmark file. |
52 Private method to write an Netscape HTML bookmark file. |
52 |
53 |
53 @param root root node of the bookmark tree (BookmarkNode) |
54 @param root root node of the bookmark tree (BookmarkNode) |
54 @return flag indicating success (boolean) |
55 @return flag indicating success (boolean) |
55 """ |
56 """ |
56 self.__dev.write( |
57 self.__dev.write( |
57 "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" |
58 "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" |
58 "<!-- This is an automatically generated file.\n" |
59 "<!-- This is an automatically generated file.\n" |
59 " It will be read and overwritten.\n" |
60 " It will be read and overwritten.\n" |
60 " DO NOT EDIT! -->\n" |
61 " DO NOT EDIT! -->\n" |
61 "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;" |
62 '<META HTTP-EQUIV="Content-Type" CONTENT="text/html;' |
62 " charset=UTF-8\">\n" |
63 ' charset=UTF-8">\n' |
63 "<TITLE>Bookmarks</TITLE>\n" |
64 "<TITLE>Bookmarks</TITLE>\n" |
64 "<H1>Bookmarks</H1>\n" |
65 "<H1>Bookmarks</H1>\n" |
65 "\n" |
66 "\n" |
66 "<DL><p>\n") |
67 "<DL><p>\n" |
|
68 ) |
67 if root.type() == BookmarkNode.Root: |
69 if root.type() == BookmarkNode.Root: |
68 for child in root.children(): |
70 for child in root.children(): |
69 self.__writeItem(child, self.indentSize) |
71 self.__writeItem(child, self.indentSize) |
70 else: |
72 else: |
71 self.__writeItem(root, self.indentSize) |
73 self.__writeItem(root, self.indentSize) |
72 self.__dev.write("</DL><p>\n") |
74 self.__dev.write("</DL><p>\n") |
73 return True |
75 return True |
74 |
76 |
75 def __writeItem(self, node, indent): |
77 def __writeItem(self, node, indent): |
76 """ |
78 """ |
77 Private method to write an entry for a node. |
79 Private method to write an entry for a node. |
78 |
80 |
79 @param node reference to the node to be written (BookmarkNode) |
81 @param node reference to the node to be written (BookmarkNode) |
80 @param indent size of the indentation (integer) |
82 @param indent size of the indentation (integer) |
81 """ |
83 """ |
82 if node.type() == BookmarkNode.Folder: |
84 if node.type() == BookmarkNode.Folder: |
83 self.__writeFolder(node, indent) |
85 self.__writeFolder(node, indent) |
84 elif node.type() == BookmarkNode.Bookmark: |
86 elif node.type() == BookmarkNode.Bookmark: |
85 self.__writeBookmark(node, indent) |
87 self.__writeBookmark(node, indent) |
86 elif node.type() == BookmarkNode.Separator: |
88 elif node.type() == BookmarkNode.Separator: |
87 self.__writeSeparator(indent) |
89 self.__writeSeparator(indent) |
88 |
90 |
89 def __writeSeparator(self, indent): |
91 def __writeSeparator(self, indent): |
90 """ |
92 """ |
91 Private method to write a separator. |
93 Private method to write a separator. |
92 |
94 |
93 @param indent size of the indentation (integer) |
95 @param indent size of the indentation (integer) |
94 """ |
96 """ |
95 self.__dev.write(" " * indent) |
97 self.__dev.write(" " * indent) |
96 self.__dev.write("<HR>\n") |
98 self.__dev.write("<HR>\n") |
97 |
99 |
98 def __writeBookmark(self, node, indent): |
100 def __writeBookmark(self, node, indent): |
99 """ |
101 """ |
100 Private method to write a bookmark node. |
102 Private method to write a bookmark node. |
101 |
103 |
102 @param node reference to the node to be written (BookmarkNode) |
104 @param node reference to the node to be written (BookmarkNode) |
103 @param indent size of the indentation (integer) |
105 @param indent size of the indentation (integer) |
104 """ |
106 """ |
105 added = ( |
107 added = ( |
106 " ADD_DATE=\"{0}\"".format(node.added.toTime_t()) |
108 ' ADD_DATE="{0}"'.format(node.added.toTime_t()) |
107 if node.added.isValid() else |
109 if node.added.isValid() |
108 "" |
110 else "" |
109 ) |
111 ) |
110 modified = ( |
112 modified = ( |
111 " LAST_MODIFIED=\"{0}\"".format(node.modified.toTime_t()) |
113 ' LAST_MODIFIED="{0}"'.format(node.modified.toTime_t()) |
112 if node.modified.isValid() else |
114 if node.modified.isValid() |
113 "" |
115 else "" |
114 ) |
116 ) |
115 visited = ( |
117 visited = ( |
116 " LAST_VISIT=\"{0}\"".format(node.visited.toTime_t()) |
118 ' LAST_VISIT="{0}"'.format(node.visited.toTime_t()) |
117 if node.visited.isValid() else |
119 if node.visited.isValid() |
118 "" |
120 else "" |
119 ) |
121 ) |
120 |
122 |
121 self.__dev.write(" " * indent) |
123 self.__dev.write(" " * indent) |
122 self.__dev.write("<DT><A HREF=\"{0}\"{1}{2}{3}>{4}</A>\n".format( |
124 self.__dev.write( |
123 node.url, added, modified, visited, |
125 '<DT><A HREF="{0}"{1}{2}{3}>{4}</A>\n'.format( |
124 Utilities.html_uencode(node.title) |
126 node.url, added, modified, visited, Utilities.html_uencode(node.title) |
125 )) |
127 ) |
126 |
128 ) |
|
129 |
127 if node.desc: |
130 if node.desc: |
128 self.__dev.write(" " * indent) |
131 self.__dev.write(" " * indent) |
129 self.__dev.write("<DD>{0}\n".format( |
132 self.__dev.write( |
130 Utilities.html_uencode("".join(node.desc.splitlines())))) |
133 "<DD>{0}\n".format( |
131 |
134 Utilities.html_uencode("".join(node.desc.splitlines())) |
|
135 ) |
|
136 ) |
|
137 |
132 def __writeFolder(self, node, indent): |
138 def __writeFolder(self, node, indent): |
133 """ |
139 """ |
134 Private method to write a bookmark node. |
140 Private method to write a bookmark node. |
135 |
141 |
136 @param node reference to the node to be written (BookmarkNode) |
142 @param node reference to the node to be written (BookmarkNode) |
137 @param indent size of the indentation (integer) |
143 @param indent size of the indentation (integer) |
138 """ |
144 """ |
139 folded = "" if node.expanded else " FOLDED" |
145 folded = "" if node.expanded else " FOLDED" |
140 |
146 |
141 added = ( |
147 added = ( |
142 " ADD_DATE=\"{0}\"".format(node.added.toTime_t()) |
148 ' ADD_DATE="{0}"'.format(node.added.toTime_t()) |
143 if node.added.isValid() else |
149 if node.added.isValid() |
144 "" |
150 else "" |
145 ) |
151 ) |
146 |
152 |
147 self.__dev.write(" " * indent) |
153 self.__dev.write(" " * indent) |
148 self.__dev.write("<DT><H3{0}{1}>{2}</H3>\n".format( |
154 self.__dev.write( |
149 folded, added, Utilities.html_uencode(node.title) |
155 "<DT><H3{0}{1}>{2}</H3>\n".format( |
150 )) |
156 folded, added, Utilities.html_uencode(node.title) |
151 |
157 ) |
|
158 ) |
|
159 |
152 if node.desc: |
160 if node.desc: |
153 self.__dev.write(" " * indent) |
161 self.__dev.write(" " * indent) |
154 self.__dev.write("<DD>{0}\n".format( |
162 self.__dev.write("<DD>{0}\n".format("".join(node.desc.splitlines()))) |
155 "".join(node.desc.splitlines()))) |
163 |
156 |
|
157 self.__dev.write(" " * indent) |
164 self.__dev.write(" " * indent) |
158 self.__dev.write("<DL><p>\n") |
165 self.__dev.write("<DL><p>\n") |
159 |
166 |
160 for child in node.children(): |
167 for child in node.children(): |
161 self.__writeItem(child, indent + self.indentSize) |
168 self.__writeItem(child, indent + self.indentSize) |
162 |
169 |
163 self.__dev.write(" " * indent) |
170 self.__dev.write(" " * indent) |
164 self.__dev.write("</DL><p>\n") |
171 self.__dev.write("</DL><p>\n") |