    {-# LANGUAGE OverloadedStrings   #-}
    {-# LANGUAGE MonoLocalBinds      #-}
    {-# LANGUAGE RankNTypes          #-}
    {-# LANGUAGE ScopedTypeVariables #-}
    {-# LANGUAGE TupleSections       #-}
    {- |
       Module      : Text.Pandoc.Readers
       Copyright   : Copyright (C) 2006-2024 John MacFarlane
       License     : GNU GPL, version 2 or above

       Maintainer  : John MacFarlane <jgm@berkeley.edu>
       Stability   : alpha
       Portability : portable

    This helper module exports the readers.

    Note:  all of the readers assume that the input text has @'\n'@
    line endings.  So if you get your input text from a web form,
    you should remove @'\r'@ characters using @filter (/='\r')@.

    -}

    module Text.Pandoc.Readers
      (
        -- * Readers: converting /to/ Pandoc format
        Reader (..)
      , readers
      , readDocx
      , readODT
      , readMarkdown
      , readCommonMark
      , readCreole
      , readDokuWiki
      , readMediaWiki
      , readVimwiki
      , readRST
      , readOrg
      , readLaTeX
      , readHtml
      , readJATS
      , readJira
      , readTextile
      , readDocBook
      , readOPML
      , readHaddock
      , readNative
      , readJSON
      , readTWiki
      , readTikiWiki
      , readTxt2Tags
      , readEPUB
      , readMuse
      , readMan
      , readMdoc
      , readFB2
      , readIpynb
      , readCSV
      , readTSV
      , readCslJson
      , readBibTeX
      , readBibLaTeX
      , readEndNoteXML
      , readRIS
      , readRTF
      , readTypst
      , readDjot
      , readPod
      -- * Miscellaneous
      , getReader
      , getDefaultExtensions
      ) where

    import Control.Monad.Except (throwError)
    import Data.Aeson
    import qualified Data.ByteString.Lazy as BL
    import Data.Text (Text)
    import qualified Data.Text as T
    import Text.Pandoc.Class
    import Text.Pandoc.Definition
    import Text.Pandoc.Error
    import Text.Pandoc.Extensions
    import qualified Text.Pandoc.Format as Format
    import Text.Pandoc.Options
    import Text.Pandoc.Readers.CommonMark
    import Text.Pandoc.Readers.Markdown
    import Text.Pandoc.Readers.Creole
    import Text.Pandoc.Readers.DocBook
    import Text.Pandoc.Readers.Docx
    import Text.Pandoc.Readers.DokuWiki
    import Text.Pandoc.Readers.EPUB
    import Text.Pandoc.Readers.FB2
    import Text.Pandoc.Readers.Ipynb
    import Text.Pandoc.Readers.Haddock
    import Text.Pandoc.Readers.HTML (readHtml)
    import Text.Pandoc.Readers.JATS (readJATS)
    import Text.Pandoc.Readers.Jira (readJira)
    import Text.Pandoc.Readers.LaTeX
    import Text.Pandoc.Readers.MediaWiki
    import Text.Pandoc.Readers.Muse
    import Text.Pandoc.Readers.Native
    import Text.Pandoc.Readers.ODT
    import Text.Pandoc.Readers.OPML
    import Text.Pandoc.Readers.Org
    import Text.Pandoc.Readers.Pod
    import Text.Pandoc.Readers.RST
    import Text.Pandoc.Readers.Textile
    import Text.Pandoc.Readers.TikiWiki
    import Text.Pandoc.Readers.TWiki
    import Text.Pandoc.Readers.Txt2Tags
    import Text.Pandoc.Readers.Vimwiki
    import Text.Pandoc.Readers.Man
    import Text.Pandoc.Readers.Mdoc
    import Text.Pandoc.Readers.CSV
    import Text.Pandoc.Readers.CslJson
    import Text.Pandoc.Readers.BibTeX
    import Text.Pandoc.Readers.EndNote
    import Text.Pandoc.Readers.RIS
    import Text.Pandoc.Readers.RTF
    import Text.Pandoc.Readers.Typst
    import Text.Pandoc.Readers.Djot
    import qualified Text.Pandoc.UTF8 as UTF8
    import Text.Pandoc.Sources (ToSources(..), sourcesToText)

    data Reader m = TextReader (forall a . ToSources a =>
                                    ReaderOptions -> a -> m Pandoc)
                  | ByteStringReader (ReaderOptions -> BL.ByteString -> m Pandoc)

    -- | Association list of formats and readers.
    readers :: PandocMonad m => [(Text, Reader m)]
    readers :: forall (m :: * -> *). PandocMonad m => [(Text, Reader m)]
    readers = [(Text
    "native"       , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readNative)
              ,(Text
    "json"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readJSON)
              ,(Text
    "markdown"     , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMarkdown)
              ,(Text
    "markdown_strict" , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMarkdown)
              ,(Text
    "markdown_phpextra" , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMarkdown)
              ,(Text
    "markdown_github" , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMarkdown)
              ,(Text
    "markdown_mmd",  (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMarkdown)
              ,(Text
    "commonmark"   , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCommonMark)
              ,(Text
    "commonmark_x" , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCommonMark)
              ,(Text
    "creole"       , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCreole)
              ,(Text
    "dokuwiki"     , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readDokuWiki)
              ,(Text
    "gfm"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCommonMark)
              ,(Text
    "rst"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readRST)
              ,(Text
    "mediawiki"    , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMediaWiki)
              ,(Text
    "vimwiki"      , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readVimwiki)
              ,(Text
    "docbook"      , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readDocBook)
              ,(Text
    "opml"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readOPML)
              ,(Text
    "org"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readOrg)
              ,(Text
    "textile"      , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTextile) -- TODO : textile+lhs
              ,(Text
    "html"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readHtml)
              ,(Text
    "bits"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readJATS)
              ,(Text
    "jats"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readJATS)
              ,(Text
    "jira"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readJira)
              ,(Text
    "latex"        , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readLaTeX)
              ,(Text
    "haddock"      , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readHaddock)
              ,(Text
    "twiki"        , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTWiki)
              ,(Text
    "tikiwiki"     , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTikiWiki)
              ,(Text
    "docx"         , (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    forall (m :: * -> *).
    (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    ByteStringReader ReaderOptions -> ByteString -> m Pandoc
    forall (m :: * -> *).
    PandocMonad m =>
    ReaderOptions -> ByteString -> m Pandoc
    readDocx)
              ,(Text
    "odt"          , (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    forall (m :: * -> *).
    (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    ByteStringReader ReaderOptions -> ByteString -> m Pandoc
    forall (m :: * -> *).
    PandocMonad m =>
    ReaderOptions -> ByteString -> m Pandoc
    readODT)
              ,(Text
    "t2t"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTxt2Tags)
              ,(Text
    "epub"         , (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    forall (m :: * -> *).
    (ReaderOptions -> ByteString -> m Pandoc) -> Reader m
    ByteStringReader ReaderOptions -> ByteString -> m Pandoc
    forall (m :: * -> *).
    PandocMonad m =>
    ReaderOptions -> ByteString -> m Pandoc
    readEPUB)
              ,(Text
    "muse"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMuse)
              ,(Text
    "man"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMan)
              ,(Text
    "fb2"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readFB2)
              ,(Text
    "ipynb"        , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readIpynb)
              ,(Text
    "csv"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCSV)
              ,(Text
    "tsv"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTSV)
              ,(Text
    "csljson"      , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readCslJson)
              ,(Text
    "bibtex"       , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readBibTeX)
              ,(Text
    "biblatex"     , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readBibLaTeX)
              ,(Text
    "endnotexml"   , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readEndNoteXML)
              ,(Text
    "ris"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readRIS)
              ,(Text
    "rtf"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readRTF)
              ,(Text
    "typst"        , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readTypst)
              ,(Text
    "djot"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readDjot)
              ,(Text
    "mdoc"         , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readMdoc)
              ,(Text
    "pod"          , (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    forall (m :: * -> *).
    (forall a. ToSources a => ReaderOptions -> a -> m Pandoc)
    -> Reader m
    TextReader ReaderOptions -> a -> m Pandoc
    forall a. ToSources a => ReaderOptions -> a -> m Pandoc
    forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readPod)
              ]

    -- | Retrieve reader, extensions based on format spec (format+extensions).
    getReader :: PandocMonad m => Format.FlavoredFormat -> m (Reader m, Extensions)
    getReader :: forall (m :: * -> *).
    PandocMonad m =>
    FlavoredFormat -> m (Reader m, Extensions)
    getReader FlavoredFormat
    flvrd = do
      let readerName :: Text
    readerName = FlavoredFormat -> Text
    Format.formatName FlavoredFormat
    flvrd
      case Text -> [(Text, Reader m)] -> Maybe (Reader m)
    forall a b. Eq a => a -> [(a, b)] -> Maybe b
    lookup Text
    readerName [(Text, Reader m)]
    forall (m :: * -> *). PandocMonad m => [(Text, Reader m)]
    readers of
        Maybe (Reader m)
    Nothing  -> PandocError -> m (Reader m, Extensions)
    forall a. PandocError -> m a
    forall e (m :: * -> *) a. MonadError e m => e -> m a
    throwError (PandocError -> m (Reader m, Extensions))
    -> PandocError -> m (Reader m, Extensions)
    forall a b. (a -> b) -> a -> b
    $ Text -> PandocError
    PandocUnknownReaderError Text
    readerName
        Just  Reader m
    r  -> (Reader m
    r,) (Extensions -> (Reader m, Extensions))
    -> m Extensions -> m (Reader m, Extensions)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$>
          ExtensionsConfig -> FlavoredFormat -> m Extensions
    forall (m :: * -> *).
    PandocMonad m =>
    ExtensionsConfig -> FlavoredFormat -> m Extensions
    Format.applyExtensionsDiff (Text -> ExtensionsConfig
    Format.getExtensionsConfig Text
    readerName) FlavoredFormat
    flvrd

    -- | Read pandoc document from JSON format.
    readJSON :: (PandocMonad m, ToSources a)
             => ReaderOptions
             -> a
             -> m Pandoc
    readJSON :: forall (m :: * -> *) a.
    (PandocMonad m, ToSources a) =>
    ReaderOptions -> a -> m Pandoc
    readJSON ReaderOptions
    _ a
    s =
      case ByteString -> Either String Pandoc
    forall a. FromJSON a => ByteString -> Either String a
    eitherDecode' (ByteString -> Either String Pandoc)
    -> (a -> ByteString) -> a -> Either String Pandoc
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . StrictByteString -> ByteString
    BL.fromStrict (StrictByteString -> ByteString)
    -> (a -> StrictByteString) -> a -> ByteString
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Text -> StrictByteString
    UTF8.fromText
                         (Text -> StrictByteString) -> (a -> Text) -> a -> StrictByteString
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Sources -> Text
    sourcesToText (Sources -> Text) -> (a -> Sources) -> a -> Text
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> Sources
    forall a. ToSources a => a -> Sources
    toSources (a -> Either String Pandoc) -> a -> Either String Pandoc
    forall a b. (a -> b) -> a -> b
    $ a
    s of
           Right Pandoc
    doc -> Pandoc -> m Pandoc
    forall a. a -> m a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Pandoc
    doc
           Left String
    e    -> PandocError -> m Pandoc
    forall a. PandocError -> m a
    forall e (m :: * -> *) a. MonadError e m => e -> m a
    throwError (PandocError -> m Pandoc) -> PandocError -> m Pandoc
    forall a b. (a -> b) -> a -> b
    $ Text -> PandocError
    PandocParseError (Text
    "JSON parse error: "
                                                       Text -> Text -> Text
    forall a. Semigroup a => a -> a -> a
    <> String -> Text
    T.pack String
    e)