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#[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#[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}