5

我很抱歉提出这样的问题。但我对 Haskell 真的很陌生。我在互联网上搜索了一整天,但没有找到任何示例。

我有一个用 python () 编写的 pandoc 过滤器tikzcd.py。我想使用该过滤器来处理我的博客文章。

我想我需要使用unixFilter或者pandocCompileWithTransform但我对 Haskell 的了解确实不足以自己找到解决方案。

那么,有人可以给我举个例子吗?

- - - - - -更新 - - - - - - - -

@Michael 使用pandocCompileWithTransformMand给出了一个解决方案unixFilter。有用。但有一个问题。

从命令行使用过滤器时,我要做的是

pandoc -t json -READEROPTIONS input.markdown | ./filter.py | pandoc -f JSON -WRITEROPTIONS -o output.html

或等效地

pandoc --filter ./filter.py -READEROPTIONS -WRITEROPTIONS -o html

此命令较短,但不显示程序。

但是pandocCompilerTransformM,它会做类似的事情

pandoc -t html -READEROPTIONS -WRITEROPTIONS input.mardown | pandoc -t JSON | ./filter.py | pandoc -f JSON -WRITEROPTIONS -o output.html

区别在于传递给的文本filter.py不同:一种是markdown直接产生的内容,另一种是markdown产生的HTML产生的一些文本。如您所知,来回转换某些东西总是会产生意想不到的问题。所以我认为可能有更好的解决方案。

PS。我一直盯着学习Haskell。我希望有一天我能自己解决这个问题。谢谢!

4

1 回答 1

4

最后,我认为您会同时使用两者。使用此https://github.com/listx/listx_blog/blob/master/blog.hs作为模型,以下将具有与其中相同的transformer形状transformer第 69-80 行用于 'posts' - 这是作为 的第三个参数pandocCompilerWithTransformM,这是一个(Pandoc -> Compiler Pandoc)在这里你需要添加绝对路径到你的 python 过滤器 - 或者如果它在 $PATH 中的名称 - 和读取器和写入器选项(例如defaultHakyllReaderOptionsand defaultHakyllWriterOptions

import Text.Pandoc
import Hakyll

type Script = String 

transformer
  :: Script         -- e.g. "/absolute/path/filter.py"
  -> ReaderOptions  -- e.g.  defaultHakyllReaderOptions
  -> WriterOptions  -- e.g.  defaultHakyllWriterOptions
  -> (Pandoc -> Compiler Pandoc)
transformer script reader_opts writer_opts pandoc = 
    do let input_json = writeJSON writer_opts pandoc
       output_json <- unixFilter script [] input_json
       return $ 
          -- either (error.show) id $  -- this line needs to be uncommented atm.
          readJSON reader_opts output_json 

类似地,(transformer "/usr/local/bin/myfilter.py" defaultHakyllReaderOptions defaultHakyllWriterOptions)可以在使用的地方(return . pandocTransform)使用,在本示例要点的第 125 行


对于调试,您可能会将所有内容外包给unixFilter

transform :: Script -> String -> Compiler String
transform script md = do json0 <- unixFilter pandoc input_args md
                         json1 <- unixFilter script [] json0
                         unixFilter pandoc output_args json1
 where
   pandoc = "pandoc"
   input_args = words "-f markdown -t json" -- add others
   output_args = words "-f json -t html"    -- add others

该块的三行do相当于 pandoc -t json | filter.py | pandoc -f json带有任何附加参数的 unix 管道的阶段。


我想也许你是对的,这里有一层额外的 pandoc。这些pandocCompilerWithTransform(M)函数用于直接的 Pandoc-> Pandoc 函数 - 它将应用于 Pandoc hakyll 提供的。我认为我们应该放弃这个并直接使用 Pandoc 库。的使用unixCompile可能是这样的。

transformXLVI :: Script -> ReaderOptions -> WriterOptions -> String  -> Compiler Html
transformXLVI script ropts wopts = fmap fromJSON . unixFilter script [] . toJSON 
  where 
    toJSON   = writeJSON wopts 
    --           . either (error . show) id -- for pandoc > 1.14
               . readMarkdown ropts 
    fromJSON = writeHtml wopts
    --           . either (error . show) id
               . readJSON ropts 

我希望原则是从这些变化中出现的!这应该和前面的差不多transform;我们使用 pandoc 库代替对pandoc可执行文件的调用。

于 2015-04-26T00:38:49.860 回答