1use {
5 crate::CustomParseError,
6 cssparser::{serialize_identifier, ParseError, Parser, ToCss},
7 std::fmt,
8};
9
10#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
11pub enum CounterStyleIdent {
12 decimal,
13 decimal_leading_zero,
14 arabic_indic,
15 armenian,
16 upper_armenian,
17 lower_armenian,
18 bengali,
19 cambodian,
20 khmer,
21 cjk_decimal,
22 devanagari,
23 georgian,
24 gujarati,
25 gurmukhi,
26 hebrew,
27 kannada,
28 lao,
29 malayalam,
30 mongolian,
31 myanmar,
32 oriya,
33 persian,
34 lower_roman,
35 upper_roman,
36 tamil,
37 telugu,
38 thai,
39 tibetan,
40 lower_alpha,
41 lower_latin,
42 upper_alpha,
43 upper_latin,
44 cjk_earthly_branch,
45 cjk_heavenly_stem,
46 lower_greek,
47 hiragana,
48 hiragana_iroha,
49 katakana,
50 katakana_iroha,
51 disc,
52 circle,
53 square,
54 disclosure_open,
55 disclosure_closed,
56 japanese_informal,
57 japanese_formal,
58 korean_hangul_formal,
59 korean_hanja_informal,
60 korean_hanja_formal,
61 simp_chinese_informal,
62 simp_chinese_formal,
63 trad_chinese_informal,
64 trad_chinese_formal,
65 cjk_ideographic,
66 ethiopic_numeric,
67
68 Custom(String),
69}
70
71impl ToCss for CounterStyleIdent {
72 fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
73 use self::CounterStyleIdent::*;
74
75 let name = match *self {
76 decimal => "decimal",
77 decimal_leading_zero => "decimal-leading-zero",
78 arabic_indic => "arabic-indic",
79 armenian => "armenian",
80 upper_armenian => "upper-armenian",
81 lower_armenian => "lower-armenian",
82 bengali => "bengali",
83 cambodian => "cambodian",
84 khmer => "khmer",
85 cjk_decimal => "cjk-decimal",
86 devanagari => "devanagari",
87 georgian => "georgian",
88 gujarati => "gujarati",
89 gurmukhi => "gurmukhi",
90 hebrew => "hebrew",
91 kannada => "kannada",
92 lao => "lao",
93 malayalam => "malayalam",
94 mongolian => "mongolian",
95 myanmar => "myanmar",
96 oriya => "oriya",
97 persian => "persian",
98 lower_roman => "lower-roman",
99 upper_roman => "upper-roman",
100 tamil => "tamil",
101 telugu => "telugu",
102 thai => "thai",
103 tibetan => "tibetan",
104 lower_alpha => "lower-alpha",
105 lower_latin => "lower-latin",
106 upper_alpha => "upper-alpha",
107 upper_latin => "upper-latin",
108 cjk_earthly_branch => "cjk-earthly-branch",
109 cjk_heavenly_stem => "cjk-heavenly-stem",
110 lower_greek => "lower-greek",
111 hiragana => "hiragana",
112 hiragana_iroha => "hiragana-iroha",
113 katakana => "katakana",
114 katakana_iroha => "katakana-iroha",
115 disc => "disc",
116 circle => "circle",
117 square => "square",
118 disclosure_open => "disclosure-open",
119 disclosure_closed => "disclosure-closed",
120 japanese_informal => "japanese-informal",
121 japanese_formal => "japanese-formal",
122 korean_hangul_formal => "korean-hangul-formal",
123 korean_hanja_informal => "korean-hanja-informal",
124 korean_hanja_formal => "korean-hanja-formal",
125 simp_chinese_informal => "simp-chinese-informal",
126 simp_chinese_formal => "simp-chinese-formal",
127 trad_chinese_informal => "trad-chinese-informal",
128 trad_chinese_formal => "trad-chinese-formal",
129 cjk_ideographic => "cjk-ideographic",
130 ethiopic_numeric => "ethiopic-numeric",
131 Custom(ref name) => name.as_str(),
132 };
133 serialize_identifier(name, dest)
134 }
135}
136
137impl CounterStyleIdent {
138 pub(crate) fn parse<'i, 't>(
139 input: &mut Parser<'i, 't>,
140 ) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
141 let ident = input.expect_ident()?;
142 Self::from_ident(ident).map_err(|_| {
143 ParseError::from(
144 CustomParseError::NoneIsNotAllowedInACounterStyleIdent,
145 )
146 })
147 }
148
149 pub(crate) fn parseForCounterStyleAtRule<'i, 't>(
150 input: &mut Parser<'i, 't>,
151 ) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
152 let counterStyleIdent = Self::parse(input)?;
153 if counterStyleIdent.is_not_allowed_in_counter_style_at_rule() {
154 Err(ParseError::from(CustomParseError::DecimalOrDiscIsNotAllowedInACounterStyleIdentInACounterStyleAtRule))
155 } else {
156 Ok(counterStyleIdent)
157 }
158 }
159
160 pub fn is_not_allowed_in_counter_style_at_rule(&self) -> bool {
161 use self::CounterStyleIdent::*;
162
163 match *self {
164 decimal | disc => true,
165 _ => false,
166 }
167 }
168
169 pub fn from_ident(anyCaseIdent: &str) -> Result<Self, ()> {
170 use self::CounterStyleIdent::*;
171
172 let lowerCaseIdent: String = anyCaseIdent.to_ascii_lowercase();
173
174 static KnownCounterStyleNames: phf::Map<
175 &'static str,
176 CounterStyleIdent,
177 > = phf_macros::phf_map! {
178 "decimal" => decimal,
179 "decimal-leading-zero" => decimal_leading_zero,
180 "arabic-indic" => arabic_indic,
181 "armenian" => armenian,
182 "upper-armenian" => upper_armenian,
183 "lower-armenian" => lower_armenian,
184 "bengali" => bengali,
185 "cambodian" => cambodian,
186 "khmer" => khmer,
187 "cjk-decimal" => cjk_decimal,
188 "devanagari" => devanagari,
189 "georgian" => georgian,
190 "gujarati" => gujarati,
191 "gurmukhi" => gurmukhi,
192 "hebrew" => hebrew,
193 "kannada" => kannada,
194 "lao" => lao,
195 "malayalam" => malayalam,
196 "mongolian" => mongolian,
197 "myanmar" => myanmar,
198 "oriya" => oriya,
199 "persian" => persian,
200 "lower-roman" => lower_roman,
201 "upper-roman" => upper_roman,
202 "tamil" => tamil,
203 "telugu" => telugu,
204 "thai" => thai,
205 "tibetan" => tibetan,
206 "lower-alpha" => lower_alpha,
207 "lower-latin" => lower_latin,
208 "upper-alpha" => upper_alpha,
209 "upper-latin" => upper_latin,
210 "cjk-earthly-branch" => cjk_earthly_branch,
211 "cjk-heavenly-stem" => cjk_heavenly_stem,
212 "lower-greek" => lower_greek,
213 "hiragana" => hiragana,
214 "hiragana-iroha" => hiragana_iroha,
215 "katakana" => katakana,
216 "katakana-iroha" => katakana_iroha,
217 "disc" => disc,
218 "circle" => circle,
219 "square" => square,
220 "disclosure-open" => disclosure_open,
221 "disclosure-closed" => disclosure_closed,
222 "japanese-informal" => japanese_informal,
223 "japanese-formal" => japanese_formal,
224 "korean-hangul-formal" => korean_hangul_formal,
225 "korean-hanja-informal" => korean_hanja_informal,
226 "korean-hanja-formal" => korean_hanja_formal,
227 "simp-chinese-informal" => simp_chinese_informal,
228 "simp-chinese-formal" => simp_chinese_formal,
229 "trad-chinese-informal" => trad_chinese_informal,
230 "trad-chinese-formal" => trad_chinese_formal,
231 "cjk-ideographic" => cjk_ideographic,
232 "ethiopic-numeric" => ethiopic_numeric,
233 };
234
235 match KnownCounterStyleNames.get(&lowerCaseIdent[..]) {
236 Some(value) => Ok(value.clone()),
237 None => {
238 if lowerCaseIdent == "none" {
239 Err(())
240 } else {
241 Ok(Custom(lowerCaseIdent))
242 }
243 }
244 }
245 }
246}