X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=icalparse.py;h=3cdc7f1c6222c68968e31ea71b7f0044a7e888bf;hb=08ba47d0e811c700411e763559a4e535cc459cf0;hp=6c3aac67ff4739d01b544462ed279aa3dc805689;hpb=18fa3d2d1ba2875bf7c15bd36862fa7368e337c0;p=frenchie%2Ficalparse.git diff --git a/icalparse.py b/icalparse.py index 6c3aac6..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) @@ -153,37 +156,47 @@ def getHTTPContent(url='',cache='.httplib2-cache'): except ImportError: import urllib2 - if not url: return '' + if not url: return ('','') - encoding = '' # If we don't populate this, the script will assume UTF-8 + 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() else: h = False - try: - if h: + if h: + try: req = h.request(url) - content = req[1] - if 'content-type' in req[0]: - for ct in req[0]['content-type'].split(';'): - ct = ct.lower() - if 'charset' in ct: - encoding = ct.split('=')[1].strip() - return (content, encoding) - except ValueError, e: - sys.stderr.write('%s\n'%e) - sys.exit(1) + except ValueError, e: + sys.stderr.write('%s\n'%e) + sys.exit(1) - try: - content = urllib2.urlopen(url).read() - return (content, encoding) - except (urllib2.URLError, OSError), e: - sys.stderr.write('%s\n'%e) - sys.exit(1) + 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 = '' - return ('', '') + else: + try: + req = urllib2.urlopen(url) + except urllib2.URLError, e: + sys.stderr.write('%s\n'%e) + sys.exit(1) + + content = req.read() + ct = req.info().getplist() + for param in ct: + if 'charset' in param: + encoding = param.split('=')[1] + break + + return (content, encoding) def generateRules(): @@ -254,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, @@ -269,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() @@ -282,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))