-- Una Paraula es una llista de caracters. type Paraula=[Char] -- Una Linia es una llista de paraules. type Linia=[Paraula] -- Llista de caracters "blancs" blancs :: [Char] blancs = [' ','\n','\t'] -- Numero de columnes que volem ncol :: Int ncol = 80 -- Funcio per a llegir una paraula. Retorna la sequencia de caracters a partir -- de l'inicial mentre siguin diferents de blanc. prenParaula :: [Char]->Paraula prenParaula [] = [] prenParaula (x:xs) | elem x blancs = [] | otherwise = (x: prenParaula xs) -- Funcio per a eliminar una paraula. Retorna la sequencia de caracters a la -- que se li ha tret la paraula que hi ha a partir del primer caracter. treuParaula :: [Char]->[Char] treuParaula [] = [] treuParaula (x:xs) | elem x blancs = (x:xs) | otherwise = treuParaula xs -- Funcio per a eliminar els espais en blanc inicials en una sequencia de -- caracters. treuBlancs :: [Char] -> [Char] treuBlancs [] = [] treuBlancs (x:xs) | elem x blancs = treuBlancs xs | otherwise = (x:xs) -- Funcio per a transformar una llista de caracters en una llista de Paraules. -- Primer treiem els blancs de davant i despres fem la crida a la funcio -- "separadora" pel cas general. separaParaules :: [Char]->[Paraula] separaParaules l = separaP (treuBlancs l) separaP [] = [] separaP l = (prenParaula l): (separaP (treuBlancs (treuParaula l))) -- Funcio que agafa les paraules necesaries per a formar una linia de com -- a molt n caracters. prenLinia:: Int -> [Paraula] -> Linia prenLinia n [] = [] prenLinia n (p:ps) | length p <= n = p: (prenLinia (n-(length p + 1)) ps) | otherwise = [] -- Funcio que ens dona la llista de Paraules sense la primera linia de -- com a molt n caracters. treuLinia::Int -> [Paraula] -> [Paraula] treuLinia n [] = [] treuLinia n (p:ps) | length p <= n = treuLinia (n-(length p + 1)) ps | otherwise = (p:ps) -- Funcio que ens passa d'una llista de paraules a una llista de linies de -- com a molt n caracters. fesLinies:: Int -> [Paraula] -> [Linia] fesLinies n [] = [] fesLinies n l = prenLinia n l : fesLinies n (treuLinia n l) -- Funcio que ens passa d'una llista de caracters (el texte a tractar) a una -- llista de linees de com a molt n caracters. formateja:: Int -> [Char] -> [Linia] formateja n l = fesLinies n (separaParaules l) -- Funcio que donades dues Paraules hi posa un espai enmig. posaEspai:: Paraula->Paraula->[Char] posaEspai e d = e++[' ']++d -- Funcio que donada una llista de linies torna una llista de cadenes -- de caracters ajustades a linies de com a molt llargada n. festexte:: [Linia]->[[Char]] festexte [] = [] festexte (x:xs) = (foldr posaEspai "\n" x): festexte xs -- Si volem alienear a la dreta, nomes cal descomentar aquestes dues -- funcions i aplicar la funcio: dreta al resultat de -- formateja ncol texte -- repeteix:: Int -> Char -> [Char] -- repeteix 0 l = [] -- repeteix (n+1) l = l:(repeteix n l) -- dreta:: [[Char]]->[[Char]] -- dreta []=[] -- dreta (x:xs) = ((repeteix (ncol-(length x)+2) ' ') ++ x): dreta xs main = do putStr "Nom del fitxer a formatejar: " entrada <- getLine putStr "Nom del fitxer de sortida: " sortida <- getLine texte <- readFile entrada writeFile sortida ( concat (festexte (formateja ncol texte))) putStr "OK."