mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Handle escaped backslashes in the new sqp
This commit is contained in:
commit
83c3312223
@ -135,7 +135,7 @@ class Parser(object):
|
|||||||
(r'[()]', lambda x,t: (1, t)),
|
(r'[()]', lambda x,t: (1, t)),
|
||||||
(r'@.+?:[^")\s]+', lambda x,t: (2, unicode(t))),
|
(r'@.+?:[^")\s]+', lambda x,t: (2, unicode(t))),
|
||||||
(r'[^"()\s]+', lambda x,t: (2, unicode(t))),
|
(r'[^"()\s]+', lambda x,t: (2, unicode(t))),
|
||||||
(r'".*?((?<!\\)")', lambda x,t: (3, t[1:-1].replace('\\"', '"'))),
|
(r'".*?((?<!\\)")', lambda x,t: (3, t[1:-1])),
|
||||||
(r'\s+', None)
|
(r'\s+', None)
|
||||||
], flags=re.DOTALL)
|
], flags=re.DOTALL)
|
||||||
|
|
||||||
@ -168,7 +168,16 @@ class Parser(object):
|
|||||||
|
|
||||||
def parse(self, expr, locations):
|
def parse(self, expr, locations):
|
||||||
self.locations = locations
|
self.locations = locations
|
||||||
|
|
||||||
|
# Strip out escaped backslashes and escaped quotes so that the
|
||||||
|
# lex scanner doesn't get confused. We put them back later.
|
||||||
|
expr = expr.replace(u'\\\\', u'\x01').replace(u'\\"', u'\x02')
|
||||||
self.tokens = self.lex_scanner.scan(expr)[0]
|
self.tokens = self.lex_scanner.scan(expr)[0]
|
||||||
|
for (i,tok) in enumerate(self.tokens):
|
||||||
|
tt, tv = tok
|
||||||
|
if tt == self.WORD or tt == self.QUOTED_WORD:
|
||||||
|
self.tokens[i] = (tt, tv.replace(u'\x01', u'\\').replace(u'\x02', u'"'))
|
||||||
|
|
||||||
self.current_token = 0
|
self.current_token = 0
|
||||||
prog = self.or_expression()
|
prog = self.or_expression()
|
||||||
if not self.is_eof():
|
if not self.is_eof():
|
||||||
@ -658,7 +667,7 @@ class Tester(SearchQueryParser):
|
|||||||
u'John Scalzi',
|
u'John Scalzi',
|
||||||
u'Tor Science Fiction',
|
u'Tor Science Fiction',
|
||||||
u'html,lrf'],
|
u'html,lrf'],
|
||||||
343: [u'The Last Colony', u'John Scalzi', u'Tor Books', u'html,lrf'],
|
343: [u'The Last Colony', u'John S"calzi', u'Tor Books', u'html,lrf'],
|
||||||
344: [u'Gossip Girl', u'Cecily von Ziegesar', u'Warner Books', u'lrf,rtf'],
|
344: [u'Gossip Girl', u'Cecily von Ziegesar', u'Warner Books', u'lrf,rtf'],
|
||||||
347: [u'Little Brother', u'Cory Doctorow', u'Tor Teen', u'lrf'],
|
347: [u'Little Brother', u'Cory Doctorow', u'Tor Teen', u'lrf'],
|
||||||
348: [u'The Reality Dysfunction',
|
348: [u'The Reality Dysfunction',
|
||||||
@ -676,7 +685,7 @@ class Tester(SearchQueryParser):
|
|||||||
u'lit,lrf'],
|
u'lit,lrf'],
|
||||||
356: [u'The Naked God', u'Peter F. Hamilton', u'Aspect', u'lit,lrf'],
|
356: [u'The Naked God', u'Peter F. Hamilton', u'Aspect', u'lit,lrf'],
|
||||||
421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf,rar'],
|
421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf,rar'],
|
||||||
427: [u'Lonesome Dove', u'Larry McMurtry', None, u'lit,lrf'],
|
427: [u'Lonesome Dove', u'Larry M\\cMurtry', None, u'lit,lrf'],
|
||||||
440: [u'Ghost', u'John Ringo', u'Baen', u'lit,lrf'],
|
440: [u'Ghost', u'John Ringo', u'Baen', u'lit,lrf'],
|
||||||
441: [u'Kildar', u'John Ringo', u'Baen', u'lit,lrf'],
|
441: [u'Kildar', u'John Ringo', u'Baen', u'lit,lrf'],
|
||||||
443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf,rar'],
|
443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf,rar'],
|
||||||
@ -702,6 +711,10 @@ class Tester(SearchQueryParser):
|
|||||||
'publisher:london:thames': set([13]),
|
'publisher:london:thames': set([13]),
|
||||||
'"(1977)"': set([13]),
|
'"(1977)"': set([13]),
|
||||||
'jack weatherford orc': set([30]),
|
'jack weatherford orc': set([30]),
|
||||||
|
'S\\"calzi': {343},
|
||||||
|
'author:S\\"calzi': {343},
|
||||||
|
'"S\\"calzi"': {343},
|
||||||
|
'M\\\\cMurty': {427},
|
||||||
}
|
}
|
||||||
fields = {'title':0, 'author':1, 'publisher':2, 'tag':3}
|
fields = {'title':0, 'author':1, 'publisher':2, 'tag':3}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user