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



我有一个关于Haskell中一些基本转换的问题。基本上,我有一个名为 Input.md 的书面输入文件。这包含在我的项目文件中读取的一些 markdown 文本,我想编写一些函数来对文本进行转换。在一个名为 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 字符串。

我尝试使用诸如Map,Filter,ZipWith之类的功能,但无法弄清楚如何遍历文本并转换每个文本。如果有人有任何建议,请。我已经连续工作了 2 天,并且有一堆失败的代码要显示几周,并且有一堆失败的代码来显示它。

我尝试使用诸如Map,Filter,ZipWith之类的功能,但无法弄清楚如何遍历文本并转换每个文本。

因为他们处理适当的元素集合。而且他们并没有真正"迭代";您只需要提供适当的数据即可。让我们以#问题为例。

我们的文件是一个巨大的String,我们希望将其很好地分成几行,所以[String].能为我们做什么?我不知道,所以让我们搜索 Hoogle 寻找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,然后将文件重新组合在一起。

在 Ideone 上观看直播

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

最新更新