]> git.phdru.name Git - bookmarks_db.git/blobdiff - bkmk2db.py
Fix(Robot): Stop splitting and un-splitting URLs
[bookmarks_db.git] / bkmk2db.py
index 39ddea6cc8f682e3c30810eb3345358e2b7521ed..629668d4cbc99fe7dd8690376bfa6b0875b22d4c 100755 (executable)
-#! /usr/local/bin/python -O
-"""
-   Convert Netscape Navigator's bookmarks.html to FLAD database
+#! /usr/bin/env python3
+"""Convert Netscape Navigator's or Mozilla's bookmarks.html to a database
 
-   Written by BroytMann, Jun 1997 - Mar 1999. Copyright (C) 1997-1999 PhiloSoft Design
+This file is a part of Bookmarks database and Internet robot.
 """
 
-import sys, os, stat, string
+from __future__ import print_function
 from getopt import getopt
+import os
+import sys
+
+from bkmk_parser import BkmkParser
+
 
-import bkmk_parser
-from formatter import AbstractFormatter, NullWriter
+__author__ = "Oleg Broytman <phd@phdru.name>"
+__copyright__ = "Copyright (C) 1997-2023 PhiloSoft Design"
+__license__ = "GNU GPL"
 
 
 def run():
-   optlist, args = getopt(sys.argv[1:], "gits")
-
-   show_pbar = 1
-   to_text = 0
-   to_gf = 0
-   report_stats = 1
-
-   for _opt, _arg in optlist:
-      if _opt == '-g':
-         to_gf = 1
-      if _opt == '-i':
-         show_pbar = 0
-      if _opt == '-t':
-         to_text = 1
-      if _opt == '-s':
-         report_stats = 0
-   try:
-      del _opt, _arg
-   except NameError:
-      pass
-
-   if args:
-      if len(args) > 1:
-         sys.stderr.write("bkmk2db: too many arguments\n")
-         sys.exit(1)
-
-      filename = args[0]
-
-   else:
-      filename = 'bookmarks.html' # good name both for DOS (bookmark.htm) and UNIX
-
-   if show_pbar:
-      show_pbar = sys.stderr.isatty()
-
-   if show_pbar:
-      try:
-         from tty_pbar import ttyProgressBar
-      except ImportError:
-         show_pbar = 0
-
-   if show_pbar:
-      try:
-         size = os.stat(filename)[stat.ST_SIZE]
-      except:
-         print filename, ": no such file"
-         sys.exit(1)
-
-
-   fmt = AbstractFormatter(NullWriter())
-   if to_text:
-      parser = bkmk_parser.Bookmarks2Text(fmt)
-   elif to_gf:
-      parser = bkmk_parser.Bookmarks2Gadfly(fmt)
-   else:
-      parser = bkmk_parser.Bookmarks2Flad(fmt)
-
-
-   if report_stats:
-      str = "Converting " + filename + " to "
-      if to_text:
-         str = "text"
-      elif to_gf:
-         str = "GadFly database"
-      else:
-         str = "FLAD database"
-
-      sys.stdout.write("Converting %s to %s: " % (filename, str))
-      sys.stdout.flush()
-
-   if show_pbar:
-      pbar = ttyProgressBar(0, size)
-      lng = 0
-
-      # This is for DOS - it counts CRLF, which len() counts as 1 char!
-      if os.name == 'dos' or os.name == 'nt' :
-         dos_add = 1
-      else:
-         dos_add = 0 # UNIX' and Mac's len() counts CR or LF correct
-
-   try:
-      f = open(filename, 'r')
-   except IOError, msg:
-      print filename, ":", msg
-      sys.exit(1)
-
-   header = open("header", 'w')
-   line_no = 0
-
-   while 1:
-      line = f.readline()
-      if not line:
-         break
-
-      if show_pbar:
-         lng = lng + len(line) + dos_add
-         pbar.display(lng)
-
-      line = string.strip(line)
-      line_no = line_no + 1
-
-      try:
-         parser.feed(line)
-
-         if parser.outfile: # Write header until HTML parser start writing outfile
-            if header:
-               header.close()
-               header = None
-         else:
-            header.write(line + '\n')
-
-      except:
-         break # I need total number of lines; interpreter will print traceback on exit
-
-   if show_pbar:
-      del pbar
-
-   if report_stats:
-      print "Ok"
-      print line_no, "lines proceed"
-      print parser.urls_no, "urls found"
-      print parser.record_no, "records created"
-
-   parser.close()
-   f.close()
+    optlist, args = getopt(sys.argv[1:], "is")
+
+    show_pbar = True
+    report_stats = 1
+
+    for _opt, _arg in optlist:
+        if _opt == '-i':
+            show_pbar = 0
+        if _opt == '-s':
+            report_stats = 0
+    try:
+        del _opt, _arg
+    except NameError:
+        pass
+
+    if args:
+        if len(args) > 1:
+            sys.stderr.write("bkmk2db: too many arguments\n")
+            sys.stderr.write("Usage: bkmk2db [-is] bookmarks.html\n")
+            sys.exit(1)
+
+        filename = args[0]
+
+    else:
+        # good name both for DOS (bookmark.htm) and UNIX
+        filename = 'bookmarks.html'
+
+    if report_stats:
+        from storage import storage_name
+        sys.stdout.write("Converting %s to %s: " % (filename, storage_name))
+        sys.stdout.flush()
+
+    if show_pbar:
+        show_pbar = sys.stderr.isatty()
+
+    if show_pbar:
+        try:
+            from m_lib.pbar.tty_pbar import ttyProgressBar
+        except ImportError:
+            show_pbar = 0
+
+    if show_pbar:
+        try:
+            size = os.path.getsize(filename)
+        except:
+            print(filename, ": no such file")
+            sys.exit(1)
+
+    if show_pbar:
+        pbar = ttyProgressBar(0, size)
+        lng = 0
+
+        # This is for DOS - it counts CRLF, which len() counts as 1 char!
+        if os.name == 'dos' or os.name == 'nt':
+            dos_add = 1
+        else:
+            dos_add = 0  # UNIX' and Mac's len() counts CR or LF correct
+
+    infile = open(filename, 'rt')
+    parser = BkmkParser()
+
+    line_no = 0
+    lng = 0
+    ok = 1
+
+    for line in infile:
+        if show_pbar:
+            lng = lng + len(line) + dos_add
+            pbar.display(lng)
+
+        # line = line.strip()
+        line_no = line_no + 1
+
+        try:
+            parser.feed(line)
+        except:
+            ok = 0
+            break
+
+    try:
+        parser.close()
+    except:
+        ok = 0
+
+    infile.close()
+
+    if show_pbar:
+        del pbar
+
+    if report_stats:
+        print("Ok")
+        print(line_no, "lines proceed")
+        print(parser.urls, "urls found")
+        print(parser.objects, "objects created")
+
+    if ok:
+        from storage import storage
+        storage = storage()
+        storage.store(parser.root_folder)
+
+    else:
+        import traceback
+        traceback.print_exc()
+        sys.exit(1)
 
 
 if __name__ == '__main__':
-   run()
+    run()