# Splices and toggles

## Splices: `(foo)`

Use `(foo)` syntax to insert the value of `foo` at runtime.
Any HTML special characters are escaped by default.

```rust
let best_pony = "Pinkie Pie";
let numbers = [1, 2, 3, 4];
# let _ = maud::
html! {
    p { "Hi, " (best_pony) "!" }
    p {
        "I have " (numbers.len()) " numbers, "
        "and the first one is " (numbers[0])
    }
}
# ;
```

Arbitrary Rust code can be included in a splice by using a [block].
This can be helpful for complex expressions
that would be difficult to read otherwise.

```rust
# struct Foo;
# impl Foo { fn time(self) -> Bar { Bar } }
# struct Bar;
# impl Bar { fn format(self, _: &str) -> &str { "" } }
# fn something_convertible_to_foo() -> Option<Foo> { Some(Foo) }
# fn test() -> Option<()> {
# let _ = maud::
html! {
    p {
        ({
            let f: Foo = something_convertible_to_foo()?;
            f.time().format("%H%Mh")
        })
    }
}
# ;
# Some(())
# }
```

[block]: https://doc.rust-lang.org/reference.html#block-expressions

### Splices in attributes

Splices work in attributes as well.

```rust
let secret_message = "Surprise!";
# let _ = maud::
html! {
    p title=(secret_message) {
        "Nothing to see here, move along."
    }
}
# ;
```

To concatenate multiple values within an attribute,
wrap the whole thing in braces.
This syntax is useful for building URLs.

```rust
const GITHUB: &'static str = "https://github.com";
# let _ = maud::
html! {
    a href={ (GITHUB) "/lambda-fairy/maud" } {
        "Fork me on GitHub"
    }
}
# ;
```

### Splices in classes and IDs

Splices can also be used in classes and IDs.

```rust
let name = "rarity";
let severity = "critical";
# let _ = maud::
html! {
    aside #(name) {
        p.{ "color-" (severity) } { "This is the worst! Possible! Thing!" }
    }
}
# ;
```

### What can be spliced?

You can splice any value that implements [`Render`][Render].
Most primitive types (such as `str` and `i32`) implement this trait,
so they should work out of the box.

To get this behavior for a custom type,
you can implement the [`Render`][Render] trait by hand.
The [`PreEscaped`][PreEscaped] wrapper type,
which outputs its argument without escaping,
works this way.
See the [traits](render-trait.md) section for details.

```rust
use maud::PreEscaped;
let post = "<p>Pre-escaped</p>";
# let _ = maud::
html! {
    h1 { "My super duper blog post" }
    (PreEscaped(post))
}
# ;
```

[Render]: https://docs.rs/maud/*/maud/trait.Render.html
[PreEscaped]: https://docs.rs/maud/*/maud/struct.PreEscaped.html

## Toggles: `[foo]`

Use `[foo]` syntax to show or hide something
based on a boolean expression `foo`.

This works on empty attributes:

```rust
let allow_editing = true;
# let _ = maud::
html! {
    p contenteditable[allow_editing] {
        "Edit me, I "
        em { "dare" }
        " you."
    }
}
# ;
```

And classes:

```rust
let cuteness = 95;
# let _ = maud::
html! {
    p.cute[cuteness > 50] { "Squee!" }
}
# ;
```