Skip to main content

dialect/themes/
dracula.rs

1/// This theme is an implementation of [Dracula](https://draculatheme.com), and follows [its
2/// specification](https://spec.draculatheme.com) as closely as possible.
3#[derive(Debug)]
4pub struct Dracula;
5
6const FADED: crate::Rgb = crate::rgb!(98, 114, 164);
7const RED: crate::Rgb = crate::rgb!(255, 85, 85);
8const ORANGE: crate::Rgb = crate::rgb!(255, 184, 108);
9const YELLOW: crate::Rgb = crate::rgb!(241, 250, 140);
10const GREEN: crate::Rgb = crate::rgb!(80, 250, 123);
11const PURPLE: crate::Rgb = crate::rgb!(189, 147, 249);
12const CYAN: crate::Rgb = crate::rgb!(139, 233, 253);
13const PINK: crate::Rgb = crate::rgb!(255, 121, 198);
14
15impl crate::Theme for Dracula {
16    fn default_style(&self) -> crate::ResolvedStyle {
17        crate::ResolvedStyle {
18            fg_color: crate::rgb!(248, 248, 242),
19            bg_color: crate::rgb!(40, 42, 54),
20            is_bold: false,
21            is_italic: false,
22            is_underline: false,
23        }
24    }
25
26    fn style(&self, group: crate::HighlightGroup) -> crate::Style {
27        match group {
28            // Keywords
29            crate::HighlightGroup::CtrlFlowKeyword | crate::HighlightGroup::OtherKeyword => {
30                crate::Style {
31                    fg_color: Some(PINK),
32                    bg_color: None,
33                    is_bold: false,
34                    is_italic: false,
35                    is_underline: false,
36                }
37            }
38
39            // Functions
40            crate::HighlightGroup::FunctionDef | crate::HighlightGroup::FunctionCall => {
41                crate::Style {
42                    fg_color: Some(GREEN),
43                    bg_color: None,
44                    is_bold: false,
45                    is_italic: false,
46                    is_underline: false,
47                }
48            }
49
50            // Types
51            crate::HighlightGroup::TyDef
52            | crate::HighlightGroup::TyUse
53            | crate::HighlightGroup::PrimitiveTy => crate::Style {
54                fg_color: Some(CYAN),
55                bg_color: None,
56                is_bold: false,
57                is_italic: false,
58                is_underline: false,
59            },
60
61            // Interfaces
62            crate::HighlightGroup::InterfaceDef | crate::HighlightGroup::InterfaceUse => {
63                crate::Style {
64                    fg_color: Some(CYAN),
65                    bg_color: None,
66                    is_bold: false,
67                    is_italic: true,
68                    is_underline: false,
69                }
70            }
71
72            // Variables
73            crate::HighlightGroup::VariableDef
74            | crate::HighlightGroup::VariableUse
75            | crate::HighlightGroup::MemberDef
76            | crate::HighlightGroup::MemberUse => crate::Style {
77                fg_color: None,
78                bg_color: None,
79                is_bold: false,
80                is_italic: false,
81                is_underline: false,
82            },
83
84            // Function parameters
85            crate::HighlightGroup::FunctionParam => crate::Style {
86                fg_color: Some(ORANGE),
87                bg_color: None,
88                is_bold: false,
89                is_italic: true,
90                is_underline: false,
91            },
92
93            // Constants
94            crate::HighlightGroup::ConstantDef
95            | crate::HighlightGroup::ConstantUse
96            | crate::HighlightGroup::Number
97            | crate::HighlightGroup::Boolean
98            | crate::HighlightGroup::Character
99            | crate::HighlightGroup::CharacterDelimiter => crate::Style {
100                fg_color: Some(PURPLE),
101                bg_color: None,
102                is_bold: false,
103                is_italic: false,
104                is_underline: false,
105            },
106
107            // Modules
108            crate::HighlightGroup::ModuleDef | crate::HighlightGroup::ModuleUse => crate::Style {
109                fg_color: None,
110                bg_color: None,
111                is_bold: false,
112                is_italic: false,
113                is_underline: false,
114            },
115
116            // Macros and other preprocessor-related highlight groups
117            crate::HighlightGroup::MacroDef
118            | crate::HighlightGroup::MacroUse
119            | crate::HighlightGroup::PreProc => crate::Style {
120                fg_color: Some(CYAN),
121                bg_color: None,
122                is_bold: false,
123                is_italic: false,
124                is_underline: false,
125            },
126
127            // Attributes
128            crate::HighlightGroup::Attribute => crate::Style {
129                fg_color: Some(GREEN),
130                bg_color: None,
131                is_bold: false,
132                is_italic: true,
133                is_underline: false,
134            },
135
136            // Strings
137            crate::HighlightGroup::String | crate::HighlightGroup::StringDelimiter => {
138                crate::Style {
139                    fg_color: Some(YELLOW),
140                    bg_color: None,
141                    is_bold: false,
142                    is_italic: false,
143                    is_underline: false,
144                }
145            }
146
147            // Special identifiers
148            crate::HighlightGroup::SpecialIdentDef | crate::HighlightGroup::SpecialIdentUse => {
149                crate::Style {
150                    fg_color: Some(GREEN),
151                    bg_color: None,
152                    is_bold: false,
153                    is_italic: false,
154                    is_underline: false,
155                }
156            }
157
158            // Comments
159            crate::HighlightGroup::Comment | crate::HighlightGroup::DocComment => crate::Style {
160                fg_color: Some(FADED),
161                bg_color: None,
162                is_bold: false,
163                is_italic: false,
164                is_underline: false,
165            },
166
167            // Some punctuation gets a colour
168            crate::HighlightGroup::PointerOper
169            | crate::HighlightGroup::AssignOper
170            | crate::HighlightGroup::BinaryOper
171            | crate::HighlightGroup::OtherOper
172            | crate::HighlightGroup::Separator => crate::Style {
173                fg_color: Some(PINK),
174                bg_color: None,
175                is_bold: false,
176                is_italic: false,
177                is_underline: false,
178            },
179
180            // Other punctuation doesn’t
181            crate::HighlightGroup::MemberOper
182            | crate::HighlightGroup::Delimiter
183            | crate::HighlightGroup::Terminator => crate::Style {
184                fg_color: None,
185                bg_color: None,
186                is_bold: false,
187                is_italic: false,
188                is_underline: false,
189            },
190
191            // Errors
192            crate::HighlightGroup::Error => crate::Style {
193                fg_color: Some(RED),
194                bg_color: None,
195                is_bold: false,
196                is_italic: false,
197                is_underline: false,
198            },
199        }
200    }
201}