jsonselect/jsonselect.py
def selector_production(self, tokens):
        """Production for a full selector."""

        validators = []
        # the following productions should return predicate functions.

        if self.peek(tokens, 'type'):
            type_ = self.match(tokens, 'type')
            validators.append(self.type_production(type_))

        if self.peek(tokens, 'identifier'):
            key = self.match(tokens, 'identifier')
            validators.append(self.key_production(key))

        if self.peek(tokens, 'pclass'):
            pclass = self.match(tokens, 'pclass')
            validators.append(self.pclass_production(pclass))

        if self.peek(tokens, 'nth_func'):
            nth_func = self.match(tokens, 'nth_func')
            validators.append(self.nth_child_production(nth_func, tokens))

        if self.peek(tokens, 'pclass_func'):
            pclass_func = self.match(tokens, 'pclass_func')
            validators.append(self.pclass_func_production(pclass_func, tokens))

        if not len(validators):
            raise SelectorSyntaxError('no selector recognized.')

        # apply validators from a selector expression to self.obj
        results = self._match_nodes(validators, self.obj)

        if self.peek(tokens, 'operator'):
            operator = self.match(tokens, 'operator')
            rvals = self.selector_production(tokens)
            if operator == ',':
                results.extend(rvals)
            elif operator == '>':
                results = self.parents(results, rvals)
            elif operator == '~':
                results = self.siblings(results, rvals)
            elif operator == ' ':
                results = self.ancestors(results, rvals)
            else:
                raise SelectorSyntaxError("unrecognized operator '%s'"
                                          % operator)
        else:
            if len(tokens):
                rvals = self.selector_production(tokens)
                results = self.ancestors(results, rvals)

        return results
def selector_production(self, tokens):
        validators = []
        # the following productions should return predicate functions.

        if self.peek(tokens, 'type'):
            type_ = self.match(tokens, 'type')
            validators.append(self.type_production(type_))

        if self.peek(tokens, 'identifier'):
            key = self.match(tokens, 'identifier')
            validators.append(self.key_production(key))

        if self.peek(tokens, 'pclass'):
            pclass = self.match(tokens, 'pclass')
            validators.append(self.pclass_production(pclass))

        if self.peek(tokens, 'nth_func'):
            nth_func = self.match(tokens, 'nth_func')
            validators.append(self.nth_child_production(nth_func, tokens))

        if self.peek(tokens, 'pclass_func'):
            pclass_func = self.match(tokens, 'pclass_func')
            validators.append(self.pclass_func_production(pclass_func, tokens))

        if not len(validators):
            raise SelectorSyntaxError('no selector recognized.')

        # apply validators from a selector expression to self.obj
        results = self._match_nodes(validators, self.obj)

        if self.peek(tokens, 'operator'):
            operator = self.match(tokens, 'operator')
            rvals = self.selector_production(tokens)
            if operator == ',':
                results.extend(rvals)
            elif operator == '>':
                results = self.parents(results, rvals)
            elif operator == '~':
                results = self.siblings(results, rvals)
            elif operator == ' ':
                results = self.ancestors(results, rvals)
            else:
                raise SelectorSyntaxError("unrecognized operator '%s'"
                                          % operator)
        else:
            if len(tokens):
                rvals = self.selector_production(tokens)
                results = self.ancestors(results, rvals)

        return results
def selector_production ( self , tokens ) : validators = [ ] # the following productions should return predicate functions. if self . peek ( tokens , 'type' ) : type_ = self . match ( tokens , 'type' ) validators . append ( self . type_production ( type_ ) ) if self . peek ( tokens , 'identifier' ) : key = self . match ( tokens , 'identifier' ) validators . append ( self . key_production ( key ) ) if self . peek ( tokens , 'pclass' ) : pclass = self . match ( tokens , 'pclass' ) validators . append ( self . pclass_production ( pclass ) ) if self . peek ( tokens , 'nth_func' ) : nth_func = self . match ( tokens , 'nth_func' ) validators . append ( self . nth_child_production ( nth_func , tokens ) ) if self . peek ( tokens , 'pclass_func' ) : pclass_func = self . match ( tokens , 'pclass_func' ) validators . append ( self . pclass_func_production ( pclass_func , tokens ) ) if not len ( validators ) : raise SelectorSyntaxError ( 'no selector recognized.' ) # apply validators from a selector expression to self.obj results = self . _match_nodes ( validators , self . obj ) if self . peek ( tokens , 'operator' ) : operator = self . match ( tokens , 'operator' ) rvals = self . selector_production ( tokens ) if operator == ',' : results . extend ( rvals ) elif operator == '>' : results = self . parents ( results , rvals ) elif operator == '~' : results = self . siblings ( results , rvals ) elif operator == ' ' : results = self . ancestors ( results , rvals ) else : raise SelectorSyntaxError ( "unrecognized operator '%s'" % operator ) else : if len ( tokens ) : rvals = self . selector_production ( tokens ) results = self . ancestors ( results , rvals ) return results
Production for a full selector.
Production for a full selector .