|
1 #!/usr/bin/python |
|
2 """ |
|
3 |
|
4 A class to parse an XBEL file and produce a Bookmarks instance. |
|
5 |
|
6 If executed as a script, this module will read an XBEL file from |
|
7 standard input, produce the corresponding Bookmarks instance, and dump |
|
8 it to standard output in a selected format. |
|
9 |
|
10 Borrowed from the xbel-utils package. |
|
11 |
|
12 """ |
|
13 |
|
14 # import bookmark |
|
15 from _xmlplus.xbel import bookmark |
|
16 import string |
|
17 from xml.sax import saxlib |
|
18 |
|
19 class XBELHandler(saxlib.HandlerBase): |
|
20 def __init__(self): |
|
21 self.bms = bookmark.Bookmarks() |
|
22 self.entered_folder = self.entered_bookmark = 0 |
|
23 |
|
24 def startElement(self, name, attrs): |
|
25 self.cur_elem = name |
|
26 # print name, attrs |
|
27 if name == 'folder': |
|
28 self.entered_folder = 1 |
|
29 elif name == 'title': |
|
30 self.title = "" |
|
31 elif name == 'desc': |
|
32 self.desc = "" |
|
33 elif name == 'bookmark': |
|
34 self.title = self.href = "" |
|
35 self.added = self.visited = self.modified = "" |
|
36 |
|
37 if attrs.has_key('href'): |
|
38 self.href = attrs['href'] |
|
39 if attrs.has_key('added'): |
|
40 self.added = attrs['added'] |
|
41 if attrs.has_key('visited'): |
|
42 self.visited = attrs['visited'] |
|
43 if attrs.has_key('modified'): |
|
44 self.modified = attrs['modified'] |
|
45 |
|
46 def characters(self, ch, start, length): |
|
47 if self.cur_elem in ['title', 'desc']: |
|
48 attr = string.lower(self.cur_elem) |
|
49 value = getattr(self, attr) |
|
50 setattr(self, attr, value + ch[start:start+length]) |
|
51 # print getattr(self, attr) |
|
52 |
|
53 def endElement(self, name): |
|
54 # print 'ending:', name |
|
55 self.cur_elem = None |
|
56 if name == 'folder': |
|
57 # print 'leaving folder' |
|
58 self.bms.leave_folder() |
|
59 self.entered_folder = 0 |
|
60 elif name == 'desc': |
|
61 self.bms.desc = self.desc |
|
62 elif name == 'title' and self.entered_folder: |
|
63 # print 'Adding folder', self.title |
|
64 self.bms.add_folder(self.title) |
|
65 self.entered_folder = 0 |
|
66 elif name == 'bookmark': |
|
67 # print 'adding bookmark:', self.title, self.href |
|
68 self.entered_folder = 0 |
|
69 if self.added == "": self.added = None |
|
70 if self.visited == "": self.visited = None |
|
71 if self.modified == "": self.modified = None |
|
72 # raise ImportError |
|
73 self.bms.add_bookmark(self.title, self.added, self.visited, self.modified, self.href) |
|
74 |
|
75 if __name__ == '__main__': |
|
76 import sys, getopt |
|
77 |
|
78 opts, args = getopt.getopt(sys.argv[1:], '', |
|
79 ['opera', 'netscape', 'lynx=', 'msie', 'xbel'] ) |
|
80 if len(args): |
|
81 print 'xbel_parse only reads from standard input' |
|
82 sys.exit(1) |
|
83 if len(opts)>1 or len(opts)==0: |
|
84 print 'You must specify a single output format when running xbel_parse' |
|
85 print 'Available formats: --opera, --netscape, --msie, --lynx, --xbel' |
|
86 print ' --lynx <path> : For Lynx, a path to the directory where' |
|
87 print ' the output bookmark files should be written' |
|
88 sys.exit(1) |
|
89 |
|
90 xbel_handler = XBELHandler() |
|
91 p=saxexts.XMLParserFactory.make_parser("xml.sax.drivers.drv_xmlproc") |
|
92 p.setDocumentHandler( xbel_handler ) |
|
93 p.parseFile( sys.stdin ) |
|
94 bms = xbel_handler.bms |
|
95 mode, arg = opts[0] |
|
96 if mode == '--opera': bms.dump_adr() |
|
97 elif mode == '--lynx': bms.dump_lynx(arg) |
|
98 elif mode == '--netscape': bms.dump_netscape() |
|
99 elif mode == '--msie': bms.dump_msie() |
|
100 elif mode == '--xbel': bms.dump_xbel() |
|
101 |
|
102 |