151 lines
2.9 KiB
Markdown
151 lines
2.9 KiB
Markdown
# 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!" }
|
|
}
|
|
# ;
|
|
```
|