Práctica Nº 8, Curso 2003/04, Fecha 28/11/2003

1. html

Crear una librería que permita generar páginas HTML. El nivel de detalle de las funciones de la librería es opcional.

A continuación se presenta un posible esquema de dicha librería

> module HTML (HTML, writeHTML, makeHTML, a, p) where

> data HTML = HTML String String

> writeHTML :: FilePath -> HTML -> IO ()
> writeHTML file (HTML head body) = 
>  writeFile file ("<html><head>" ++ head ++ 
>                  "</head><body>" ++ body ++ 
>                  "</body></html>")

> makeHTML :: String -> String -> HTML
> makeHTML head body = HTML head body 

> a :: String -> String -> String
> a url cs = "<a href=\"" ++ url ++ "\"> " ++ cs ++ "</a>"

> p :: String -> String
> p cs = "<p>" ++ cs ++ "</p>"


Un posible cliente de dicho programa podría ser el siguiente módulo que permite generar una página HTML con información de un grupo de una asignatura.

> module CreaHTML where
> import HTML

> main = 
>  writeHTML "index.html" 
>    (makeHTML "<title>PLF</title>"
>      (p (a "http://petra.euitio.uniovi.es/~dni1" "Nombre Alumno 1") ++
>       p (a "http://petra.euitio.uniovi.es/~dni2" "Nombre Alumno 2") ++
>       p (a "mundo.wrl" "Mundo Virtual")))


Guardar ambos programas en 2 ficheros (con el mismo nombre que el módulo), compilarlos y visualizar la página Web generada al ejecutar la función main.

Incluir los datos de cada alumno del grupo junto con la dirección de su página Web y poner la página generada en una dirección determinada.




2. vrml

Crear una librería que permita generar páginas VRML. El nivel de detalle de las funciones de la librería es opcional.

A continuación se presenta un posible esquema

> module VRML (VRML, Point(..), Color(..), 
>              writeVRML, makeVRML, 
>              putText, putBox, url) where

> data VRML = VRML String
> data Point = Point Float Float Float
> data Color = RGB Float Float Float

> writeVRML :: FilePath -> VRML -> IO ()
> writeVRML file (VRML v) = 
>  writeFile file (cabecera ++ viewPoint (Point 0 0 20) ++ v)

> cabecera :: String
> cabecera = "#VRML V2.0 utf8\n\n" 

> viewPoint :: Point -> String
> viewPoint (Point x y z) = "Viewpoint { position " ++ sh3 (x,y,z) ++ "}\n" 

> makeVRML :: String -> VRML
> makeVRML s = VRML s

> url :: String -> String -> String -> String
> url url desc fig = 
>   "Anchor { description \"" ++ desc ++ 
>           "\" url [\"" ++ url ++ 
>           "\"] children [" ++ fig ++ "] }"

> putText :: Point -> Color -> String -> String
> putText p c = translate p . color c . verText 

> putBox :: Point -> Color -> (Float,Float,Float) -> String
> putBox p c = translate p . color c . verBox

> verText t = "geometry Text { string \"" ++ t ++ "\"}"

> verBox (sx,sy,sz) = 
>    "geometry Box { size " ++ sh3 (sx,sy,sz) ++ "}"

> translate (Point x y z) s = 
>   "Transform { translation " ++ sh3 (x,y,z) ++
>   "\n children [" ++ s ++ " ]}"

> color (RGB r g b) s = "Shape { \n" ++ s ++
>   "\n appearance Appearance { material Material { " ++
>   "\n   diffuseColor " ++ sh3 (r,g,b) ++ " }}}\n"

> sh3 (x,y,z) = show x ++ " " ++ show y ++ " " ++ show z ++ " "


Un posible cliente de dicho programa podría ser el siguiente módulo:

> module CreaVRML where
> import VRML

> main = 
>  writeVRML "mundo.wrl" 
>    (makeVRML (url "index.html" "Información" 
>                 (putText (Point 0 0 0) (RGB 0 0.1 0.1) "Información" ++
>                  putBox (Point 4 (-2) (-0.2)) (RGB 0.8 1 1) (10,10,0.1))))


Guardar ambos programas en 2 ficheros (con el mismo nombre que el módulo), compilarlos y visualizar el mundo virtual generado al ejecutar la función main.

Incluir dicho mundo virtual en una dirección Web determinada




3. SVG (Opcional)

Crear una librería similar a las anteriores para generar ficheros SVG




4. Octree (Opcional)

Crear otra librería para manipular octrees