]> git.phdru.name Git - bookmarks_db.git/blob - bkmk2db.py
Initial revision
[bookmarks_db.git] / bkmk2db.py
1 #! /usr/local/bin/python -O
2 """
3    Convert Netscape Navigator's bookmarks.html to FLAD database
4
5    Written by BroytMann, Jun 1997 - Mar 1999. Copyright (C) 1997-1999 PhiloSoft Design
6 """
7
8 import sys, os, stat, string
9 from getopt import getopt
10
11 import bkmk_parser
12 from formatter import AbstractFormatter, NullWriter
13
14
15 def run():
16    optlist, args = getopt(sys.argv[1:], "gits")
17
18    show_pbar = 1
19    to_text = 0
20    to_gf = 0
21    report_stats = 1
22
23    for _opt, _arg in optlist:
24       if _opt == '-g':
25          to_gf = 1
26       if _opt == '-i':
27          show_pbar = 0
28       if _opt == '-t':
29          to_text = 1
30       if _opt == '-s':
31          report_stats = 0
32    try:
33       del _opt, _arg
34    except NameError:
35       pass
36
37    if args:
38       if len(args) > 1:
39          sys.stderr.write("bkmk2db: too many arguments\n")
40          sys.exit(1)
41
42       filename = args[0]
43
44    else:
45       filename = 'bookmarks.html' # good name both for DOS (bookmark.htm) and UNIX
46
47    if show_pbar:
48       show_pbar = sys.stderr.isatty()
49
50    if show_pbar:
51       try:
52          from tty_pbar import ttyProgressBar
53       except ImportError:
54          show_pbar = 0
55
56    if show_pbar:
57       try:
58          size = os.stat(filename)[stat.ST_SIZE]
59       except:
60          print filename, ": no such file"
61          sys.exit(1)
62
63
64    fmt = AbstractFormatter(NullWriter())
65    if to_text:
66       parser = bkmk_parser.Bookmarks2Text(fmt)
67    elif to_gf:
68       parser = bkmk_parser.Bookmarks2Gadfly(fmt)
69    else:
70       parser = bkmk_parser.Bookmarks2Flad(fmt)
71
72
73    if report_stats:
74       str = "Converting " + filename + " to "
75       if to_text:
76          str = "text"
77       elif to_gf:
78          str = "GadFly database"
79       else:
80          str = "FLAD database"
81
82       sys.stdout.write("Converting %s to %s: " % (filename, str))
83       sys.stdout.flush()
84
85    if show_pbar:
86       pbar = ttyProgressBar(0, size)
87       lng = 0
88
89       # This is for DOS - it counts CRLF, which len() counts as 1 char!
90       if os.name == 'dos' or os.name == 'nt' :
91          dos_add = 1
92       else:
93          dos_add = 0 # UNIX' and Mac's len() counts CR or LF correct
94
95    try:
96       f = open(filename, 'r')
97    except IOError, msg:
98       print filename, ":", msg
99       sys.exit(1)
100
101    header = open("header", 'w')
102    line_no = 0
103
104    while 1:
105       line = f.readline()
106       if not line:
107          break
108
109       if show_pbar:
110          lng = lng + len(line) + dos_add
111          pbar.display(lng)
112
113       line = string.strip(line)
114       line_no = line_no + 1
115
116       try:
117          parser.feed(line)
118
119          if parser.outfile: # Write header until HTML parser start writing outfile
120             if header:
121                header.close()
122                header = None
123          else:
124             header.write(line + '\n')
125
126       except:
127          break # I need total number of lines; interpreter will print traceback on exit
128
129    if show_pbar:
130       del pbar
131
132    if report_stats:
133       print "Ok"
134       print line_no, "lines proceed"
135       print parser.urls_no, "urls found"
136       print parser.record_no, "records created"
137
138    parser.close()
139    f.close()
140
141
142 if __name__ == '__main__':
143    run()