24
|
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 |
|