{-# OPTIONS_GHC -Wall #-}

{- |

Functions on 'WriterOptions' that modify the syntax highlighting.

-}

module Text.Pandoc.Highlighting.Extensions.WriterOptions
  ( applyAllSyntaxExtensions
  , modifySyntaxMap
  , modifySyntax
  , modifyContext
  ) where

-- pandoc
import Text.Pandoc (WriterOptions (..))

-- skylighting-core
import Skylighting.Types (Context, Syntax)

-- skylighting-extensions
import qualified Skylighting.Extensions

-- skylighting-modding
import Skylighting.Modding (SyntaxMap)
import qualified Skylighting.Modding

-- text
import Data.Text (Text)

{- |

Apply all of the syntax highlighting extensions provided by the
@skylighting-extensions@ package to Pandoc writer options.

-}

applyAllSyntaxExtensions :: WriterOptions -> WriterOptions
applyAllSyntaxExtensions = modifySyntaxMap Skylighting.Extensions.applyAll

{- |

Apply a function to the 'SyntaxMap' within Pandoc writer options.

-}

modifySyntaxMap :: (SyntaxMap -> SyntaxMap) -> WriterOptions -> WriterOptions
modifySyntaxMap f o = o{ writerSyntaxMap = f (writerSyntaxMap o) }

{- |

Modify a particular syntax by name.

-}

modifySyntax
    :: Text -- ^ Name of the syntax to modify
    -> (Syntax -> Syntax) -> WriterOptions -> WriterOptions

modifySyntax name =
    modifySyntaxMap .
    Skylighting.Modding.modifySyntax name

{- |

Modify a particular syntax context by name.

-}

modifyContext
    :: Text -- ^ Name of the syntax to modify
    -> Text -- ^ Name of the context to modify
    -> (Context -> Context) -> WriterOptions -> WriterOptions

modifyContext syntaxName contextName =
    modifySyntax syntaxName .
    Skylighting.Modding.modifySyntaxContexts .
    Skylighting.Modding.modifyContext contextName