splitOn :: Char -> String -> [String] 
splitOn delim = foldr (\x rest ->
                        if x == delim then "": rest
                        else (x:head rest):tail rest) [""]

htmlEscape :: String -> String
htmlEscape =  concatMap escapeChar
              where escapeChar '<' = "&lt;"
                    escapeChar '>' = "&gt;"
                    escapeChar '&' = "&amp;"
                    escapeChar '"' = "&quot;" 
                    escapeChar c   = [c]

toHtmlRow :: [String] -> String
toHtmlRow []   = "<tr></tr>"
toHtmlRow cols = let htmlColumns = concatMap toHtmlCol cols
                  in "<tr>\n" ++ htmlColumns  ++ "</tr>"
               where toHtmlCol x = "  <td>" ++ htmlEscape x ++ "</td>\n"

csvToTable :: String -> String
csvToTable csv = let rows = map (splitOn ',') $ lines csv
                     html = unlines $ map toHtmlRow rows
                  in "<table>\n" ++ html ++ "</table>"

main = interact csvToTable