Descrição do Problema Uma página HTML Representação de uma página A Árvore Localização das tags A atividade As Funções Exemplos de uso Exemplo de Entrada para 'exemplo2.c' Exemplo de Saída Código Data de Entrega |
MC 202 EF - Segundo semestre de 2008Geração de Página HTMLDescrição do ProblemaAo se desenvolver uma aplicação disponibilizada aos usuários através da web, normalmente se depara com o problema de construir páginas HTML cujo conteúdo é definido dinâmicamente pela aplicação. Essas páginas são chamadas páginas de conteúdo dinâmico ou simplesmente 'páginas dinâmicas'. Diversas soluções têm sido usadas para o problema, sendo que as mais usadas se baseiam em combinar texto HTML com a linguagem de programação usada. Esse é o caso de soluções como JSP e ASP (JSP mistura HTML com Java e ASP mistura HTML com VisualBasic).Essas soluções, embora produzam resultados rápidos, levam à construção de um software difícil de ser mantido uma vez que tendem a misturar a lógica da aplicação com a apresentação. Isso vai contra as práticas modernas de engenharia de software, que propõem justamente a organização da arquitetura em camadas, onde 'lógica de negócios' e 'apresentação' tipicamente são colocadas em camadas distintas. Uma alternativa é a usar uma estrutura de dados que represente a 'página dinâmica' sendo construída e que é modificada pela aplicação através de funções específicas. Uma vez que essa estrutura esteja representando a página na sua forma final, ela é percorrida para que a página seja efetivamente gerada (a página HTML gerada nada mais é que um arquivo texto). Uma página HTMLUma página HTML é formada por elementos delimitados por marcadores (etiquetas ou, em ingles, tags), da forma<marcador> ... conteúdo ... </marcador> Os marcadores são indicações para o navegador sobre a forma pela qual o conteúdo deve ser apresentado. A linguagem HTML define um conjunto de marcadores, cada um com um significado específico. O conteúdo de um marcador é uma seqüência de elementos que podem ser Um exemplo simples de página HTML: <HTML> Neste exemplo são usados os principais elementos de uma página HTML: <FONT name=“arial” size=“24” colour=“black” > Se você não estiver familiarizado com HTML, muitos tutoriais estão disponíveis na rede, como por exemplo http://www.icmc.usp.br/ensino/material/html/basico.html http://members.tripod.com/~shibolete/Passo1.html http://www.w3schools.com/html/default.asp Representação de uma páginaConsiderando a estrutura de uma página HTML, a representação natural para a mesma seria uma árvore geral: cada 'elemento' da página pode ter vários filhos, dos cada um pode ser uma tag. No caso de ser uma tag, ele pode ter vários filhos, cada um por sua vez podendo ser uma tag. Nessa linha a página do exemplo acima poderia ser representada de forma simplificada por uma árvore como mostrada abaixo:A ÁrvoreConforme explicado acima, cada nó da árvore irá representar um 'elemento' da página que pode ser/* tipos possíveis para um nó da árvore */ O campo type será usado para indicar o tipo do nó. O campo content pode ser uma estrutura com partes variantes (union), definida como a seguir: /* descrição de uma tag */ A lista de atributos pode ser descrita por nós do seguinte tipo: typedef struct AttrType *AttrPtr; Localização das tagsA construção da página HTML baseada numa estrutura que a representa vai exigir que se localize as partes da página. Felizmente HTML tem um recurso que pode ajudar nesse caso: o atributo 'id', que não interfere na apresentação da página pelo navegador. Esse atributo pode ser usado para localizar os elementos da página aos quais se deseja agregar novos elementos dinamicamente. Para isso, é necessário que cada tag tenha uma identificação única. Uma vez que as tags tenham essa identificação, a sua localização pode ser feita por meio de um mecanismo de busca como por exemplo árvore de busca ou tabela de 'hashing'. Nesta atividade, deverá ser usada uma tabela de hashing. A tabela de hashing fará referências aos nós da árvore que representa a página, conforme mostrado na figura abaixo.
As definições necessárias ao uso de hashing são as seguintes: /* apontador para um nó da tabela de hashing */ A atividadePara esta atividade de laboratório já estão definidosA sua tarefa consiste em implementar, num arquivo 'htmlib.c', as funções que realizam as operações definidas em 'htmlib.h' e num arquivo 'hashlib.c', as funções que realizam as operações definidas em 'hashlib.h'. As FunçõesAs funções a serem implementadas são as seguintesHTMLPagePtr newPage(char *); Cria um descritor de página HTML contendo uma tabela de hashing vazia e um descritor para a tag <HTML>, com atributo "id", cujo valor é passado como parâmeetro para a função. void insertElement(HTMLPagePtr, char *, NodePtr); Insere um elemento numa página HTML, como 'filho' da tag cuja identificação é passada como parâmetro. Os parâmetros são: Atenção: o elemento sendo insererido pode ser uma tag que tem o atributo "id". Nesse caso, o valor do atributo deve ser inserido na tabela de hashing da página, associado ao elemento. void addAttrib(NodePtr, char *, char*); Agrega um atributo a um elemento (só faz sentido se esse elemento for uma tag). Parâmetros: void appendChild(NodePtr, NodePtr); Agrega um 'filho' a um elemento (só faz sentido se for uma tag). Parâmetros: NodePtr newTag(char *name, int closed); Cria um elemento que descreve uma tag HTML. Parâmetros: NodePtr newComment(char *); Cria um elemento do tipo comentário. Parâmetro: NodePtr newText(char *); Cria um elemento do tipo texto. Parâmetro: void writePage(HTMLPagePtr, char *); Escreve o texto correspondente a uma página HTML descrita por um 'descritor de página'. Parâmetros: Para escrever como HTML o conteúdo de um elemento de uma página, se esse elemento for do tipo Exemplos de usoO código abaixo mostra como a biblioteca 'htmlib' pode ser usada para gerar uma página simples, 'exemplo1.c'.#include O programa 'exemplo2.c' mostra um código mais completo. Exemplo de Entrada para 'exemplo2.c'O arquivo de entrada, 'ativ10.txt', usado por 'main.c' para gerar uma página HTML, é um exemplo de entrada possível para a aplicação de testes 'exemplo2.c'.Exemplo de SaídaEsta página HTML que você está lendo, foi gerada pelo programa 'exemplo2.c' e constitui assim um bom exemplo de saída.CódigoO código para esta atividade está disponível em http://www.ic.unicamp.br/~vanini/codAtiv10.zipData de EntregaA tarefa deverá ser entregue até 17/11/2008 |