如何从 m Pandoc 获取 Pandoc?

How to get Pandoc from m Pandoc?

我开始使用 pandoc api 编写一些程序,示例来自 https://johnmacfarlane.net/BayHac2014/#/the-pandoc-types,但我无法将 Pandoc 与 m Pandoc 隔离。

module ImageAttr where
import Text.Pandoc.Builder
import Text.Pandoc.Generic
import Text.Pandoc.Definition
import Text.Pandoc.JSON
import qualified Data.Char as DataChar
import qualified Data.List as DataList
import Data.Either
import Text.Parsec as Parsec
import Text.Pandoc
import qualified Data.Text as T
import qualified Data.Text.IO as TIO

fromRight :: b -> Either a b -> b
fromRight _ (Right b) = b
fromRight b _         = b


fromLeft :: b -> Either b a -> b
fromLeft  _ (Left b)  = b
fromLeft  b _        = b


main :: IO ()
main = do
        result <- runIO $ do
            doc <- readMarkdown def (T.pack "[testing](url)")
            writeRST def doc
        x<-((handleError result))
        print x

输出是 String 但我需要 pandoc ast 之前它是 Either PandocError Pandoc type ,而不是我得到 "m Pandoc"。如何从 "m Pandoc".

中获取 Pandoc

有什么想法吗? 顺便说一句,我是新手,还在学习haskell。

我收到的错误消息是:

ImageSizeModifer.hs:28:12:
    Couldn't match expected type ‘PandocIO a0’ with actual type ‘IO ()’
    In a stmt of a 'do' block: print ""
    In the second argument of ‘($)’, namely
      ‘do { doc <- readMarkdown def (T.pack "[testing](url)");
            print "" }’
Failed, modules loaded: none.
Prelude T>

我的问题是我需要 Pandoc,但我不太清楚如何获得它?有新的 PandocIO 和 PandocPure ,我相信这些是新的。

新版本pandocreadMarkdown :: PandocMonad m => ReaderOptions -> Text -> m Pandoc。这遵循通常的 mtl 风格来指定对 monad 的约束,而不是实际的 monad。

这意味着要使用 readMarkdown,您需要选择一个特定的 m 满足 PandocMonad。您可以滚动到 its doc 的 "Instances" 部分,找到 PandocMonad 有哪些实例。在这种情况下,您会发现:

  • PandocMonad PandocPure 可能很有趣
  • PandocMonad PandocIO 可能很有趣
  • (MonadTrans t, PandocMonad m, Functor (t m), MonadError PandocError (t m), Monad (t m), Applicative (t m)) => PandocMonad (t m) - 没意思,需要另一个 PandocMonad m
  • PandocMonad m => PandocMonad (ParsecT s st m) - 没意思,需要另一个 PandocMonad m

现在,滚动到 PandocPurePandocIO 的定义位置,您可以找到 运行 从中提取信息的方法:

将这些函数中的任何一个与 readMarkdown 组合,您可以获得具体的 Either 类型。

runIO (readMarkdown def (T.pack "[testing](url)")) :: IO (Either PandocError Pandoc)
runPure (readMarkdown def (T.pack "[testing](url)")) :: Either PandocError Pandoc

请注意,我对 Pandoc 或其 API 一无所知 - 我所做的只是完成上述过程。

查看 http://pandoc.org/using-the-pandoc-api.html 了解使用 pandoc 2.x API 的基本教程。