Fix handling of bangs (#851)

Changed the implementation to work if the bang is at anyplace in the query.

Added a check to not spend time looking for an operator if a "!" is not present
in the query.

No longer allowed to have the bang at the "!" char at the end, since this may
cause some conflicts like the issue cited before, where the ! is after a word
in the query, which is natural in most languages.
pull/857/head
João 2 years ago committed by GitHub
parent 74503d542e
commit 219fc58401
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -53,24 +53,38 @@ def resolve_bang(query: str, bangs_dict: dict) -> str:
wasn't a match or didn't contain a bang operator wasn't a match or didn't contain a bang operator
""" """
# Ensure bang search is case insensitive
query = query.lower() #if ! not in query simply return (speed up processing)
split_query = query.split(' ') if '!' not in query:
for operator in bangs_dict.keys(): return ''
if operator not in split_query \
and operator[1:] + operator[0] not in split_query: split_query = query.strip().split(' ')
continue
# look for operator in query if one is found, list operator should be of
bang_query = query.replace( # length 1, operator should not be case-sensitive here to remove it later
operator if operator in split_query else operator[1:] + operator = [
operator[0], '' word
).strip() for word in split_query
if word.lower() in bangs_dict
bang_url = bangs_dict[operator]['url'] ]
if len(operator) == 1:
if bang_query: # get operator
return bang_url.replace('{}', bang_query, 1) operator = operator[0]
else:
parsed_url = urlparse.urlparse(bang_url) # removes operator from query
return f'{parsed_url.scheme}://{parsed_url.netloc}' split_query.remove(operator)
# rebuild the query string
bang_query = ' '.join(split_query).strip()
# Check if operator is a key in bangs and get bang if exists
bang = bangs_dict.get(operator.lower(), None)
if bang:
bang_url = bang['url']
if bang_query:
return bang_url.replace('{}', bang_query, 1)
else:
parsed_url = urlparse.urlparse(bang_url)
return f'{parsed_url.scheme}://{parsed_url.netloc}'
return '' return ''

@ -37,11 +37,6 @@ def test_ddg_bang(client):
assert rv._status_code == 302 assert rv._status_code == 302
assert rv.headers.get('Location').startswith('https://www.reddit.com') assert rv.headers.get('Location').startswith('https://www.reddit.com')
# Move '!' to end of the bang
rv = client.get(f'/{Endpoint.search}?q=gitlab%20w!')
assert rv._status_code == 302
assert rv.headers.get('Location').startswith('https://en.wikipedia.org')
# Ensure bang is case insensitive # Ensure bang is case insensitive
rv = client.get(f'/{Endpoint.search}?q=!GH%20whoogle') rv = client.get(f'/{Endpoint.search}?q=!GH%20whoogle')
assert rv._status_code == 302 assert rv._status_code == 302

Loading…
Cancel
Save