on master help sign in
Use data- attribute to identify config key/value pairs
commit0e9de985c3165c2ae30226666d49e6e4c984e469 authorKen Micklas <ken.micklas@obsidian.systems> dateWed 1 May 2019, 16:52 (7 years ago) parent3b47a85
3 files changed+20−17
lib/executable-config/inject/src/Obelisk/ExecutableConfig/Inject.hs+1−1 lib/executable-config/lookup/src-ghcjs/Obelisk/ExecutableConfig/Lookup.hs+16−13 lib/frontend/src/Obelisk/Frontend.hs+3−3
lib/executable-config/inject/src/Obelisk/ExecutableConfig/Inject.hs+1−1
@@ -13,7 +13,7 @@ import Reflex.Dom.Core hiding (value)
1313-- whose value is the provided configuration
1414injectPure :: DomBuilder t m => Text -> Text -> m ()
1515injectPure 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)
1717 in elAttr "script" attrs $ text value
1818
1919-- | 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 #-}
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
lib/frontend/src/Obelisk/Frontend.hs+3−3
@@ -40,9 +40,9 @@ import Data.Monoid ((<>))
4040import Data.Text (Text)
4141import GHCJS.DOM (currentDocument)
4242import GHCJS.DOM.Document (getHead)
43−import GHCJS.DOM.Element (getElementsByClassName)
44−import GHCJS.DOM.HTMLCollection (item, getLength)
4543import GHCJS.DOM.Node (removeChild_)
44+import GHCJS.DOM.NodeList (item, getLength)
45+import GHCJS.DOM.ParentNode (querySelectorAll)
4646import Language.Javascript.JSaddle (JSM)
4747import Obelisk.Frontend.Cookie
4848import Obelisk.Route.Frontend
@@ -96,7 +96,7 @@ removeHTMLConfigs :: JSM ()
9696removeHTMLConfigs = void $ runMaybeT $ do
9797 doc <- MaybeT currentDocument
9898 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)
100100 for_ es $ removeChild_ hd
101101 where
102102 collToList es = do