From a8188ab1c777a3f3db0bdc17eb793368b84b66d5 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Wed, 24 Apr 2013 15:14:09 +0200 Subject: [PATCH] Fix using saved searches with upper-case letters in the name --- src/calibre/utils/search_query_parser.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index cc90e53bac..692f949c19 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -146,6 +146,14 @@ class Parser(object): self.current_token += 1 return res + def lcase_token(self, advance=False): + if self.is_eof(): + return None + res = self.tokens[self.current_token][1] + if advance: + self.current_token += 1 + return icu_lower(res) + def token_type(self): if self.is_eof(): return self.EOF @@ -159,7 +167,7 @@ class Parser(object): def parse(self, expr, locations): self.locations = locations - self.tokens = self.lex_scanner.scan(icu_lower(expr))[0] + self.tokens = self.lex_scanner.scan(expr)[0] self.current_token = 0 prog = self.or_expression() if not self.is_eof(): @@ -169,24 +177,25 @@ class Parser(object): def or_expression(self): lhs = self.and_expression() - if self.token() == 'or': + if self.lcase_token() == 'or': self.advance() return ['or', lhs, self.or_expression()] return lhs def and_expression(self): lhs = self.not_expression() - if self.token() == 'and': + if self.lcase_token() == 'and': self.advance() return ['and', lhs, self.and_expression()] # Account for the optional 'and' - if self.token_type() in [self.WORD, self.QUOTED_WORD] and self.token() != 'or': + if (self.token_type() in [self.WORD, self.QUOTED_WORD] and + self.lcase_token() != 'or'): return ['and', lhs, self.and_expression()] return lhs def not_expression(self): - if self.token() == 'not': + if self.lcase_token() == 'not': self.advance() return ['not', self.not_expression()] return self.location_expression() @@ -226,7 +235,7 @@ class Parser(object): words = words[1:] if len(words) == 1 and self.token_type() == self.QUOTED_WORD: return ['token', loc, self.token(advance=True)] - return ['token', loc, ':'.join(words)] + return ['token', icu_lower(loc), ':'.join(words)] return ['token', 'all', ':'.join(words)]