HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Moduleblaze-markup-0.8.3.0Haskell2010

Text.Blaze

BlazeMarkup is a markup combinator library. It provides a way to embed markup languages like HTML and SVG in Haskell in an efficient and convenient way, with a light-weight syntax.

To use the library, one needs to import a set of combinators. For example, you can use HTML 4 Strict from BlazeHtml package.

{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (head, id, div)
import Text.Blaze.Html4.Strict hiding (map)
import Text.Blaze.Html4.Strict.Attributes hiding (title)

To render the page later on, you need a so called Renderer. The recommended renderer is an UTF-8 renderer which produces a lazy bytestring.

import Text.Blaze.Renderer.Utf8 (renderMarkup)

Now, you can describe pages using the imported combinators.

page1 :: Markup
page1 = html $ do
    head $ do
        title "Introduction page."
        link ! rel "stylesheet" ! type_ "text/css" ! href "screen.css"
    body $ do
        div ! id "header" $ "Syntax"
        p "This is an example of BlazeMarkup syntax."
        ul $ mapM_ (li . toMarkup . show) [1, 2, 3]

The resulting HTML can now be extracted using:

renderMarkup page1
  • 4 types
  • 2 classes
  • 27 values

Important types.

4 declarations
newtypenewtype Tag
#

Type for an HTML tag. This can be seen as an internal string type used by BlazeMarkup.

Instances1IsString
  • IsString TagDefined in blaze-markup-0.8.3.0 · Text.Blaze.Internal
newtypenewtype Attribute
#

Type for an attribute.

Instances2Semigroup, Monoid

Creating attributes.

2 declarations
valuedataAttribute
  1. :: Tag

    Name of the attribute.

  2. -> AttributeValue

    Value for the attribute.

  3. -> Attribute

    Resulting HTML attribute.

#

From HTML 5 onwards, the user is able to specify custom data attributes.

An example:

<p data-foo="bar">Hello.</p>

We support this in BlazeMarkup using this function. The above fragment could be described using BlazeMarkup with:

p ! dataAttribute "foo" "bar" $ "Hello."
valuecustomAttribute
  1. :: Tag

    Name of the attribute

  2. -> AttributeValue

    Value for the attribute

  3. -> Attribute

    Resulting HTML attribtue

#

Create a custom attribute. This is not specified in the HTML spec, but some JavaScript libraries rely on it.

An example:

<select dojoType="select">foo</select>

Can be produced using:

select ! customAttribute "dojoType" "select" $ "foo"

Converting values to Markup.

9 declarations
classclass ToMarkup a where
#

Class allowing us to use a single function for Markup values

Methods

Instances19ToMarkup, …
valuetext
  1. :: Text

    Text to render.

  2. -> Markup

    Resulting HTML fragment.

#

Render text. Functions like these can be used to supply content in HTML.

Comments

5 declarations
valuetextComment :: Text -> Markup
#

Create a comment from a Text value. The text should not contain "--". This is not checked by the library.

Creating tags.

2 declarations

Converting values to attribute values.

9 declarations
classclass ToValue a where
#

Class allowing us to use a single function for attribute values

Methods

Instances17ToValue, …

Setting attributes

2 declarations
method(!) :: h -> Attribute -> h
#

Apply an attribute to an element.

Example:

img ! src "foo.png"

Result:

<img src="foo.png" />

This can be used on nested elements as well.

Example:

p ! style "float: right" $ "Hello!"

Result:

<p style="float: right">Hello!</p>
value(!?) :: Attributable h => h -> (Bool, Attribute) -> h
#

Shorthand for setting an attribute depending on a conditional.

Example:

p !? (isBig, A.class "big") $ "Hello"

Gives the same result as:

(if isBig then p ! A.class "big" else p) "Hello"

Modifying Markup trees

1 declaration
valuecontents :: MarkupM a -> MarkupM a
#

Take only the text content of an HTML tree.

contents $ do
    p ! $ "Hello "
    p ! $ "Word!"

Result:

Hello World!