Helpviewer/Bookmarks/NsHtmlWriter.py

changeset 1729
66b9dc45f2bd
child 1731
56cf9c150dbf
equal deleted inserted replaced
1727:9355815a4403 1729:66b9dc45f2bd
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")

eric ide

mercurial