Django 2.0
[wolnelektury.git] / src / sortify.py
1 import re
2 from fnpdjango.utils.text import char_map
3
4
5 # Specifies diacritics order.
6 # Default order is zero, max is 9
7 char_order = {
8     'ż': 1, 'Ż': 1,
9 }
10
11
12 def replace_char(m):
13     char = m.group()
14     if char in char_map:
15         order = char_order.get(char, 0)
16         return "%s~%d" % (char_map[char], order)
17     else:
18         return char
19
20
21 def sortify(value):
22     """
23         Turns Unicode into ASCII-sortable str
24
25         Examples :
26
27         >>> sortify('a a') < sortify('aa') < sortify('ą') < sortify('b')
28         True
29
30         >>> sortify('ź') < sortify('ż')
31         True
32
33     """
34
35     if not isinstance(value, str):
36         value = str(value, 'utf-8')
37
38     # try to replace chars
39     value = re.sub('[^a-zA-Z0-9\\s\\-]', replace_char, value)
40     value = value.lower()
41     value = re.sub(r'[^a-z0-9~]+', ' ', value)
42     
43     return value.encode('ascii', 'ignore').decode('ascii')