pulldown_latex/parser/
tables.rs

1// TODO: Consider using `phf`s for this
2
3use crate::event::DelimiterType;
4
5use super::Token;
6
7#[rustfmt::skip]
8pub fn is_binary(c: char) -> bool {
9    matches!(
10        c,
11        '\u{002B}' | '\u{002F}' | '\u{00B1}' | '\u{005C}' | '\u{00B7}' | '\u{00D7}' | '\u{00F7}' | '\u{2022}' |
12        '\u{2040}' | '\u{2044}' | '\u{204E}' | '\u{2061}' | '\u{2062}' | '\u{2213}' | '\u{2214}' | '\u{2215}' |
13        '\u{2216}' | '\u{2217}' | '\u{2218}' | '\u{2219}' | '\u{2227}' | '\u{2228}' | '\u{2229}' | '\u{222A}' |
14        '\u{2238}' | '\u{223E}' | '\u{2240}' | '\u{228C}' | '\u{228D}' | '\u{228E}' | '\u{2293}' | '\u{2294}' |
15        '\u{2295}' | '\u{2296}' | '\u{2297}' | '\u{2298}' | '\u{2299}' | '\u{229A}' | '\u{229B}' | '\u{229C}' |
16        '\u{229D}' | '\u{229E}' | '\u{229F}' | '\u{22A0}' | '\u{22A1}' | '\u{22B9}' | '\u{22BA}' | '\u{22BB}' |
17        '\u{22BC}' | '\u{22BD}' | '\u{22C4}' | '\u{22C5}' | '\u{22C6}' | '\u{22C7}' | '\u{22C9}' | '\u{22CA}' |
18        '\u{22CB}' | '\u{22CC}' | '\u{22CE}' | '\u{22CF}' | '\u{22D2}' | '\u{22D3}' | '\u{2305}' | '\u{2306}' |
19        '\u{233D}' | '\u{25B2}' | '\u{25B3}' | '\u{25B4}' | '\u{25B5}' | '\u{25B6}' | '\u{25B7}' | '\u{25B8}' |
20        '\u{25B9}' | '\u{25BC}' | '\u{25BD}' | '\u{25BE}' | '\u{25BF}' | '\u{25C0}' | '\u{25C1}' | '\u{25C2}' |
21        '\u{25C3}' | '\u{25C4}' | '\u{25C5}' | '\u{25CA}' | '\u{25CB}' | '\u{25E6}' | '\u{25EB}' | '\u{25EC}' |
22        '\u{25F8}' | '\u{25F9}' | '\u{25FA}' | '\u{25FB}' | '\u{25FC}' | '\u{25FD}' | '\u{25FE}' | '\u{25FF}' |
23        '\u{2605}' | '\u{2606}' | '\u{27CE}' | '\u{27CF}' | '\u{27D1}' | '\u{27E0}' | '\u{27E1}' | '\u{27E2}' |
24        '\u{27E3}' | '\u{29B6}' | '\u{29B7}' | '\u{29B8}' | '\u{29B9}' | '\u{29C0}' | '\u{29C1}' | '\u{29C4}' |
25        '\u{29C5}' | '\u{29C6}' | '\u{29C7}' | '\u{29C8}' | '\u{27E4}' | '\u{27E5}' | '\u{29D6}' | '\u{29D7}' |
26        '\u{29E2}' | '\u{29EB}' | '\u{29F5}' | '\u{29F6}' | '\u{29F7}' | '\u{29FA}' | '\u{29FB}' | '\u{29FE}' |
27        '\u{29FF}' | '\u{2A22}' | '\u{2A23}' | '\u{2A24}' | '\u{2A25}' | '\u{2A26}' | '\u{2A27}' | '\u{2A28}' |
28        '\u{2A29}' | '\u{2A2A}' | '\u{2A2B}' | '\u{2A2C}' | '\u{2A2D}' | '\u{2A2E}' | '\u{2A2F}' | '\u{2A30}' |
29        '\u{2A31}' | '\u{2A32}' | '\u{2A33}' | '\u{2A34}' | '\u{2A35}' | '\u{2A36}' | '\u{2A37}' | '\u{2A38}' |
30        '\u{2A39}' | '\u{2A3A}' | '\u{2A3B}' | '\u{2A3C}' | '\u{2A3D}' | '\u{2A3E}' | '\u{2A3F}' | '\u{2A40}' |
31        '\u{2A41}' | '\u{2A42}' | '\u{2A43}' | '\u{2A44}' | '\u{2A45}' | '\u{2A46}' | '\u{2A47}' | '\u{2A48}' |
32        '\u{2A49}' | '\u{2A4A}' | '\u{2A4B}' | '\u{2A4C}' | '\u{2A4D}' | '\u{2A4E}' | '\u{2A4F}' | '\u{2A50}' |
33        '\u{2A51}' | '\u{2A52}' | '\u{2A53}' | '\u{2A54}' | '\u{2A55}' | '\u{2A56}' | '\u{2A57}' | '\u{2A58}' |
34        '\u{2A71}' | '\u{2A72}' | '\u{2AF4}' | '\u{2AF5}' | '\u{2AF6}' | '\u{2AFB}' | '\u{2AFD}' | '\u{2AFE}' 
35    )
36}
37
38#[rustfmt::skip]
39pub fn is_relation(c: char) -> bool {
40    matches!(
41        c,
42        '\u{003A}' | '\u{003C}' | '\u{003D}' | '\u{003E}' | '\u{2020}' | '\u{2021}' | '\u{204F}' | '\u{2050}' |
43        '\u{2190}'..='\u{21B3}' | '\u{21B6}' | '\u{21B7}' | '\u{21BA}'..='\u{21FF}' | '\u{2208}' | '\u{2209}' |
44        '\u{220A}' | '\u{220B}' | '\u{220C}' | '\u{220D}' | '\u{221D}' | '\u{2223}' | '\u{2224}' | '\u{2225}' |
45        '\u{2226}' | '\u{2234}' | '\u{2235}' | '\u{2236}' | '\u{2237}' | '\u{2239}' | '\u{223A}' | '\u{223B}' |
46        '\u{223C}' | '\u{223D}' | '\u{2241}' | '\u{2242}' | '\u{2243}' | '\u{2244}' | '\u{2245}' | '\u{2246}' |
47        '\u{2247}' | '\u{2248}' | '\u{2249}' | '\u{224A}' | '\u{224B}' | '\u{224C}' | '\u{224D}' | '\u{224E}' |
48        '\u{224F}' | '\u{2250}' | '\u{2251}' | '\u{2252}' | '\u{2253}' | '\u{2254}' | '\u{2255}' | '\u{2256}' |
49        '\u{2257}' | '\u{2258}' | '\u{2259}' | '\u{225A}' | '\u{225B}' | '\u{225C}' | '\u{225D}' | '\u{225E}' |
50        '\u{225F}' | '\u{2260}' | '\u{2261}' | '\u{2262}' | '\u{2263}' | '\u{2264}' | '\u{2265}' | '\u{2266}' |
51        '\u{2267}' | '\u{2268}' | '\u{2269}' | '\u{226A}' | '\u{226B}' | '\u{226C}' | '\u{226D}' | '\u{226E}' |
52        '\u{226F}' | '\u{2270}' | '\u{2271}' | '\u{2272}' | '\u{2273}' | '\u{2274}' | '\u{2275}' | '\u{2276}' |
53        '\u{2277}' | '\u{2278}' | '\u{2279}' | '\u{227A}' | '\u{227B}' | '\u{227C}' | '\u{227D}' | '\u{227E}' |
54        '\u{227F}' | '\u{2280}' | '\u{2281}' | '\u{2282}' | '\u{2283}' | '\u{2284}' | '\u{2285}' | '\u{2286}' |
55        '\u{2287}' | '\u{2288}' | '\u{2289}' | '\u{228A}' | '\u{228B}' | '\u{228F}' | '\u{2290}' | '\u{2291}' |
56        '\u{2292}' | '\u{22A2}' | '\u{22A3}' | '\u{22A5}' | '\u{22A6}' | '\u{22A7}' | '\u{22A8}' | '\u{22A9}' |
57        '\u{22AA}' | '\u{22AB}' | '\u{22AC}' | '\u{22AD}' | '\u{22AE}' | '\u{22AF}' | '\u{22B0}' | '\u{22B1}' |
58        '\u{22B2}' | '\u{22B3}' | '\u{22B4}' | '\u{22B5}' | '\u{22B6}' | '\u{22B7}' | '\u{22B8}' | '\u{22C8}' |
59        '\u{22CD}' | '\u{22D0}' | '\u{22D1}' | '\u{22D4}' | '\u{22D5}' | '\u{22D6}' | '\u{22D7}' | '\u{22D8}' |
60        '\u{22D9}' | '\u{22DA}' | '\u{22DB}' | '\u{22DC}' | '\u{22DD}' | '\u{22DE}' | '\u{22DF}' | '\u{22E0}' |
61        '\u{22E1}' | '\u{22E2}' | '\u{22E3}' | '\u{22E4}' | '\u{22E5}' | '\u{22E6}' | '\u{22E7}' | '\u{22E8}' |
62        '\u{22E9}' | '\u{22EA}' | '\u{22EB}' | '\u{22EC}' | '\u{22ED}' | '\u{22EE}' | '\u{22EF}' | '\u{22F0}' |
63        '\u{22F1}' | '\u{22F2}' | '\u{22F3}' | '\u{22F4}' | '\u{22F5}' | '\u{22F6}' | '\u{22F7}' | '\u{22F8}' |
64        '\u{22F9}' | '\u{22FA}' | '\u{22FB}' | '\u{22FC}' | '\u{22FD}' | '\u{22FE}' | '\u{22FF}' | '\u{2322}' |
65        '\u{2323}' | '\u{233F}' | '\u{237C}' | '\u{23B0}' | '\u{23B1}' | '\u{27C2}' | '\u{27C3}' | '\u{27C4}' |
66        '\u{27C5}' | '\u{27C6}' | '\u{27C7}' | '\u{27C8}' | '\u{27C9}' | '\u{27CA}' | '\u{27CB}' | '\u{27CD}' |
67        '\u{27D2}' | '\u{27D3}' | '\u{27D4}' | '\u{27DA}' | '\u{27DB}' | '\u{27DC}' | '\u{27DD}' | '\u{27DE}' |
68        '\u{27DF}' | '\u{27F0}' | '\u{27F1}' | '\u{27F2}' | '\u{27F3}' | '\u{27F4}' | '\u{27F5}' | '\u{27F6}' |
69        '\u{27F7}' | '\u{27F8}' | '\u{27F9}' | '\u{27FA}' | '\u{27FB}' | '\u{27FC}' | '\u{27FD}' | '\u{27FE}' |
70        '\u{27FF}' | '\u{2900}' | '\u{2901}' | '\u{2902}' | '\u{2903}' | '\u{2904}' | '\u{2905}' | '\u{2906}' |
71        '\u{2907}' | '\u{2908}' | '\u{2909}' | '\u{290A}' | '\u{290B}' | '\u{290C}' | '\u{290D}' | '\u{290E}' |
72        '\u{290F}' | '\u{2910}' | '\u{2911}' | '\u{2912}' | '\u{2913}' | '\u{2914}' | '\u{2915}' | '\u{2916}' |
73        '\u{2917}' | '\u{2918}' | '\u{2919}' | '\u{291A}' | '\u{291B}' | '\u{291C}' | '\u{291D}' | '\u{291E}' |
74        '\u{291F}' | '\u{2920}' | '\u{2921}' | '\u{2922}' | '\u{2923}' | '\u{2924}' | '\u{2925}' | '\u{2926}' |
75        '\u{2927}' | '\u{2928}' | '\u{2929}' | '\u{292A}' | '\u{292B}' | '\u{292C}' | '\u{292D}' | '\u{292E}' |
76        '\u{292F}' | '\u{2930}' | '\u{2931}' | '\u{2932}' | '\u{2933}' | '\u{2934}' | '\u{2935}' | '\u{2936}' |
77        '\u{2937}' | '\u{2938}' | '\u{2939}' | '\u{293A}' | '\u{293B}' | '\u{293C}' | '\u{293D}' | '\u{293E}' |
78        '\u{293F}' | '\u{2940}' | '\u{2941}' | '\u{2942}' | '\u{2943}' | '\u{2944}' | '\u{2945}' | '\u{2946}' |
79        '\u{2947}' | '\u{2948}' | '\u{2949}' | '\u{294A}' | '\u{294B}' | '\u{294C}' | '\u{294D}' | '\u{294E}' |
80        '\u{294F}' | '\u{2950}' | '\u{2951}' | '\u{2952}' | '\u{2953}' | '\u{2954}' | '\u{2955}' | '\u{2956}' |
81        '\u{2957}' | '\u{2958}' | '\u{2959}' | '\u{295A}' | '\u{295B}' | '\u{295C}' | '\u{295D}' | '\u{295E}' |
82        '\u{295F}' | '\u{2960}' | '\u{2961}' | '\u{2962}' | '\u{2963}' | '\u{2964}' | '\u{2965}' | '\u{2966}' |
83        '\u{2967}' | '\u{2968}' | '\u{2969}' | '\u{296A}' | '\u{296B}' | '\u{296C}' | '\u{296D}' | '\u{296E}' |
84        '\u{296F}' | '\u{2970}' | '\u{2971}' | '\u{2972}' | '\u{2973}' | '\u{2974}' | '\u{2975}' | '\u{2976}' |
85        '\u{2977}' | '\u{2978}' | '\u{2979}' | '\u{297A}' | '\u{297B}' | '\u{297C}' | '\u{297D}' | '\u{297E}' |
86        '\u{297F}' | '\u{29CE}' | '\u{29CF}' | '\u{29D0}' | '\u{29D1}' | '\u{29D2}' | '\u{29D3}' | '\u{29D4}' |
87        '\u{29D5}' | '\u{29DF}' | '\u{29E1}' | '\u{29E3}' | '\u{29E4}' | '\u{29E5}' | '\u{29E6}' | '\u{29F4}' |
88        '\u{2A59}' | '\u{2A66}' | '\u{2A67}' | '\u{2A68}' | '\u{2A69}' | '\u{2A6A}' | '\u{2A6B}' | '\u{2A6C}' |
89        '\u{2A6D}' | '\u{2A6E}' | '\u{2A6F}' | '\u{2A70}' | '\u{2A73}' | '\u{2A74}' | '\u{2A75}' | '\u{2A76}' |
90        '\u{2A77}' | '\u{2A78}' | '\u{2A79}' | '\u{2A7A}' | '\u{2A7B}' | '\u{2A7C}' | '\u{2A7D}' | '\u{2A7E}' |
91        '\u{2A7F}' | '\u{2A80}' | '\u{2A81}' | '\u{2A82}' | '\u{2A83}' | '\u{2A84}' | '\u{2A85}' | '\u{2A86}' |
92        '\u{2A87}' | '\u{2A88}' | '\u{2A89}' | '\u{2A8A}' | '\u{2A8B}' | '\u{2A8C}' | '\u{2A8D}' | '\u{2A8E}' |
93        '\u{2A8F}' | '\u{2A90}' | '\u{2A91}' | '\u{2A92}' | '\u{2A93}' | '\u{2A94}' | '\u{2A95}' | '\u{2A96}' |
94        '\u{2A97}' | '\u{2A98}' | '\u{2A99}' | '\u{2A9A}' | '\u{2A9B}' | '\u{2A9C}' | '\u{2A9D}' | '\u{2A9E}' |
95        '\u{2A9F}' | '\u{2AA0}' | '\u{2AA1}' | '\u{2AA2}' | '\u{2AA3}' | '\u{2AA4}' | '\u{2AA5}' | '\u{2AA6}' |
96        '\u{2AA7}' | '\u{2AA8}' | '\u{2AA9}' | '\u{2AAA}' | '\u{2AAB}' | '\u{2AAC}' | '\u{2AAD}' | '\u{2AAE}' |
97        '\u{2AAF}' | '\u{2AB0}' | '\u{2AB1}' | '\u{2AB2}' | '\u{2AB3}' | '\u{2AB4}' | '\u{2AB5}' | '\u{2AB6}' |
98        '\u{2AB7}' | '\u{2AB8}' | '\u{2AB9}' | '\u{2ABA}' | '\u{2ABB}' | '\u{2ABC}' | '\u{2ABD}' | '\u{2ABE}' |
99        '\u{2ABF}' | '\u{2AC0}' | '\u{2AC1}' | '\u{2AC2}' | '\u{2AC3}' | '\u{2AC4}' | '\u{2AC5}' | '\u{2AC6}' |
100        '\u{2AC7}' | '\u{2AC8}' | '\u{2AC9}' | '\u{2ACA}' | '\u{2ACB}' | '\u{2ACC}' | '\u{2ACD}' | '\u{2ACE}' |
101        '\u{2ACF}' | '\u{2AD0}' | '\u{2AD1}' | '\u{2AD2}' | '\u{2AD3}' | '\u{2AD4}' | '\u{2AD5}' | '\u{2AD6}' |
102        '\u{2AD7}' | '\u{2AD8}' | '\u{2AD9}' | '\u{2ADA}' | '\u{2ADB}' | '\u{2ADC}' | '\u{2ADD}' | '\u{2ADE}' |
103        '\u{2ADF}' | '\u{2AE0}' | '\u{2AE2}' | '\u{2AE3}' | '\u{2AE4}' | '\u{2AE5}' | '\u{2AE6}' | '\u{2AE7}' |
104        '\u{2AE8}' | '\u{2AE9}' | '\u{2AEA}' | '\u{2AEB}' | '\u{2AEC}' | '\u{2AED}' | '\u{2AEE}' | '\u{2AEF}' |
105        '\u{2AF0}' | '\u{2AF2}' | '\u{2AF3}' | '\u{2AF7}' | '\u{2AF8}' | '\u{2AF9}' | '\u{2AFA}' | '\u{2B95}' |
106        '\u{2B00}'..='\u{2B11}' | '\u{2B30}'..='\u{2B44}' | '\u{2B45}' | '\u{2B46}' | '\u{2B47}'..='\u{2B4C}'
107    )
108}
109
110pub fn char_delimiter_map(c: char) -> Option<(char, DelimiterType)> {
111    Some(match c {
112        '(' | '⦇' | '⟮' | '[' | '⟦' | '⦃' | '⟨' | '⟪' | '⦉' | '⌊' | '⌈' | '┌' | '└' | '⎰' => {
113            (c, DelimiterType::Open)
114        }
115        ')' | '⦈' | '⟯' | ']' | '⟧' | '⦄' | '⟩' | '⟫' | '⦊' | '⌋' | '⌉' | '┐' | '┘' | '⎱' => {
116            (c, DelimiterType::Close)
117        }
118        '|' | '‖' | '↑' | '⇑' | '↓' | '⇓' | '↕' | '⇕' | '/' => {
119            (c, DelimiterType::Fence)
120        }
121        _ => return None,
122    })
123}
124
125/// Returns the matching delimiter for the given control sequence, if it exists.
126pub fn control_sequence_delimiter_map(cs: &str) -> Option<(char, DelimiterType)> {
127    Some(match cs {
128        "lparen" => ('(', DelimiterType::Open),
129        "rparen" => (')', DelimiterType::Close),
130        "llparenthesis" => ('⦇', DelimiterType::Open),
131        "rrparenthesis" => ('⦈', DelimiterType::Close),
132        "lgroup" => ('⟮', DelimiterType::Open),
133        "rgroup" => ('⟯', DelimiterType::Close),
134
135        "lbrack" => ('[', DelimiterType::Open),
136        "rbrack" => (']', DelimiterType::Close),
137        "lBrack" => ('⟦', DelimiterType::Open),
138        "rBrack" => ('⟧', DelimiterType::Close),
139
140        "{" | "lbrace" => ('{', DelimiterType::Open),
141        "}" | "rbrace" => ('}', DelimiterType::Close),
142        "lBrace" => ('⦃', DelimiterType::Open),
143        "rBrace" => ('⦄', DelimiterType::Close),
144
145        "langle" => ('⟨', DelimiterType::Open),
146        "rangle" => ('⟩', DelimiterType::Close),
147        "lAngle" => ('⟪', DelimiterType::Open),
148        "rAngle" => ('⟫', DelimiterType::Close),
149        "llangle" => ('⦉', DelimiterType::Open),
150        "rrangle" => ('⦊', DelimiterType::Close),
151
152        "lfloor" => ('⌊', DelimiterType::Open),
153        "rfloor" => ('⌋', DelimiterType::Close),
154        "lceil" => ('⌈', DelimiterType::Open),
155        "rceil" => ('⌉', DelimiterType::Close),
156        "ulcorner" => ('┌', DelimiterType::Open),
157        "urcorner" => ('┐', DelimiterType::Close),
158        "llcorner" => ('└', DelimiterType::Open),
159        "lrcorner" => ('┘', DelimiterType::Close),
160
161        "lmoustache" => ('⎰', DelimiterType::Open),
162        "rmoustache" => ('⎱', DelimiterType::Close),
163        "backslash" => ('\\', DelimiterType::Fence),
164
165        "vert" => ('|', DelimiterType::Fence),
166        "lvert" => ('|', DelimiterType::Open),
167        "rvert" => ('|', DelimiterType::Close),
168        "|" | "Vert" => ('‖', DelimiterType::Fence),
169        "lVert" => ('‖', DelimiterType::Open),
170        "rVert" => ('‖', DelimiterType::Close),
171        "uparrow" => ('↑', DelimiterType::Fence),
172        "Uparrow" => ('⇑', DelimiterType::Fence),
173        "downarrow" => ('↓', DelimiterType::Fence),
174        "Downarrow" => ('⇓', DelimiterType::Fence),
175        "updownarrow" => ('↕', DelimiterType::Fence),
176        "Updownarrow" => ('⇕', DelimiterType::Fence),
177        _ => return None,
178    })
179}
180
181/// Returns the matching delimiter character for the given token, if it exists, along with whether
182/// the delimiter is an opening (left) delimiter.
183pub fn token_to_delim(token: Token) -> Option<(char, DelimiterType)> {
184    match token {
185        Token::ControlSequence(cs) => control_sequence_delimiter_map(cs),
186        Token::Character(c) => char_delimiter_map(c.into()),
187    }
188}
189
190/// Returns whether the given string is a valid primitive color.
191///
192/// Named colors come from the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/CSS/named-color#value),
193/// which is a list of about 150 official css color names.
194pub fn primitive_color(color: &str) -> Option<(u8, u8, u8)> {
195    if color.len() > 20 {
196        return None;
197    };
198    Some(match color.to_lowercase().as_str() {
199        "aliceblue" => (240, 248, 255),
200        "antiquewhite" => (250, 235, 215),
201        "aqua" | "cyan" => (0, 255, 255),
202        "aquamarine" => (127, 255, 212),
203        "azure" => (240, 255, 255),
204        "beige" => (245, 245, 220),
205        "bisque" => (255, 228, 196),
206        "black" => (0, 0, 0),
207        "blanchedalmond" => (255, 235, 205),
208        "blue" => (0, 0, 255),
209        "blueviolet" => (138, 43, 226),
210        "brown" => (165, 42, 42),
211        "burlywood" => (222, 184, 135),
212        "cadetblue" => (95, 158, 160),
213        "chartreuse" => (127, 255, 0),
214        "chocolate" => (210, 105, 30),
215        "coral" => (255, 127, 80),
216        "cornflowerblue" => (100, 149, 237),
217        "cornsilk" => (255, 248, 220),
218        "crimson" => (220, 20, 60),
219        "darkblue" => (0, 0, 139),
220        "darkcyan" => (0, 139, 139),
221        "darkgoldenrod" => (184, 134, 11),
222        "darkgray" => (169, 169, 169),
223        "darkgreen" => (0, 100, 0),
224        "darkgrey" => (169, 169, 169),
225        "darkkhaki" => (189, 183, 107),
226        "darkmagenta" => (139, 0, 139),
227        "darkolivegreen" => (85, 107, 47),
228        "darkorange" => (255, 140, 0),
229        "darkorchid" => (153, 50, 204),
230        "darkred" => (139, 0, 0),
231        "darksalmon" => (233, 150, 122),
232        "darkseagreen" => (143, 188, 143),
233        "darkslateblue" => (72, 61, 139),
234        "darkslategray" => (47, 79, 79),
235        "darkslategrey" => (47, 79, 79),
236        "darkturquoise" => (0, 206, 209),
237        "darkviolet" => (148, 0, 211),
238        "deeppink" => (255, 20, 147),
239        "deepskyblue" => (0, 191, 255),
240        "dimgray" => (105, 105, 105),
241        "dimgrey" => (105, 105, 105),
242        "dodgerblue" => (30, 144, 255),
243        "firebrick" => (178, 34, 34),
244        "floralwhite" => (255, 250, 240),
245        "forestgreen" => (34, 139, 34),
246        "magenta" | "fuchsia" => (255, 0, 255),
247        "gainsboro" => (220, 220, 220),
248        "ghostwhite" => (248, 248, 255),
249        "gold" => (255, 215, 0),
250        "goldenrod" => (218, 165, 32),
251        "grey" | "gray" => (128, 128, 128),
252        "green" => (0, 128, 0),
253        "greenyellow" => (173, 255, 47),
254        "honeydew" => (240, 255, 240),
255        "hotpink" => (255, 105, 180),
256        "indianred" => (205, 92, 92),
257        "indigo" => (75, 0, 130),
258        "ivory" => (255, 255, 240),
259        "khaki" => (240, 230, 140),
260        "lavender" => (230, 230, 250),
261        "lavenderblush" => (255, 240, 245),
262        "lawngreen" => (124, 252, 0),
263        "lemonchiffon" => (255, 250, 205),
264        "lightblue" => (173, 216, 230),
265        "lightcoral" => (240, 128, 128),
266        "lightcyan" => (224, 255, 255),
267        "lightgoldenrodyellow" => (250, 250, 210),
268        "lightgray" => (211, 211, 211),
269        "lightgreen" => (144, 238, 144),
270        "lightgrey" => (211, 211, 211),
271        "lightpink" => (255, 182, 193),
272        "lightsalmon" => (255, 160, 122),
273        "lightseagreen" => (32, 178, 170),
274        "lightskyblue" => (135, 206, 250),
275        "lightslategray" => (119, 136, 153),
276        "lightslategrey" => (119, 136, 153),
277        "lightsteelblue" => (176, 196, 222),
278        "lightyellow" => (255, 255, 224),
279        "lime" => (0, 255, 0),
280        "limegreen" => (50, 205, 50),
281        "linen" => (250, 240, 230),
282        "maroon" => (128, 0, 0),
283        "mediumaquamarine" => (102, 205, 170),
284        "mediumblue" => (0, 0, 205),
285        "mediumorchid" => (186, 85, 211),
286        "mediumpurple" => (147, 112, 219),
287        "mediumseagreen" => (60, 179, 113),
288        "mediumslateblue" => (123, 104, 238),
289        "mediumspringgreen" => (0, 250, 154),
290        "mediumturquoise" => (72, 209, 204),
291        "mediumvioletred" => (199, 21, 133),
292        "midnightblue" => (25, 25, 112),
293        "mintcream" => (245, 255, 250),
294        "mistyrose" => (255, 228, 225),
295        "moccasin" => (255, 228, 181),
296        "navajowhite" => (255, 222, 173),
297        "navy" => (0, 0, 128),
298        "oldlace" => (253, 245, 230),
299        "olive" => (128, 128, 0),
300        "olivedrab" => (107, 142, 35),
301        "orange" => (255, 165, 0),
302        "orangered" => (255, 69, 0),
303        "orchid" => (218, 112, 214),
304        "palegoldenrod" => (238, 232, 170),
305        "palegreen" => (152, 251, 152),
306        "paleturquoise" => (175, 238, 238),
307        "palevioletred" => (219, 112, 147),
308        "papayawhip" => (255, 239, 213),
309        "peachpuff" => (255, 218, 185),
310        "peru" => (205, 133, 63),
311        "pink" => (255, 192, 203),
312        "plum" => (221, 160, 221),
313        "powderblue" => (176, 224, 230),
314        "purple" => (128, 0, 128),
315        "rebeccapurple" => (102, 51, 153),
316        "red" => (255, 0, 0),
317        "rosybrown" => (188, 143, 143),
318        "royalblue" => (65, 105, 225),
319        "saddlebrown" => (139, 69, 19),
320        "salmon" => (250, 128, 114),
321        "sandybrown" => (244, 164, 96),
322        "seagreen" => (46, 139, 87),
323        "seashell" => (255, 245, 238),
324        "sienna" => (160, 82, 45),
325        "silver" => (192, 192, 192),
326        "skyblue" => (135, 206, 235),
327        "slateblue" => (106, 90, 205),
328        "slategray" => (112, 128, 144),
329        "slategrey" => (112, 128, 144),
330        "snow" => (255, 250, 250),
331        "springgreen" => (0, 255, 127),
332        "steelblue" => (70, 130, 180),
333        "tan" => (210, 180, 140),
334        "teal" => (0, 128, 128),
335        "thistle" => (216, 191, 216),
336        "tomato" => (255, 99, 71),
337        "turquoise" => (64, 224, 208),
338        "violet" => (238, 130, 238),
339        "wheat" => (245, 222, 179),
340        "white" => (255, 255, 255),
341        "whitesmoke" => (245, 245, 245),
342        "yellow" => (255, 255, 0),
343        "yellowgreen" => (154, 205, 50),
344        _ => return None,
345    })
346}