9 |
9 |
10 import os |
10 import os |
11 |
11 |
12 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, QByteArray, \ |
12 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, QByteArray, \ |
13 QBuffer, QIODevice, QXmlStreamReader, QDate, QFileInfo, QUrl |
13 QBuffer, QIODevice, QXmlStreamReader, QDate, QFileInfo, QUrl |
14 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication |
14 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication, QDialog |
15 from PyQt4.QtWebKit import QWebPage |
|
16 |
15 |
17 from E5Gui import E5MessageBox, E5FileDialog |
16 from E5Gui import E5MessageBox, E5FileDialog |
18 |
17 |
19 from .BookmarkNode import BookmarkNode |
18 from .BookmarkNode import BookmarkNode |
20 from .BookmarksModel import BookmarksModel |
19 from .BookmarksModel import BookmarksModel |
21 from .DefaultBookmarks import DefaultBookmarks |
20 from .DefaultBookmarks import DefaultBookmarks |
22 from .XbelReader import XbelReader |
21 from .XbelReader import XbelReader |
23 from .XbelWriter import XbelWriter |
22 from .XbelWriter import XbelWriter |
|
23 from .BookmarksImportDialog import BookmarksImportDialog |
24 |
24 |
25 from Utilities.AutoSaver import AutoSaver |
25 from Utilities.AutoSaver import AutoSaver |
26 import Utilities |
26 import Utilities |
27 import Preferences |
27 import Preferences |
28 |
28 |
30 BOOKMARKMENU = QT_TRANSLATE_NOOP("BookmarksManager", "Bookmarks Menu") |
30 BOOKMARKMENU = QT_TRANSLATE_NOOP("BookmarksManager", "Bookmarks Menu") |
31 |
31 |
32 StartRoot = 0 |
32 StartRoot = 0 |
33 StartMenu = 1 |
33 StartMenu = 1 |
34 StartToolBar = 2 |
34 StartToolBar = 2 |
35 |
|
36 ########################################################################################## |
|
37 |
|
38 extract_js = r""" |
|
39 function walk() { |
|
40 var parent = arguments[0]; |
|
41 var indent = arguments[1]; |
|
42 |
|
43 var result = ""; |
|
44 var children = parent.childNodes; |
|
45 var folderName = ""; |
|
46 var folded = ""; |
|
47 for (var i = 0; i < children.length; i++) { |
|
48 var object = children.item(i); |
|
49 if (object.nodeName == "HR") { |
|
50 result += indent + "<separator/>\n"; |
|
51 } |
|
52 if (object.nodeName == "H3") { |
|
53 folderName = object.innerHTML; |
|
54 folded = object.folded; |
|
55 if (object.folded == undefined) |
|
56 folded = "false"; |
|
57 else |
|
58 folded = "true"; |
|
59 } |
|
60 if (object.nodeName == "A") { |
|
61 result += indent + "<bookmark href=\"" + encodeURI(object.href).replace(/&/g, '&') + "\">\n"; |
|
62 result += indent + indent + "<title>" + object.innerHTML + "</title>\n"; |
|
63 result += indent + "</bookmark>\n"; |
|
64 } |
|
65 |
|
66 var currentIndent = indent; |
|
67 if (object.nodeName == "DL" && folderName != "") { |
|
68 result += indent + "<folder folded=\"" + folded + "\">\n"; |
|
69 indent += " "; |
|
70 result += indent + "<title>" + folderName + "</title>\n"; |
|
71 } |
|
72 result += walk(object, indent); |
|
73 if (object.nodeName == "DL" && folderName != "") { |
|
74 result += currentIndent + "</folder>\n"; |
|
75 } |
|
76 } |
|
77 return result; |
|
78 } |
|
79 |
|
80 var xbel = walk(document, " "); |
|
81 |
|
82 if (xbel != "") { |
|
83 xbel = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE xbel>\n<xbel version=\"1.0\">\n" + xbel + "</xbel>\n"; |
|
84 } |
|
85 |
|
86 xbel; |
|
87 """ |
|
88 |
|
89 ########################################################################################## |
|
90 |
35 |
91 |
36 |
92 class BookmarksManager(QObject): |
37 class BookmarksManager(QObject): |
93 """ |
38 """ |
94 Class implementing the bookmarks manager. |
39 Class implementing the bookmarks manager. |
130 self.__toolbar = None |
75 self.__toolbar = None |
131 self.__menu = None |
76 self.__menu = None |
132 self.__bookmarksModel = None |
77 self.__bookmarksModel = None |
133 self.__commands = QUndoStack() |
78 self.__commands = QUndoStack() |
134 |
79 |
135 def getFileName(self): |
80 @classmethod |
|
81 def getFileName(cls): |
136 """ |
82 """ |
137 Public method to get the file name of the bookmark file. |
83 Public method to get the file name of the bookmark file. |
138 |
84 |
139 @return name of the bookmark file (string) |
85 @return name of the bookmark file (string) |
140 """ |
86 """ |
357 |
303 |
358 def importBookmarks(self): |
304 def importBookmarks(self): |
359 """ |
305 """ |
360 Public method to import bookmarks. |
306 Public method to import bookmarks. |
361 """ |
307 """ |
362 supportedFormats = [ |
308 dlg = BookmarksImportDialog() |
363 self.trUtf8("XBEL bookmarks") + " (*.xbel *.xml)", |
309 if dlg.exec_() == QDialog.Accepted: |
364 self.trUtf8("HTML Netscape bookmarks") + " (*.html *.htm)" |
310 importRootNode = dlg.getImportedBookmarks() |
365 ] |
311 if importRootNode is not None: |
366 |
312 self.addBookmark(self.menu(), importRootNode) |
367 fileName = E5FileDialog.getOpenFileName( |
|
368 None, |
|
369 self.trUtf8("Import Bookmarks"), |
|
370 "", |
|
371 ";;".join(supportedFormats)) |
|
372 if not fileName: |
|
373 return |
|
374 |
|
375 reader = XbelReader() |
|
376 importRootNode = None |
|
377 if fileName.endswith(".html"): |
|
378 inFile = QFile(fileName) |
|
379 inFile.open(QIODevice.ReadOnly) |
|
380 if inFile.openMode == QIODevice.NotOpen: |
|
381 E5MessageBox.warning(None, |
|
382 self.trUtf8("Import Bookmarks"), |
|
383 self.trUtf8("""Error opening bookmarks file <b>{0}</b>.""")\ |
|
384 .format(fileName)) |
|
385 return |
|
386 |
|
387 webpage = QWebPage() |
|
388 webpage.mainFrame().setHtml(inFile.readAll()) |
|
389 result = webpage.mainFrame().evaluateJavaScript(extract_js) |
|
390 buffer_ = QBuffer(result) |
|
391 buffer_.open(QIODevice.ReadOnly) |
|
392 importRootNode = reader.read(buffer_) |
|
393 else: |
|
394 importRootNode = reader.read(fileName) |
|
395 |
|
396 if reader.error() != QXmlStreamReader.NoError: |
|
397 E5MessageBox.warning(None, |
|
398 self.trUtf8("Import Bookmarks"), |
|
399 self.trUtf8("""Error when importing bookmarks on""" |
|
400 """ line {0}, column [1}:\n{2}""")\ |
|
401 .format(reader.lineNumber(), |
|
402 reader.columnNumber(), |
|
403 reader.errorString())) |
|
404 return |
|
405 |
|
406 importRootNode.setType(BookmarkNode.Folder) |
|
407 importRootNode.title = self.trUtf8("Imported {0}")\ |
|
408 .format(QDate.currentDate().toString(Qt.SystemLocaleShortDate)) |
|
409 self.addBookmark(self.menu(), importRootNode) |
|
410 |
313 |
411 def exportBookmarks(self): |
314 def exportBookmarks(self): |
412 """ |
315 """ |
413 Public method to export the bookmarks. |
316 Public method to export the bookmarks. |
414 """ |
317 """ |