diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 7a56ae72..2d7ef4f9 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -24,6 +24,8 @@ class Search(View): def get(self, request): """that search bar up top""" query = request.GET.get("q") + # check if query is isbn + query = isbn_check(query) min_confidence = request.GET.get("min_confidence", 0) search_type = request.GET.get("type") search_remote = ( @@ -123,3 +125,35 @@ def list_search(query, viewer, *_): ) .order_by("-similarity") ), None + + +def isbn_check(query): + """isbn10 or isbn13 check, if so remove separators""" + if query: + su_num = re.sub(r"(?<=\d)\D(?=\d|[xX])", "", query) + if len(su_num) == 13 and su_num.isdecimal(): + # Multiply every other digit by 3 + # Add these numbers and the other digits + product = sum(int(ch) for ch in su_num[::2]) + sum( + int(ch) * 3 for ch in su_num[1::2] + ) + if product % 10 == 0: + return su_num + elif ( + len(su_num) == 10 + and su_num[:-1].isdecimal() + and (su_num[-1].isdecimal() or su_num[-1].lower() == "x") + ): + product = 0 + # Iterate through code_string + for i in range(9): + # for each character, multiply by a different decreasing number: 10 - x + product = product + int(su_num[i]) * (10 - i) + # Handle last character + if su_num[9].lower() == "x": + product += 10 + else: + product += int(su_num[9]) + if product % 11 == 0: + return su_num + return query