Safe Haskell | None |
---|---|
Language | Haskell2010 |
Clear to write, read and edit DSL for writing HTML
See Lucid.Html5 for a complete list of Html5 combinators. That module is re-exported from this module for your convenience.
See Lucid.Base for lower level functions like
makeElement
, makeAttributes
, termRaw
, etc.
To convert html to the lucid DSL, use the (experimental) program lucid-from-html which may eventually be integrated into lucid itself.
Synopsis
- renderText :: Html a -> Text
- renderBS :: Html a -> ByteString
- renderTextT :: Monad m => HtmlT m a -> m Text
- renderBST :: Monad m => HtmlT m a -> m ByteString
- renderToFile :: FilePath -> Html a -> IO ()
- execHtmlT :: Monad m => HtmlT m a -> m Builder
- evalHtmlT :: Monad m => HtmlT m a -> m a
- runHtmlT :: Monad m => HtmlT m a -> m (Builder, a)
- type Html = HtmlT Identity
- data HtmlT m a
- data Attributes
- class Term arg result | result -> arg where
- class ToHtml a where
- module Lucid.Html5
Intro
HTML terms in Lucid are written with a postfix ‘_
’ to indicate data
rather than code. Some examples:
Note: If you're testing in the REPL you need to add a type annotation to indicate that you want HTML. In normal code your top-level declaration signatures handle that.
For GHCi:
:set -XOverloadedStrings -XExtendedDefaultRules@ import Lucid
In a module: {-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}
Plain text is written like this, and is automatically escaped:
>>>
"123 < 456" :: Html ()
123 < 456
Except some elements, like script_
:
>>>
script_ "alert('Hello!' > 12)" :: Html ()
<script>alert('Hello!' > 12)</script>
Elements nest by function application:
>>>
table_ (tr_ (td_ (p_ "Hello, World!"))) :: Html ()
<table><tr><td><p>Hello, World!</p></td></tr></table>
Elements are juxtaposed via monoidal append (remember to import Data.Monoid):
>>>
p_ "hello" <> p_ "sup" :: Html ()
<p>hello</p><p>sup</p>
Or monadic sequencing:
>>>
div_ (do p_ "hello"; p_ "sup") :: Html ()
<div><p>hello</p><p>sup</p></div>
Attributes are set by providing an argument list:
>>>
p_ [class_ "brand"] "Lucid Inc" :: Html ()
<p class="brand">Lucid Inc</p>
>>>
p_ [data_ "zot" "foo",checked_] "Go!" :: Html ()
<p data-zot="foo" checked>go</p>
Attribute and element terms are not conflicting:
>>>
style_ [style_ "inception"] "Go deeper." :: Html ()
<style style="inception">Go deeper.</style>
Here is a fuller example of Lucid:
table_ [rows_ "2"] (tr_ (do td_ [class_ "top",colspan_ "2",style_ "color:red"] (p_ "Hello, attributes!") td_ "yay!"))
Elements (and some attributes) are variadic and overloaded, see the
Term
class for more explanation about that.
For proper rendering you can easily run some HTML immediately with:
>>>
renderText (p_ "Hello!")
> "<p>Hello!</p>"
>>>
renderBS (p_ [style_ "color:red"] "Hello!")
"<p style=\"color:red\">Hello!</p>"
For ease of use in GHCi, there is a Show
instance, as
demonstrated above.
renderText :: Html a -> Text Source #
Render the HTML to a lazy Text
.
This is a convenience function defined in terms of execHtmlT
,
runIdentity
and toLazyByteString
, and
decodeUtf8
. Check the source if you're interested in the
lower-level behaviour.
renderBS :: Html a -> ByteString Source #
Render the HTML to a lazy ByteString
.
This is a convenience function defined in terms of execHtmlT
,
runIdentity
and toLazyByteString
. Check the source if
you're interested in the lower-level behaviour.
renderTextT :: Monad m => HtmlT m a -> m Text Source #
Render the HTML to a lazy Text
, but in a monad.
This is a convenience function defined in terms of execHtmlT
and
toLazyByteString
, and decodeUtf8
. Check the source if
you're interested in the lower-level behaviour.
renderBST :: Monad m => HtmlT m a -> m ByteString Source #
Render the HTML to a lazy ByteString
, but in a monad.
This is a convenience function defined in terms of execHtmlT
and
toLazyByteString
. Check the source if you're interested in
the lower-level behaviour.
renderToFile :: FilePath -> Html a -> IO () Source #
Render the HTML to a lazy ByteString
.
This is a convenience function defined in terms of execHtmlT
,
runIdentity
and toLazyByteString
. Check the source if
you're interested in the lower-level behaviour.
Running
If the above rendering functions aren't suited for your purpose,
you can run the monad directly and use the more low-level blaze
Builder
, which has a plethora of output modes in
Blaze.ByteString.Builder.
Build the HTML. Analogous to execState
.
You might want to use this is if you want to do something with the
raw Builder
. Otherwise for simple cases you can just use
renderText
or renderBS
.
:: Monad m | |
=> HtmlT m a | HTML monad to evaluate. |
-> m a | Ignore the HTML output and just return the value. |
Evaluate the HTML to its return value. Analogous to evalState
.
Use this if you want to ignore the HTML output of an action completely and just get the result.
For using with the Html
type, you'll need runIdentity
e.g.
>>>
runIdentity (evalHtmlT (p_ "Hello!"))
()
Types
A monad transformer that generates HTML. Use the simpler Html
type if you don't want to transform over some other monad.
Instances
MonadTrans HtmlT Source # | |
Defined in Lucid.Base | |
MonadState s m => MonadState s (HtmlT m) Source # | Since: 2.9.7 |
MonadReader r m => MonadReader r (HtmlT m) Source # | Since: 2.9.7 |
(Monad m, a ~ ()) => TermRaw Text (HtmlT m a) Source # | Given children immediately, just use that and expect no attributes. |
Monad m => Monad (HtmlT m) Source # | |
Functor m => Functor (HtmlT m) Source # | |
MonadFix m => MonadFix (HtmlT m) Source # | |
Defined in Lucid.Base | |
Monad m => Applicative (HtmlT m) Source # | |
MonadIO m => MonadIO (HtmlT m) Source # | If you want to use IO in your HTML generation. |
Defined in Lucid.Base | |
(Monad m, ToHtml f, a ~ ()) => TermRaw [Attributes] (f -> HtmlT m a) Source # | Given attributes, expect more child input. |
Defined in Lucid.Base | |
(Monad m, f ~ HtmlT m a) => Term [Attributes] (f -> HtmlT m a) Source # | Given attributes, expect more child input. |
Defined in Lucid.Base | |
m ~ Identity => Show (HtmlT m a) Source # | Just calls |
(Monad m, a ~ ()) => IsString (HtmlT m a) Source # | We pack it via string. Could possibly encode straight into a builder. That might be faster. |
Defined in Lucid.Base fromString :: String -> HtmlT m a # | |
(a ~ (), Monad m) => Semigroup (HtmlT m a) Source # | Since: 2.9.7 |
(a ~ (), Monad m) => Monoid (HtmlT m a) Source # | Monoid is right-associative, a la the |
(a ~ (), m ~ Identity) => ToHtml (HtmlT m a) Source # | Since: 2.9.8 |
Monad m => Term (HtmlT m a) (HtmlT m a) Source # | Given children immediately, just use that and expect no attributes. |
data Attributes Source #
A list of attributes.
Instances
Semigroup Attributes Source # | |
Defined in Lucid.Base (<>) :: Attributes -> Attributes -> Attributes # sconcat :: NonEmpty Attributes -> Attributes # stimes :: Integral b => b -> Attributes -> Attributes # | |
Monoid Attributes Source # | |
Defined in Lucid.Base mempty :: Attributes # mappend :: Attributes -> Attributes -> Attributes # mconcat :: [Attributes] -> Attributes # | |
TermRaw Text Attributes Source # | Some termRaws (like |
Defined in Lucid.Base | |
Term Text Attributes Source # | Some terms (like |
Defined in Lucid.Base | |
(Monad m, ToHtml f, a ~ ()) => TermRaw [Attributes] (f -> HtmlT m a) Source # | Given attributes, expect more child input. |
Defined in Lucid.Base | |
(Monad m, f ~ HtmlT m a) => Term [Attributes] (f -> HtmlT m a) Source # | Given attributes, expect more child input. |
Defined in Lucid.Base |
Classes
To support convenient use of HTML terms, HTML terms are overloaded. Here are the following types possible for an element term accepting attributes and/or children:
p_ :: Term arg result => arg -> result p_ :: Monad m => [Attributes] -> HtmlT m () -> HtmlT m () p_ :: Monad m => HtmlT m () -> HtmlT m ()
The first is the generic form. The latter two are the possible types for an element.
Elements that accept no content are always concrete:
input_ :: Monad m => [Attributes] -> HtmlT m ()
And some elements share the same name as attributes, so you can also overload them as attributes:
style_ :: TermRaw arg result => arg -> result style_ :: Monad m => [Attributes] -> Text -> HtmlT m () style_ :: Monad m => Text -> HtmlT m () style_ :: Text -> Attributes
class Term arg result | result -> arg where Source #
Used to construct HTML terms.
Simplest use: p_ = term "p" yields p_
.
Very overloaded for three cases:
- The first case is the basic
arg
of[(Text,Text)]
which will return a function that wants children. - The second is an
arg
which isHtmlT m ()
, in which case the term accepts no attributes and just the children are used for the element. - Finally, this is also used for overloaded attributes, like
style_
ortitle_
. If a return type of(Text,Text)
is inferred then an attribute will be made.
The instances look intimidating but actually the constraints make
it very general so that type inference works well even in the
presence of things like OverloadedLists
and such.
:: Text | Name of the element or attribute. |
-> arg | Either an attribute list or children. |
-> result | Result: either an element or an attribute. |
Used for constructing elements e.g. term "p"
yields p_
.
Instances
Term Text Attributes Source # | Some terms (like |
Defined in Lucid.Base | |
(Monad m, f ~ HtmlT m a) => Term [Attributes] (f -> HtmlT m a) Source # | Given attributes, expect more child input. |
Defined in Lucid.Base | |
Monad m => Term (HtmlT m a) (HtmlT m a) Source # | Given children immediately, just use that and expect no attributes. |
Can be converted to HTML.
toHtml :: Monad m => a -> HtmlT m () Source #
Convert to HTML, doing HTML escaping.
toHtmlRaw :: Monad m => a -> HtmlT m () Source #
Convert to HTML without any escaping.
Instances
ToHtml String Source # | |
ToHtml ByteString Source # | This instance requires the ByteString to contain UTF-8 encoded
text, for the Since: 2.9.5 |
ToHtml ByteString Source # | This instance requires the ByteString to contain UTF-8 encoded
text, for the Since: 2.9.5 |
ToHtml Text Source # | |
ToHtml Text Source # | |
(a ~ (), m ~ Identity) => ToHtml (HtmlT m a) Source # | Since: 2.9.8 |
Re-exports
module Lucid.Html5