Tucuruí é uma linguagem textual para organização hierárquica de informação, semanticamente similar à XML.
O nome Tucuruí é proveniente da língua Tupi (Brasil) e significa "rio dos gafanhotos".
Translation to English: http://joseflavio.com/tucurui/en
Versão atual: 1.0
Repositório: https://github.com/joseflaviojr/tucurui
Licença: GNU Lesser General Public License, version 3 (LGPLv3)
Autores:
José Flávio de Souza Dias Júnior - contato@joseflavio.com
Principais elementos de um documento Tucuruí:
- Objeto
- Valor
- Comentário
Os elementos são organizados hierarquicamente através de indentação (tabulação ou 4 espaços).
O principal elemento de um documento Tucuruí é o objeto, o qual pode agregar um valor:
html
head
title: Alô mundo!
body
Conceituamente, objetos Tucuruí são equivalentes a tags XML, e valores são conteúdos. Observe o exemplo anterior na sintaxe HTML:
<html>
<head>
<title>Alô mundo!</title>
</head>
<body>
</body>
</html>
A indentação dos exemplos em HTML, presentes nesta documentação, não correspondem aos resultados efetivos da conversão automática, estando assim apenas para melhorar a compreensão.
O objeto title
contém o valor Alô mundo!
e foi precedido por 2 indentações, estando hierarquicamente subordinado ao objeto head
, que com 1 indentação está subordinado ao objeto raiz html
. Todo valor contido na mesma linha do seu referido objeto deve ser precedido por dois pontos e um espaço, tal como em title: Alô mundo!
.
Um documento Tucuruí pode conter mais de um objeto raiz, inclusive homônimos.
O valor de um objeto pode ser também definido através da concatenação de objetos anônimos:
html
body
p
: Oi! Meu nome é
: Tucuruí.
p: Rio dos gafanhotos.
<html>
<body>
<p>Oi! Meu nome é Tucuruí.</p>
<p>Rio dos gafanhotos.</p>
</body>
</html>
Valor livre é a declaração contínua de um valor multilinha:
html
body
div
---
Oi! Meu nome é Tucuruí.
Rio dos gafanhotos.
---
<html>
<body>
<div>
Oi! Meu nome é Tucuruí.
Rio dos gafanhotos.
</div>
</body>
</html>
De fato, um valor livre é um conjunto de valores, sendo automática a inclusão de quebra de linha {n}
no final de todas as linhas, com exceção da última. Objetos descendentes de um valor livre estarão subordinados apenas ao último valor (última linha). Exemplo de equivalência:
obj
---
Linha 1
Linha 2
Linha 3
---
-id: 000
obj
: Linha 1{n}
: Linha 2{n}
: Linha 3
-id: 000
A sequência de elementos estabelece um fluxo de concatenação:
html
body
div
: Meu nome é
strong: Tucuruí
: . Rio dos gafanhotos.
<html>
<body>
<div>
Meu nome é <strong>Tucuruí</strong>. Rio dos gafanhotos.
</div>
</body>
</html>
Elementos podem ser intercalados, independente de ordem:
html
body
div
h1: Tucuruí
: Meu nome é
strong: Tucuruí
---
. Rio dos gafanhotos.
---
<html>
<body>
<div>
<h1>Tucuruí</h1>
Meu nome é <strong>Tucuruí</strong>. Rio dos gafanhotos.
</div>
</body>
</html>
É possível utilizar codificadores de caracteres através de números hexadecimais da tabela Unicode. Exemplo que define a frase Tucuruí = Rio + Gafanhotos
:
html
body
: Tucuruí{20}{3D}{20}
: Rio {2B} Gafanhotos
<html>
<body>
Tucuruí = Rio + Gafanhotos
</body>
</html>
Há codificadores especiais que não estão relacionados à tabela Unicode:
{n}
: nova linha{t}
: tabulação
Objeto privado é equivalente ao conceito de atributo da XML. Todo objeto privado é prefixado com -
:
html
body
div: Meu nome é Tucuruí
-id: foo
-class: bar
<html>
<body>
<div id="foo" class="bar">
Meu nome é Tucuruí
</div>
</body>
</html>
A ideia central acerca do objeto privado é estabelecer uma ligação de dependência entre objetos. Objetos privados possuem um forte vínculo com o elemento imediatamente superior na hierarquia.
Objetos privados também podem conter outros elementos, como por exemplo os valores livres, o que difere fortemente a Tucuruí da XML.
Uma linha de comentário pode ser definida com o prefixo //
:
html
body
//Exemplo de comentário
p: Meu nome é Tucuruí
<html>
<body>
<!--Exemplo de comentário-->
<p>Meu nome é Tucuruí</p>
</body>
</html>
Só existem comentários de uma linha, e eles devem ser exclusivos na linha, jamais após objetos ou valores.
Documentos Tucuruí podem conter os seguintes cabeçalhos:
# 1.0 UTF-8
@ http://foo/bar/HTML5.tuc
html
body
p: Meu nome é Tucuruí
O cabeçalho # 1.0 UTF-8
especifica a versão da Tucuruí utilizada e a codificação do texto. A linha @ http://foo/bar/HTML5.tuc
especifica a URL do modelo de documento Tucuruí, que neste caso consiste num modelo hipotético de conteúdo HTML5.
O arquivamento e o intercâmbio de documentos Tucuruí é feito através de arquivos de texto puro com extensão .tuc
. Exemplos:
Documento.tuc
Lista de Pessoas.tuc
index.tuc
A codificação padrão de documentos Tucuruí é a
UTF-8
.
MIME type:text/tucurui
Modelo Tucuruí é um documento Tucuruí que especifica a estrutura hierárquica desejada, não obrigatória, para os documentos que apontam para ele.
Modelos Tucuruí não devem conter valores.
Exemplo de modelo de HTML resumido:
# 1.0 UTF-8
@ Tucuruí
html
head
title
meta
style
script
body
!fluxo
!fluxo
div
!fluxo
strong
img
Objeto com prefixo !
representa um grupo de objetos permitidos na descendência direta, recurso este denominado herança. A herança é definida na raiz do modelo e, toda vez que ocorre ao longo da estrutura, indica o conjunto possível de objetos naquele local.
# 1.0 UTF-8
@ Tucuruí
html
head
title
body
!global
!fluxo
!fluxo
div
!global
!fluxo
strong
!global
img
!global
!global
!identificacao
!estilo
!identificacao
-id
!estilo
-class
-style
O modelo de todo modelo deve ser
@ Tucuruí
.
Outro recurso disponível para os modelos é a negação, que consiste na indicação de um objeto ou de um grupo de objetos (através de herança) que será excluído da descendência.
Negação direta é a exclusão limitada ao primeiro nível de descendência. Ela é determinada através da inclusão do nome do objeto (ou grupo, por herança) indesejado entre parênteses.
Negação total é a exclusão em todos os níveis de descendência. Ela é determinada através da inclusão do nome do objeto (ou grupo, por herança) indesejado entre duplo parênteses.
Exemplo:
# 1.0 UTF-8
@ Tucuruí
html
head
title
!tags
body
!tags
((style))
!tags
style
script
No exemplo acima, o objeto style
será rejeitado dentro do escopo do objeto body
.
A biblioteca Java Urucum implementa Tucuruí.
Como exemplo, considere o arquivo /temp/teste.tuc
:
html
head
title: Tucuruí
Executando em Java, utilizando Urucum:
Tucurui tuc = TucuruiUtil.abrir("/temp/teste.tuc" );
String html = tuc.gerarHTML();
System.out.println( html );
Saída:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Tucuruí</title>
</head>
</html>
Executando:
Tucurui tuc = TucuruiUtil.abrir("/temp/teste.tuc" );
String xml = tuc.gerarXML();
System.out.println( xml );
Saída:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<html>
<head>
<title>Tucuruí</title>
</head>
</html>
Outro exemplo:
Tucurui tuc = TucuruiUtil.abrir("/temp/teste.tuc" );
String titulo = tuc.obj( "html" ).obj( "head" ).obj( "title" ).valor().texto();
System.out.println( titulo );
O código acima terá como saída o valor Tucuruí
.
A biblioteca Urucum possibilita a conversão de documentos Tucuruí para XML e vice-versa, ampliando seu escopo de aplicação.
Este projeto inclui implementação básica de script em linguagem Groovy que utiliza Urucum para realizar, no terminal de comando, conversão rápida de Tucuruí para XML ou HTML.
./tuc-html.groovy Exemplo.tuc
./tuc-xml.groovy Exemplo.tuc
Ou:
groovy tuc-html.groovy Exemplo.tuc
groovy tuc-xml.groovy Exemplo.tuc
Saída HTML:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Tucuruí</title>
</head>
<body>
<p>Meu nome é <strong>Tucuruí</strong>. Rio dos gafanhotos.</p>
</body>
</html>