changeset 2:5b63c545fa4a

added slices
author sheep@wintermute
date Wed, 14 Apr 2010 11:20:26 +0200
parents 1e04d0ab763b
children d0fecf87e3bc
files jpath.py
diffstat 1 files changed, 34 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/jpath.py	Wed Apr 14 11:03:13 2010 +0200
+++ b/jpath.py	Wed Apr 14 11:20:26 2010 +0200
@@ -57,18 +57,22 @@
                               if p[1] is not None)
                 yield cls.tokens[name](**params)
 
+    @staticmethod
+    def apply(tokens, data):
+        try:
+            token, *tokens = tokens
+        except ValueError:
+            token = NoneToken()
+        for value in token.parse(tokens, data):
+            yield value
+
     def parse(self, tokens, data):
         """
         Default parsing method for most tokens: parse the subtree
         under token's value in data.
         """
 
-        try:
-            token, *tokens = tokens
-        except ValueError:
-            token = NoneToken()
-        for value in token.parse(tokens, data[self.value]):
-            yield value
+        return Token.apply(tokens, data[self.value])
 
 
 @Token.use
@@ -116,12 +120,31 @@
 
 
 @Token.use
+class SliceToken(Token):
+    """[0:-1:2], may return multiple results"""
+
+    regexp = (r'\[(?P<slice_start>-?[0-9]+)?:(?P<slice_end>-?[0-9]+)?'
+              r'(:(?P<slice_step>-?[0-9]+))?\]')
+    name = '_slice'
+    priority = 50
+
+    def __init__(self, _slice, slice_start=None, slice_end=None,
+                 slice_step=None):
+        self.start = int(slice_start) if slice_start is not None else None
+        self.end = int(slice_end) if slice_end is not None else None
+        self.step = int(slice_step) if slice_step is not None else None
+
+    def parse(self, tokens, data):
+        return Token.apply(tokens, data[self.start:self.end:self.step])
+
+
+@Token.use
 class WildcardToken(Token):
     """*[*].*, may return multiple results"""
 
     regexp = r'(^|(?<=\.\.)|\.)\*|\[\*\]'
     name = 'wildcard'
-    priority = 10
+    priority = 50
 
     def __init__(self, wildcard):
         self.value = None
@@ -235,6 +258,10 @@
     [3]
     >>> get_all('a..b', {'a': {'b': 3, 'c': {'b': 4}}})
     [3, 4]
+    >>> get_all('[1:]', [1, 2, 3])
+    [[2, 3]]
+    >>> get_all('[:-1]', [1, 2, 3])
+    [[1, 2]]
     """
 
     tokens = list(Token.tokenize(jpath))