2016-03-07 34 views
0

我想使用Yesod和Haskell來調用Pandoc,將某些格式轉換爲其他格式。與Yesod一起使用Haskell來激活Pandoc

pandocConverted :: String -> IO String 
pandocConverted input = do 
    (Just hIn, Just hOut, _, _) <- createProcess (proc "pandoc" []) { std_in = CreatePipe, std_out = CreatePipe } 
    hPutStr hIn input  
    converted <- hGetContents hOut 
    return converted 

這很好。但是,我如何轉換成不同的格式?

例如我如何以這種方式稱爲pandoc?

pandoc -s README -o example4.tex

或那樣嗎?

pandoc -s -S -t docbook README -o example9.db

+3

我沒有用過Pandoc,但爲什麼不使用[pandoc庫(https://hackage.haskell.org/package/pandoc)和原始Haskell調用它,而不是調用出來的可執行文件?看起來這樣會更容易配置,更安全,更易於打包等。 – MaxGabriel

回答

4

您可以使用-f-t標誌在管道使用pandoc時指定源和目標格式。

createProcess (proc "pandoc" ["-f", "markdown", "-t", "latex"]) 

然而,由於pandoc是foremostly一個Haskell庫(到其pandoc可執行僅僅是一個命令行接口),這將是更慣用到您耶索德程序中直接調用該庫,而不是使用createProcess

import Text.Pandoc 
import Text.Pandoc.Error (handleError) 
import Control.Arrow 

pandocConverted' :: String -> String 
pandocConverted' = readMarkdown def 
       >>> fmap (writeLaTeX def {writerReferenceLinks = True}) 
       >>> handleError 
+0

非常感謝!我在哪裏可以找到如何調用和使用它? – Spacemoose

+1

在[hackage documentation](http://hackage.haskell.org/package/pandoc)中。我還添加了一個適用於您的用例的代碼片段。 – leftaroundabout

+0

很好的回答。非常感謝! – Spacemoose