/tucurui

Linguagem textual fácil de escrever e de ler. A Tucuruí simplifica a organização da informação de uma forma parecida com a XML, porém mais enxuta e flexível.

Primary LanguageGroovyGNU Lesser General Public License v3.0LGPL-3.0

Tucuruí

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

1. Documento Tucuruí

1.1. Elementos

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

1.2. Objeto e Valor

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.

1.3. Objeto Anônimo

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>

1.4. Valor Livre

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

1.5. Concatenação

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>

1.6. Codificador de Caractere

É 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í&nbsp;&#61;&nbsp;Rio &#43; Gafanhotos
    </body>
</html>

codificadores especiais que não estão relacionados à tabela Unicode:

  • {n} : nova linha
  • {t} : tabulação

1.7. Objeto Privado

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.

1.8. Comentário

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.

1.9. Cabeçalho

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.

1.10. Arquivamento e Intercâmbio

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

2. Modelo Tucuruí

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

2.1. Herança

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

2.2. Negação

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.

3. Implementação

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&iacute;</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.

3.1 Script em Groovy

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&iacute;</title>
</head>
<body>
<p>Meu nome &eacute; <strong>Tucuru&iacute;</strong>. Rio dos gafanhotos.</p>
</body>
</html>