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