10
Eyl

WordPress’te “Tanrı Yanılgısı” diye bir başlık attığınızda, WordPress’in sizin için ürettiği URL’e bakalım:

http://blog.gokmengorgen.net/2010/09/09/tanri-yanilgisi/

Tam istediğimiz gibi. Django ile bir blog uygulaması yazıyor olsaydım, sanırım biraz sıkıntı çekecektim:


In [1]: from django.template.defaultfilters import slugify

In [2]: slugify('Tanrı Yanılgısı')
Out[2]: u'tanr-yanlgs'

Gitti ı’lar… Türkçe karakterler arasından Django’nun slugify’sinde çalışmayan tek karakter küçük harfle yazılmış ‘ı’. Baştan slugify fonksiyonuna bir yama yapıp Django ekibine göndermeyi düşündüm; fakat sadece Türkçe’yi dikkate aldığım için büyük ihtimalle yamam reddedilecekti. Ben de bir utils.py dosyası açıp şöyle bir slugify fonksiyonu yazdım:


def slugify_unicode(value):
    value = value.replace(u'\u0131', 'i')
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())

    return mark_safe(re.sub('[-\s]+', '-', value))

Bu fonksiyonu iPython’da denediğinizde patlıyor; ama sitede kullandığınızda herhangi bir sorunla karşılaşılmıyor. Bunun sebebi, ‘ı’ harfinin iPython konsolunda \u0131 olarak dönmemesinden kaynaklanıyor:


In [5]: u"Tanrı Yanılgısı"
Out[5]: u'Tanr\xc4\xb1 Yan\xc4\xb1lg\xc4\xb1s\xc4\xb1'

Bu bana Python’un garipliği gibi geliyor ve Python3′te sorunun düzeltildiğini söylüyorlar (Python3′te unicode default olacak). Henüz denemedim. Emin olmamakla birlikte, slugify fonksiyonu için değer olarak verdiğim başlığın Django’dan “Tanrı Yanılgısı” olarak değil de, “Tanr\u0131 Yan\u0131lg\u0131s\u0131″ çekilmesinden kaynaklanıyor:


In [24]: x = u"Tanr\u0131 Yan\u0131lg\u0131s\u0131"

In [25]: x
Out[25]: u'Tanr\u0131 Yan\u0131lg\u0131s\u0131'

In [26]: slugify_unicode(x)
Out[26]: u'tanri-yanilgisi'