module Ondim.Targets.HTML.Expansions where

import Ondim
import Ondim.Extra.Expansions
import Ondim.Extra.Standard (standardMap)
import Ondim.Targets.HTML.Instances
import Ondim.Targets.HTML.Parser (parseT)
import Text.XML qualified as X
import Ondim.Debug (throwTemplateError)

defaultState :: OndimState s
defaultState :: forall s. OndimState s
defaultState =
  OndimState
    { expansions :: Namespace s
expansions = Namespace s
forall {m}. Namespace m
exps
    }
  where
    exps :: Namespace m
exps = NamespaceMap m -> Namespace m
forall m. NamespaceMap m -> Namespace m
mapToNamespace do
      NamespaceMap m
forall s. NamespaceMap s
standardMap
      Text
"raw.html" Text -> Expansion m HtmlNode -> NamespaceMap m
forall t m.
(HasCallStack, Typeable t) =>
Text -> Expansion m t -> NamespaceMap m
## \(HtmlNode
node :: HtmlNode) -> do
        t <- Text -> HtmlNode -> Ondim m Text
forall t s. OndimNode t => Text -> t -> Ondim s Text
lookupAttr' Text
"text" HtmlNode
node
        return [RawNode t]
      Text
"expanded.html" Text -> Expansion m HtmlNode -> NamespaceMap m
forall t m.
(HasCallStack, Typeable t) =>
Text -> Expansion m t -> NamespaceMap m
## \(HtmlNode
node :: HtmlNode) -> do
        t <- Text -> Document
parseT (Text -> Document) -> Ondim m Text -> Ondim m Document
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> HtmlNode -> Ondim m Text
forall t s. OndimNode t => Text -> t -> Ondim s Text
lookupAttr' Text
"text" HtmlNode
node
        result <- case toHtmlNodes $ X.elementNodes $ X.documentRoot t of
          Right [HtmlNode]
nodes -> [HtmlNode] -> Ondim m [HtmlNode]
forall a. a -> Ondim m a
forall (m :: * -> *) a. Monad m => a -> m a
return [HtmlNode]
nodes
          Left String
err -> Text -> Ondim m [HtmlNode]
forall s a. HasCallStack => Text -> Ondim s a
throwTemplateError (String -> Text
forall a. ToText a => a -> Text
toText String
err)
        expandSubs result