我正在使用Text.ParserCombinators.Parsec和Text.XHtml来解析这样的输入:
this is the beginning of the paragraph --this is an emphasized text-- and this is the end\n
我的输出应该是:
<p>this is the beginning of the paragraph <em>this is an emphasized text</em> and this is the end\n</p>
此代码解析并返回强调元素
em = do{
;count 2 (char '-') ;
;s <- manyTill anyChar (count 2 (char '-'))
;return (emphasize << s)
}
但我不知道如何使用强调项目来获取段落
有什么想法吗?
谢谢!
答案 0 :(得分:1)
这是一个黑客,但我认为它符合你的要求:
list = (:[])
text = many (try em <|> (anyChar >>= return . list))
>>= return . ("<p>"++) . (++"</p>") . concat
(每个非强调字符都以其自己的字符串形式返回。)
以下是它的工作原理:
在每个字符处,首先尝试解析em
。这从两个破折号开始。由于em
在使用单个短划线后可能会失败,例如在“a-b”中,您需要在其前面添加try
。如果在输入的其余部分中不允许使用破折号,则不需要尝试,但可能不是这种情况。否则,消耗anyChar。但这是Char
类型,而不是String
,所以它必须包含在列表中。
这将返回一个单字符字符串列表,其中强调部分是交错的。但是您需要一个由p
标记包围的字符串,因此您首先concat
,然后将开始/结束标记添加到开头/结尾。然后你返回那个值。
可能有一种方法可以重写整个解析器,以便在看到两个破折号之前消耗输入而不是anyChar。但是我不知道如何把它写在我的头顶,所以你得到这个黑客,这可能效率低很多。