All pastes #260334 Raw Edit

Anonymous

public text v1 · immutable
#260334 ·published 2006-11-28 06:54 UTC
rendered paste body
--convierte una lista en un string
unwords1::[String]->String
unwords1 [] = []
unwords1 (x:xs) = x ++ "\n" ++ unwords1 xs

borrarcomentarios::String->String
borrarcomentarios [] = []
borrarcomentarios [x] = [x]
borrarcomentarios (x:y:ys) 
	                      |x == '\\' && y == '%' = y:borrarcomentarios(ys)
			      |x == '\\' && y == '\\' = y:borrarcomentarios(ys)
--                            |x == '\\' && y == '#' = y:borrarcomentarios(ys)
-- 			      |x == '\\' && y == '$' = y:borrarcomentarios(ys)
-- 			      |x == '\\' && y == '_' = y:borrarcomentarios(ys)
-- 			      |x == '\\' && y == '&' = y:borrarcomentarios(ys)
-- 			      |x == '\\' && y == '{' = y:borrarcomentarios(ys)
-- 			      |x == '\\' && y == '}' = y:borrarcomentarios(ys)
			      |x== '%' = []
			      |otherwise =x:borrarcomentarios(y:ys)

findbegin::String->Bool
findbegin x
      |x == "\\begin{document}" = True
      |otherwise = False
	     
auxhead::[String]->[String]
auxhead [] = []
auxhead (x:xs) 
	| findbegin(x) == False = x:auxhead(xs)
	| otherwise = []
	
auxbody::[String]->[String]
auxbody [] = []
auxbody (x:xs)
	| findbegin(x) == False = auxbody(xs)
	| otherwise = xs

divibuffer::[String]->[String]
divibuffer x = [(unwords1 (auxhead x)), (unwords1 (auxbody x))]

htmlhead:: String-> String
htmlhead titulo = "<html>\n<head>\n<link rel=\"stylesheet\" href=\"style.css\" \\>\n" ++  
		  "<title>" ++ titulo ++ "<\\title>\n <\\head>"
		
armartitulo:: String -> String -> String -> String
armartitulo titulo autor fecha = "<h1 class=\"title\">" ++ titulo ++ "<\\h1>\n" ++
				 "<h2 class=\"author\">" ++ autor ++ "<\\h2>\n" ++
				 "<h2 class=\"date\">" ++ fecha ++ "<\\h2>\n"

--creamos variables de los comandos de la cabeza
	

-- en caso que no haya fecha definida hay que sacar la fecha del sistema

--guarda la cabeza en un arreglo dividiendo por \

slashsplit::String->[String]
slashsplit [] = []
slashsplit (x:xs)
                 |x == '\\' = (fst(break('\\'==) (xs))):slashsplit(snd(break('\\'==) (xs)))
                 |otherwise = []

-- ya se encuentra un \ se llama a esta funcion para que devuelva el nombre del comando
				
comando::String->String
comando [] = []
comando (x:xs) 
             |x == '{' = []
	     |x == '[' = []
	     |x == ' ' = []
	     |x == '\t' = []
	     |otherwise = x:comando(xs)	      

parametro::String->String
parametro [] = []
parametro (x:xs)
             |x == '{' = tail( fst( break('}'==) (snd (break('{'==) (x:xs)))))
	     |x == '[' = tail( fst( break(']'==) (snd (break('['==) (x:xs)))))
	     |otherwise = parametro(xs)

gettitle::[String]->String
gettitle [] = []
gettitle (x:xs) = if comando(x) == "title" then parametro(x) else gettitle(xs)

getauthor::[String]->String
getauthor [] = []
getauthor (x:xs) = if comando(x) == "author" then parametro(x) else gettitle(xs)


getdate::[String]->String
getdate [] = []
getdate (x:xs) = if comando(x) == "date" then parametro(x) else gettitle(xs)

-- body
-- .--
letra::String->String
letra [] = []
letra (x:xs) 
	      | x=='{' = []
	      | x=='}' = []
              | x=='\\' = []
	      | x=='[' = []
	      | x==']' = []
	      | otherwise = x:(letra xs)

splitter_line::String->[String]
splitter_line [] = []
splitter_line (x:xs)
	      | x == '{' = "OPBRACE":(splitter_line xs)
	      | x == '}' = "CLBRACE":(splitter_line xs)
              | x == '\\'= "COM":(comando xs):(splitter_line (drop (length (comando xs)) xs))
	      | otherwise = (letra (x:xs)):(splitter_line (drop(length(letra xs))xs))
		     
splitter::[String]->[String]
splitter [] = []
splitter (x:xs) = (splitter_line x)++["SALTO",[]]++(splitter xs)

parsebody::[String]->String->String
parsebody (x:xs) make = unwords1 (splitter (x:xs))

--                     |x == "\maketitle" = make ++ parsebody(xs)
--		     |x == ""


-- .------
-- . MAIN
-- .------

execute::IO()
execute = do
-- leemos el archivo a convertir
	  putStr "ingrese el nombre del archivo a leer "
	  archivo<-getLine	 
	  texto<-readFile archivo	  
-- convertimos el archivo a una lista de lineas y le	  
-- quitamos los comentarios         
	  let buffer = map borrarcomentarios(lines texto)
	      bufflista = divibuffer buffer
	      lista = slashsplit(head bufflista)
	      titulo = gettitle(lista)
	      autor = getauthor(lista)
	      fecha = getdate(lista)
	      maketitle = armartitulo titulo autor fecha
	      body = parsebody (tail bufflista) maketitle
	      in do
--		 putStr (htmlhead titulo)
		 putStr body
--		 putStr(unwords1 buffer)
--		 putStr "cabeza \n" 
--		 putStr (head bufflista)
--		 putStr "cuerpo \n"
--		 putStr (unwords1 (tail bufflista))
-- mostramos el archivo sin comentarios
		 
-- partimos en head y title