More efficient lineFolder implementation
[frenchie/icalparse.git] / icalparse.py
index 1ed6076..cc548a3 100755 (executable)
@@ -60,12 +60,13 @@ def lineFolder(oldcal, length=75):
                if len(line.rstrip()) <= length:
                        cal.append(line)
                else:
-                       brokenline = [line[0:length] + '\r\n']
+                       brokenline = [line[0:length]]
                        ll = length
-                       while ll < len(line.rstrip('\r\n')) + 1:
-                               brokenline.append(' ' + line[ll:sl+ll].rstrip('\r\n') + '\r\n')
+                       while ll < len(line) + 1:
+                               brokenline.append(line[ll:sl+ll])
                                ll += sl
-                       cal += brokenline
+                       brokenline = '\r\n '.join(brokenline)
+                       cal.append(brokenline)
 
        return cal
 
@@ -83,6 +84,12 @@ def splitFields(cal):
        return ical
 
 
+def joinFields(ical):
+       '''Takes a list of tuples that make up a calendar file and returns a list of lines'''
+
+       return [':'.join(x) for x in ical]
+
+
 def getContent(url='',stdin=False):
        '''Generic content retriever, DO NOT use this function in a CGI script as
        it can read from the local disk (which you probably don't want it to).
@@ -162,6 +169,40 @@ 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 +226,6 @@ if __name__ == '__main__':
 
        content = getContent(url, options.stdin)
        cal = lineJoiner(content)
-       ical = splitFields(cal)
-       rules = generateRules()
-       print rules
+       ical = applyRules(splitFields(cal), generateRules())
+       output = lineFolder(joinFields(ical))
+       print output

UCC git Repository :: git.ucc.asn.au