{-|
Copyright  : (c) Nathan Bloomfield, 2017
License    : GPL-3
Maintainer : nbloomf@gmail.com
Stability  : experimental

This module provides a filter for Hakyll which expands WordPress-style shortcodes. To use it, include the line @>>= applyShortcodes allServices@ in your compiler.
-}

module Hakyll.Shortcode (
  ShortcodeService(..),
  expandShortcodes,
  applyShortcodes,
  allServices
) where

import Hakyll.Shortcode.Service.GeoGebra
import Hakyll.Shortcode.Service.Gravatar
import Hakyll.Shortcode.Service.YouTube
import Hakyll.Shortcode.Service.Example


-- | A simple sum type representing the available shortcodes.
data ShortcodeService
  = GeoGebra
  | Gravatar
  | YouTube
  | Example
  deriving Eq


-- Expand shortcodes of the provided type.
expandShortcodesFor :: ShortcodeService -> String -> String
expandShortcodesFor x = case x of
  GeoGebra -> expandGeoGebraShortcodes
  Gravatar -> expandGravatarShortcodes
  YouTube  -> expandYouTubeShortcodes
  Example  -> expandExampleShortcodes


-- | Expand shortcodes of each of the provided types.
expandShortcodes :: [ShortcodeService] -> String -> String
expandShortcodes = foldr1 (.) . map expandShortcodesFor


-- | Monadic version of 'expandShortcodes', for use with Hakyll.
applyShortcodes :: (Monad m, Functor f)
  => [ShortcodeService] -> f String -> m (f String)
applyShortcodes svc text =
  return $ (fmap $ expandShortcodes svc) text


-- | A list of all the available shortcodes (for convenience).
allServices :: [ShortcodeService]
allServices =
  [ GeoGebra
  , Gravatar
  , YouTube
  ]