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