1 #! /usr/local/bin/python -O
3 Convert FLAD database back to bookmarks.html suitable for Netscape Navigator
5 Written by BroytMann, Jun 1997 - Mar 1999. Copyright (C) 1997-1999 PhiloSoft Design
8 import sys, os, string, shutil
9 from getopt import getopt
15 if private_level == 0: # Put in public all except private folder
16 public_html.write(str)
17 private_html.write(str)
20 def unindent(old_level, new_level):
21 while old_level > new_level:
22 old_level = old_level - 1
23 write(" "*old_level + "</DL><p>\n")
26 def gen_html(bookmarks_db, show_pbar, report_stats):
27 global pbar, record_no, urls_no, public_html, private_html, private_level
29 shutil.copy("header", "public.html")
30 shutil.copy("header", "private.html")
32 public_html = open("public.html", 'a')
33 private_html = open("private.html", 'a')
39 got_folder = 1 # Start as if we already have one folder
42 for record in bookmarks_db:
43 record_no = record_no + 1
46 pbar.display(record_no)
48 level = string.atoi(record["Level"])
50 if level == save_level:
52 elif level == save_level + 1:
54 write(" "*(level - 1) + "<DL><p>\n")
56 raise ValueError, "indent without folder"
57 elif level <= save_level - 1:
58 unindent(save_level, level)
60 raise ValueError, "new level (%d) too big; must be %d - %d" % (level, save_level-1, save_level+1)
63 got_folder = record.has_key("Folder") # Test here to save got_folder for next loop
65 if private_level == save_level:
66 private_level = 0 # We've returned to saved private level - private folder is over
68 if record.has_key("URL"):
69 write(" "*level + '<DT><A HREF="%s" ADD_DATE="%s" LAST_VISIT="%s" LAST_MODIFIED="%s">%s</A>\n' % (record["URL"], record["AddDate"], record["LastVisit"], record["LastModified"], record["Title"]))
72 elif record.has_key("Folder"):
74 if (record["Folder"] == "Private links") and (private_level == 0):
75 private_level = save_level # We found private folder - save its level
77 if record["Folder"] == "All the rest - Unclassified":
78 write(" "*level + '<DT><H3 NEWITEMHEADER ADD_DATE="%s">%s</H3>\n' % (record["AddDate"], record["Folder"]))
80 write(" "*level + '<DT><H3 ADD_DATE="%s">%s</H3>\n' % (record["AddDate"], record["Folder"]))
82 elif record.has_key("Ruler"):
83 write(" "*level + "<HR>\n")
86 raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record)
88 if record.has_key("Comment") and (record["Comment"] <> ''):
89 write("<DD>%s\n" % string.join(string.split(record["Comment"], "<BR>"), "<BR>\n"))
93 unindent(save_level, 0)
95 raise ValueError, "new level (%d) too little - must be >= 0" % save_level
107 def translate(bookmarks_db, transldb_name, transl, show_pbar, report_stats):
108 global pbar, record_no, urls_no, public_html, private_html, private_level
110 new_ext = str(transl)
111 os.rename("public.html", "public." + new_ext)
112 os.rename("private.html", "private." + new_ext)
115 transl_db = fladm.load_from_file(transldb_name, fladm.check_record, ["URL1", "URL2"], [""])
116 # This prevents any other key to appear in transl.db ^
118 # Generate translation dictionary (hash table)
120 for record in transl_db:
121 transl_d[record["URL1"]] = record["URL2"]
123 for record in transl_db:
124 transl_d[record["URL2"]] = record["URL1"]
126 raise ValueError, "transl (%d) must be 1 or 2" % transl
128 del transl_db # Save few bytes of memory
129 transl_k = transl_d.keys()
132 for record in bookmarks_db:
133 if record.has_key("URL") and (record["URL"] in transl_k):
134 record["URL"] = transl_d[record["URL"]]
136 gen_html(bookmarks_db, show_pbar, report_stats)
138 new_ext = str(3 - transl) # Translate 1 to 2, or 2 to 1
139 os.rename("public.html", "public." + new_ext)
140 os.rename("private.html", "private." + new_ext)
144 global pbar, record_no, urls_no, public_html, private_html, private_level
146 optlist, args = getopt(sys.argv[1:], "ist:r")
151 transldb_name = "" # dictionary translation; default is no translation
154 for _opt, _arg in optlist:
170 sys.stderr.write("db2bkmk: too many arguments\n")
174 show_pbar = sys.stderr.isatty()
178 from tty_pbar import ttyProgressBar
183 sys.stdout.write("Loading: ")
186 bookmarks_db = fladm.load_from_file("bookmarks.db", fladm.check_record, ["Level"])
190 sys.stdout.write("Converting FLAD database to bookmarks.html: ")
194 pbar = ttyProgressBar(0, len(bookmarks_db))
196 gen_html(bookmarks_db, show_pbar, report_stats)
200 sys.stdout.write("Translating: ")
203 if report_stats and show_pbar: # Display bar only without "-i";
204 # with "-s" skip it (one bar already
205 # displayed, and it is enough)
206 pbar = ttyProgressBar(0, len(bookmarks_db))
211 translate(bookmarks_db, transldb_name, transl, show_pbar, report_stats)
215 print record_no, "records proceed"
216 print urls_no, "urls created"
219 if __name__ == '__main__':