+ if cal[-1]: cal.append('')
+
+ out.write('\r\n'.join(cal))
+
+ if not out == sys.stdout:
+ 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,
+ # otherwise we'll try for a url opener
+
+ parser = OptionParser('usage: %prog [options] url')
+ parser.add_option('-s', '--stdin', action='store_true', dest='stdin',
+ default=False, help='Take a calendar from standard input')
+ parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
+ default=False, help='Be verbose when rules are being applied')
+ parser.add_option('-o', '--output', dest='outfile', default='',
+ help='Specify output file (defaults to standard output)')
+ 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()
+
+ if not args and not options.stdin:
+ parser.print_usage()
+ sys.exit(0)
+ elif not options.stdin:
+ url = args[0]
+ else:
+ url = ''
+
+ (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))
+ writeOutput(output, options.outfile)