From 85843643c1e11a84cf8583ab58b07af8eba4057e Mon Sep 17 00:00:00 2001 From: James French Date: Mon, 2 Aug 2010 14:24:06 +0800 Subject: [PATCH] Rules implemented --- icalparse.py | 37 ++++++++++++++++++++++++++++++++++--- parserrules.py | 9 +++------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/icalparse.py b/icalparse.py index 1ed6076..cc41353 100755 --- a/icalparse.py +++ b/icalparse.py @@ -162,6 +162,38 @@ def generateRules(): return rules +def applyRules(ical, rules=[], verbose=False): + 'Runs a series of rules on the lines in ical and mangles its output' + + for rule in rules: + output = [] + if rule.__doc__ and verbose: + print(rule.__doc__) + for line in ical: + try: + out = rule(line[0],line[1]) + except TypeError, e: + output.append(line) + print(e) + continue + + # Drop lines that are boolean False + if not out and not out == None: continue + + # If the rule did something and is a tuple or a list we'll accept it + # otherwise, pay no attention to the man behind the curtain + try: + if tuple(out) == out or list(out) == out and len(out) == 2: + output.append(tuple(out)) + else: + output.append(line) + except TypeError, e: + output.append(line) + + ical = output + + return ical + if __name__ == '__main__': from optparse import OptionParser # If the user passed us a 'stdin' argument, we'll go with that, @@ -185,6 +217,5 @@ if __name__ == '__main__': content = getContent(url, options.stdin) cal = lineJoiner(content) - ical = splitFields(cal) - rules = generateRules() - print rules + ical = applyRules(splitFields(cal), generateRules()) + print ical diff --git a/parserrules.py b/parserrules.py index 61a09e5..e66af2f 100644 --- a/parserrules.py +++ b/parserrules.py @@ -4,15 +4,12 @@ # rule(key, value) # Your functions are expected to return a (key, value) tuple or they will be treated as -# if they don't exist (ie, the line will go through unhindered). Returning a value which -# is boolean False will remove the offending line from the final ICS. The easiest way -# to pass a line back without changing it is to return True. +# if they don't exist (ie, the line will go through unhindered). Returning an value which +# is boolean False will remove the offending line from the final ICS (unless it's a None). # The doc string will be presented to the user when run as verbose, so please be polite def markEventsPublic(key, value): '''Marking private events public''' # Required as google are strict about the CLASS:PRIVATE/CLASS:CONFIDENTIAL lines - if key == 'CLASS': - return (key, 'PUBLIC') - return True + if key == 'CLASS': return (key, 'PUBLIC') -- 2.20.1