1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//! # 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
use type_name;
use Cell;
use HashSet;
/// A tracker for rendered css
;
/// A macro for the Markup templates to ensure the css is rendered only once