]> git.phdru.name Git - bookmarks_db.git/blobdiff - Storage/bkmk_stflad.py
Fix(Robot): Stop splitting and un-splitting URLs
[bookmarks_db.git] / Storage / bkmk_stflad.py
index 9bd8751c278b9fa6becbee0d552455a43049c8de..81a4e6dc38e025c36ab2981737504efdeac42311 100644 (file)
@@ -1,33 +1,38 @@
-"""
-   Bookmarks storage module - FLAD (Flat ASCII Database)
-      special version for compatibility with old (version 1) bkmk2db
+"""Bookmarks storage module - FLAD (Flat ASCII Database)
+
+Special version for compatibility with old (version 1) bkmk2db.
 
-   Written by Broytman. Copyright (C) 2000-2010 PhiloSoft Design
+This file is a part of Bookmarks database and Internet robot.
 """
 
+__author__ = "Oleg Broytman <phd@phdru.name>"
+__copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design"
+__license__ = "GNU GPL"
+
+__all__ = ['storage_flad']
+
 
-import string
 from m_lib.flad import fladm
 from bkmk_objects import Folder, Bookmark, Ruler, Walker
 
 
 class storage_flad(Walker):
-   filename = "bookmarks_db.flad"
-
-   def __init__(self):
-      self.first_object = 1
-
-   def root_folder(self, f):
-      header = string.replace(f.header, ".", ".\n")
-      header = string.replace(header, "<", "\n<", 3)[1:]
-      header_file = open("header", 'w')
-      header_file.write(header + "\n")
-      header_file.write('<H1>%s</H1>\n\n' % f.name)
-      if f.comment: header_file.write('<DD>%s\n' % f.comment)
-      header_file.close()
-
-   def start_folder(self, f, level):
-      self.outfile.write("""
+    filename = "bookmarks_db.flad"
+
+    def __init__(self):
+        self.first_object = 1
+
+    def root_folder(self, f):
+        header = f.header.replace(".", ".\n")
+        header = header.replace("<", "\n<", 3)[1:]
+        header_file = open("header", 'wt', encoding='utf-8')
+        header_file.write(header + "\n")
+        header_file.write('<H1>%s</H1>\n\n' % f.name)
+        if f.comment: header_file.write('<DD>%s\n' % f.comment)
+        header_file.close()
+
+    def start_folder(self, f, level):
+        self.outfile.write("""
 Level: %d
 Folder: %s
 AddDate: %s
@@ -35,8 +40,8 @@ Comment: %s
 LastModified: %s
 """ % (level, f.name, f.add_date, f.comment, f.last_modified or ''))
 
-   def bookmark(self, b, level):
-      self.outfile.write("""
+    def bookmark(self, b, level):
+        self.outfile.write("""
 Level: %d
 Title: %s
 URL: %s
@@ -49,89 +54,97 @@ IconURI: %s
 Icon: %s
 Charset: %s
 """ % (level+1, b.name, b.href, b.add_date, b.last_visit, b.last_modified,
-         b.keyword, b.comment.replace('\n', "\\n"),
-         b.icon_href or '', b.icon or '', b.charset or ''))
-
-
-   def ruler(self, r, level):
-      self.outfile.write("\nLevel: %s\nRuler: YES\n" % (level+1))
-
-
-   def store(self, root_folder):
-      self.outfile = open(self.filename, 'w')
-      root_folder.walk_depth(self)
-      self.outfile.close()
-
-
-   def unindent(self, old_level, new_level):
-      while old_level > new_level:
-         old_level = old_level - 1
-         del self.folder_stack[-1]
-
-      if self.folder_stack:
-         self.current_folder = self.folder_stack[-1]
-      else:
-         self.current_folder = None
-
-   def load(self):
-      bookmarks_db = fladm.load_from_file(self.filename, fladm.check_record, ["Level"])
-
-      root_folder = Folder()
-      self.folder_stack = [root_folder]
-      self.current_folder = root_folder
-
-      header_file = open("header", 'r')
-      header = header_file.read()
-      header_file.close()
-
-      header = string.split(header, "\n")
-      root_folder.header = string.join(header[:5], '')
-      root_folder.name = header[5][4:-5]
-      root_folder.comment = string.join(header[7:], '')[4:]
-
-      save_level = 0
-      got_folder = 1 # Start as if we already have one folder
-
-      for record in bookmarks_db:
-         level = int(record["Level"])
-
-         if level == save_level:
-            pass
-         elif level == save_level + 1:
-            if not got_folder:
-               raise ValueError, "indent without folder"
-         elif level <= save_level - 1:
-            self.unindent(save_level, level)
-         else:
-            raise ValueError, "new level (%d) too big; must be %d - %d" % (level, save_level-1, save_level+1)
-
-         save_level = level
-         got_folder = record.has_key("Folder") # Test here to save got_folder for next loop
-
-         if record.has_key("URL"):
-            comment = record["Comment"].replace("\\n", '\n')
-            bookmark = Bookmark(record["URL"], record["AddDate"],
-               record["LastVisit"], record["LastModified"],
-               record["Keyword"], comment)
-            bookmark.name = record["Title"]
-            self.current_folder.append(bookmark)
-
-         elif record.has_key("Folder"):
-            folder = Folder(record["AddDate"], record["Comment"], record["LastModified"])
-            folder.name = record["Folder"]
-            self.current_folder.append(folder)
-            self.folder_stack.append(folder)
-            self.current_folder = folder
-
-         elif record.has_key("Ruler"):
-            self.current_folder.append(Ruler())
-
-         else:
-            raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record)
-
-      if save_level >= 0:
-         self.unindent(save_level, 0)
-      else:
-         raise ValueError, "new level (%d) too little - must be >= 0" % save_level
-
-      return root_folder
+            b.keyword, b.comment.replace('\n', "\\n"),
+            b.icon_href or '', b.icon or '', b.charset or ''))
+
+    def ruler(self, r, level):
+        self.outfile.write("\nLevel: %s\nRuler: YES\n" % (level+1))
+
+    def store(self, root_folder):
+        self.outfile = open(self.filename, 'wt', encoding='utf-8')
+        root_folder.walk_depth(self)
+        self.outfile.close()
+
+    def unindent(self, old_level, new_level):
+        while old_level > new_level:
+            old_level = old_level - 1
+            del self.folder_stack[-1]
+
+        if self.folder_stack:
+            self.current_folder = self.folder_stack[-1]
+        else:
+            self.current_folder = None
+
+    def load(self):
+        bookmarks_db = fladm.load_from_file(
+            self.filename, fladm.check_record, ["Level"])
+
+        root_folder = Folder()
+        self.folder_stack = [root_folder]
+        self.current_folder = root_folder
+
+        header_file = open("header", 'rt', encoding='utf-8')
+        header = header_file.read()
+        header_file.close()
+
+        header = header.split("\n")
+        root_folder.header = ''.join(header[:5])
+        root_folder.name = ''.join(header[5:6])[4:-5]
+        root_folder.comment = ''.join(header[7:])[4:]
+
+        save_level = 0
+        got_folder = 1  # Start as if we already have one folder
+
+        for record in bookmarks_db:
+            level = int(record["Level"])
+
+            if level == save_level:
+                pass
+            elif level == save_level + 1:
+                if not got_folder:
+                    raise ValueError("indent without folder")
+            elif level <= save_level - 1:
+                self.unindent(save_level, level)
+            else:
+                raise ValueError("new level (%d) too big; must be %d - %d"
+                                 % (level, save_level-1, save_level+1))
+
+            save_level = level
+            # Test here to save got_folder for next loop
+            got_folder = "Folder" in record
+
+            if "URL" in record:
+                comment = record["Comment"].replace("\\n", '\n')
+                bookmark = Bookmark(
+                    record["URL"], record["AddDate"],
+                    record["LastVisit"], record["LastModified"],
+                    record["Keyword"], comment)
+                bookmark.name = record["Title"]
+                self.current_folder.append(bookmark)
+
+            elif "Folder" in record:
+                folder = Folder(
+                    record["AddDate"], record["Comment"],
+                    record["LastModified"]
+                )
+                folder.name = record["Folder"]
+                self.current_folder.append(folder)
+                self.folder_stack.append(folder)
+                self.current_folder = folder
+
+            elif "Ruler" in record:
+                self.current_folder.append(Ruler())
+
+            else:
+                raise KeyError(
+                    'neither "URL" nor "Folder" nor "Ruler" in record '
+                    + str(record)
+                )
+
+        if save_level >= 0:
+            self.unindent(save_level, 0)
+        else:
+            raise ValueError("new level (%d) too little - must be >= 0"
+                             % save_level)
+
+        return root_folder