content: module Heist.Splices.Bind where
  
  ------------------------------------------------------------------------------
  import           Data.Text (Text)
  import qualified Data.Text as T
  import qualified Text.XmlHtml as X
  
  ------------------------------------------------------------------------------
  import           Heist.Common
  import           Heist.Interpreted.Internal
  import           Heist.Splices.Apply
  import           Heist.Internal.Types.HeistState
  
  -- | Default name for the bind splice.
  bindTag :: Text
  bindTag = "bind"
  
  
  ------------------------------------------------------------------------------
  -- | Default attribute name for the bind tag.
  bindAttr :: Text
  bindAttr = "tag"
  
  
  ------------------------------------------------------------------------------
  -- | Implementation of the bind splice.
  bindImpl :: Monad n => Splice n
  bindImpl = do
      node <- getParamNode
      let err = "must supply \"" ++ T.unpack bindAttr ++
                "\" attribute in <" ++ T.unpack (X.elementTag node) ++ ">"
      maybe (return () `orError` err)
            (add node)
            (X.getAttribute bindAttr node)
      return []
    where
      add node nm = modifyHS $ bindSplice nm $ do
          caller <- getParamNode
          ctx <- getContext
          rawApply "bind-content" (X.childNodes node)
                   Nothing ctx (X.childNodes caller)
  
  