1.1 --- a/vRecurrence.py Wed Oct 08 18:18:11 2014 +0200
1.2 +++ b/vRecurrence.py Thu Oct 09 22:50:12 2014 +0200
1.3 @@ -96,6 +96,7 @@
1.4
1.5 freq = dict([(level, i) for (i, level) in enumerate(freq_levels) if level])
1.6 enum = dict([(level, i) for (i, level) in enumerate(enum_levels) if level])
1.7 +weekdays = dict([(weekday, i+1) for (i, weekday) in enumerate(["MO", "TU", "WE", "TH", "FR", "SA", "SU"])])
1.8
1.9 # Functions for structuring the recurrences.
1.10
1.11 @@ -105,6 +106,77 @@
1.12 except StopIteration:
1.13 return None
1.14
1.15 +def get_parameters(values):
1.16 +
1.17 + "Return parameters from the given list of 'values'."
1.18 +
1.19 + d = {}
1.20 + for value in values:
1.21 + parts = value.split("=", 1)
1.22 + if len(parts) < 2:
1.23 + continue
1.24 + key, value = parts
1.25 + if key in ("COUNT", "BYSETPOS"):
1.26 + d[key] = int(value)
1.27 + return d
1.28 +
1.29 +def get_qualifiers(values):
1.30 +
1.31 + """
1.32 + Process the list of 'values' of the form "key=value", returning a list of
1.33 + qualifiers.
1.34 + """
1.35 +
1.36 + qualifiers = []
1.37 + frequency = None
1.38 + interval = 1
1.39 +
1.40 + for value in values:
1.41 + parts = value.split("=", 1)
1.42 + if len(parts) < 2:
1.43 + continue
1.44 + key, value = parts
1.45 + if key == "FREQ" and freq.has_key(value):
1.46 + qualifier = frequency = (value, {})
1.47 + elif key == "INTERVAL":
1.48 + interval = int(value)
1.49 + continue
1.50 + elif enum.has_key(key):
1.51 + qualifier = (key, {"values" : get_qualifier_values(key, value)})
1.52 + else:
1.53 + continue
1.54 +
1.55 + qualifiers.append(qualifier)
1.56 +
1.57 + if frequency:
1.58 + frequency[1]["interval"] = interval
1.59 +
1.60 + return qualifiers
1.61 +
1.62 +def get_qualifier_values(qualifier, value):
1.63 +
1.64 + """
1.65 + For the given 'qualifier', process the 'value' string, returning a list of
1.66 + suitable values.
1.67 + """
1.68 +
1.69 + if qualifier != "BYDAY":
1.70 + return map(int, value.split(","))
1.71 +
1.72 + values = []
1.73 + for part in value.split(","):
1.74 + weekday = weekdays.get(part[-2:])
1.75 + if not weekday:
1.76 + continue
1.77 + index = part[:-2]
1.78 + if index:
1.79 + index = int(index)
1.80 + else:
1.81 + index = None
1.82 + values.append((weekday, index))
1.83 +
1.84 + return values
1.85 +
1.86 def order_qualifiers(qualifiers):
1.87
1.88 "Return the 'qualifiers' in order of increasing resolution."
1.89 @@ -260,7 +332,14 @@
1.90
1.91 return to_tuple(d + s, len(t))
1.92
1.93 -def to_tuple(d, n):
1.94 +def to_tuple(d, n=None):
1.95 + if not isinstance(d, date):
1.96 + return d
1.97 + if n is None:
1.98 + if isinstance(d, datetime):
1.99 + n = 6
1.100 + else:
1.101 + n = 3
1.102 return d.timetuple()[:n]
1.103
1.104 def get_first_day(first_day, weekday):
1.105 @@ -294,6 +373,8 @@
1.106 return "%s(%r, %r, %r, %r)" % (self.__class__.__name__, self.level, self.args, self.qualifier, self.context)
1.107
1.108 def materialise(self, start, end, count=None, setpos=None):
1.109 + start = to_tuple(start)
1.110 + end = to_tuple(end)
1.111 counter = count and [0, count]
1.112 results = self.materialise_items(self.context, start, end, counter, setpos)
1.113 results.sort()
1.114 @@ -502,17 +583,27 @@
1.115
1.116 return self.filter_by_period(results, start, end)
1.117
1.118 -def process(selectors):
1.119 +special_enum_levels = {
1.120 + "BYDAY" : WeekDayFilter,
1.121 + "BYMONTHDAY" : MonthDayFilter,
1.122 + "BYYEARDAY" : YearDayFilter,
1.123 + }
1.124 +
1.125 +# Public functions.
1.126 +
1.127 +def connect_selectors(selectors):
1.128 current = selectors[0]
1.129 for selector in selectors[1:]:
1.130 current.selecting = selector
1.131 current = selector
1.132 return selectors[0]
1.133
1.134 -special_enum_levels = {
1.135 - "BYDAY" : WeekDayFilter,
1.136 - "BYMONTHDAY" : MonthDayFilter,
1.137 - "BYYEARDAY" : YearDayFilter,
1.138 - }
1.139 +def get_selector(dt, qualifiers):
1.140 + dt = to_tuple(dt)
1.141 + return connect_selectors(combine_datetime_with_qualifiers(dt, qualifiers))
1.142 +
1.143 +def get_rule(dt, rule):
1.144 + qualifiers = get_qualifiers(rule)
1.145 + return get_selector(dt, qualifiers)
1.146
1.147 # vim: tabstop=4 expandtab shiftwidth=4