aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Scripting.hs
blob: 5e26b0279b0f48a9ced05072b9df33af4f3e25bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE ImpredicativeTypes   #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{- |
Module      : Text.Pandoc.Scripting
Copyright   : © 2022 Albert Krewinkel
License     : GPL-2.0-or-later
Maintainer  : Albert Krewinkel <[email protected]>

Central data structure for scripting engines.
-}
module Text.Pandoc.Scripting
  ( ScriptingEngine (..)
  , noEngine
  )
where

import Control.Monad.Except (throwError)
import Control.Monad.IO.Class (MonadIO)
import Data.Text (Text)
import Text.Pandoc.Class.PandocMonad (PandocMonad)
import Text.Pandoc.Definition (Pandoc)
import Text.Pandoc.Error (PandocError (PandocNoScriptingEngine))
import Text.Pandoc.Filter.Environment (Environment)
import Text.Pandoc.Format (ExtensionsConfig)
import Text.Pandoc.Templates (Template)
import Text.Pandoc.Readers (Reader)
import Text.Pandoc.Writers (Writer)

-- | Structure to define a scripting engine.
data ScriptingEngine = ScriptingEngine
  { engineName :: Text   -- ^ Name of the engine.

  , engineApplyFilter :: forall m. (PandocMonad m, MonadIO m)
                      => Environment -> [String] -> FilePath
                      -> Pandoc -> m Pandoc
    -- ^ Use the scripting engine to run a filter.

  , engineReadCustom :: forall m. (PandocMonad m, MonadIO m)
                     => FilePath -> m (Reader m, ExtensionsConfig)
    -- ^ Function to parse input into a 'Pandoc' document.

  , engineWriteCustom :: forall m. (PandocMonad m, MonadIO m)
                      => FilePath -> m (WriterProperties m)
    -- ^ Invoke the given script file to convert to any custom format.
  }

type WriterProperties m = (Writer m, ExtensionsConfig, m (Template Text))

noEngine :: ScriptingEngine
noEngine = ScriptingEngine
  { engineName = "none"
  , engineApplyFilter = \_env _args _fp _doc ->
      throwError PandocNoScriptingEngine
  , engineReadCustom = \_fp ->
      throwError PandocNoScriptingEngine
  , engineWriteCustom = \_fp ->
      throwError PandocNoScriptingEngine
  }