2016-03-07 3 views
0

Я хочу использовать Yesod и Haskell для вызова Pandoc для перевода некоторого формата в другой формат.Использование Haskell с Yesod для активации 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

В [документации по взлому] (http://hackage.haskell.org/package/pandoc). Я также добавил фрагмент, который должен работать для чего-то вроде вашего прецедента. – leftaroundabout

+0

Отличный ответ. Спасибо огромное! – Spacemoose