3.2 Elementos, tags, e atributos

Todos os DTDs escritos em SGML compartilham certas características. Isto é uma dura surpresa, como a filosofia por de trás do SGML nos mostrará ser completamente inevitável. Uma das manifestações mais óbvias desta filosofia está no conteúdo e nos elementos.

A sua documentação (independente se é uma única página web ou um livro longo) é composta de conteúdo. Este conteúdo é então dividido (e de novo subdividido) em elementos. O propósito da adição de marcações é atribuir nome e identidade para os limites destes elementos de forma a possibilitar o processamento adicional.

Por exemplo, considere um livro típico. No nível mais alto, o livro por si só é um elemento. Este elemento “livro” (book) obviamente contém capítulos, os quais também podem ser considerados elementos em sua própria forma. Cada capítulo irá conter mais elementos, tais como parágrafos, citações, notas de rodapé, etc. Cada parágrafo pode conter elementos adicionais, identificando o conteúdo que era de discurso direto, ou o nome de um personagem da história.

Você pode preferir pensar nisto como uma “quebra” do conteúdo. No nível mais alto você tem um pedaço, o Livro. Olhando um pouco mais abaixo, você tem mais pedaços, os capítulos individuais. Estes estão divididos em pedaços ainda menores, os parágrafos, notas de rodapé, nomes de personagens, etc.

Observe que você pode fazer esta diferenciação entre os diferentes elementos do conteúdo sem recorrer a nenhum termo SGML. Na realidade é surpreendentemente fácil de usar. Você pode fazer isso utilizando uma caneta de marcação e uma cópia impressa do livro, utilizando diferentes cores para indicar os diferentes pedaços do conteúdo.

Naturalmente, nós não possuímos uma caneta eletrônica de marcação, assim nós necessitamos de alguma outra maneira de indicar a que elemento cada peça de conteúdo pertence. Nas linguagens escritas em SGML (HTML, DocBook, etc) isto é feito através do uso de tags.

Uma tag é utilizada para identificar onde um elemento particular começa e onde ele termina. A tag não é uma parte própria do elemento . Porque cada DTD foi normalmente escrito para marcar um tipo específico de informação, cada um deles reconhecerá diferentes elementos, e terá nomes diferentes para cada tag.

Para um elemento chamado element-name a tag de início normalmente irá se parecer com <element-name>. E a tag correspondente de fechamento para este elemento seria </element-name>.

Exemplo 3-1. Utilizando um elemento (tags de inicio e fim)

O HTML possui um elemento para indicar que o conteúdo envolvido por este elemento é um parágrafo, chamado <p>. Este elemento possui ambas as tags de início e de fim.

<p>Este é um parágrafo.  Ele inicia com a tag de inicio do 
  elemento 'p', e irá terminar com a tag de fim para o 
  elemento 'p'.</p>

<p>Este é um outro parágrafo.  Mas este é muito menor.</p>

Nem todos os elementos requerem uma tag de finalização. Alguns elementos não possuem conteúdo. Por exemplo, em HTML você pode indicar que deseja que uma linha horizontal apareça no documento. Obviamente, esta linha não possui conteúdo, assim apenas a tag de inicio é requerida para este elemento.

Exemplo 3-2. Utilizando um elemento (Apenas tag de início)

O HTML possui um elemento para indicar uma linha horizontal, chamado <hr>. Este elemento não contém nenhum conteúdo, assim ele possui apenas uma tag de inicio.

<p>Este é um parágrafo.</p>

<hr>

<p>Este é outro parágrafo.  Uma linha horizontal o separa do 
  parágrafo anterior.</p>

Se isto não é óbvio agora, os elementos podem conter outros elementos. No exemplo anterior do livro, o elemento livro continha todos os elementos capítulos, os quais por sua vez continham todos os elementos parágrafos, etc.

Exemplo 3-3. Elementos contendo elementos; <em>

<p>Este é um <em>parágrafo</em> simples no qual 
  algumas das <em>palavras</em> foram <em>enfatizadas</em>.</p>

O DTD irá especificar as regras detalhando quais elementos podem conter outros elementos, e o que exatamente eles podem conter.

Importante: As pessoas sempre confundem os termos tags e elementos, e utilizam os termos como se eles fossem intercambiáveis. Eles não são.

Um elemento é uma parte conceitual do seu documento. Um elemento possui um inicio e fim determinados. As tags marcam onde os elementos começam e terminam.

Quando este documento (ou qualquer pessoa que conheça SGML) se refere a “tag <p>” estamos nos referindo literalmente ao texto de três caracteres <, p e >. Mas a frase “o elemento <p>” se refere ao elemento inteiro.

Esta distinção é muito sutil. Mas mantenha ela em mente

Os elementos podem ter atributos. Um atributo possui um nome e um valor, e é utilizado para adicionar informações extras ao elemento. Esta pode ser a informação a qual indica como o conteúdo deve ser renderizado, ou pode ser algo que identifique a ocorrência única do elemento, ou pode ser qualquer outra coisa.

O atributo de um elemento é sempre escrito dentro da tag de início para aquele elemento, e assume a forma nome-do-atributo="valor-do-atributo".

Nas versões suficientemente recentes do HTML, o elemento <p> possui um atributo chamado <align>, o qual sugere o alinhamento (Justificação) de um parágrafo para o programa que estiver exibindo o HTML.

O atributo align pode assumir um de quatro valores possíveis, left (esquerda), center (centralizado), right (direita) e justify (justificado). Se o atributo não for especificado será assumido o valor padrão left.

Exemplo 3-4. Utilizando um elemento com um atributo

<p align="left">A inclusão de um atributo de alinhamento neste 
  parágrafo foi supérfluo, uma vez que o alinhamento 
  padrão é left (esquerda).</p>

<p align="center">Isto pode aparecer no centro.</p>

Alguns atributos irão assumir apenas valores específicos, como o left ou justify. Outros irão permitir que você entre com qualquer coisa que deseje. Se você precisar incluir aspas (") no valor de um atributo, você deve envolver o valor do atributo com aspas simples (').

Exemplo 3-5. Aspas simples envolta de atributos

<p align='right'>Eu estou a direita!</p>

Algumas vezes você não precisa utilizar aspas em volta de todos os valores dos atributos. Entretanto, a regra para fazer isso é muito sutil, e é muito mais simples sempre utilizar as aspas em volta dos valores dos seus atributos.

A informação nos atributos, elementos e tags são armazenados nos catálogos SGML. Várias ferramentas do projeto de documentação utilizam estes arquivos de catalogo para validarem o seu trabalho. As ferramentas no textproc/docproj incluem uma variedade de arquivos de catalogo SGML. O projeto de documentação do FreeBSD inclui seu próprio conjunto de arquivos de catálogos. Suas ferramentas precisam reconhecer ambos os tipos de arquivos de catalogo.

3.2.1 Para você fazer…

Para poder praticar com os exemplos deste documento você precisará instalar alguns aplicativos no seu sistema, além de assegurar que as variáveis de ambiente estejam corretamente configuradas.

  1. Faça o download e instale o textproc/docproj a partir do sistema de ports do FreeBSD. Ele é um meta-port o qual deve efetuar o download e a instalação de todos os aplicativos e arquivos de suporte que são utilizados pelo projeto de documentação.

  2. Adicione linhas ao seu arquivo de inicialização do shell para configurar a variável de ambiente SGML_CATALOG_FILES. (Se você não estiver trabalhando com a versão no idioma inglês da documentação, você pode precisar substituir o caminho com o diretório correto para o seu idioma.)

    Exemplo 3-6. .profile, para os usuários dos shells sh(1) e bash(1)

    SGML_ROOT=/usr/local/share/xml	    
    SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog
    SGML_CATALOG_FILES=${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/share/xml/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/en_US.ISO8859-1/share/xml/catalog:$SGML_CATALOG_FILES
    export SGML_CATALOG_FILES
    

    Exemplo 3-7. .cshrc, para os usuários dos shell csh(1) e tcsh(1)

    setenv SGML_ROOT /usr/local/share/xml
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/share/xml/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/en_US.ISO8859-1/share/xml/catalog:$SGML_CATALOG_FILES
    

    Para carregar estas variáveis, execute um logout do sistema, logando novamente em seguida, ou execute os comandos acima na sua linha de comando para configurar os valores das variáveis.

  1. Crie o arquivo example.xml, e entre com o seguinte texto:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    
    <html>
      <head>	     
        <title>Um exemplo de arquivo HTML</title>
      </head>
    
      <body>	    
        <p>Este é um parágrafo contendo algum texto.</p>
    
        <p>Este parágrafo contém mais algum texto.</p>
    
        <p align="right">Este parágrafo pode estar alinhado a direita.</p>
      </body>	    
    </html>
    
  2. Tente validar este arquivo utilizando um interpretador SGML.

    Um dos componentes do textproc/docproj é o onsgmls, um interpretador de validação. Normalmente, o onsgmls lê um documento marcado de acordo com um DTD SGML e retorna uma cópia do conjunto de informações sobre a estrutura dos elementos (ESIS, mas isso não é importante agora).

    Entretanto, quando o onsgmls é executado com o parâmetro -s, ele irá suprimir o output normal, e imprimir apenas as mensagens de erro. Isto o torna um meio útil de verificar se o seu documento é válido ou não.

    Utilize o onsgmls para verificar se o seu documento é válido:

    % onsgmls -s example.xml
    

    Como você irá ver, o onsgmls irá executar sem retornar nenhuma mensagem. Isto significa que o seu documento foi validado com sucesso.

  3. Veja o que acontece quando um elemento obrigatório é omitido. Tente remover as tags <title> e </title> , e execute novamente a validação.

    % onsgmls -s example.xml
    onsgmls:example.xml:5:4:E: character data is not allowed here
    onsgmls:example.xml:6:8:E: end tag for "HEAD" which is not finished
    

    As mensagens de erro emitidas pelo onsgmls são organizadas em grupos separados por dois pontos, ou colunas.

    Coluna Propósito
    1 O nome do programa que está gerando o erro. Ela será sempre onsgmls.
    2 O nome do arquivo que contém o erro.
    3 Número da linha na qual o erro aparece.
    4 Número da coluna na qual o erro aparece.
    5 Um código de uma letra indicando a natureza da mensagem. I indica uma mensagem informativa, W é para um aviso, e E é para um erro [a], e X é para uma referência cruzada. Como você pode ver, estas mensagens são erros.
    6 O texto da mensagem.
    Notas:
    a. Ele não está sempre na quinta coluna. O onsgmls -sv exibe onsgmls:I: "OpenSP" version "1.5.2" (depende da versão instalada). Como você pode ver, esta é uma mensagem informativa.

    A simples omissão das tags <title> gerou 2 erros diferentes.

    O primeiro erro indica que o conteúdo (neste caso, caracteres, ou melhor, a tag de inicio de um elemento) ocorreu onde o interpretador SGML estava esperando outra coisa. Neste caso, o interpretador estava esperando encontrar uma das tags de início para os elementos que são válidos dentro do <head> (como a <title> ).

    O segundo erro é porque o elemento <head> deve conter o elemento <title>. Por causa disso o onsgmls considera que o elemento não foi corretamente finalizado. Entretanto, a tag de finalização indica que o elemento foi fechado antes que estivesse terminado.

  4. Coloque de volta o elemento <title>.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.