25-10-2010, 9:38 ö.s. //
//
python
, markdown, pygments
, wordpress
, vim
Eski wordpress arşivimi daha okunabilir bir hale getirmek için küçük bir parser yazma niyetindeydim ama beceremedim. Şimdilik aşağıdaki template filter ile işimi görüyorum:
def wpcodegen(value):
value = value.replace('[code lang="python"]', '<pre class="wp">')
value = value.replace('[/code]', '</pre>')
value = value.replace('[coolcode]', '<pre class="wp">')
value = value.replace('[/coolcode]', '</pre>')
return value
Aslında syntax renklendirme için uğraşıyordum. Python kodlarını markdown ve codehilite ile renklendirecektim. Bunun için yazıyı parçalara ayırık, [code] ... [/code] arasını gerekli fonksiyona gönderip(fonksiyona göndermeden önce markdown'a göre biçimlendirmem gerekiyordu, dolayısıyla [code] ... [/code] arasını önce satır satır parçalayıp gerekli biçimlendirmeleri yapmam gerekri) çıktıyı o parçayı yazının neresinden söktüysem oraya yerleştirecektim. Kodlamaya başladıktan sonra biraz daha esnek bir yapı için fantastik işlere giriştim. Son hali duruma göre güzel çalışabiliyor aslında.
class Parser:
def __init__(self, metin, baslangic, bitis):
self.metin = metin
self.devam = metin
self.pos = [[0, 0]]
self.baslangic = baslangic
self.bitis = bitis
self.__setPos()
def __setPos(self, index = 0):
try:
bas = self.devam.index(self.baslangic) + \
len(self.baslangic) + index
son = self.devam.index(self.bitis) + index
except ValueError:
return self.pos
self.pos.append([bas, son])
self.devam = self.devam[son+len(self.bitis):]
return self.__setPos(index = son+len(self.bitis))
def codehilite(self, lang=""):
if self.pos == [[0, 0]]:
return self.metin
s = ''
for i in range(len(self.pos)):
if i == range(len(self.pos))[-1]:
break
i += 1
kod = ''
basladi = False
s += self.metin[self.pos[i-1][1] : self.pos[i][0]-len(self.baslangic)]
for satir in self.metin[self.pos[i][0] : self.pos[i][1]].split('\n'):
if not basladi:
if not lang == "":
kod += '\t:::%s\n' % lang
basladi = True
kod += '\t%s\n' % satir
s += Markdown(kod, ['codehilite'])
return s
Birkaç sorun var, birincisi, wordpressde yazdığım bu yazılar veritabanına hep ' " gibi karakterler kaçılarak(ne desem bilemedim, & gibi karakterlere dönüştürülerek işte) kaydedilmiş. Fakat codehilite kullandığımda onlar ekrana & şeklinde yazdırılıyor. Onun dışında, iki ayrı tagı ayrıştırmak istiyorsanız 2 ayrı parser oluşturmalı ve aynı işlemi iki parser ile de uygulamalısınız. Hoş olmadı.
Kullanımı şu şekilde olacaktı:
>>> ornekMetin = u'Buraya [test]bazı etiketler [/test]gelecek'
>>> parser = Parser(ornekMetin, '[test]', '[/test]')
>>> parser.codehilite()
u'Buraya <pre><code>baz\xc4\xb1 etiketler\n</code></pre>'
28-8-2010, 5:23 ö.s. //
//
python
, django
, wordpress
Birkaç gün önce bir arkadaş sormuştu Django ile Wordpress'e nasıl bağlandığımı(bkz arşiv sayfam. Yaptığım şey, wordpress için bir model oluşturup, mümkün olduğunca wordpress veritabanını kopyaladım.
Kendi sitem için sadece wp_posts tablosunu aktardım, fakat tüm wordpress'de aktarılabilir biraz daha uğraşılarak. Bu yöntemle wordpress'e yazı bile girebilirsiniz aslında. Ben sadece yazıları çekiyorum.
wp_posts tablosu(wordpress 2.9.1 için) şu alanları içeriyor:
field type
----------------------------
id int(11)
post_date datetime
post_title varchar(100)
post_content longtext
post_excerpt varchar(100)
post_status varchar(100)
guid varchar(100)
comment_count int(11)
post_type varchar(20)
Bunu Django ORM'ine şu şekilde çevirdim(tam olarak aynısı olmasa da, eğer sadece yazıları okuyacaksanız gayet güzel çalışıyor, yazı eklemek için denemedim):
# models.py
from django.db import models
class Posts(models.Model):
post_date = models.DateTimeField()
post_content = models.TextField()
post_title = models.CharField(max_length=100)
post_content = models.TextField()
post_excerpt = models.CharField(max_length=100)
post_status = models.CharField(max_length=20)
guid = models.CharField(max_length=100)
comment_count = models.IntegerField()
post_type = models.CharField(max_length=20)
Daha sonra views.py dosyamdan şu şekilde çekiyorum:
from wp.models import Posts
def wp():
return [post for post in Posts.objects.order_by("-post_date") if post.post_type == "post" and post.post_status == "publish"]
Bundan sonrası normal Django işlemleri. wp() fonksiyonunu istediğim sayfaya gönderdikten sonra(render_to_response ile mesela) aşağıdaki template kodları ile wordpress yazılarıma ait verileri çekiyorum:
{% for yazi in wp %}
{{ yazi.post_title }} *baslik*
{{ yazi.post_date }} *tarih*
{{ yazi.post_content }} *icerik*
{{ yazi.coment_count }} *yorum sayisi*
{% endfor %}
Tabii bunları çekerken bazı builtin template taglardan yararlanıyorum. Bu arada, Django, 1.2 sürümüyle beraber artık birden fazla veritabanına bağlanabiliyor, wordpress yazılarınızı çekmek istiyorsanız bunu kullanabilirsiniz(ben aynı veritabanını kullanıyorum.
5-7-2010, 10:43 ö.ö. //
//
python
, django
, wordpress
Bir süredir Django öğreniyorum ve öğrendiklerimi uygulamaya koyma amacıyla basit bir blog şeysi yazmıştım. Daha sonra bir tasarım uydurdum ona ve bundan sonra buraya yazmaya devam edeceğim. Wordpress kadar rahat olmasa da, en azından bana Python kullanarak istediğim gibi geliştirme ve kendimi geliştirme imkanı sağlıyor.
Biraz altyapıdan bahsetmek gerekirse, Python 2.4 ve Django kullandım. Yönetim için Django'nun kendi admin eklentisini, yorumlar için yine Django'nun kendi yorum eklentisini kullandım. Programlama açısından geriye kalanları kendim programladım. Başlangıç için The Definitive Guide to Django(Apress) kitabından faydalandım, birkaç bölümden sonra Django'nun kendi belgelerinden yararlandım.
Tasarım kısmına gelince, o kadar çok yerden o kadar çok şey çaldım ki, ben bile hatırlayamıyorum. Aslında genel olarak altyapıyı ben yaptım fakat daha sonra geriye kalan detayları civardan çaldım. Aklıma geldiği kadarıyla kaynak belirteceğim:
Daha çok geliştirilmesi gerekiyor tabii ki, şimdilik aklıma gelenler, etiket bulutu, yazının içeriğine göre otomatik etiketleme, etiketlere göre alakalı yazıları bulabilme, yazı eklemek için daha gelişmiş bir editor(örneğin linkleri tanıyıp gerekli html kodlarını ekleyebilen).. Aslında bunların hiçbiri zor şeyler değil fakat Django bilgim henüz yeterli değil, Python kısmı kolay..
Yazı eklemeyi daha kolay hale getirebilmek için öncelikle yönetici panelinden girdiğim bir yazının veritabanına eklenmeden önce nasıl bir fonksiyona sokulabilir, çıktının veritabanına yazılabileceğini öğrenmem lazım. Yapabilirsem resim ve dosya ekleme özelliği de eklemek istiyorum. İşin arkaplanında düzenlenecek bir sürü kod var aslında, templatelerimin düzenlenmeye ihtiyacı var, view fonksiyonlarımda da pek çok kod tekrarı vs. var. Bir değişiklik yapmam gerektiğimde zorlanacağım.
Onun dışında, gördüğünüz hataları yorumlar kısmında belirtirseniz çok iyi olur..
Son olarak Python destekli sunucusunu kullanmama izin veren arkadaşım Muhammet'e teşekkürler..
0