@@ -1,31 +1,34 @@
1+{-# LANGUAGE LambdaCase #-}
12{-# LANGUAGE OverloadedStrings #-}
23module Obelisk.ExecutableConfig.Lookup where
34
45import Data.Map (Map)
56import qualified Data.Map as Map
67import Data.Maybe (catMaybes)
7−import Data.Semigroup ((<>))
88import Data.Text (Text)
9−import qualified Data.Text as T
109import Data.Traversable (for)
1110import GHCJS.DOM
1211import GHCJS.DOM.Document (getHead)
13−import GHCJS.DOM.Element (getElementsByClassName, getId, getInnerHTML)
14−import GHCJS.DOM.HTMLCollection (item, getLength)
12+import GHCJS.DOM.DOMStringMap (get)
13+import GHCJS.DOM.Element (getInnerHTML)
14+import GHCJS.DOM.HTMLElement (HTMLElement(HTMLElement), getDataset)
15+import GHCJS.DOM.NodeList (item, getLength)
16+import GHCJS.DOM.ParentNode (querySelectorAll)
17+import GHCJS.DOM.Types (Node(Node), castTo)
1518
1619getConfigs :: IO (Map Text Text)
1720getConfigs = do
1821 Just doc <- currentDocument
1922 Just hd <- getHead doc
20− es <- collToList =<< getElementsByClassName hd ("obelisk-executable-config-inject" :: Text)
21− cfg <- for es $ \e -> do
22− ident <- getId e
23− v <- getInnerHTML e
24− return $ case T.stripPrefix "config-" ident of
25− Just k -> (k, v)
26− Nothing -> error $
27− "Element '" <> show ident <> "' has class 'obelisk-executable-config-inject' but does not start with 'config-'."
28− return $ Map.fromList cfg
23+ nodes <- collToList =<< querySelectorAll hd ("[data-obelisk-executable-config-inject-key]" :: Text)
24+ fmap Map.fromList $ for nodes $ \node -> do
25+ e <- castTo HTMLElement node >>= \case
26+ Nothing -> error "Found node with data attribute obelisk-executable-config-inject-key that is not an HTMLElement."
27+ Just htmlE -> return htmlE
28+ dataset <- getDataset e
29+ (,)
30+ <$> get dataset ("obelisk-executable-config-inject-key" :: Text)
31+ <*> getInnerHTML e
2932 where
3033 collToList es = do
3134 len <- getLength es