haskell - 将 <q> 和 </q> 标签更改为“特定位置的配对”

标签 haskell filter pandoc

我正在使用工具链将 markdown 转换为 HMTL5,使用 Pandoc用于作为 HTML 内容插入 WordPress 的可视化编辑器。

在插入图像时,WordPress 放置了所谓的 shortcode的形式

[caption id="attachment_100" align="aligncenter" width="300" caption="This is an image caption"]

插入 HTML 文本中。这并不是真正的 Markdown ,而是由 Pandoc 进行解释,翻译每个 " ... "配对成 <q> ... </q>对用于 HTML 输出。这在 WordPress 中无法正常工作。

我需要阻止 " ... " 的转换但仅限于那些出现在明确定义的 [caption ... ] 范围内的情况方括号是 WordPress 专门放入的,不能与我放入的其他内容混淆。

我对Pandoc API了解不够或Haskell编写一个内联 paseser/过滤器,以使该文本片段免于 Pandoc 处理。鉴于我对 Pandoc 和 Haskell 缺乏了解,到目前为止,我在 pandoc 邮件列表上收到的建议超出了我的理解范围。

我想过编写一个 Perl 过滤器,但由于非常充分的理由而被强烈劝阻不要使用正则表达式。

我在这里询问是否有一种可靠的方法可以从 <q> ... </q> 进行反向替换标签为" ... "仅适用于 [caption ... ] 内的文本作为后处理步骤,在通过 pandoc 运行后进行阻止。

有人可以建议我如何解决这个问题吗?

非常感谢。

最佳答案

你想要这样的东西吗?

import Data.List
import System.IO

main = do
   inh  <- openFile "input.txt"  ReadMode
   outh <- openFile "output.txt" WriteMode
   str <- hGetContents inh
   hPutStrLn outh (outsideCaption str) 
   hClose inh
   hClose outh

outsideCaption::String->String
outsideCaption [] = []
outsideCaption str@(x:xs)
    | isPrefixOf "[caption" str = insideCaption str
    | otherwise                 = x:outsideCaption xs


insideCaption::String->String
insideCaption []       = []
insideCaption (']':xs) = ']':outsideCaption xs
insideCaption str@(x:xs)
    | (isPrefixOf "<q>"  str) = '\"':insideCaption (drop 3 str)
    | (isPrefixOf "</q>" str) = '\"':insideCaption (drop 4 str)
    |  otherwise              = x   :insideCaption         xs

这段代码读取名为“input.txt”的文件,执行您所描述的替换并将结果打印到“output.txt”。

将当前的 main 替换为:

main = interact outsideCaption 

使其从标准输入读取到标准输出,例如:

[rothesay]Ygfijj: echo "testing <q> [caption<q></q>]" | ./test 
testing <q> [caption""] 

关于haskell - 将 <q> 和 </q> 标签更改为“特定位置的配对”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264587/

相关文章:

haskell - 在两个不同的模块中定义函数或解决方法

list - Haskell 中重复项的交集的快速长度

haskell - 在没有 GHC 的机器上运行 Haskell 脚本

user-interface - 在 TreeView 行上捕获右键单击事件 [haskell gtk2hs]

html - 使用 pandoc 从第一个标题设置 html 标题

r - 使用 R markdown、knitr、pandoc、beamer 绘图大小和分辨率

networking - tcpdump 将 tcp 流量过滤到 csv 文件中

php - 动态 PHP 查询 - 过滤器选择

filter - Elasticsearch:错误的方面条件结果

haskell - 如何在 Hakyll 中使用 pandoc-crossref