@@ -1,31 +1,34 @@
1+{-# LANGUAGE LambdaCase #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
2module Obelisk.ExecutableConfig.Lookup where
3module Obelisk.ExecutableConfig.Lookup where
4import Data.Map (Map)
5import Data.Map (Map)
5import qualified Data.Map as Map
6import qualified Data.Map as Map
6import Data.Maybe (catMaybes)
7import Data.Maybe (catMaybes)
7−import Data.Semigroup ((<>))
8import Data.Text (Text)
8import Data.Text (Text)
9−import qualified Data.Text as T
10import Data.Traversable (for)
9import Data.Traversable (for)
11import GHCJS.DOM
10import GHCJS.DOM
12import GHCJS.DOM.Document (getHead)
11import GHCJS.DOM.Document (getHead)
12+import GHCJS.DOM.DOMStringMap (get)
13−import GHCJS.DOM.Element (getElementsByClassName, getId, getInnerHTML)
13+import GHCJS.DOM.Element (getInnerHTML)
14−import GHCJS.DOM.HTMLCollection (item, getLength)
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)
16getConfigs :: IO (Map Text Text)
19getConfigs :: IO (Map Text Text)
17getConfigs = do
20getConfigs = do
18 Just doc <- currentDocument
21 Just doc <- currentDocument
19 Just hd <- getHead doc
22 Just hd <- getHead doc
20− es <- collToList =<< getElementsByClassName hd ("obelisk-executable-config-inject" :: Text)
23+ nodes <- collToList =<< querySelectorAll hd ("[data-obelisk-executable-config-inject-key]" :: Text)
21− cfg <- for es $ \e -> do
24+ fmap Map.fromList $ for nodes $ \node -> do
22− ident <- getId e
25+ e <- castTo HTMLElement node >>= \case
23− v <- getInnerHTML e
26+ Nothing -> error "Found node with data attribute obelisk-executable-config-inject-key that is not an HTMLElement."
24− return $ case T.stripPrefix "config-" ident of
27+ Just htmlE -> return htmlE
25− Just k -> (k, v)
28+ dataset <- getDataset e
26− Nothing -> error $
29+ (,)
27− "Element '" <> show ident <> "' has class 'obelisk-executable-config-inject' but does not start with 'config-'."
30+ <$> get dataset ("obelisk-executable-config-inject-key" :: Text)
28− return $ Map.fromList cfg
31+ <*> getInnerHTML e
30 collToList es = do
33 collToList es = do
31 len <- getLength es
34 len <- getLength es