lucid ===== Clear to write, read and edit DSL for writing HTML ## Introduction HTML terms in Lucid are written with a postfix ‘`_`’ to indicate data rather than code. Some examples: `p_`, `class_`, `table_`, `style_` See `Lucid.Html5` for a complete list of Html5 combinators. Plain text is written using the `OverloadedStrings` and `ExtendedDefaultRules` extensions, and is automatically escaped: ``` haskell λ> "123 < 456" :: Html () ``` ``` html 123 < 456 ``` Elements nest by function application: ``` haskell λ> table_ (tr_ (td_ (p_ "Hello, World!"))) :: Html () ``` ``` html
Hello, World! |
hello
sup
``` Or monadic sequencing: ``` haskell λ> div_ (do p_ "hello"; p_ "sup") :: Html () ``` ``` htmlhello
sup
Lucid Inc
``` Here is a fuller example of Lucid: ``` haskell table_ [rows_ "2"] (tr_ (do td_ [class_ "top",colspan_ "2",style_ "color:red"] (p_ "Hello, attributes!") td_ "yay!")) ``` ``` html
Hello, attributes! |
yay! |
Hello!
" ``` Or to bytes: ``` haskell λ> renderBS (p_ [style_ "color:red"] "Hello!") ``` ``` html "Hello!
" ``` For ease of use in GHCi, there is a `Show` instance, as demonstrated above. If the above rendering functions aren't suited for your purpose, you can run the monad directly via `execHtml` and use the more low-level blaze `Builder`, which has a plethora of output modes in Blaze.ByteString.Builder. See the documentation for the `Lucid` module for information about using it as a monad transformer. ## Transforming You can use `lift` to call parent monads. ``` haskell λ> runReader (renderTextT (html_ (body_ (do name <- lift ask p_ [class_ "name"] (toHtml name))))) ("Chris" :: String) ``` ``` html "Chris
" ```