Na primeira parte, disponível aqui, vimos alguns aspectos do XHP, como armadilhas, caracteres de escape e métodos primitivos. Aqui, veremos a segunda e última parte, que vai abordar características e regras.
***
Características
Se um elemento possui atributos, é possível incluí-los facilmente, como ilustrado na listagem 9, com a palavra-chave attribute. Na listagem 9, o elemento admin:auto recebe exatamente dois atributos. O primeiro é a marcação brand, que aceita strings e padrões como um valor chamado Ferrari. O nome do atributo é seguido por @require, afirmando que o atributo é obrigatório. Seu colega color só pode assumir dois possíveis valores: blue e red.
Listagem 9: Definindo atributos
01 class :admin:auto extends :x:element { 02 attribute 03 string brand = "Ferrari" @required, 04 enum { "blau", "rot" } color; 05 06 protected function render() { 07 foreach ( $this‐>getAttributes() as $key 08 $output . = ' ' . $key . => $val) { '="' . $val . '"'; 09 } 10 return <div> {$output} </div>; 11 } 12 } 13 14 echo <admin:auto brand="bmw" color="blau" />;
Você pode acessar os atributos usando o método getAttributes() (figura 9), que pode então produzir um loop (mais detalhes na Listagem 9) dentro de render(). O método getAttributes() também está disponível para qualquer classe derivada de x:primitive.
Regras
Um texto em um blog sempre possui pelo menos um título, uma introdução e um corpo de texto. Para expressar tais condições, o XHP usa a palavra-chave children (ver Listagem 10).
Um admin:post deve conter pelo menos um admin:header e um admin:introduction. A notação é baseada em expressões regulares.
A tabela 1 apresenta todos os operadores que o XHP compreende. Durante o processamento, o XHP verifica essas condições e aborta a execução do código se as condições não se aplicarem. Na listagem 10, a instrução:
<admin:post> <admin:header /> <admin:introduction /></admin:post>
seria considerada válida, mas a introdução faltante:
<admin:post> <admin:header /> </admin:post>
não será considerada válida.
Listagem 10: Definindo as permissões de elementos filhos
01 class :admin:post extends :x:element { 02 children (:admin:header, :admin:introduction,:admin:bodytext?); 03 }
Os desenvolvedores do XHP salientam explicitamente que o algoritmo ”greedy” tem preferência. Os elementos filhos (:elem:*,:elem); desencadeiam uma condição de erro: o curinga * já cobre tudo: o primeiro atributo :elem; é o principal, seguido do segundo :elem.
Se for necessário enumerar muitos elementos, é possível simplificar essa tarefa com categorias de elementos. Na Listagem 11, os elementos admin:retweets e admin:tweet pertencem à categoria admin:twittercategory. O elemento admin:twitter pode ter qualquer quantidade de elementos filhos, mas estes devem vir diretamente da categoria admin:twittercategory.
Listagem 11: Uso de categorias de elementos
01 class :admin:retweet extends :x:element { 02 category %admin:twittercategory; 03 } 04 class :admin:tweet extends :x:element { 05 category %admin:twittercategory; 06 } 07 class :admin:twitter extends :x:element { 08 children (%admin:twittercategory)*; 09
As classes x:element e x:primitive são definidas no arquivo code.php. Os comentários armazenados nessas classes também fornecem a única documentação de referência existente. No entanto, o arquivo html.php contém classes para todos os elementos HTML. Por exemplo, :ul processa a lista ul. Aliás, o arquivo html.php também define a classe x:doctype, que por sua vez representa o tipo de documento como HTML5, conforme a definição anteriormente mencionada <DOCTYPE!html>. Será necessário criar suas próprias classes para outros tipos de documentos, tais como XHTML.
A documentação XHP deixa muito a desejar. Como introdução, você pode ler o arquivo README.textile do arquivo de código-fonte, que também pode ser encontrado no GitHub.
Além disso, é possível encontrar informações na wiki um tanto espartana da ferramenta e no posts do Facebook enviados pelo desenvolvedor do XHP Stefan Parker. Entre outras coisas, Parker mostra como parametrizar códigos CSS de uma maneira muito elegante usando XHP.
Conclusão
O XHP simplifica a filtragem, a programação e a entrada de dados. Por exemplo, o XHP verifica sempre as sintaxes e as tags corretas. Elementos desconhecidos não têm saída de dados e expressões em chaves {…} são processadas diretamente pela função htmlspecialchars().
Além disso, o XHP é bastante rigoroso e, por exemplo, leva a erros de execução de código caso o fechamento de tags seja esquecido ou esteja incorreto. Finalmente, é possível criar rapidamente blocos de construção de um sistema modelo usando seus próprios elementos e tags.
Por outro lado, a conversão das tags em objetos custa tempo computacional. Na verdade, isso pode sair tremendamente caro, dependendo do código e da forma de uso. De acordo com um comentário no código fonte do XHP, os desenvolvedores realmente esperam que o cache do sistema APC possa ser utilizado como um acelerador do código.
Os administradores também precisam compilar, provisionar e manter a extensão, o que não é possível com alguns provedores de hospedagem web. Por fim, melhorar a legibilidade do código depende fortemente do quão bem escrito está o código HTML.
Tabela 1: Operadores dos elementos filhos
Símbolo | Significado |
? | Zero elementos ou um elemento |
* | Zero ou múltiplos elementos |
+ | Um ou múltiplos elementos |
| | Ou (uma das condições listadas a direita ou esquerda do elemento/onde será aplicado |
, | Os elementos listados com vírgulas devem aparecer na ordem |
any | Filhos arbitrariamente alocados |
empty | Nenhum elemento filho é permitido |
Box instalação
O processo de instalação do XHP é projetado para sistemas Linux; uma dll para Windows não existe. O XHP suporta oficialmente PHP nas versões 5.2 e 5.3, mas também rodou no Debian 7 com PHP 5.4.
Para instalar o XHP em um sistema Ubuntu 13.04 ou Debian 7, certifique-se de instalar o Apache, junto com o PHP 5 e seu pacote para desenvolvedores:
sudo apt‐get install apache2 php5 php5‐dev
Para compilar o XHP, também será necessário o compilador GCC 4.0, juntamente com o G++ 4.0, Flex versão 2.5.35 ou posterior, o Bison 2.3 ou posterior, e o re2c versão 0.13.5 ou mais atual:
sudo apt‐get install build‐essential flex bison re2c
Tendo os pré-requisitos atendidos, baixe o código-fonte do GitHub ou clone o repositório git:
git clone git://github.com/facebook/xhp.git
E então construa o pacote do XHP com os três comandos a seguir:
phpize
./configure
make
Caso utilize o comando make teste, poderá testar se os pré-requisitos para instalação estão todos atendidos. Para instalar o XHP, execute o comando:
sudo make install
É preciso ativar a nova extensão no php.ini. No Debian e no Ubuntu, o arquivo de configuração está localizado em /etc/php5/apache2.
Adicione a seguinte linha:
extension=xhp.so
Dependendo de sua instalação, talvez seja necessário adicionar o caminho completo para o arquivo xhp.so, junto do comando sudo make install anterior. Depois de reiniciar o servidor web através da emissão do comando sudo /etc/init.d/apache2 restart, o script da Listagem 2 deve funcionar. No Ubuntu e no Debian, você precisará salvar a listagem no diretório /var/www; salve o arquivo como test.php, por exemplo. Também será necessário despejar o conteúdo do arquivo PHP presente no subdiretório php-lib no arquivo de código-fonte do XHP presente em /var/www antes que seja possível ver os resultados em um navegador pelo endereço http://localhost/test.php. Alternativamente, é possível conferir os resultados através da linha de comando, como ilsutra a figura 3.
php ‐r ‘echo “XHP!\n”; exit; ;’.
Os sistemas Debian e Ubuntu atribuem ao interpretador de linha de comando para PHP um arquivo php.ini separado, que reside no diretório /etc/php5/ dentro do subdiretório cli. Digite no diretório XHP em /etc/php5/cli; caso contrário,
a chamada falhará.