Mercurial > jpath
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))
