css_ast/types/
counter_style.rs

1use css_parse::{Cursor, Parser, Peek, T, keyword_set};
2use csskit_derives::{Parse, ToCursors, ToSpan, Visitable};
3
4use crate::SymbolsFunction;
5
6#[derive(Parse, ToCursors, ToSpan, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
8#[visit]
9pub enum CounterStyle<'a> {
10	#[visit(skip)]
11	Predefined(PredefinedCounter),
12	#[visit(skip)]
13	Named(T![Ident]),
14	SymbolsFunction(SymbolsFunction<'a>),
15}
16
17impl<'a> Peek<'a> for CounterStyle<'a> {
18	fn peek(p: &Parser<'a>, c: Cursor) -> bool {
19		<T![Ident]>::peek(p, c) || <SymbolsFunction>::peek(p, c)
20	}
21}
22
23keyword_set!(
24	// https://drafts.csswg.org/css-counter-styles-3/#predefined-counters
25	pub enum PredefinedCounter {
26		Decimal: "decimal",
27		DecimalLeadingZero: "decimal-leading-zero",
28		ArabicIndic: "arabic-indic",
29		Armenian: "armenian",
30		UpperArmenian: "upper-armenian",
31		LowerArmenian: "lower-armenian",
32		Bengali: "bengali",
33		Cambodian: "cambodian",
34		Khmer: "khmer",
35		CjkDecimal: "cjk-decimal",
36		Devanagari: "devanagari",
37		Georgian: "georgian",
38		Gujarati: "gujarati",
39		Gurmukhi: "gurmukhi",
40		Hebrew: "hebrew",
41		Kannada: "kannada",
42		Lao: "lao",
43		Malayalam: "malayalam",
44		Mongolian: "mongolian",
45		Myanmar: "myanmar",
46		Oriya: "oriya",
47		Persian: "persian",
48		LowerRoman: "lower-roman",
49		UpperRoman: "upper-roman",
50		Tamil: "tamil",
51		Telugu: "telugu",
52		Thai: "thai",
53		Tibetan: "tibetan",
54		LowerAlpha: "lower-alpha",
55		UpperAlpha: "upper-alpha",
56		UpperLatin: "upper-latin",
57		LowerGreek: "lower-greek",
58		Hiragana: "hiragana",
59		HiraganaIroha: "hiragana-iroha",
60		Katakana: "katakana",
61		KatakanaIroha: "katakana-iroha",
62		Disc: "disc",
63		Square: "square",
64		DisclousureOpen: "disclousure-open",
65		DisclousureClosed: "disclousure-closed",
66		CjkEarthlyBranch: "cjk-earthly-branch",
67		CjkHeavenlyStem: "cjk-heavenly-stem",
68	}
69);
70
71#[cfg(test)]
72mod tests {
73	use super::*;
74	use css_parse::assert_parse;
75
76	#[test]
77	fn size_test() {
78		assert_eq!(std::mem::size_of::<CounterStyle>(), 80);
79	}
80
81	#[test]
82	fn test_writes() {
83		assert_parse!(CounterStyle, "cjk-heavenly-stem");
84		assert_parse!(CounterStyle, "foobar");
85		assert_parse!(CounterStyle, "symbols(symbolic'+')");
86	}
87}