# Template Attribute Language

A Template Attribute Language (TAL) é uma linguagem de modelo usada para gerar páginas HTML e XML dinamicamente. Seu principal objetivo é simplificar a colaboração entre programadores e designers. Isto é conseguido pela incorporação de declarações TAL dentro de tags HTML (ou XML, respectivamente) válidas que podem então ser trabalhadas utilizando-se ferramentas de design comuns.
TAL foi criada para o Zope, mas também é usada em outros projetos baseados em Python.

## Visão geral

Modelos TAL normalmente são compostos de páginas de resultado com a variável content sendo substituída por atributos especiais. Por exemplo,
seria tratada por uma ferramenta de desenvolvimento HTML comum como
enquanto que o servidor de aplicações, avaliando o atributo tal:content, produziria
Naturalmente, os literais de cadeia de caracteres não são os casos de uso mais comuns nem os mais úteis. A sintaxe dos possíveis valores de atributo são propriedades da linguagem TAL Expression Syntax (TALES). Em implementações baseadas em Python, é possível usar expressões Python.
Utilizando-se METAL (Macro Expansion TAL) é possível reutilizar código de outros modelos.
Ao gerar documentos XML, é importante especificar o espaço de nomes XML xmlns:tal="http://xml.zope.org/namespaces/tal"

## Atributos

Os seguintes atributos são usados, normalmente prefixados por "tal:":

### define

    cria variáveis locais, válidas no elemento que suporta o atributo (incluindo elementos contidos)

### condition

    decide se deve ou não apresentar o tag (e todo o texto contido)

### repeat

    cria uma variável loop e repete a tag iterando uma sequencia, por exemplo, para criar uma lista de seleção ou uma tabela

### content

    substitui o conteúdo da tag

### replace

    substitui a tag (e, portanto, não pode ser usado junto com o conteúdo ou atributos)

### attributes

    substitui os atributos dados (por exemplo, usando tal:attributes="name name; id name" os atributos nome e id de um campo de entrada podem ser definidos como o valor da variável "name")

### omit-tag

    permite omitir a tag de início e término e apresentar apenas o conteúdo se a expressão for verdadeira.

### on-error

    se ocorrer um erro, este atributo funciona como a tag de conteúdo.
Se uma tag tem mais de um atributo TAL, elas são avaliadas na ordem (bastante lógica) acima.
Nos casos em que nenhuma tag estiver presente, que se presta para tomar os atributos, tags TAL especiais podem ser utilizadas, tornando o prefixo "tal:" opcional. Por exemplo:
faria com que o código dentro das tags tal:if serem utilizadas sempre que o contexto (seja qual for o servidor de aplicação que define o contexto para ser um objeto, por exemplo) contém a variável "itemlist" com um valor true, por exemplo, uma lista contendo pelo menos um elemento. O identificador depois dos dois pontos é arbitrário. Ele simplesmente precisa estar lá e ser o mesmo para as tags de abertura e fechamento.

## METAL

A Macro Expansion Template Attribute Language complementa TAL, fornecendo macros que permitem reutilizar o código através de arquivos de modelo (template). Ambas foram criadas para o Zope, mas também são utilizadas em outros projetos Python.
METAL complementa TAL com a habilidade de reutilização de código. Ela permite que o desenvolvedor defina e utilize macros, que por sua vez pode possuir slots. Quando utiliza-se uma macro, o conteúdo variacional pode ser especificado por um slot.
Ao gerar documentos XML, o espaço de nomes XML deve ser especificado (xmlns:metal="http://xml.zope.org/namespaces/metal").

### Atributos de METAL

Os seguintes atributos são reconhecidos, normalmente requerendo um prefixo „metal:“:

#### define-macro

    cria uma macro

#### define-slot

    cria um slot dentro de uma macro

#### use-macro

    utiliza uma macro (normalmente passada através de uma expressão de caminho TALES)

#### fill-slot

    quando utiliza uma macro, substitui o conteúdo padrão de um dados slot

#### extend-macro

    a partir do Zope v3: estende uma macro, comparável à criação de subclasses, pela redefinição de slots
Normalmente, apenas um destes é usado por vez.
Em casos quando não há nenhuma tag presente, que se presta a tomar os atributos, e em casos especiais, quando mais de um atributo METAL é necessário, tags especiais de METAL podem ser usadas​​, tornando o prefixo „metal:“ opcional. Por exemplo (esboçado com o Roundup em mente):

## Uso

TAL/TALES/METAL são usados pelos seguintes projetos:
* Zope (servidor de aplicações web)
* Roundup (gerenciador de incidentes)
* Simplicity PHP Framework

## Outras implementações

Além da implementação original no Zope, há (não exaustivamente):

### Python

* SimpleTAL (http://www.owlfish.com/software/simpleTAL/, TAL-guide)
* OpenTAL (http://savannah.nongnu.org/projects/opental/)
* ZPT (http://zpt.sourceforge.net/), uma versão independente do Zope Page Templates
* Chameleon (http://chameleon.repoze.org/), uma re-implementação rápida do Zope Page Templates

### C#

* SharpTAL (http://sharptal.codeplex.com/)

### JavaScript

* jstal (http://code.google.com/p/jstal/)
* Distal (http://code.google.com/p/distal/)

### Java

* JPT: Java Page Templates (http://christophermrossi.com/jpt/)
* JavaZPT (http://javazpt.sourceforge.net/)

### Perl

* PETAL, a Perl Template Attribute Language (http://search.cpan.org/dist/Petal/)
* Template-TAL (http://search.cpan.org/dist/Template-TAL/)

### Perl 6

* Flower, uma implementação Perl 6 de TAL, com algumas extensões de Petal e PHPTAL. (http://github.com/supernovus/flower/)

### PHP

* PHPTAL (http://phptal.org)

### XSL

* XSLTal, transformando TAL via XSLT para XSLT; https://web.archive.org/web/20110429170112/http://svn.bitflux.ch/repos/public/popoon/trunk/components/transformers/xsltal/tal2xslt.xsl