1.1 --- a/vRecurrence.py Mon Dec 04 23:47:37 2017 +0100
1.2 +++ b/vRecurrence.py Thu Dec 07 23:11:36 2017 +0100
1.3 @@ -58,19 +58,37 @@
1.4 import operator
1.5
1.6 # Frequency levels, specified by FREQ in iCalendar.
1.7 +# Enumeration levels, employed by BY... qualifiers.
1.8 +# Labels, employed in string representations of selectors.
1.9 +# Datetime tuple lengths.
1.10 +# The first/lowest values at each resolution.
1.11 +# Parent resolutions, employed for repetition at a lower resolution than selected.
1.12
1.13 -freq_levels = (
1.14 - "YEARLY",
1.15 - "MONTHLY",
1.16 - "WEEKLY",
1.17 - None, # yearday has no equivalent frequency
1.18 - None, # monthday has no equivalent frequency
1.19 - "DAILY",
1.20 - "HOURLY",
1.21 - "MINUTELY",
1.22 - "SECONDLY"
1.23 +resolutions = (
1.24 + # Frequency # Enumeration # Label # Length # First # Parent
1.25 + ("YEARLY", None, "YEARS", 1, 0, None), # nothing beyond years
1.26 + ("MONTHLY", "BYMONTH", "MONTHS", 2, 1, 0), # months -> years
1.27 + ("WEEKLY", "BYWEEKNO", "WEEKS", 3, 1, 1), # weeks -> months
1.28 + (None, "BYYEARDAY", "YEARDAYS", 3, 1, 0), # yeardays -> years
1.29 + (None, "BYMONTHDAY", "MONTHDAYS", 3, 1, 1), # monthdays -> months
1.30 + ("DAILY", "BYDAY", "DAYS", 3, 1, 2), # weekdays -> weeks
1.31 + ("HOURLY", "BYHOUR", "HOURS", 4, 0, 5), # hours -> days
1.32 + ("MINUTELY", "BYMINUTE", "MINUTES", 5, 0, 6), # minutes -> hours
1.33 + ("SECONDLY", "BYSECOND", "SECONDS", 6, 0, 7), # seconds -> minutes
1.34 )
1.35
1.36 +freq_levels = map(lambda x: x[0], resolutions)
1.37 +enum_levels = map(lambda x: x[1], resolutions)
1.38 +level_labels = map(lambda x: x[2], resolutions)
1.39 +lengths = map(lambda x: x[3], resolutions)
1.40 +positions = map(lambda x: x[3] - 1, resolutions)
1.41 +firstvalues = map(lambda x: x[4], resolutions)
1.42 +enum_parent_levels = map(lambda x: x[5], resolutions)
1.43 +
1.44 +# Add labels corresponding to negative indexes.
1.45 +
1.46 +level_labels += ("COUNT", "DTSTART")
1.47 +
1.48 # Symbols corresponding to resolution levels.
1.49
1.50 YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS = 0, 1, 2, 5, 6, 7, 8
1.51 @@ -83,56 +101,9 @@
1.52
1.53 COUNT, DTSTART, BYSETPOS = -2, -1, None
1.54
1.55 -level_labels = (
1.56 - "YEARS", "MONTHS", "WEEKS", "YEARDAYS", "MONTHDAYS", "DAYS", "HOURS",
1.57 - "MINUTES", "SECONDS",
1.58 -
1.59 - # Negative indexes.
1.60 -
1.61 - "COUNT", "DTSTART"
1.62 - )
1.63 -
1.64 -# Enumeration levels, employed by BY... qualifiers.
1.65 -
1.66 -enum_levels = (
1.67 - None,
1.68 - "BYMONTH",
1.69 - "BYWEEKNO",
1.70 - "BYYEARDAY",
1.71 - "BYMONTHDAY",
1.72 - "BYDAY",
1.73 - "BYHOUR",
1.74 - "BYMINUTE",
1.75 - "BYSECOND"
1.76 - )
1.77 -
1.78 -# Map levels to parent levels.
1.79 -
1.80 -enum_parent_levels = (
1.81 - None, # nothing beyond years
1.82 - 0, # months -> years
1.83 - 1, # weeks -> months
1.84 - 0, # yeardays -> years
1.85 - 1, # monthdays -> months
1.86 - 2, # weekdays -> weeks
1.87 - 5, # hours -> days
1.88 - 6, # minutes -> hours
1.89 - 7 # seconds -> minutes
1.90 - )
1.91 -
1.92 # Levels defining days.
1.93
1.94 -daylevels = [2, 3, 4, 5]
1.95 -
1.96 -# Map from levels to lengths of datetime tuples.
1.97 -
1.98 -lengths = [1, 2, 3, 3, 3, 3, 4, 5, 6]
1.99 -positions = [l-1 for l in lengths]
1.100 -
1.101 -# Define the lowest values at each resolution (years, months, days... hours,
1.102 -# minutes, seconds).
1.103 -
1.104 -firstvalues = [0, 1, 1, 1, 1, 1, 0, 0, 0]
1.105 +daylevels = map(lambda t: t[0], filter(lambda t: t[1] == 3, enumerate(lengths)))
1.106
1.107 # Map from qualifiers to interval multiples. Here, weeks are defined as 7 days.
1.108