Skip to content

Instantly share code, notes, and snippets.

@monadplus
Created January 31, 2020 08:53
Show Gist options
  • Save monadplus/e1317840b439d21899c56a3f8e3a8eef to your computer and use it in GitHub Desktop.
Save monadplus/e1317840b439d21899c56a3f8e3a8eef to your computer and use it in GitHub Desktop.
Simple HTML render
class Renderable component where
render :: component -> String
{-# MINIMAL render #-}
data Text = Text String
instance Renderable Text where
render (Text s) = "<p>" <> s <> "</p>"
data RenderableX where
RenderableX :: Renderable component => component -> RenderableX
instance Renderable RenderableX where
render (RenderableX component) = render component
data HTML = HTML { properties :: [(String, String)], children :: [RenderableX] }
instance Renderable HTML where
render (HTML props components) =
unlines [ "<div " <> (unwords $ fmap render props) <> " >"
, unlines (fmap ((" " ++) . render) components)
, "</div>"
]
instance Renderable (String, String) where
render (prop, value) = prop <> "=\"" <> value <> "\""
renderableExample :: IO ()
renderableExample = putStr $ render html where
html = HTML [("width", "100%"), ("heigth", "80%")]
[RenderableX (Text "Hello"), RenderableX embedded, RenderableX (Text "World")]
embedded = HTML [("colour", "white")]
[RenderableX (Text "Frozen II")]
-- >>> renderableExample
-- <div width="100%" heigth="80%" >
-- <p>Hello</p>
-- <div colour="white" >
-- <p>Frozen II</p>
--
-- </div>
--
-- <p>World</p>
--
-- </div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment