X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=icalparse.py;h=3cdc7f1c6222c68968e31ea71b7f0044a7e888bf;hb=08ba47d0e811c700411e763559a4e535cc459cf0;hp=47db2256b9777f7c1d88766a26acf2e3ce3050bd;hpb=2fbe03f8749d964a4e062870068a170f138afd99;p=frenchie%2Ficalparse.git diff --git a/icalparse.py b/icalparse.py index 47db225..3cdc7f1 100755 --- a/icalparse.py +++ b/icalparse.py @@ -23,6 +23,7 @@ import sys import urlparse import os +from cgi import parse_header class InvalidICS(Exception): pass @@ -125,22 +126,24 @@ def getContent(url='',stdin=False): content = sys.stdin.read() return (content, encoding) - if not parsedURL[0]: - try: content = open(os.path.abspath(url),'r').read() - except (IOError, OSError), e: - sys.stderr.write('%s\n'%e) - sys.exit(1) - return (content, encoding) + if not parsedURL[0]: url = 'file://' + os.path.abspath(url) # If we've survived, use python's generic URL opening library to handle it import urllib2 try: res = urllib2.urlopen(url) content = res.read() + ct = res.info().getplist() res.close() except (urllib2.URLError, OSError), e: sys.stderr.write('%s\n'%e) sys.exit(1) + + for param in ct: + if 'charset' in param: + encoding = param.split('=')[1] + break + return (content, encoding) @@ -155,6 +158,8 @@ def getHTTPContent(url='',cache='.httplib2-cache'): if not url: return ('','') + if not 'http' in urlparse.urlparse(url)[0]: return ('','') + if 'httplib2' in sys.modules: try: h = httplib2.Http('.httplib2-cache') except OSError: h = httplib2.Http() @@ -167,8 +172,15 @@ def getHTTPContent(url='',cache='.httplib2-cache'): sys.stderr.write('%s\n'%e) sys.exit(1) - content = req[1] - if 'content-type' in req[0]: ct = req[0]['content-type'] + resp, content = req + if 'content-type' in resp: + ct = 'Content-Type: %s'%req[0]['content-type'] + ct = parse_header(ct) + if 'charset' in ct[1]: encoding = ct[1]['charset'] + else: encoding = '' + else: + ct = '' + encoding = '' else: try: @@ -178,11 +190,11 @@ def getHTTPContent(url='',cache='.httplib2-cache'): sys.exit(1) content = req.read() - info = req.info() - - ct = info['content-type'] - - encoding = 'charset' in ct and ct.split(';')[-1].lower().split('=')[-1].strip() or '' + ct = req.info().getplist() + for param in ct: + if 'charset' in param: + encoding = param.split('=')[1] + break return (content, encoding) @@ -255,6 +267,21 @@ def writeOutput(cal, outfile=''): out.close() +def vobjectRules(ics): + '''Applies rules to the ICS file before we have our way with it''' + + try: + import vobjectRules + except ImportError: + sys.stderr.write('Vobject rules file could not be imported\n') + return ics + + for rule in vobjectRules.runRules: + ics = rule(ics) + + return ics + + if __name__ == '__main__': from optparse import OptionParser # If the user passed us a 'stdin' argument, we'll go with that, @@ -270,6 +297,9 @@ if __name__ == '__main__': parser.add_option('-m','--encoding', dest='encoding', default='', help='Specify a different character encoding' '(ignored if the remote server also specifies one)') + parser.add_option('-r','--vobject-rules', + action='store_true', dest='vobject', + help='Run rules written for vobject stored in vobjectRules.py') (options, args) = parser.parse_args() @@ -283,6 +313,7 @@ if __name__ == '__main__': (content, encoding) = getContent(url, options.stdin) encoding = encoding or options.encoding or 'utf-8' + if options.vobject: content = vobjectRules(content) cal = lineJoiner(content, encoding) ical = applyRules(splitFields(cal), generateRules(), options.verbose) output = lineFolder(joinFields(ical))