on develop help sign in
Render void elements correctly in Static builder.
commitd82b04e67c66974cf0d2d98c2c097c25c3241493 authorLuigy Leon <luigy@outlook.com> dateTue 6 Sep 2016, 20:38 (10 years ago) parent2a473ae
1 file changed+9−3
src/Reflex/Dom/Builder/Static.hs+9−3
src/Reflex/Dom/Builder/Static.hs+9−3
@@ -30,6 +30,7 @@ import Data.Default
3030import Data.Dependent.Sum (DSum (..))
3131import qualified Data.Map as Map
3232import Data.Monoid
33+import qualified Data.Set as Set
3334import Data.Text.Encoding
3435import GHC.Generics
3536import Reflex.Class
@@ -146,6 +147,8 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
146147 return $ TextNode ()
147148 {-# INLINABLE element #-}
148149 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"]
149152 let toAttr (AttributeName _mns k) v = encodeUtf8 k <> "=\"" <> BL.toStrict (toLazyByteString $ fromHtmlEscapedText v) <> "\""
150153 es <- newFanEventWithTrigger $ \_ _ -> return (return ())
151154 StaticDomBuilderT $ do
@@ -153,9 +156,12 @@ instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) wh
153156 attrs0 <- foldDyn applyMap (cfg ^. initialAttributes) (cfg ^. modifyAttributes)
154157 let attrs1 = ffor (current attrs0) $ mconcat . fmap (\(k, v) -> " " <> toAttr k v) . Map.toList
155158 let tagBS = encodeUtf8 elementTag
156− let open = mconcat [constant ("<" <> tagBS <> " "), attrs1, constant ">"]
157− let close = constant $ "</" <> tagBS <> ">" -- TODO handle elements without closing tags
158− modify $ (:) $ mconcat [open, innerHtml, close]
159+ if Set.member elementTag voidElements
160+ then modify $ (:) $ mconcat [constant ("<" <> tagBS), attrs1, constant " />"]
161+ else do
162+ let open = mconcat [constant ("<" <> tagBS <> " "), attrs1, constant ">"]
163+ let close = constant $ "</" <> tagBS <> ">"
164+ modify $ (:) $ mconcat [open, innerHtml, close]
159165 return (Element es (), result)
160166 {-# INLINABLE placeholder #-}
161167 placeholder (PlaceholderConfig toInsertAbove _delete) = StaticDomBuilderT $ do