lib/xbel_handler.py
branchxbelweb
changeset 24 f3a926c13ce0
equal deleted inserted replaced
23:69c1f93892dd 24:f3a926c13ce0
       
     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