]> git.phdru.name Git - bookmarks_db.git/blob - db2bkmk.py
Initial revision
[bookmarks_db.git] / db2bkmk.py
1 #! /usr/local/bin/python -O
2 """
3    Convert FLAD database back to bookmarks.html suitable for Netscape Navigator
4
5    Written by BroytMann, Jun 1997 - Mar 1999. Copyright (C) 1997-1999 PhiloSoft Design
6 """
7
8 import sys, os, string, shutil
9 from getopt import getopt
10
11 import fladm
12
13
14 def write(str):
15    if private_level == 0: # Put in public all except private folder
16       public_html.write(str)
17    private_html.write(str)
18
19
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")
24
25
26 def gen_html(bookmarks_db, show_pbar, report_stats):
27    global pbar, record_no, urls_no, public_html, private_html, private_level
28
29    shutil.copy("header", "public.html")
30    shutil.copy("header", "private.html")
31
32    public_html = open("public.html", 'a')
33    private_html = open("private.html", 'a')
34
35    record_no = 0
36    urls_no = 0
37
38    save_level = 0
39    got_folder = 1 # Start as if we already have one folder
40    private_level = 0
41
42    for record in bookmarks_db:
43       record_no = record_no + 1
44
45       if show_pbar:
46          pbar.display(record_no)
47
48       level = string.atoi(record["Level"])
49
50       if level == save_level:
51          pass
52       elif level == save_level + 1:
53          if got_folder:
54             write("    "*(level - 1) + "<DL><p>\n")
55          else:
56             raise ValueError, "indent without folder"
57       elif level <= save_level - 1:
58          unindent(save_level, level)
59       else:
60          raise ValueError, "new level (%d) too big; must be %d - %d" % (level, save_level-1, save_level+1)
61
62       save_level = level
63       got_folder = record.has_key("Folder") # Test here to save got_folder for next loop
64
65       if private_level == save_level:
66          private_level = 0 # We've returned to saved private level - private folder is over
67
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"]))
70          urls_no = urls_no + 1
71
72       elif record.has_key("Folder"):
73          # Dirty hacks here
74          if (record["Folder"] == "Private links") and (private_level == 0):
75             private_level = save_level # We found private folder - save its level
76
77          if record["Folder"] == "All the rest - Unclassified":
78             write("    "*level + '<DT><H3 NEWITEMHEADER ADD_DATE="%s">%s</H3>\n' % (record["AddDate"], record["Folder"]))
79          else:
80             write("    "*level + '<DT><H3 ADD_DATE="%s">%s</H3>\n' % (record["AddDate"], record["Folder"]))
81
82       elif record.has_key("Ruler"):
83          write("    "*level + "<HR>\n")
84
85       else:
86          raise KeyError, "neither \"URL\" nor \"Folder\" nor \"Ruler\" in record " + str(record)
87
88       if record.has_key("Comment") and (record["Comment"] <> ''):
89          write("<DD>%s\n" % string.join(string.split(record["Comment"], "<BR>"), "<BR>\n"))
90
91
92    if save_level >= 0:
93       unindent(save_level, 0)
94    else:
95       raise ValueError, "new level (%d) too little - must be >= 0" % save_level
96
97    public_html.close()
98    private_html.close()
99
100    if show_pbar:
101       del pbar
102
103    if report_stats:
104       print "Ok"
105
106
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
109
110    new_ext = str(transl)
111    os.rename("public.html", "public." + new_ext)
112    os.rename("private.html", "private." + new_ext)
113
114    transl_d = {}
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 ^
117
118    # Generate translation dictionary (hash table)
119    if transl == 1:
120       for record in transl_db:
121          transl_d[record["URL1"]] = record["URL2"]
122    elif transl == 2:
123       for record in transl_db:
124          transl_d[record["URL2"]] = record["URL1"]
125    else:
126       raise ValueError, "transl (%d) must be 1 or 2" % transl
127
128    del transl_db # Save few bytes of memory
129    transl_k = transl_d.keys()
130
131    # Translate URLs
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"]]
135
136    gen_html(bookmarks_db, show_pbar, report_stats)
137
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)
141
142
143 def run():
144    global pbar, record_no, urls_no, public_html, private_html, private_level
145
146    optlist, args = getopt(sys.argv[1:], "ist:r")
147
148    show_pbar = 1
149    report_stats = 1
150
151    transldb_name = "" # dictionary translation; default is no translation
152    transl = 0
153
154    for _opt, _arg in optlist:
155       if _opt == '-i':
156          show_pbar = 0
157       if _opt == '-s':
158          report_stats = 0
159       if _opt == '-t':
160          transldb_name = _arg
161          transl = 1
162       if _opt == '-r':
163          transl = 2
164    try:
165       del _opt, _arg
166    except NameError:
167       pass
168
169    if args:
170       sys.stderr.write("db2bkmk: too many arguments\n")
171       sys.exit(1)
172
173    if show_pbar:
174       show_pbar = sys.stderr.isatty()
175
176    if show_pbar:
177       try:
178          from tty_pbar import ttyProgressBar
179       except ImportError:
180          show_pbar = 0
181
182    if report_stats:
183       sys.stdout.write("Loading: ")
184       sys.stdout.flush()
185
186    bookmarks_db = fladm.load_from_file("bookmarks.db", fladm.check_record, ["Level"])
187
188    if report_stats:
189       print "Ok"
190       sys.stdout.write("Converting FLAD database to bookmarks.html: ")
191       sys.stdout.flush()
192
193    if show_pbar:
194       pbar = ttyProgressBar(0, len(bookmarks_db))
195
196    gen_html(bookmarks_db, show_pbar, report_stats)
197
198    if transl:
199       if report_stats:
200          sys.stdout.write("Translating: ")
201          sys.stdout.flush()
202
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))
207
208       else:
209          show_pbar = 0
210
211       translate(bookmarks_db, transldb_name, transl, show_pbar, report_stats)
212
213
214    if report_stats:
215       print record_no, "records proceed"
216       print urls_no, "urls created"
217
218
219 if __name__ == '__main__':
220    run()