lewp_css/domain/
counter_style_ident.rs

1// This file is part of css. It is subject to the license terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/css/master/COPYRIGHT. No part of predicator, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file.
2// Copyright © 2017 The developers of css. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/css/master/COPYRIGHT.
3
4use {
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}