Back-End

8 set, 2014

Usando código XML em scripts PHP com XHP – Parte 02

Publicidade

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.

Os atributos são derivados utilizando a função getAttributes() (veja Listagem 9).
Os atributos são derivados utilizando a função getAttributes() (veja Listagem 9).

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á.

Se a extensão estiver funcionando corretamente e estiver sendo interpretada pelo php.ini via linha de comando, essa mensagem deve aparecer.
Se a extensão estiver funcionando corretamente e estiver sendo interpretada pelo php.ini via linha de comando, essa mensagem deve aparecer.