|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a class to write Netscape HTML bookmark files. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import QObject, QIODevice, QFile |
|
11 |
|
12 from .BookmarkNode import BookmarkNode |
|
13 |
|
14 import Utilities |
|
15 |
|
16 |
|
17 class NsHtmlWriter(QObject): |
|
18 """ |
|
19 Class implementing a writer object to generate Netscape HTML bookmark files. |
|
20 """ |
|
21 indentSize = 4 |
|
22 |
|
23 def __init__(self): |
|
24 """ |
|
25 Constructor |
|
26 """ |
|
27 super().__init__() |
|
28 |
|
29 def write(self, fileNameOrDevice, root): |
|
30 """ |
|
31 Public method to write an Netscape HTML bookmark file. |
|
32 |
|
33 @param fileNameOrDevice name of the file to write (string) |
|
34 or device to write to (QIODevice) |
|
35 @param root root node of the bookmark tree (BookmarkNode) |
|
36 """ |
|
37 if isinstance(fileNameOrDevice, QIODevice): |
|
38 f = fileNameOrDevice |
|
39 else: |
|
40 f = QFile(fileNameOrDevice) |
|
41 if root is None or not f.open(QFile.WriteOnly): |
|
42 return False |
|
43 |
|
44 self.__dev = f |
|
45 return self.__write(root) |
|
46 |
|
47 def __write(self, root): |
|
48 """ |
|
49 Private method to write an Netscape HTML bookmark file. |
|
50 |
|
51 @param root root node of the bookmark tree (BookmarkNode) |
|
52 """ |
|
53 self.__dev.write("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" |
|
54 "<!-- This is an automatically generated file.\n" |
|
55 " It will be read and overwritten.\n" |
|
56 " DO NOT EDIT! -->\n" |
|
57 "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n" |
|
58 "<TITLE>Bookmarks</TITLE>\n" |
|
59 "<H1>Bookmarks</H1>\n" |
|
60 "\n" |
|
61 "<DL><p>\n") |
|
62 if root.type() == BookmarkNode.Root: |
|
63 for child in root.children(): |
|
64 self.__writeItem(child, self.indentSize) |
|
65 else: |
|
66 self.__writeItem(root, self.indentSize) |
|
67 self.__dev.write("</DL><p>\n") |
|
68 return True |
|
69 |
|
70 def __writeItem(self, node, indent): |
|
71 """ |
|
72 Private method to write an entry for a node. |
|
73 |
|
74 @param node reference to the node to be written (BookmarkNode) |
|
75 @param indent size of the indentation (integer) |
|
76 """ |
|
77 if node.type() == BookmarkNode.Folder: |
|
78 self.__writeFolder(node, indent) |
|
79 elif node.type() == BookmarkNode.Bookmark: |
|
80 self.__writeBookmark(node, indent) |
|
81 elif node.type() == BookmarkNode.Separator: |
|
82 self.__writeSeparator(indent) |
|
83 |
|
84 def __writeSeparator(self, indent): |
|
85 """ |
|
86 Private method to write a separator. |
|
87 |
|
88 @param indent size of the indentation (integer) |
|
89 """ |
|
90 self.__dev.write(" " * indent) |
|
91 self.__dev.write("<HR>\n") |
|
92 |
|
93 def __writeBookmark(self, node, indent): |
|
94 """ |
|
95 Private method to write a bookmark node. |
|
96 |
|
97 @param node reference to the node to be written (BookmarkNode) |
|
98 @param indent size of the indentation (integer) |
|
99 """ |
|
100 self.__dev.write(" " * indent) |
|
101 self.__dev.write("<DT><A HREF=\"{0}\">{1}</A>\n".format( |
|
102 node.url, Utilities.html_uencode(node.title) |
|
103 )) |
|
104 |
|
105 def __writeFolder(self, node, indent): |
|
106 """ |
|
107 Private method to write a bookmark node. |
|
108 |
|
109 @param node reference to the node to be written (BookmarkNode) |
|
110 @param indent size of the indentation (integer) |
|
111 """ |
|
112 if node.expanded: |
|
113 folded = "" |
|
114 else: |
|
115 folded = " FOLDED" |
|
116 |
|
117 self.__dev.write(" " * indent) |
|
118 self.__dev.write("<DT><H3{0}>{1}</H3>\n".format( |
|
119 folded, Utilities.html_uencode(node.title) |
|
120 )) |
|
121 |
|
122 if node.desc: |
|
123 self.__dev.write(" " * indent) |
|
124 self.__dev.write("<DD>{0}\n".format("".join(node.desc.splitlines()))) |
|
125 |
|
126 self.__dev.write(" " * indent) |
|
127 self.__dev.write("<DL><p>\n") |
|
128 |
|
129 for child in node.children(): |
|
130 self.__writeItem(child, indent + self.indentSize) |
|
131 |
|
132 self.__dev.write(" " * indent) |
|
133 self.__dev.write("</DL><p>\n") |