X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=db2bkmk.py;h=e0ac1c1bcb6b76c6247f7680421a2e66765b34a4;hb=3e29cb1a49f602f4a647c18ae64f0516a76de236;hp=cc2bb82eec1eb73a116feab6c0b27080ac211bea;hpb=2e82a937f80392639176d9a414b55ffb8164ebca;p=bookmarks_db.git diff --git a/db2bkmk.py b/db2bkmk.py index cc2bb82..e0ac1c1 100755 --- a/db2bkmk.py +++ b/db2bkmk.py @@ -1,220 +1,108 @@ -#! /usr/local/bin/python -O -""" - Convert FLAD database back to bookmarks.html suitable for Netscape Navigator +#! /usr/bin/env python +"""Convert a bkmk database back to bookmarks.html (or other format defined by writer) - 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, string, shutil -from getopt import getopt - -import fladm - - -def write(str): - if private_level == 0: # Put in public all except private folder - public_html.write(str) - private_html.write(str) - - -def unindent(old_level, new_level): - while old_level > new_level: - old_level = old_level - 1 - write(" "*old_level + "

\n") - - -def gen_html(bookmarks_db, show_pbar, report_stats): - global pbar, record_no, urls_no, public_html, private_html, private_level - - shutil.copy("header", "public.html") - shutil.copy("header", "private.html") - - public_html = open("public.html", 'a') - private_html = open("private.html", 'a') - - record_no = 0 - urls_no = 0 - - save_level = 0 - got_folder = 1 # Start as if we already have one folder - private_level = 0 - - for record in bookmarks_db: - record_no = record_no + 1 - - if show_pbar: - pbar.display(record_no) - - level = string.atoi(record["Level"]) - - if level == save_level: - pass - elif level == save_level + 1: - if got_folder: - write(" "*(level - 1) + "

\n") - else: - raise ValueError, "indent without folder" - elif level <= save_level - 1: - 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 private_level == save_level: - private_level = 0 # We've returned to saved private level - private folder is over +__author__ = "Oleg Broytman " +__copyright__ = "Copyright (C) 2000-2017 PhiloSoft Design" +__license__ = "GNU GPL" - if record.has_key("URL"): - write(" "*level + '

%s\n' % (record["URL"], record["AddDate"], record["LastVisit"], record["LastModified"], record["Title"])) - urls_no = urls_no + 1 +import sys - elif record.has_key("Folder"): - # Dirty hacks here - if (record["Folder"] == "Private links") and (private_level == 0): - private_level = save_level # We found private folder - save its level - if record["Folder"] == "All the rest - Unclassified": - write(" "*level + '

%s

\n' % (record["AddDate"], record["Folder"])) - else: - write(" "*level + '

%s

\n' % (record["AddDate"], record["Folder"])) - - elif record.has_key("Ruler"): - write(" "*level + "
\n") - - else: - raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record) - - if record.has_key("Comment") and (record["Comment"] <> ''): - write("
%s\n" % string.join(string.split(record["Comment"], "
"), "
\n")) - - - if save_level >= 0: - unindent(save_level, 0) - else: - raise ValueError, "new level (%d) too little - must be >= 0" % save_level - - public_html.close() - private_html.close() - - if show_pbar: - del pbar - - if report_stats: - print "Ok" - - -def translate(bookmarks_db, transldb_name, transl, show_pbar, report_stats): - global pbar, record_no, urls_no, public_html, private_html, private_level - - new_ext = str(transl) - os.rename("public.html", "public." + new_ext) - os.rename("private.html", "private." + new_ext) - - transl_d = {} - transl_db = fladm.load_from_file(transldb_name, fladm.check_record, ["URL1", "URL2"], [""]) - # This prevents any other key to appear in transl.db ^ - - # Generate translation dictionary (hash table) - if transl == 1: - for record in transl_db: - transl_d[record["URL1"]] = record["URL2"] - elif transl == 2: - for record in transl_db: - transl_d[record["URL2"]] = record["URL1"] - else: - raise ValueError, "transl (%d) must be 1 or 2" % transl - - del transl_db # Save few bytes of memory - transl_k = transl_d.keys() - - # Translate URLs - for record in bookmarks_db: - if record.has_key("URL") and (record["URL"] in transl_k): - record["URL"] = transl_d[record["URL"]] - - gen_html(bookmarks_db, show_pbar, report_stats) +def run(): + from getopt import getopt + optlist, args = getopt(sys.argv[1:], "sp:o:t:r") - new_ext = str(3 - transl) # Translate 1 to 2, or 2 to 1 - os.rename("public.html", "public." + new_ext) - os.rename("private.html", "private." + new_ext) + report_stats = 1 + prune = None + from writers import writer + output_filename = writer.filename -def run(): - global pbar, record_no, urls_no, public_html, private_html, private_level + transl = 0 + transl_name = "" # dictionary translation; default is no translation - optlist, args = getopt(sys.argv[1:], "ist:r") + for _opt, _arg in optlist: + if _opt == '-s': + report_stats = 0 + if _opt == '-p': + prune = _arg + if _opt == '-o': + output_filename = _arg + if _opt == '-t': + transl = 1 + transl_name = _arg + if _opt == '-r': + transl = 2 + try: + del _opt, _arg + except NameError: + pass - show_pbar = 1 - report_stats = 1 + if args: + sys.stderr.write("db2bkmk: too many arguments\n") + sys.stderr.write("Usage: db2bkmk [-s] [-p prune_folder] [-o filename] [-t trans] [-r]\n") + sys.exit(1) - transldb_name = "" # dictionary translation; default is no translation - transl = 0 + from storage import storage + storage = storage() - for _opt, _arg in optlist: - if _opt == '-i': - show_pbar = 0 - if _opt == '-s': - report_stats = 0 - if _opt == '-t': - transldb_name = _arg - transl = 1 - if _opt == '-r': - transl = 2 - try: - del _opt, _arg - except NameError: - pass + if report_stats: + sys.stdout.write("Loading %s: " % storage.filename) + sys.stdout.flush() - if args: - sys.stderr.write("db2bkmk: too many arguments\n") - sys.exit(1) + root_folder = storage.load() - if show_pbar: - show_pbar = sys.stderr.isatty() + if report_stats: + print("Ok") + sys.stdout.write("Writing %s: " % output_filename) + sys.stdout.flush() - if show_pbar: - try: - from tty_pbar import ttyProgressBar - except ImportError: - show_pbar = 0 - if report_stats: - sys.stdout.write("Loading: ") - sys.stdout.flush() + if transl: + new_ext = str(transl) + transl_d = {} - bookmarks_db = fladm.load_from_file("bookmarks.db", fladm.check_record, ["Level"]) + from m_lib.flad import fladm + transl_db = fladm.load_from_file(transl_name, fladm.check_record, ["URL1", "URL2"], [""]) + # This prevents any other key to appear in transl_db ^ - if report_stats: - print "Ok" - sys.stdout.write("Converting FLAD database to bookmarks.html: ") - sys.stdout.flush() + # Generate translation dictionary (hash table) + if transl == 1: + for record in transl_db: + transl_d[record["URL1"]] = record["URL2"] + elif transl == 2: + for record in transl_db: + transl_d[record["URL2"]] = record["URL1"] + else: + raise ValueError("transl (%d) must be 1 or 2" % transl) - if show_pbar: - pbar = ttyProgressBar(0, len(bookmarks_db)) + del transl_db # Save few bytes of memory - gen_html(bookmarks_db, show_pbar, report_stats) + from bkmk_objects import Walker + class Transl(Walker): + def __init__(self, transl_d): + self.transl_d = transl_d - if transl: - if report_stats: - sys.stdout.write("Translating: ") - sys.stdout.flush() + def bookmark(self, b, level): + href = b.href + transl_d = self.transl_d - if report_stats and show_pbar: # Display bar only without "-i"; - # with "-s" skip it (one bar already - # displayed, and it is enough) - pbar = ttyProgressBar(0, len(bookmarks_db)) + if transl_d.has_key(href): + b.href = transl_d[href] - else: - show_pbar = 0 + root_folder.walk_depth(Transl(transl_d)) - translate(bookmarks_db, transldb_name, transl, show_pbar, report_stats) + outfile = open(output_filename, 'w') + root_folder.walk_depth(writer(outfile, prune)) + outfile.close() - if report_stats: - print record_no, "records proceed" - print urls_no, "urls created" + if report_stats: + print("Ok") if __name__ == '__main__': - run() + run()