TurboGears - Genshi Şablon Dili
Genshi, XML tabanlı bir şablon dilidir. BenzerKid, daha önce TurboGears’ın önceki sürümleri için şablon motoruydu. Genshi ve Kid gibi diğer iyi bilinen şablon dillerinden esinlenmiştir.HSLT, TAL ve PHP.
Bir Genshi şablonu, işleme yönergelerinden oluşur. Bu Yönergeler, bir şablondaki öğeler ve özniteliklerdir. Genshi yönergeleri bir ad alanında tanımlanırhttp://genshi.edgewall.org/. Bu nedenle, bu ad alanının şablonun kök öğesinde bildirilmesi gerekir.
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/"
lang = "en">
...
</html>
Yukarıdaki beyan, varsayılan isim alanının XHTML olarak ayarlandığı ve Genshi direktiflerinin 'py' öneki olduğu anlamına gelir.
Genshi Direktifleri
Genshi'de bir dizi direktif tanımlanmıştır. Aşağıdaki liste Genshi direktiflerini sıralar -
- py:if
- py:choose
- py:for
- py:def
- py:match
- py:with
- py:replace
- py:content
- py:attrs
- py:strip
Koşullu Bölümler
Genshi içeriğin koşullu olarak oluşturulması için iki yönerge sağlar− py: if ve py: select.
py: if
Bu yönergenin öğesinin içeriği, yalnızca içindeki ifade if clausedoğru olarak değerlendirilir. Şablon bağlamındaki verilerin{‘foo’:True, ‘bar’:’Hello’}, aşağıdaki yönerge -
<div>
<b py:if = "foo">${bar}</b>
</div>
sonuçlanacak
Hello
Ancak bu çıktı, eğer ‘foo’ is set to False.
Bu yönerge aynı zamanda öğe olarak da kullanılabilir. Bu durumda<py:if> karşılık gelen tarafından kapatılmalıdır </py:if>
<div>
<py:if test = "foo">
<b>${bar}</b>
</py:if>
</div>
py: seçmek
Gelişmiş koşullu işlem, aşağıdakilerin kullanılmasıyla mümkündür: py:choose ile bütünlüğünde py:when ve py:otherwisedirektifler. Bu özellik şuna benzer:switch – case inşa etmek C/C++.
İçinde ifade py:choose yönerge ile tanımlanan farklı değerlerle kontrol edilir py:whenalternatifler ve ilgili içerikler işlenecektir. Varsayılan bir alternatif şu şekilde sağlanabilir:py:otherwise direktif.
<div py:choose = "foo”>
<span py:when = "0">0</span>
<span py:when = "1">1</span>
<span py:otherwise = "">2</span>
</div>
Aşağıdaki örnek, py:choose ve py:whendirektifler. HTML formu, verileri URL'ye gönderir / işaretler. marks() işlev, işaretleri ve sonuçları bir sözlük nesnesi biçiminde yeniden total.htmlşablonu. Koşullu gösterimiresult Pass/Fail kullanılarak elde edilir py:choose ve py:when direktifler.
İşaret girmenin HTML betiği (marks.html) aşağıdaki gibidir -
<html>
<body>
<form action = "http://localhost:8080/marks" method = "post">
<p>Marks in Physics:</p>
<p><input type = "text" name = "phy" /></p>
<p>Marks in Maths:</p>
<p><input type = "text" name = "maths" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
Tam kodu root.pyŞöyleki. marks() denetleyici işaretler ve sonuç gönderiyor total.html şablon -
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose("hello.templates.marks")
def marksform(self):
return {}
@expose("hello.templates.total")
def marks(self, **kw):
phy = kw['phy']
maths = kw['maths']
ttl = int(phy)+int(maths)
avg = ttl/2
if avg ≥ 50:
mydata = {'phy':phy, 'maths':maths, 'total':ttl, 'result':2}
else:
mydata = {'phy':phy, 'maths':maths, 'total':ttl,'result':1}
return mydata
total.html şablonlar klasöründe sözlük verilerini alır ve aşağıdaki gibi koşullu olarak html çıktısında ayrıştırır -
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/"
lang = "en">
<head>
<title>TurboGears Templating Example</title>
</head>
<body>
<h2>Hello, Welcome to TurboGears!.</h2>
<h3>Marks in Physics: ${phy}.</h3>
<h3>Marks in Maths: ${maths}.</h3>
<h3>Total Marks: ${total}</h3>
<div py:choose = "result">
<span py:when = "1"><h2>Result: Fail</h2></span>
<span py:when = "2"><h2>Result: Pass</h2></span>
</div>
</body>
</html>
Sunucuyu başlatın (zaten çalışmıyorsa)
Gearbox server –reload –debug
Giriş http://localhost::8080/marksform tarayıcıda -
total.html aşağıdaki çıktıyı oluşturacak -
py: için
Element in py: for yönergesi yinelenebilir, tipik olarak bir Python List nesnesindeki her öğe için tekrarlanır. Eğeritems = [1,2,3] bir şablon bağlamında mevcutsa, py: yönergesi için - izlenerek yinelenebilir
<ul>
<li py:for = "item in items">${item}</li>
</ul>
Aşağıdaki çıktı işlenecek -
1
2
3
Aşağıdaki örnek, py kullanılarak total.html şablonunda oluşturulan HTML form verilerini gösterir: for yönergesi aşağıdaki gibi de kullanılabilir -
<py:for each = "item in items">
<li>${item}</li>
</py:for>
HTML Form Komut Dosyası
<html>
<body>
<form action = "http://localhost:8080/loop" method="post">
<p>Marks in Physics:</p>
<p><input type = "text" name = "phy" /></p>
<p>Marks in Chemistry:</p>
<p><input type = "text" name = "che" /></p>
<p>Marks in Maths:</p>
<p><input type = "text" name = "maths" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
loop() denetleyici form verilerini okur ve bir liste nesnesi biçiminde total.template'e gönderir.
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose("hello.templates.marks")
def marksform(self):
return {}
@expose("hello.templates.temp")
def loop(self, **kw):
phy = kw['phy']
maths = kw['maths']
che = kw['che']
l1 = []
l1.append(phy)
l1.append(che)
l1.append(maths)
return ({'subjects':['physics', 'Chemistry', 'Mathematics'], 'marks':l1})
Temp.html şablonu, dict nesnesinin içeriğini bir tablo biçiminde işlemek için py: for döngüsünü kullanır.
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/" lang = "en">
<body>
<b>Marks Statement</b>
<table border = '1'>
<thead>
<py:for each = "key in subjects"><th>${key}</th></py:for>
</thead>
<tr>
<py:for each = "key in marks"><td>${key}</td></py:for>
</tr>
</table>
</body>
</html>
Sunucuyu başlatın (zaten çalışmıyorsa)
gearbox server –reload –debug
Giriş http://localhost::8080/marksform tarayıcıda.
Yukarıdaki form gönderildiğinde aşağıdaki çıktı tarayıcıda görüntülenecektir.
py: def
Bu yönerge, bir makro oluşturmak için kullanılır. Bir makro, yeniden kullanılabilir bir şablon kod pasajıdır. Bir Python işlevi gibi, bir adı vardır ve isteğe bağlı olarak parametrelere sahip olabilir. Bu makronun çıktısı şablonun herhangi bir yerine eklenebilir.
Py: def yönergesi aşağıdaki sözdizimini izler -
<p py:def = "greeting(name)">
Hello, ${name}!
</p>
Bu makro bir değişken değeri ile 'isim' parametresine dönüştürülebilir.
${greeting('world')}
${greeting('everybody)}
Bu yönerge, aşağıdaki gibi başka bir sözdizimi sürümüyle de kullanılabilir -
<py:def function = "greeting(name)">
<p>Hello, ${name}! </p>
</py:def>
Aşağıdaki örnekte, macro() denetleyici root.py gönderir dict makro.html şablonuna name1 ve name2 iki anahtarlı nesne.
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose('hello.templates.macro')
def macro(self):
return {'name1':'TutorialPoint', 'name2':'TurboGears'}
Bu macro.html şablonu selamlama adı verilen bir makronun tanımını içerir. Kontrolörden alınan veriler için karşılama mesajı oluşturmak için kullanılır.
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/"
lang = "en">
<body>
<h2>py:def example</h2>
<div>
<div py:def = "greeting(name)">
Hello, Welcome to ${name}!
</div>
<b>
${greeting(name1)}
${greeting(name2)}
</b>
</div>
</body>
</html>
Gearbox kullanarak sunucuyu başlatın
gearbox serve –reload –debug
Tarayıcıya aşağıdaki URL'yi girerek makro () denetleyicisini çağırın -
http://localhost:8080/macro
Aşağıdaki çıktı tarayıcıda oluşturulacak -
py: ile
Bu yönerge, yerel değişkenlere ifade atamanıza izin verir. Bu yerel değişkenler, ifadeyi daha az ayrıntılı ve daha verimli hale getirir.
X = 50'nin bir şablon için bağlam verisinde verildiğini varsayarsak, aşağıdaki py: with yönergesi olacaktır -
<div>
<span py:with = "y = 50; z = x+y">$x $y $z</span>
</div>
Aşağıdaki çıktıyla sonuçlanacaktır -
50 50 100
Py: with directive için alternatif bir sürüm de mevcuttur -
<div>
<py:with = "y = 50; z = x+y">$x $y $z</py:with>
</div>
Aşağıdaki örnekte, macro () controller name, phy ve maths anahtarlarıyla bir dict nesnesi döndürür.
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose('hello.templates.macro')
def macro(self):
return {'name':'XYZ', 'phy':60, 'maths':70}
Macro.html şablonu py: with yönergesini kullanarak phy ve maths anahtarlarının değerlerini ekler.
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:py = "http://genshi.edgewall.org/"
lang = "en">
<body>
<h2>py:with example</h2>
<h3>Marks Statement for : ${name}!</h3>
<b>Phy: $phy Maths: $maths
<span py:with = "ttl = phy+maths">Total: $ttl</span>
</b>
</body>
</html>
Tarayıcı, URL'ye yanıt olarak aşağıdaki çıktıyı oluşturacaktır http://localhost:8080/macro
Yapı Manipülasyonu Direktifleri
py:attrs yönerge öğeye öznitelikler ekler, değiştirir veya öznitelikleri kaldırır.
<ul>
<li py:attrs = "foo">Bar</li>
</ul>
Eğer foo = {‘class’:’collapse’} yukarıdaki kod parçacığının işleyeceği bir şablon bağlamında mevcuttur.
<ul>
<li class = "collapse">Bar</li>
</ul>
py:content yönergesi, herhangi bir iç içe geçmiş içeriği, ifadenin değerlendirilmesinin sonucuyla değiştirir -
<ul>
<li py:content = "bar">Hello</li>
</ul>
Bağlam verilerinde bar = 'Bye' verildiğinde, bu,
<ul>
<li>Bye</li>
</ul>
py:replace yönerge, ifadenin değerlendirilmesinin sonucuyla öğenin kendisini değiştirir -
<div>
<span py:replace = "bar">Hello</span>
</div>
Bağlam verilerinde bar = 'Bye' verildiğinde,
<div>
Bye
</div>