1.1 --- a/vRecurrence.py Sat Dec 02 22:18:51 2017 +0100
1.2 +++ b/vRecurrence.py Sat Dec 02 23:46:33 2017 +0100
1.3 @@ -304,7 +304,7 @@
1.4
1.5 for selector in selectors:
1.6 if isinstance(selector, PositionSelector):
1.7 - selector.level = max_level
1.8 + selector.set_level(max_level)
1.9
1.10 selectors.sort(key=selector_sort_key)
1.11 return selectors
1.12 @@ -313,21 +313,25 @@
1.13
1.14 "Produce a sort key for 'selector'."
1.15
1.16 + # Make DTSTART sort later than COUNT.
1.17 +
1.18 + if selector.qualifier == "COUNT":
1.19 + sublevel = 0
1.20 + elif selector.qualifier == "DTSTART":
1.21 + sublevel = 1
1.22 +
1.23 # Make BYSETPOS sort earlier than the enumeration it modifies.
1.24 +
1.25 + elif selector.qualifier == "BYSETPOS":
1.26 + sublevel = 2
1.27 +
1.28 # Other BY... qualifiers sort earlier than selectors at the same resolution
1.29 # even though such things as "FREQ=HOURLY;BYHOUR=10" do not make much sense.
1.30
1.31 - if not selector.qualifier.startswith("BY"):
1.32 - sublevel = 2
1.33 - elif selector.qualifier != "BYSETPOS":
1.34 - sublevel = 1
1.35 -
1.36 - # Make DTSTART sort later than COUNT.
1.37 -
1.38 - elif selector.qualifier == "DTSTART":
1.39 - sublevel = 1
1.40 + elif selector.qualifier.startswith("BY"):
1.41 + sublevel = 3
1.42 else:
1.43 - sublevel = 0
1.44 + sublevel = 4
1.45
1.46 return (selector.level, sublevel)
1.47
1.48 @@ -458,8 +462,7 @@
1.49 results.
1.50
1.51 Qualifiers are accumulated in order to define a selection. Datetime values
1.52 - occurring between qualifiers or at the same resolution as qualifiers are
1.53 - ignored.
1.54 + occurring at the same resolution as qualifiers are ignored.
1.55
1.56 Any remaining datetime values are introduced as enumerators, provided that
1.57 they do not conflict with qualifiers. For example, specific day values
1.58 @@ -549,7 +552,7 @@
1.59 """
1.60
1.61 if isinstance(from_sel, Enum) and level > 0:
1.62 - repeat = Pattern(level - 1, {"interval" : 1}, None)
1.63 + repeat = Pattern(level - 1, {"interval" : 1}, freq_levels[level - 1])
1.64 l.append(repeat)
1.65
1.66 def get_multiple(qualifier):
1.67 @@ -1042,7 +1045,14 @@
1.68
1.69 def __init__(self, level, args, qualifier, selecting=None, first=False):
1.70 Selector.__init__(self, level, args, qualifier, selecting, first)
1.71 - self.step = scale(1, level)
1.72 + if level is not None:
1.73 + self.set_level(level)
1.74 + else:
1.75 + self.step = None
1.76 +
1.77 + def set_level(self, level):
1.78 + self.level = level
1.79 + self.step = scale(1, self.level)
1.80
1.81 def materialise_items(self, context, start, end, inclusive=False):
1.82 return PositionIterator(self, context, start, end, inclusive, self.step,