Recursos Básicos do Cheetah Template

O Cheetah Template é uma engine de templates para Python. Nesse caso, templates nada mais são que documentos de texto puro com algumas marcações especiais que permitem a inserção de conteúdo em pontos específicos. Com o Cheetah os templates são escritos em uma linguagem específica para escrever templates. O programa Python se encarrega de carregar o arquivo de template e passar para ele os valores que serão substituídos.

A Linguagem de Templates do Cheetah

A linguagem de templates do Cheetah é bastante completa e flexível o que torna a construção de um programa que gera código uma tarefa razoavelmente simples. Vou descrever brevemente alguns recursos da linguagem.

Placeholders

O elemento mais básico de um template Cheetah é o placeholder (algo como guardador de lugar, traduzindo para o português). Como o nome indica, o placeholder guarda lugar para um valor que será dado pelo programa que usa o template. Os placeholders do Cheetah são indicados por nomes iniciando com um caractere $. Por exemplo, no template

Olá, $nome! Seja bem vindo a $lugar


$nome e $lugar são placeholders. A parte depois do $ pode ser qualquer nome de variável Python válido junto com operadores para acessar atributos ou fazer indexação e chamadas de função. Isso quer dizer que $funcao().atrib[0] é um nome válido de placeholder. Para deixar claro até onde queremos que o nome de um placeholder vá, usamos chaves ({}) para delimitar o nome. Por exemplo, o placeholder ${palavra}s corresponde a $palavra com um s literal depois.

Estruturas de Controle

Placeholders são úteis, mas existem meios bem mais simples de fazer esse tipo de substituição usando recursos padrão do Python. O que realmente justifica utilizar o Cheetah Template são os outros recursos da linguagem de template. Com o Cheetah é possível incluir lógica condicional (#if ... #else ... #end if), repetição (#while ... #end while, #for ... #end for) e muitos outros.

Nos comandos podemos usar expresões python para definir como queremos fazer o controle. Por exemplo, abaixo eu uso a função padrão range para gerar uma sequência de números e iterar sobre ela exibindo a contagem:

Olá, $nome! Vou contar até 5:
#for i in range(1, 6)
$i,
#end for
Acabou!


Se o valor de $nome nesse contexto fosse 'João', veríamos a seguinte saída:

Olá, João! Vou contar até 5:
1,
2,
3,
4,
5,
Acabou!


A vantagem de ter esse tipo de controle dentro de um template é que isso torna muito mais simples a geração de código que repete certos padrões ou que depende de certas condições para ser preenchido de uma ou outra maneira. Sem esse controle no template, seria necessário quebrar os trechos de código em vários pedaços "preenchíveis" e depois juntá-los com a lógica do próprio programa.

Usando lógica nos templates podemos focar em escrever um programa que apenas gera as estruturas de dados adequadas para o problema que queremos resolver. Depois passamos essa estrutura para o template que cuida da lógica de apresentação.

Existem outros recursos também na linguagem como definição de funções, herança de templates e outros, mas não irei falar sobre eles agora.

Preeenchendo Templates

Claro que apenas escrever um template não serve para muita coisa, a menos que tenhamos um jeito de controlar quais valores queremos nos nossos placeholders e variáveis de condição. Isso é feito no programa Python, de maneira nada surpreendente, através da classe Template do módulo Cheetah.Template.

>>> from Cheetah.Template import Template


O mínimo de argumentos que precisamos passar para criar um objeto Template é uma fonte de onde vem o template em si e um namespace ou lista de namespaces. A fonte pode um string, um nome de arquivo ou qualquer objeto que se comporte como um arquivo (denominados file-like, no universo Python). A lista de namespaces é passada através do parâmetro searchList. Caso o objeto passado não seja uma lista o Cheetah interpretará como um namespace. Isso quer dizer que

>>> Template(fonte, searchList=namespace)


é equivalente a

>>> Template(fonte, searchList=[namespace])


Os namespaces em si podem dicionários ou objetos quaisquer. Caso seja um dicionário, as chaves do dicionário serão usadas para mapear os nomes usados no template a valores. Caso seja um objeto, os atributos do objeto serão usados.

Para ver o resultado de um template no contexto de um determinado namespace, basta imprimir diretamente o objeto template instanciado. Alguns exemplos para deixar mais claro:

>>> # Um template simples
>>> fonte = "Olá, $nome!"
>>> # Usando um dicionário como namespace
>>> d = {'nome' : 'Kao'}
>>> print Template(fonte, searchList=d)
Olá, Kao!
>>> # Criar uma classe arbitrária para fazer um objeto:
>>> class Foo: pass
>>> # Criar um objeto e adicionar um atributo nome
>>> obj = Foo()
>>> obj.nome = 'João'
>>> print Template(fonte, searchList=obj)
Olá, João!
>>>


Bom, esse breve tour pelos recursos básicos da Cheetah Template demonstraram algumas de suas características. No próximo post será mostrado como ele será usado para efetivamente gerar código C++.

Last edited Jan 7, 2009 at 10:19 PM by kcfelix, version 1

Comments

No comments yet.