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