@@ -30,6 +30,7 @@ import Data.Default
30import Data.Dependent.Sum (DSum (..))
30import Data.Dependent.Sum (DSum (..))
31import qualified Data.Map as Map
31import qualified Data.Map as Map
32import Data.Monoid
32import Data.Monoid
33+import qualified Data.Set as Set
33import Data.Text.Encoding
34import Data.Text.Encoding
34import GHC.Generics
35import GHC.Generics
35import Reflex.Class
36import Reflex.Class
@@ -146,6 +147,8 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
146 return $ TextNode ()
147 return $ TextNode ()
147 {-# INLINABLE element #-}
148 {-# INLINABLE element #-}
148 element elementTag cfg child = do
149 element elementTag cfg child = do
150+ -- https://www.w3.org/TR/html-markup/syntax.html#syntax-elements
151+ let voidElements = Set.fromList ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]
149 let toAttr (AttributeName _mns k) v = encodeUtf8 k <> "=\"" <> BL.toStrict (toLazyByteString $ fromHtmlEscapedText v) <> "\""
152 let toAttr (AttributeName _mns k) v = encodeUtf8 k <> "=\"" <> BL.toStrict (toLazyByteString $ fromHtmlEscapedText v) <> "\""
150 es <- newFanEventWithTrigger $ \_ _ -> return (return ())
153 es <- newFanEventWithTrigger $ \_ _ -> return (return ())
151 StaticDomBuilderT $ do
154 StaticDomBuilderT $ do
@@ -153,9 +156,12 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
153 attrs0 <- foldDyn applyMap (cfg ^. initialAttributes) (cfg ^. modifyAttributes)
156 attrs0 <- foldDyn applyMap (cfg ^. initialAttributes) (cfg ^. modifyAttributes)
154 let attrs1 = ffor (current attrs0) $ mconcat . fmap (\(k, v) -> " " <> toAttr k v) . Map.toList
157 let attrs1 = ffor (current attrs0) $ mconcat . fmap (\(k, v) -> " " <> toAttr k v) . Map.toList
155 let tagBS = encodeUtf8 elementTag
158 let tagBS = encodeUtf8 elementTag
159+ if Set.member elementTag voidElements
160+ then modify $ (:) $ mconcat [constant ("<" <> tagBS), attrs1, constant " />"]
156− let open = mconcat [constant ("<" <> tagBS <> " "), attrs1, constant ">"]
162+ let open = mconcat [constant ("<" <> tagBS <> " "), attrs1, constant ">"]
157− let close = constant $ "</" <> tagBS <> ">" -- TODO handle elements without closing tags
163+ let close = constant $ "</" <> tagBS <> ">"
158− modify $ (:) $ mconcat [open, innerHtml, close]
164+ modify $ (:) $ mconcat [open, innerHtml, close]
159 return (Element es (), result)
165 return (Element es (), result)
160 {-# INLINABLE placeholder #-}
166 {-# INLINABLE placeholder #-}
161 placeholder (PlaceholderConfig toInsertAbove _delete) = StaticDomBuilderT $ do
167 placeholder (PlaceholderConfig toInsertAbove _delete) = StaticDomBuilderT $ do