content: module Commonmark.Parser
      ( commonmark
      , commonmarkWith
      , parseCommonmarkWith
      -- * Exported from "Text.Parsec.Error"
      , ParseError
      ) where
  
  import           Commonmark.Blocks
  import           Commonmark.Inlines
  import           Commonmark.Tokens
  import           Commonmark.Types
  import           Commonmark.Syntax (SyntaxSpec(..), defaultSyntaxSpec)
  import           Text.Parsec.Error (ParseError)
  import           Data.Functor.Identity   (runIdentity)
  import           Data.Text (Text)
  
  -- | Parse a commonmark document using the core syntax
  -- elements.
  -- To produce HTML, instantiate 'bl' with @'Html' ()@ (see
  -- 'Commonmark.Html'.
  -- If you want to add syntax extensions or run the parser in a
  -- monadic context, use 'commonmarkWith'.
  -- If you want to operate on tokenized input, use 'parseCommonmarkWith'.
  commonmark :: IsBlock il bl
             => String      -- ^ Name or path of input
             -> Text        -- ^ Commonmark text input
             -> Either ParseError bl -- ^ Result or error
  commonmark sourcename =
   runIdentity .
   parseCommonmarkWith defaultSyntaxSpec .
   tokenize sourcename
  
  -- | Like 'commonmark', but allows specifying a custom syntax
  -- and a monadic context (since some syntax extensions may
  -- only be defined in certain monads, e.g. an extension for
  -- include files may require IO).
  commonmarkWith :: (Monad m, IsBlock il bl, IsInline il)
                 => SyntaxSpec m il bl       -- ^ Defines syntax
                 -> String                   -- ^ Name or path of input
                 -> Text                     -- ^ Commonmark text input
                 -> m (Either ParseError bl) -- ^ Result or error
  commonmarkWith syntax sourcename =
   parseCommonmarkWith syntax .
   tokenize sourcename
  
  -- | Parse a tokenized commonmark document using specified
  -- syntax elements.  Use 'tokenize' to convert 'Text' into ['Tok'].
  parseCommonmarkWith :: (Monad m, IsBlock il bl, IsInline il)
                      => SyntaxSpec m il bl -- ^ Defines syntax
                      -> [Tok] -- ^ Tokenized commonmark input
                      -> m (Either ParseError bl)  -- ^ Result or error
  parseCommonmarkWith syntax =
      mkBlockParser (syntaxBlockSpecs syntax)
        (syntaxFinalParsers syntax)
        (mkInlineParser (syntaxBracketedSpecs syntax)
                        (syntaxFormattingSpecs syntax)
                        (syntaxInlineParsers syntax)
                        (syntaxAttributeParsers syntax))
        (syntaxAttributeParsers syntax)
  