Skip to main content

css_ast/types/
counter_style.rs

1use super::prelude::*;
2
3use crate::SymbolsFunction;
4
5#[node]
6#[derive(Parse, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
8#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
9#[derive(csskit_derives::NodeWithMetadata)]
10pub enum CounterStyle<'a> {
11	#[cfg_attr(feature = "visitable", visit(skip))]
12	Predefined(PredefinedCounter),
13	#[cfg_attr(feature = "visitable", visit(skip))]
14	Symbolic(SymbolicCounterStyle),
15	#[cfg_attr(feature = "visitable", visit(skip))]
16	Named(T![Ident]),
17	SymbolsFunction(SymbolsFunction<'a>),
18}
19
20impl<'a> Peek<'a> for CounterStyle<'a> {
21	const PEEK_KINDSET: KindSet = <T![Ident]>::PEEK_KINDSET.combine(SymbolsFunction::PEEK_KINDSET);
22
23	#[inline(always)]
24	fn peek<I>(p: &Parser<'a, I>, c: Cursor) -> bool
25	where
26		I: Iterator<Item = Cursor> + Clone,
27	{
28		<T![Ident]>::peek(p, c) || <SymbolsFunction>::peek(p, c)
29	}
30}
31
32/// <https://drafts.csswg.org/css-counter-styles-3/#predefined-counters>
33#[node]
34#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
36#[derive(csskit_derives::NodeWithMetadata)]
37pub enum PredefinedCounter {
38	#[atom(CssAtomSet::Decimal)]
39	Decimal(T![Ident]),
40	#[atom(CssAtomSet::DecimalLeadingZero)]
41	DecimalLeadingZero(T![Ident]),
42	#[atom(CssAtomSet::ArabicIndic)]
43	ArabicIndic(T![Ident]),
44	#[atom(CssAtomSet::Armenian)]
45	Armenian(T![Ident]),
46	#[atom(CssAtomSet::UpperArmenian)]
47	UpperArmenian(T![Ident]),
48	#[atom(CssAtomSet::LowerArmenian)]
49	LowerArmenian(T![Ident]),
50	#[atom(CssAtomSet::Bengali)]
51	Bengali(T![Ident]),
52	#[atom(CssAtomSet::Cambodian)]
53	Cambodian(T![Ident]),
54	#[atom(CssAtomSet::Khmer)]
55	Khmer(T![Ident]),
56	#[atom(CssAtomSet::CjkDecimal)]
57	CjkDecimal(T![Ident]),
58	#[atom(CssAtomSet::Devanagari)]
59	Devanagari(T![Ident]),
60	#[atom(CssAtomSet::Georgian)]
61	Georgian(T![Ident]),
62	#[atom(CssAtomSet::Gujarati)]
63	Gujarati(T![Ident]),
64	#[atom(CssAtomSet::Gurmukhi)]
65	Gurmukhi(T![Ident]),
66	#[atom(CssAtomSet::Hebrew)]
67	Hebrew(T![Ident]),
68	#[atom(CssAtomSet::Kannada)]
69	Kannada(T![Ident]),
70	#[atom(CssAtomSet::Lao)]
71	Lao(T![Ident]),
72	#[atom(CssAtomSet::Malayalam)]
73	Malayalam(T![Ident]),
74	#[atom(CssAtomSet::Mongolian)]
75	Mongolian(T![Ident]),
76	#[atom(CssAtomSet::Myanmar)]
77	Myanmar(T![Ident]),
78	#[atom(CssAtomSet::Oriya)]
79	Oriya(T![Ident]),
80	#[atom(CssAtomSet::Persian)]
81	Persian(T![Ident]),
82	#[atom(CssAtomSet::LowerRoman)]
83	LowerRoman(T![Ident]),
84	#[atom(CssAtomSet::UpperRoman)]
85	UpperRoman(T![Ident]),
86	#[atom(CssAtomSet::Tamil)]
87	Tamil(T![Ident]),
88	#[atom(CssAtomSet::Telugu)]
89	Telugu(T![Ident]),
90	#[atom(CssAtomSet::Thai)]
91	Thai(T![Ident]),
92	#[atom(CssAtomSet::Tibetan)]
93	Tibetan(T![Ident]),
94	#[atom(CssAtomSet::LowerAlpha)]
95	LowerAlpha(T![Ident]),
96	#[atom(CssAtomSet::UpperAlpha)]
97	UpperAlpha(T![Ident]),
98	#[atom(CssAtomSet::UpperLatin)]
99	UpperLatin(T![Ident]),
100	#[atom(CssAtomSet::LowerGreek)]
101	LowerGreek(T![Ident]),
102	#[atom(CssAtomSet::Hiragana)]
103	Hiragana(T![Ident]),
104	#[atom(CssAtomSet::HiraganaIroha)]
105	HiraganaIroha(T![Ident]),
106	#[atom(CssAtomSet::Katakana)]
107	Katakana(T![Ident]),
108	#[atom(CssAtomSet::KatakanaIroha)]
109	KatakanaIroha(T![Ident]),
110	#[atom(CssAtomSet::CjkEarthlyBranch)]
111	CjkEarthlyBranch(T![Ident]),
112	#[atom(CssAtomSet::CjkHeavenlyStem)]
113	CjkHeavenlyStem(T![Ident]),
114}
115
116/// <https://drafts.csswg.org/css-counter-styles-3/#predefined-counters>
117#[node]
118#[derive(Parse, Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
119#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
120#[derive(csskit_derives::NodeWithMetadata)]
121pub enum SymbolicCounterStyle {
122	#[atom(CssAtomSet::Disc)]
123	Disc(T![Ident]),
124	#[atom(CssAtomSet::Square)]
125	Square(T![Ident]),
126	#[atom(CssAtomSet::DisclosureOpen)]
127	DisclosureOpen(T![Ident]),
128	#[atom(CssAtomSet::DisclosureClosed)]
129	DisclosureClosed(T![Ident]),
130}
131
132#[cfg(test)]
133mod tests {
134	use super::*;
135	use crate::CssAtomSet;
136	use css_parse::assert_parse;
137
138	#[test]
139	fn test_writes() {
140		assert_parse!(CssAtomSet::ATOMS, CounterStyle, "cjk-heavenly-stem");
141		assert_parse!(CssAtomSet::ATOMS, CounterStyle, "foobar");
142		assert_parse!(CssAtomSet::ATOMS, CounterStyle, "disc");
143		assert_parse!(CssAtomSet::ATOMS, CounterStyle, "symbols(symbolic'+')");
144	}
145}