osa1 github gitlab twitter cv rss

Django'ya Markdown desteği

August 2, 2010 - Tagged as: python, django, tr.

Bir süredir blog sayfam için yazı girmemi kolaylaştıracak bazı düzenlemeler yapıyorum. Öncelikle Beginning Python: From Novice to Professional kitabındaki “instant markup” örneğini uygulamaya çalıştım, düz yazı yazacaksanız gayet kullanışlı, fakat eğer kod yayınlayacaksanız sapıtıyor. Daha sonrdan BBCode tarzı birşeyler oluşturmayı denedim, fakat o sırada Markdown’ı keşfettim.

Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).

Python modülünü http://pypi.python.org/pypi/Markdown/2.0.3 adresinden indirebilirsiniz.

Henüz isteğim doğrultusunda nasıl geliştirebileceğimi bulamasam da ilk haliyle bile çok yardımcı oluyor. Django’yla kullanmak için iki farklı yol izleyebilirsiniz. Birincisi, hangi modelinizde uygulamak istiyorsanız, onun save metodunu override edersiniz. Örneğin modelimdeki “post” alanına uygulamak istiyorsam, markdown modülünü import ettikten sonra şöyle yapıyorum:

def save(self, *args, **kargs):
    self.post = markdown.markdown(self.post)
    super(Post, self).save()

Bu yöntemin kötü yanı, eğer o yazıyı bir daha düzenlemek isterseniz, size markdown’ın eklediği html taglarıyla beraber gelecek. Yani yazıyı bir kere eklediniz mi, düzenlemek için yine html ile uğraşmanız gerekir. Kötü bir yöntem yani.

İkinci yöntem de, markdown fonksiyonu için bir template tag’ı oluşturup, istediğiniz yere uygulamanız. Bu yöntem her yönden çok daha mantıklı gözüküyor, hem istediğiniz şeye uygulayabilirsiniz. Bunun için markdown’u proje klasörüne kopyaladıktan sonra ayar dosyanızdan markdown’u ISTALLED_APPS altında eklemeniz gerekiyor. Daha sonra şu belgedeki adımları izlemelisiniz. Ya da:

    from django import template
    from ..markdown import markdown as Markdown
    from django.template.defaultfilters import stringfilter
    register = template.Library()
    @register.filter # detayli bilgi icin http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
    @stringfilter # sadece stringlerle calissin
    def markdown(value):
        "String'i Markdown'dan gecirir."
        return Markdown(value)

Daha sonra http://daringfireball.net/projects/markdown/syntax adresindeki gibi yazarsınız. Eklenti desteği sayesinden markdown’a tablo bile çizdirebilirsiniz(eklenti klasörüne bakın).