src/eric7/WebBrowser/Bookmarks/NsHtmlWriter.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/WebBrowser/Bookmarks/NsHtmlWriter.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class to write Netscape HTML bookmark files.
+"""
+
+from PyQt6.QtCore import QObject, QIODevice, QFile
+
+from .BookmarkNode import BookmarkNode
+
+import Utilities
+
+
+class NsHtmlWriter(QObject):
+    """
+    Class implementing a writer object to generate Netscape HTML bookmark
+    files.
+    """
+    indentSize = 4
+    
+    def __init__(self):
+        """
+        Constructor
+        """
+        super().__init__()
+    
+    def write(self, fileNameOrDevice, root):
+        """
+        Public method to write an Netscape HTML bookmark file.
+        
+        @param fileNameOrDevice name of the file to write (string)
+            or device to write to (QIODevice)
+        @param root root node of the bookmark tree (BookmarkNode)
+        @return flag indicating success (boolean)
+        """
+        if isinstance(fileNameOrDevice, QIODevice):
+            f = fileNameOrDevice
+        else:
+            f = QFile(fileNameOrDevice)
+            if root is None or not f.open(QIODevice.OpenModeFlag.WriteOnly):
+                return False
+        
+        self.__dev = f
+        return self.__write(root)
+    
+    def __write(self, root):
+        """
+        Private method to write an Netscape HTML bookmark file.
+        
+        @param root root node of the bookmark tree (BookmarkNode)
+        @return flag indicating success (boolean)
+        """
+        self.__dev.write(
+            "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n"
+            "<!-- This is an automatically generated file.\n"
+            "     It will be read and overwritten.\n"
+            "     DO NOT EDIT! -->\n"
+            "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;"
+            " charset=UTF-8\">\n"
+            "<TITLE>Bookmarks</TITLE>\n"
+            "<H1>Bookmarks</H1>\n"
+            "\n"
+            "<DL><p>\n")
+        if root.type() == BookmarkNode.Root:
+            for child in root.children():
+                self.__writeItem(child, self.indentSize)
+        else:
+            self.__writeItem(root, self.indentSize)
+        self.__dev.write("</DL><p>\n")
+        return True
+    
+    def __writeItem(self, node, indent):
+        """
+        Private method to write an entry for a node.
+        
+        @param node reference to the node to be written (BookmarkNode)
+        @param indent size of the indentation (integer)
+        """
+        if node.type() == BookmarkNode.Folder:
+            self.__writeFolder(node, indent)
+        elif node.type() == BookmarkNode.Bookmark:
+            self.__writeBookmark(node, indent)
+        elif node.type() == BookmarkNode.Separator:
+            self.__writeSeparator(indent)
+    
+    def __writeSeparator(self, indent):
+        """
+        Private method to write a separator.
+        
+        @param indent size of the indentation (integer)
+        """
+        self.__dev.write(" " * indent)
+        self.__dev.write("<HR>\n")
+    
+    def __writeBookmark(self, node, indent):
+        """
+        Private method to write a bookmark node.
+        
+        @param node reference to the node to be written (BookmarkNode)
+        @param indent size of the indentation (integer)
+        """
+        added = (
+            " ADD_DATE=\"{0}\"".format(node.added.toTime_t())
+            if node.added.isValid() else
+            ""
+        )
+        modified = (
+            " LAST_MODIFIED=\"{0}\"".format(node.modified.toTime_t())
+            if node.modified.isValid() else
+            ""
+        )
+        visited = (
+            " LAST_VISIT=\"{0}\"".format(node.visited.toTime_t())
+            if node.visited.isValid() else
+            ""
+        )
+        
+        self.__dev.write(" " * indent)
+        self.__dev.write("<DT><A HREF=\"{0}\"{1}{2}{3}>{4}</A>\n".format(
+            node.url, added, modified, visited,
+            Utilities.html_uencode(node.title)
+        ))
+        
+        if node.desc:
+            self.__dev.write(" " * indent)
+            self.__dev.write("<DD>{0}\n".format(
+                Utilities.html_uencode("".join(node.desc.splitlines()))))
+    
+    def __writeFolder(self, node, indent):
+        """
+        Private method to write a bookmark node.
+        
+        @param node reference to the node to be written (BookmarkNode)
+        @param indent size of the indentation (integer)
+        """
+        folded = "" if node.expanded else " FOLDED"
+        
+        added = (
+            " ADD_DATE=\"{0}\"".format(node.added.toTime_t())
+            if node.added.isValid() else
+            ""
+        )
+        
+        self.__dev.write(" " * indent)
+        self.__dev.write("<DT><H3{0}{1}>{2}</H3>\n".format(
+            folded, added, Utilities.html_uencode(node.title)
+        ))
+        
+        if node.desc:
+            self.__dev.write(" " * indent)
+            self.__dev.write("<DD>{0}\n".format(
+                "".join(node.desc.splitlines())))
+        
+        self.__dev.write(" " * indent)
+        self.__dev.write("<DL><p>\n")
+        
+        for child in node.children():
+            self.__writeItem(child, indent + self.indentSize)
+        
+        self.__dev.write(" " * indent)
+        self.__dev.write("</DL><p>\n")

eric ide

mercurial