xref: /aosp_15_r20/external/pigweed/pw_console/py/pw_console/pigweed_code_style.py (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1# Copyright 2021 The Pigweed Authors
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7#     https://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14"""Brighter PigweedCode pygments style."""
15
16import re
17
18from prompt_toolkit.styles.style_transformation import get_opposite_color
19
20from pygments.style import Style  # type: ignore
21from pygments.token import Token  # type: ignore
22
23_pigweed_code_style_list = {
24    Token.Comment: '#778899',  # Lighter comments
25    Token.Comment.Hashbang: '#778899',
26    Token.Comment.Multiline: '#778899',
27    Token.Comment.Preproc: '#ff79c6',
28    Token.Comment.PreprocFile: '',
29    Token.Comment.Single: '#778899',
30    Token.Comment.Special: '#778899',
31    Token.Error: '#f8f8f2',
32    Token.Escape: '',
33    Token.Generic.Deleted: '#8b080b',
34    Token.Generic.Emph: '#f8f8f2',
35    Token.Generic.Error: '#f8f8f2',
36    Token.Generic.Heading: '#f8f8f2 bold',
37    Token.Generic.Inserted: '#f8f8f2 bold',
38    Token.Generic.Output: '#f8f8f2',
39    Token.Generic.Prompt: '#bfbfbf',  # Darker Prompt
40    Token.Generic.Strong: '#f8f8f2',
41    Token.Generic.Subheading: '#f8f8f2 bold',
42    Token.Generic.Traceback: '#f8f8f2',
43    Token.Generic: '#f8f8f2',
44    Token.Keyword.Constant: '#ff79c6',
45    Token.Keyword.Declaration: '#8be9fd',
46    Token.Keyword.Namespace: '#ff79c6',
47    Token.Keyword.Pseudo: '#ff79c6',
48    Token.Keyword.Reserved: '#ff79c6',
49    Token.Keyword.Type: '#8be9fd',
50    Token.Keyword: '#ff79c6',
51    Token.Literal.Date: '#f8f8f2',
52    Token.Literal.Number.Bin: '#bd93f9',
53    Token.Literal.Number.Float: '#bd93f9',
54    Token.Literal.Number.Hex: '#bd93f9',
55    Token.Literal.Number.Integer.Long: '#bd93f9',
56    Token.Literal.Number.Integer: '#bd93f9',
57    Token.Literal.Number.Oct: '#bd93f9',
58    Token.Literal.Number: '#bd93f9',
59    Token.Literal.String.Affix: '',
60    Token.Literal.String.Backtick: '#f1fa8c',
61    Token.Literal.String.Char: '#f1fa8c',
62    Token.Literal.String.Delimiter: '',
63    Token.Literal.String.Doc: '#f1fa8c',
64    Token.Literal.String.Double: '#f1fa8c',
65    Token.Literal.String.Escape: '#f1fa8c',
66    Token.Literal.String.Heredoc: '#f1fa8c',
67    Token.Literal.String.Interpol: '#f1fa8c',
68    Token.Literal.String.Other: '#f1fa8c',
69    Token.Literal.String.Regex: '#f1fa8c',
70    Token.Literal.String.Single: '#f1fa8c',
71    Token.Literal.String.Symbol: '#f1fa8c',
72    Token.Literal.String: '#f1fa8c',
73    Token.Literal: '#f8f8f2',
74    Token.Name.Attribute: '#50fa7b',
75    Token.Name.Builtin: '#8be9fd',
76    Token.Name.Builtin.Pseudo: '#f8f8f2',
77    Token.Name.Class: '#50fa7b',
78    Token.Name.Constant: '#f8f8f2',
79    Token.Name.Decorator: '#f8f8f2',
80    Token.Name.Entity: '#f8f8f2',
81    Token.Name.Exception: '#f8f8f2',
82    Token.Name.Function.Magic: '',
83    Token.Name.Function: '#50fa7b',
84    Token.Name.Label: '#8be9fd',
85    Token.Name.Namespace: '#f8f8f2',
86    Token.Name.Other: '#f8f8f2',
87    Token.Name.Property: '',
88    Token.Name.Tag: '#ff79c6',
89    Token.Name.Variable: '#8be9fd',
90    Token.Name.Variable.Class: '#8be9fd',
91    Token.Name.Variable.Global: '#8be9fd',
92    Token.Name.Variable.Instance: '#8be9fd',
93    Token.Name.Variable.Magic: '',
94    Token.Name: '#f8f8f2',
95    Token.Operator.Word: '#ff79c6',
96    Token.Operator: '#ff79c6',
97    Token.Other: '#f8f8f2',
98    Token.Punctuation: '#f8f8f2',
99    Token.Text.Whitespace: '#f8f8f2',
100    Token.Text: '#f8f8f2',
101    Token: '',
102}
103
104_COLOR_REGEX = re.compile(r'#(?P<hex>[0-9a-fA-F]{6}) *(?P<rest>.*?)$')
105
106
107def swap_light_dark(color: str) -> str:
108    if not color:
109        return color
110    match = _COLOR_REGEX.search(color)
111    if not match:
112        return color
113    match_groups = match.groupdict()
114    opposite_color = get_opposite_color(match_groups['hex'])
115    if not opposite_color:
116        return color
117    rest = match_groups.get('rest', '')
118    return '#' + ' '.join([opposite_color, rest])
119
120
121class PigweedCodeStyle(Style):
122    background_color = '#2e2e2e'
123    default_style = ''
124
125    styles = _pigweed_code_style_list
126
127
128class PigweedCodeLightStyle(Style):
129    background_color = '#f8f8f8'
130    default_style = ''
131
132    styles = {
133        key: swap_light_dark(value)
134        for key, value in _pigweed_code_style_list.items()
135    }
136
137
138_synthwave84_code_style_list = {
139    Token.Comment: '#848bbd',  # Lighter comments
140    Token.Comment.Hashbang: '#848bbd',
141    Token.Comment.Multiline: '#848bbd',
142    Token.Comment.Preproc: '#fede5d',
143    Token.Comment.PreprocFile: '',
144    Token.Comment.Single: '#848bbd',
145    Token.Comment.Special: '#848bbd',
146    Token.Error: '#fe4450',
147    Token.Escape: '',
148    Token.Generic.Deleted: '#fe4450',
149    Token.Generic.Emph: '#ffffff',
150    Token.Generic.Error: '#f97e72',
151    Token.Generic.Heading: '#0beb99 bold',
152    Token.Generic.Inserted: '#0beb99 bold',
153    Token.Generic.Output: '#ffffff',
154    Token.Generic.Prompt: '#495495',
155    Token.Generic.Strong: '#ffffff bold',
156    Token.Generic.Subheading: '#ffffff bold',
157    Token.Generic.Traceback: '#ffffff',
158    Token.Generic: '#ffffff',
159    Token.Keyword.Constant: '#f97e72',
160    Token.Keyword.Declaration: '#ff7edb',
161    Token.Keyword.Namespace: '#f97e72',
162    Token.Keyword.Pseudo: '#f97e72',
163    Token.Keyword.Reserved: '#f97e72',
164    Token.Keyword.Type: '#fe4450',
165    Token.Keyword: '#fede5d',
166    Token.Literal.Date: '#ffffff',
167    Token.Literal.Number.Bin: '#f97e72',
168    Token.Literal.Number.Float: '#f97e72',
169    Token.Literal.Number.Hex: '#f97e72',
170    Token.Literal.Number.Integer.Long: '#f97e72',
171    Token.Literal.Number.Integer: '#f97e72',
172    Token.Literal.Number.Oct: '#f97e72',
173    Token.Literal.Number: '#f97e72',
174    Token.Literal.String.Affix: '',
175    Token.Literal.String.Backtick: '#ff8b39',
176    Token.Literal.String.Char: '#ff8b39',
177    Token.Literal.String.Delimiter: '',
178    Token.Literal.String.Doc: '#ff8b39',
179    Token.Literal.String.Double: '#ff8b39',
180    Token.Literal.String.Escape: '#36f9f6',
181    Token.Literal.String.Heredoc: '#ff8b39',
182    Token.Literal.String.Interpol: '#ff8b39',
183    Token.Literal.String.Other: '#ff8b39',
184    Token.Literal.String.Regex: '#f97e72',
185    Token.Literal.String.Single: '#ff8b39',
186    Token.Literal.String.Symbol: '#ff8b39',
187    Token.Literal.String: '#ff8b39',
188    Token.Literal: '#ff7edb',
189    Token.Name.Attribute: '#fede5d',
190    Token.Name.Builtin: '#ff7edb',
191    Token.Name.Builtin.Pseudo: '#fe4450',
192    Token.Name.Class: '#fe4450',
193    Token.Name.Constant: '#f97e72',
194    Token.Name.Decorator: '#36f9f6',
195    Token.Name.Entity: '#fe4450',
196    Token.Name.Exception: '#fe4450',
197    Token.Name.Function.Magic: '#36f9f6',
198    Token.Name.Function: '#36f9f6',
199    Token.Name.Label: '#ff7edb',
200    Token.Name.Namespace: '#fe4450',
201    Token.Name.Other: '#f97e72',
202    Token.Name.Property: '#ff7edb',
203    Token.Name.Tag: '#f97e72',
204    Token.Name.Variable: '#ff7edb',
205    Token.Name.Variable.Class: '#ff7edb',
206    Token.Name.Variable.Global: '#ff7edb',
207    Token.Name.Variable.Instance: '#ff7edb',
208    Token.Name.Variable.Magic: '#fe4450',
209    Token.Name: '#ff7edb',
210    Token.Operator.Word: '#fede5d',
211    Token.Operator: '#fede5d',
212    Token.Other: '#ffffff',
213    Token.Punctuation: '#b6b1b1',
214    Token.Text.Whitespace: '#ffffff',
215    Token.Text: '#ffffff',
216    Token: '',
217}
218
219
220class Synthwave84CodeStyle(Style):
221    background_color = '#252334'
222    default_style = ''
223
224    styles = _synthwave84_code_style_list
225