[](https://choosealicense.com/licenses/mit/)
[](https://crates.io/crates/markup-css-once)
[](https://docs.rs/markup-css-once)
# markup-css-once
Render embedded styles only once per template with [Markup][] Rust template engine
## Usage
Let's say we have a template we'd like to use on the page multiple times. We also have styles
related to this template inside an embedded `<style>` tag.
```rust
use markup_css_once::{CssOnce, css_once};
markup::define! {
Hello<'a>(
css: &'a CssOnce,
name: &'a str,
) {
@css_once!(css,
"p { background: blue }"
"b { color: yellow }"
)
p { "Hello, " b { @name } }
}
}
// We need an tracker for components with already rendered css
let css = CssOnce::new();
// The first time the template is rendered with styles
assert_eq!(
Hello { css: &css, name: "World" }.to_string(),
"<style>p { background: blue }b { color: yellow }</style>\n<p>Hello, <b>World</b></p>"
);
// But all subsequent calls will render only it's HTML
assert_eq!(
Hello { css: &css, name: "World" }.to_string(),
"<p>Hello, <b>World</b></p>"
);
```
[Markup]: https://github.com/utkarshkukreti/markup.rs
## Contributing
We appreciate all kinds of contributions, thank you!
### Note on README
Most of the readme is automatically copied from the crate documentation by [cargo-sync-readme][].
This way the readme is always in sync with the docs and examples are tested.
So if you find a part of the readme you'd like to change between `<!-- cargo-sync-readme start -->`
and `<!-- cargo-sync-readme end -->` markers, don't edit `README.md` directly, but rather change
the documentation on top of `src/lib.rs` and then synchronize the readme with:
```bash
cargo sync-readme
```
(make sure the cargo command is installed):
```bash
cargo install cargo-sync-readme
```
If you have [rusty-hook] installed the changes will apply automatically on commit.
## License
This project is licensed under the [MIT license](LICENSE).
[cargo-sync-readme]: https://github.com/phaazon/cargo-sync-readme
[rusty-hook]: https://github.com/swellaby/rusty-hook