读取一个Input.md文件并输出.html文件Haskell

时间:2014-12-03 08:24:24

标签: html haskell character converter

我有一个关于Haskell中一些基本转换的问题。 基本上,我有一个名为Input.md的书面输入文件。这包含一些在我的项目文件中读取的降价文本,我想写一些函数来对文本进行转换。在一个名为convertToHTML的函数下完成这些函数后,我将文件以正确的格式输出为.html文件。

module Main
(
convertToHTML,
main
) where

import System.Environment (getArgs)
import System.IO
import Data.Char (toLower, toUpper) 

process :: String -> String 
process s = head $ lines s


convertToHTML :: String -> String
convertToHTML str = do
     x <- str
     if (x == '#')
     then "<h1>"
     else return x
      --convertToHTML x = map toUpper x

main = do

    args <- getArgs                     -- command line args

    let (infile,outfile) = (\(x:y:ys)->(x,y)) args

    putStrLn $ "Input file:  " ++ infile
    putStrLn $ "Output file: " ++ outfile

    contents <- readFile infile

    writeFile outfile $ convertToHTML contents

所以,

  1. 我如何阅读输入文件,并将以#开头的任何行转换为html标记
  2. 我将如何再次读取输入文件并将_word_(1下划线)包围的任何WORD转换为另一个html标记
  3. 用html字符串替换任何字符。
  4. 我尝试使用Map,Filter,ZipWith等功能,但无法弄清楚如何迭代文本并转换每个文本。如果有人有任何建议,请。我已经连续工作了两天,并且有一堆失败的代码要显示几周并且有一堆失败的代码来显示它。

1 个答案:

答案 0 :(得分:0)

  

我尝试使用Map,Filter,ZipWith等函数,但无法弄清楚如何遍历文本并转换每个文本。

因为它们适用于适当的元素集合。他们并没有真正“迭代”;你只需要提供适当的数据。我们来解决#问题。

我们的文件是一个巨人String,我们想要的是将它很好地分成几行,所以[String]。有什么能为我们做的?我不知道,所以我只是search Hoogle for String -> [String]

啊,我们去,lines功能!它的对应物unlines也将是有用的。现在我们可以编写我们的换行包装了:

convertHeader :: String -> String
convertHeader [] = [] -- that prevents us from calling head on an empty line
convertHeader x  = if head x == '#' then "<h1>" ++ x ++ "</h1>"
                                    else x

所以:

convertHeaders :: String -> String
convertHeaders = unlines . map convertHeader . lines
--              ^String   ^[String]         ^[String] ^String

正如您所看到的,该函数首先将文件转换为行,在每行上映射convertHeader,然后将文件重新组合在一起。

See it live on Ideone

现在尝试使用words执行相同操作以替换格式设置模式。作为奖励练习,请更改convertHeader以计算该行前面#的数量,并相应地输出<h1><h2><h3>等。