Processamento de Documentos Estruturados com Omnimark
Compiladores e Interpretadores
•	Máquina Virtual Omnimark – Omnimark VM
•	Compilador Omnimark – Omnimark C
•	Linha de comando Omnimark – Omnimark C/VM
Extensões e Componentes
•	“.xvc” – Código binário Omnimark (compilado)
•	dependente da plataforma
•	código opaco
•	ligeiramente mais rápido
•	“.xom” – Código fonte Omnimark
Linha de Comando
•	os ficheiros passados como argumento são automaticamente processados como entrada do programa
•	as variáveis globais podem ser inicialiazadas
•	quando a invocação se torna complexa pode usar-se um ficheiro de argumentos “.xar” com a opção “-f”.
Execução de Programas
omnimark –s programa.xom
A opção “-s” (“source”) identifica o ficheiro com o programa omnimark.

Omnimark –f minha-invoca.xar
A opção “-f” identifica o ficheiro com os vários parâmetros da linha de comando (um por linha).

Exemplos:
Omnimark –s tolatex.xom geira.xml
Omnimark –s gera-ind.xom *.xml
Bibliotecas de Funções e Inclusões de Ficheiros
•	Utilização das opções “-i” e “-x”
•	Inicialização das variáveis de ambiente: OMNIMARK_INCLUDE e OMNIMARK_XFLPATH
Exemplo de um ficheiro de argumentos:
$cat meus-args.xar
  -i /usr/bin/omnimark/xin
  -x /usr/bin/omnimark/xfunc
  -s /home/jcr/scripts/omni/teste.xom

Parsing (XML e SGML)
Os parsers de XML e SGML realizam três tarefas principais:
•	Separam as anotações do texto e extraem a estrutura do documento.
•	Validam a estrutura do documento e comunicam os erros encontrados.
•	Expandem as entidades (por vezes com alguma ajuda do código).
O parser analiza o documento e por cada elemento estrutural encontrado executa a correspondente “regra estrutural” (“pattern matching”).

Exemplo 1
Documento XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<sumarios> 
  <disciplina> Processamento Estruturado de Documentos</disciplina> 
  <professor> 
	 <nome>José Carlos Ramalho</nome> 
	 <email>jcr@di.uminho.pt</email> 
	 <url>http://www.di.uminho.pt/~jcr</url> 
  </professor> 
  <aula tipo="T"> 
	 <data>2000.10.02</data> 
	 <sumario> 
		<p>Anotação de Documentos: um pouco de história.</p>
		<p>Linguagens de Anotação como meta-linguagens: o SGML e o XML.</p> 
		<p>Anotação Descritiva. Ciclo de vida dos documentos estruturados.</p> 
	 </sumario> 
  </aula>
  …
</sumarios> 

Script Omnimark

process
  local stream output-file
  open output-file as file “output.htm”
  using output as output-file
  do xml-parse instance
    scan file “sumarios.xml”
      output “<html>%c</html>”
  done

element “sumarios”
  output “<body>%c</body>”

element “disciplina”
  output “<h1>%c</h1>”

element “professor”
  output “<h2>Responsável:</h2>%c”

element “nome”
  output “%c<br>”

element “url”
  output “%c<br>”

element “aula”
  do when attribute tipo is “T”
    output “<hr><b>Aula Teórica</b><br>%c”
  else
    output “<hr><b>Aula TP</b><br>%c”
  done

element “data”
  output “<b>%c</b><br>”

element “sumario”
  output “%c”

element “p”
  output “<p>%c”

element #implied
  suppress

Output gerado

$omnimark –s exemplo1.xom
$cat output.htm
<html><body>
  <h1> Processamento Estruturado de Documentos</h1> 
  <h2>Responsável:</h2>
	 José Carlos Ramalho<br> 
	 http://www.di.uminho.pt/~jcr<br> 
  <hr><b>Aula Teórica</b><br 
  <b>2000.10.02</b><br>
  <p>Anotação de Documentos: um pouco de história.
  <p>Linguagens de Anotação como meta-linguagens: o SGML e o XML.
  <p>Anotação Descritiva. Ciclo de vida dos documentos estruturados. 
  …
</body></html>

%c e suppress
Cada acção duma “element rule” tem que ter obrigatoriamente a indicação do que se pretende para o seu conteúdo (%c) ou da sua supressão no output (suppress).

Atribuição a uma variável

element “data”
  local stream cont-nome
  set cont-nome to “%c”

A variável cont-nome ficaria com o valor: 2000.10.02
%c é o conteúdo pós-processamento:
element “sumario”
  local stream cont-sumario
  set cont-sumario to “%c”

A variável cont-sumario ficaria com o valor:
<p>Anotação de Documentos: um pouco de história.
<p>Linguagens de Anotação como meta-linguagens: o SGML e o XML.
<p>Anotação Descritiva. Ciclo de vida dos documentos estruturados.
Processamento orientado à Estrutura
Os parsers sabem sempre em que ponto da estrutura do documento estão posicionados o que torna possível a utilização desta informação para dirigir o processamento.
element “p” when parent is “sumario”
  suppress
  output “Sou um parágrafo filho de sumário.”

element “p” 
  do when parent isnt “sumario”
    output “%c”
  else 
    suppress
  done

Regras para processamento estruturado
•	data-content – regras que permitem manipular o conteúdo textual dos elementos.
•	document-end – regra accionada quando se atinge o fim do documento.
•	document-start – regra accionada no início do documento, também designada por regra de inicialização.
•	element – regra normalmente accionada sempre que o início de um novo elemento é encontrado.
•	markup-comment – regra accionada sempre que um comentário é encontrado e que permite assim tratar o seu conteúdo.
•	markup-error – regra accionada sempre que um erro é encontrado permitindo tratar a situação.
Algumas Scripts exemplo
Parser
DOWN-TRANSLATE WITH XML

ELEMENT #IMPLIED
  SUPPRESS

document-end
  OUTPUT "Document is OK."

Geração de HTML
;
; Omnimark Script to generate html version (simple version).
; 
; Versão 0.1 - jgr - 23.04.98 - MW98
;

DOWN-TRANSLATE

global counter bib-no initial {0}

document-start
	output "<HTML>%n"
	output "<TITLE>%n"
	output "Archaelogical Sites in the North of PORTUGAL%n"
	output "</TITLE>%n"
	output '<BODY BGCOLOR="ffffff">%n'

global stream bibset

ELEMENT arqsits
  OUTPUT "%c"

ELEMENT arqelem
  OUTPUT "%c"

ELEMENT identi
  OUTPUT "%n<H2>%c</H2>%n"

ELEMENT concel
  OUTPUT "%n%n<B> Concelho </B>%n%c%n"

ELEMENT lugar
  OUTPUT "%n<B> Lugar </B>%n%c%n"

ELEMENT fregue
  OUTPUT "%n<B> Freguesia </B>%n%c%n"

ELEMENT acesso
  OUTPUT "%n<B> Acesso </B>%n%c%n"

ELEMENT quadro
  OUTPUT "%n<B> Enquadramento </B>%n%c%n"

ELEMENT traarq
  OUTPUT "%n<B> Trabalhos Arqueológicos </B>%n%c%n"

ELEMENT desarq
  OUTPUT "%n<B> Descrição Arqueológica </B>%n%c%n"

ELEMENT interp
  OUTPUT "%n<B> Interpretação </B>%n%c%n"

ELEMENT autor
  OUTPUT "%n<B> Autor </B>%n%c%n"

ELEMENT liga
  OUTPUT "%c"

ELEMENT #IMPLIED
	SUPPRESS

document-end
	output "%n</BODY>%n"
	output "%n</HTML>%n"
Geração de índices
;
; Script Omnimark para gerar uma página HTML com os arqueositios agrupados
;   por Concelho e links para cada uma das páginas individuais dos arqsits
; e cruzar esta informação com o glossário enriquecendo os dois.
; Versão 0.1 - jcr - 21.04.98
;

DOWN-TRANSLATE

global stream area-stream variable initial-size 0
global stream thesaurus variable initial-size 0
global stream cidenti
global stream concelho
global counter arqind INITIAL {1}
global stream farq
  
global counter cliga 

ELEMENT #IMPLIED
  SUPPRESS

ELEMENT arqsits
  OUTPUT "%c"

ELEMENT arqelem
  set cliga to 1
  OPEN farq AS FILE "ARQS/arq%d(arqind).html"
  USING OUTPUT AS farq
    OUTPUT "<HR><P>%c<P><HR>"
  CLOSE farq
  INCREMENT arqind

ELEMENT identi
  SET cidenti TO "%c"
  OUTPUT "<P>%n<H3>Identificação:</H3> %g(cidenti)"

ELEMENT concel
  SET concelho TO "%sc"
  OUTPUT "<P>%n<H3>Concelho:</H3> %g(concelho)"
  DO WHEN !(area-stream has key concelho)
    NEW area-stream key concelho
  DONE
  REOPEN area-stream key concelho as buffer
  PUT area-stream key concelho "<LI><A HREF=%"ARQS/arq%d(arqind).html%">%g(cidenti)</A>%n"
  CLOSE area-stream key concelho

ELEMENT quadro
  OUTPUT "<P>%n<H3>Quadro:</H3>%n%c"

ELEMENT desarq
  OUTPUT "<P>%n<H3>Descrição:</H3>%n%c"

ELEMENT liga
  local stream lstemp

  set lstemp to "%c"
  OUTPUT "<A NAME=%"%g(cidenti)%d(cliga)%" HREF=%"gloss.html#%g(lstemp)%">%g(lstemp)</A>"
  DO WHEN !(thesaurus has key lstemp)
    new thesaurus key lstemp
  DONE
  REOPEN thesaurus key lstemp as buffer
  PUT thesaurus key lstemp "<LI><A HREF=%"ARQS/arq%d(arqind).html#%g(cidenti)%d(cliga)%">%g(cidenti)</A>%n"
  CLOSE thesaurus key lstemp 
  INCREMENT cliga

DOCUMENT-END
  local stream alist

  REPEAT OVER area-stream
    OUTPUT "<h2>Entrys of  '" || 
           key of area-stream ||
           "':</h2>%n<ul>%n%g(area-stream)</ul>%n"
  again

  OUTPUT "<hr><H1>THESAURUS:</H1>%n" 
  REPEAT OVER thesaurus
    OUTPUT "<h2>Termo:  '" || 
           key of thesaurus ||
           "':</h2>%n<ul>%n%g(thesaurus)</ul>%n"
  AGAIN