on master help sign in
Use data- attribute to identify config key/value pairs
0e9de98Ken Micklas
lib/executable-config/inject/src/Obelisk/ExecutableConfig/Inject.hs+1−1
@@ -13,7 +13,7 @@ import Reflex.Dom.Core hiding (value)
13-- whose value is the provided configuration
13-- whose value is the provided configuration
14injectPure :: DomBuilder t m => Text -> Text -> m ()
14injectPure :: DomBuilder t m => Text -> Text -> m ()
15injectPure key value =
15injectPure key value =
16− let attrs = ("type" =: "text/plain" <> "id" =: ("config-" <> key) <> "class" =: "obelisk-executable-config-inject")
16+ let attrs = ("type" =: "text/plain" <> "data-obelisk-executable-config-inject-key" =: key)
17 in elAttr "script" attrs $ text value
17 in elAttr "script" attrs $ text value
18
18
19-- | Produces injectable @<script>@ tags containing the configuration keys
19-- | Produces injectable @<script>@ tags containing the configuration keys
lib/executable-config/lookup/src-ghcjs/Obelisk/ExecutableConfig/Lookup.hs+16−13
@@ -1,31 +1,34 @@
1+{-# LANGUAGE LambdaCase #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
2module Obelisk.ExecutableConfig.Lookup where
3module Obelisk.ExecutableConfig.Lookup where
3
4
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)
15
18
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
29 where
32 where
30 collToList es = do
33 collToList es = do
31 len <- getLength es
34 len <- getLength es
lib/frontend/src/Obelisk/Frontend.hs+3−3
@@ -40,9 +40,9 @@ import Data.Monoid ((<>))
40import Data.Text (Text)
40import Data.Text (Text)
41import GHCJS.DOM (currentDocument)
41import GHCJS.DOM (currentDocument)
42import GHCJS.DOM.Document (getHead)
42import GHCJS.DOM.Document (getHead)
43−import GHCJS.DOM.Element (getElementsByClassName)
44−import GHCJS.DOM.HTMLCollection (item, getLength)
45import GHCJS.DOM.Node (removeChild_)
43import GHCJS.DOM.Node (removeChild_)
44+import GHCJS.DOM.NodeList (item, getLength)
45+import GHCJS.DOM.ParentNode (querySelectorAll)
46import Language.Javascript.JSaddle (JSM)
46import Language.Javascript.JSaddle (JSM)
47import Obelisk.Frontend.Cookie
47import Obelisk.Frontend.Cookie
48import Obelisk.Route.Frontend
48import Obelisk.Route.Frontend
@@ -96,7 +96,7 @@ removeHTMLConfigs :: JSM ()
96removeHTMLConfigs = void $ runMaybeT $ do
96removeHTMLConfigs = void $ runMaybeT $ do
97 doc <- MaybeT currentDocument
97 doc <- MaybeT currentDocument
98 hd <- MaybeT $ getHead doc
98 hd <- MaybeT $ getHead doc
99− es <- collToList =<< getElementsByClassName hd ("obelisk-executable-config-inject" :: Text)
99+ es <- collToList =<< querySelectorAll hd ("[data-obelisk-executable-config-inject-key]" :: Text)
100 for_ es $ removeChild_ hd
100 for_ es $ removeChild_ hd
101 where
101 where
102 collToList es = do
102 collToList es = do