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

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

This helper module exports all writers functions.
-}
module Text.Pandoc.Writers
  (
    -- * Writers: converting /from/ Pandoc format
      Writer(..)
    , writers
    , writeAsciiDoc
    , writeAsciiDocLegacy
    , writeAsciiDoctor
    , writeBeamer
    , writeBibTeX
    , writeBibLaTeX
    , writeChunkedHTML
    , writeCommonMark
    , writeConTeXt
    , writeCslJson
    , writeDZSlides
    , writeDocBook4
    , writeDocBook5
    , writeDocx
    , writeDokuWiki
    , writeEPUB2
    , writeEPUB3
    , writeFB2
    , writeIpynb
    , writeHaddock
    , writeHtml4
    , writeHtml4String
    , writeHtml5
    , writeHtml5String
    , writeICML
    , writeJATS
    , writeJatsArchiving
    , writeJatsArticleAuthoring
    , writeJatsPublishing
    , writeJSON
    , writeJira
    , writeLaTeX
    , writeMan
    , writeMarkdown
    , writeMarkua
    , writeMediaWiki
    , writeMs
    , writeMuse
    , writeNative
    , writeODT
    , writeOPML
    , writeOpenDocument
    , writeOrg
    , writePlain
    , writePowerpoint
    , writeRST
    , writeRTF
    , writeRevealJs
    , writeS5
    , writeSlideous
    , writeSlidy
    , writeTEI
    , writeTexinfo
    , writeTextile
    , writeTypst
    , writeXWiki
    , writeZimWiki
    , getWriter
    ) where

import Control.Monad.Except (throwError)
import Data.Aeson
import qualified Data.ByteString.Lazy as BL
import Data.Text (Text)
import Text.Pandoc.Class
import Text.Pandoc.Definition
import qualified Text.Pandoc.Format as Format
import Text.Pandoc.Options
import qualified Text.Pandoc.UTF8 as UTF8
import Text.Pandoc.Error
import Text.Pandoc.Writers.AsciiDoc
import Text.Pandoc.Writers.BibTeX
import Text.Pandoc.Writers.ChunkedHTML
import Text.Pandoc.Writers.CommonMark
import Text.Pandoc.Writers.ConTeXt
import Text.Pandoc.Writers.CslJson
import Text.Pandoc.Writers.DocBook
import Text.Pandoc.Writers.Docx
import Text.Pandoc.Writers.DokuWiki
import Text.Pandoc.Writers.EPUB
import Text.Pandoc.Writers.FB2
import Text.Pandoc.Writers.Ipynb
import Text.Pandoc.Writers.Haddock
import Text.Pandoc.Writers.HTML
import Text.Pandoc.Writers.ICML
import Text.Pandoc.Writers.JATS
import Text.Pandoc.Writers.Jira
import Text.Pandoc.Writers.LaTeX
import Text.Pandoc.Writers.Man
import Text.Pandoc.Writers.Markdown
import Text.Pandoc.Writers.MediaWiki
import Text.Pandoc.Writers.Ms
import Text.Pandoc.Writers.Muse
import Text.Pandoc.Writers.Native
import Text.Pandoc.Writers.ODT
import Text.Pandoc.Writers.OpenDocument
import Text.Pandoc.Writers.OPML
import Text.Pandoc.Writers.Org
import Text.Pandoc.Writers.Powerpoint
import Text.Pandoc.Writers.RST
import Text.Pandoc.Writers.RTF
import Text.Pandoc.Writers.TEI
import Text.Pandoc.Writers.Texinfo
import Text.Pandoc.Writers.Textile
import Text.Pandoc.Writers.Typst
import Text.Pandoc.Writers.XWiki
import Text.Pandoc.Writers.ZimWiki

data Writer m = TextWriter (WriterOptions -> Pandoc -> m Text)
              | ByteStringWriter (WriterOptions -> Pandoc -> m BL.ByteString)

-- | Association list of formats and writers.
writers :: PandocMonad m => [ (Text, Writer m) ]
writers :: forall (m :: * -> *). PandocMonad m => [(Text, Writer m)]
writers = [
   (Text
"native"       , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeNative)
  ,(Text
"json"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJSON)
  ,(Text
"docx"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeDocx)
  ,(Text
"odt"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeODT)
  ,(Text
"pptx"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writePowerpoint)
  ,(Text
"epub"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeEPUB3)
  ,(Text
"epub2"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeEPUB2)
  ,(Text
"epub3"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeEPUB3)
  ,(Text
"fb2"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeFB2)
  ,(Text
"ipynb"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeIpynb)
  ,(Text
"html"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeHtml5String)
  ,(Text
"html4"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeHtml4String)
  ,(Text
"html5"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeHtml5String)
  ,(Text
"icml"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeICML)
  ,(Text
"s5"           , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeS5)
  ,(Text
"slidy"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeSlidy)
  ,(Text
"slideous"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeSlideous)
  ,(Text
"dzslides"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeDZSlides)
  ,(Text
"revealjs"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeRevealJs)
  ,(Text
"docbook"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeDocBook5)
  ,(Text
"docbook4"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeDocBook4)
  ,(Text
"docbook5"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeDocBook5)
  ,(Text
"jats"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJatsArchiving)
  ,(Text
"jats_articleauthoring", forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJatsArticleAuthoring)
  ,(Text
"jats_publishing" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJatsPublishing)
  ,(Text
"jats_archiving" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJatsArchiving)
  ,(Text
"jira"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJira)
  ,(Text
"opml"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeOPML)
  ,(Text
"opendocument" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeOpenDocument)
  ,(Text
"latex"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeLaTeX)
  ,(Text
"beamer"       , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeBeamer)
  ,(Text
"context"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeConTeXt)
  ,(Text
"texinfo"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeTexinfo)
  ,(Text
"man"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMan)
  ,(Text
"ms"           , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMs)
  ,(Text
"markdown"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkdown)
  ,(Text
"markdown_strict" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkdown)
  ,(Text
"markdown_phpextra" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkdown)
  ,(Text
"markdown_github" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkdown)
  ,(Text
"markdown_mmd" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkdown)
  ,(Text
"plain"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writePlain)
  ,(Text
"rst"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeRST)
  ,(Text
"mediawiki"    , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMediaWiki)
  ,(Text
"dokuwiki"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeDokuWiki)
  ,(Text
"xwiki"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeXWiki)
  ,(Text
"zimwiki"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeZimWiki)
  ,(Text
"textile"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeTextile)
  ,(Text
"typst"        , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeTypst)
  ,(Text
"rtf"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeRTF)
  ,(Text
"org"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeOrg)
  ,(Text
"asciidoc"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeAsciiDoc)
  ,(Text
"asciidoctor"  , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeAsciiDoc)
  ,(Text
"asciidoc_legacy" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeAsciiDocLegacy)
  ,(Text
"haddock"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeHaddock)
  ,(Text
"commonmark"   , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeCommonMark)
  ,(Text
"commonmark_x" , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeCommonMark)
  ,(Text
"gfm"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeCommonMark)
  ,(Text
"tei"          , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeTEI)
  ,(Text
"muse"         , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMuse)
  ,(Text
"csljson"      , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeCslJson)
  ,(Text
"bibtex"       , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeBibTeX)
  ,(Text
"biblatex"     , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeBibLaTeX)
  ,(Text
"markua"       , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m Text) -> Writer m
TextWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeMarkua)
  ,(Text
"chunkedhtml"  , forall (m :: * -> *).
(WriterOptions -> Pandoc -> m ByteString) -> Writer m
ByteStringWriter forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m ByteString
writeChunkedHTML)
  ]

-- | Retrieve writer, extensions based on formatSpec (format+extensions).
getWriter :: PandocMonad m => Format.FlavoredFormat -> m (Writer m, Extensions)
getWriter :: forall (m :: * -> *).
PandocMonad m =>
FlavoredFormat -> m (Writer m, Extensions)
getWriter FlavoredFormat
flvrd = do
  let writerName :: Text
writerName = FlavoredFormat -> Text
Format.formatName FlavoredFormat
flvrd
  case forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Text
writerName forall (m :: * -> *). PandocMonad m => [(Text, Writer m)]
writers of
    Maybe (Writer m)
Nothing  -> forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocUnknownWriterError Text
writerName
    Just  Writer m
w  -> (Writer m
w,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
      forall (m :: * -> *).
PandocMonad m =>
ExtensionsConfig -> FlavoredFormat -> m Extensions
Format.applyExtensionsDiff (Text -> ExtensionsConfig
Format.getExtensionsConfig Text
writerName) FlavoredFormat
flvrd

writeJSON :: PandocMonad m => WriterOptions -> Pandoc -> m Text
writeJSON :: forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> m Text
writeJSON WriterOptions
_ = forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
UTF8.toText forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
BL.toStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode