-
Notifications
You must be signed in to change notification settings - Fork 94
Added Color-Scheme Feature #23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
14173d3
afd8d24
0482454
7cfcb54
f33e6e0
063d493
67b7109
e1c011b
5cbd870
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| from pygments.style import Style | ||
| from pygments.token import ( | ||
| Comment, Error, Keyword, Literal, Name, Number, Operator, String, Text | ||
| ) | ||
| from vardbg.output.video_writer.getstyle import get_style_by_name | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use absolute imports unless required. It makes maintenance harder. |
||
|
|
||
| scheme = get_style_by_name('wood') | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is no need for a separate "default" file. That can be handled as a simple alias in |
||
|
|
||
| class DefaultStyle(Style): | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be built on-the-fly for any style, not statically defined here. |
||
| background_color = scheme['base00'] | ||
| highlight_color = scheme['base02'] | ||
|
|
||
| styles = { | ||
| Text: scheme['base05'], | ||
| Error: scheme['base08'], # .err | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What are these comments for? |
||
|
|
||
| Comment: scheme['base03'], # .c | ||
| Comment.Preproc: scheme['base0f'], # .cp | ||
| Comment.PreprocFile: scheme['base0b'], # .cpf | ||
|
|
||
| Keyword: scheme['base0e'], # .k | ||
| Keyword.Type: scheme['base08'], # .kt | ||
|
|
||
| Name.Attribute: scheme['base0d'], # .na | ||
| Name.Builtin: scheme['base0d'], # .nb | ||
| Name.Builtin.Pseudo: scheme['base08'], # .bp | ||
| Name.Class: scheme['base0d'], # .nc | ||
| Name.Constant: scheme['base09'], # .no | ||
| Name.Decorator: scheme['base09'], # .nd | ||
| Name.Function: scheme['base0d'], # .nf | ||
| Name.Namespace: scheme['base0d'], # .nn | ||
| Name.Tag: scheme['base0e'], # .nt | ||
| Name.Variable: scheme['base0d'], # .nv | ||
| Name.Variable.Instance: scheme['base08'], # .vi | ||
|
|
||
| Number: scheme['base09'], # .m | ||
|
|
||
| Operator: scheme['base0c'], # .o | ||
| Operator.Word: scheme['base0e'], # .ow | ||
|
|
||
| Literal: scheme['base0b'], # .l | ||
|
|
||
| String: scheme['base0b'], # .s | ||
| String.Interpol: scheme['base0f'], # .si | ||
| String.Regex: scheme['base0c'], # .sr | ||
| String.Symbol: scheme['base09'], # .ss | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| scheme = { | ||
| 'base00' : '#231e18', | ||
| 'base01' : '#302b25', | ||
| 'base02' : '#48413a', | ||
| 'base03' : '#9d8b70', | ||
| 'base04' : '#b4a490', | ||
| 'base05' : '#cabcb1', | ||
| 'base06' : '#d7c8bc', | ||
| 'base07' : '#e4d4c8', | ||
| 'base08' : '#d35c5c', | ||
| 'base09' : '#ca7f32', | ||
| 'base0a' : '#e0ac16', | ||
| 'base0b' : '#b7ba53', | ||
| 'base0c' : '#6eb958', | ||
| 'base0d' : '#88a4d3', | ||
| 'base0e' : '#bb90e2', | ||
| 'base0f' : '#b49368' | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does not match Black's code style, which is what this project uses. Please run the pre-commit hooks to format it. |
||
| } | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Confusing indentation. |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,15 +1,18 @@ | ||
| import collections.abc | ||
| from pathlib import Path | ||
| import math | ||
|
|
||
| import toml | ||
| from pygments.formatter import Formatter | ||
| from pygments.styles.monokai import MonokaiStyle | ||
| from vardbg.assets.styles.default import DefaultStyle | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use absolute imports unless required. It makes maintenance harder. |
||
| from pygments.token import Token | ||
|
|
||
| FILE_PATH = Path(__file__).parent | ||
| ASSETS_PATH = FILE_PATH / ".." / ".." / "assets" | ||
| DEFAULT_CFG_PATH = FILE_PATH / "default_config.toml" | ||
|
|
||
| # List for colors in color_scheme | ||
| color_list = [] | ||
|
|
||
| # Source: https://stackoverflow.com/a/3233356 | ||
| def recursive_update(base, new): | ||
|
|
@@ -58,18 +61,27 @@ def parse_hex_color(string): | |
|
|
||
| return r, g, b, 255 | ||
|
|
||
| # Some color_scheme can have same txt and bg color | ||
| def color_contrast(body_txt): | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That sounds like a color scheme loading problem. No real color scheme will have the same foreground and background colors — how are people supposed to read the text if that's the case? |
||
| contrast = (int(body_txt[0] * 299) + int(body_txt[1] * 587) + int(body_txt[2] * 114)) / 1000 | ||
| if (contrast >= 128): | ||
| return (50,50,50,255) # return grey | ||
| else: | ||
| return (255,255,255,255) # return white | ||
|
|
||
| # Calculate distance btw two color | ||
| def color_similarity(base_col_val,oth_col_val): | ||
| return math.sqrt(sum((base_col_val[i]-oth_col_val[i])**2 for i in range(3))) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is no longer necessary.
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ya, You are right, Sorry I forgot to remove this part from the code |
||
|
|
||
| def load_style(style): | ||
| styles = {} | ||
| formatter = Formatter(style=style) | ||
|
|
||
| for token, params in formatter.style: | ||
| color = parse_hex_color(params["color"]) if params["color"] else None | ||
| # Italic and underline styles aren't supported, so just use bold for them | ||
| bold = params["bold"] or params["italic"] or params["underline"] | ||
|
|
||
| # Save style | ||
| styles[token] = {"color": color, "bold": bold} | ||
| styles[token] = {"color": color} | ||
|
|
||
| return styles | ||
|
|
||
|
|
@@ -106,16 +118,16 @@ def __init__(self, config_path): | |
| self.font_heading = (sub_path(fonts["heading"]), fonts["heading_size"]) | ||
| self.font_intro = (sub_path(fonts["intro"]), fonts["intro_size"]) | ||
|
|
||
| style = MonokaiStyle | ||
| style = DefaultStyle | ||
| self.styles = load_style(style) | ||
|
|
||
| self.bg = parse_hex_color(style.background_color) | ||
| self.highlight = parse_hex_color(style.highlight_color) | ||
| self.fg_divider = self.styles[Token.Generic.Subheading]["color"] | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Base16 colors should be used directly rather than translating them into a Pygments style and referencing that. |
||
| self.fg_heading = self.styles[Token.Name]["color"] | ||
| self.fg_body = self.styles[Token.Text]["color"] | ||
| self.fg_body = color_contrast(self.bg) | ||
| self.fg_watermark = self.styles[Token.Comment]["color"] | ||
|
|
||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Trailing whitespace; please run the pre-commit hooks to take care of this. |
||
| self.red = self.styles[Token.Operator]["color"] | ||
| self.green = self.styles[Token.Name.Function]["color"] | ||
| self.blue = self.styles[Token.Keyword]["color"] | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -45,3 +45,48 @@ heading_size = 24 | |
| # Intro font, used to render the intro screen | ||
| intro = "$ASSETS/fonts/Inter-Bold.ttf" | ||
| intro_size = 48 | ||
|
|
||
| [theme] | ||
| # Color scheme to use | ||
| # Available themes: | ||
| # - default | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These schemes no longer exist. |
||
| # - emacs | ||
| # - friendly | ||
| # - colorful | ||
| # - autumn | ||
| # - murphy | ||
| # - manni | ||
| # - monokai | ||
| # - perldoc | ||
| # - pastie | ||
| # - borland | ||
| # - trac | ||
| # - native | ||
| # - fruity | ||
| # - bw | ||
| # - vim | ||
| # - vs | ||
| # - tango | ||
| # - rrt | ||
| # - xcode | ||
| # - igor | ||
| # - paraiso-light | ||
| # - paraiso-dark | ||
| # - lovelace | ||
| # - algol | ||
| # - algol_nu | ||
| # - arduino | ||
| # - rainbow_dash | ||
| # - abap | ||
| # - solarized-dark | ||
| # - solarized-light | ||
| # - sas | ||
| # - stata | ||
| # - stata-light | ||
| # - stata-dark | ||
| color_scheme = "monokai" | ||
|
|
||
| # Maximum distance color can have with other color | ||
| max_red_dist = 360 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No longer necessary. |
||
| max_green_dist = 360 | ||
| max_blue_dist = 360 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| """ | ||
| vardbg.styles | ||
| ~~~~~~~~~~~~~~~ | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What's the point of this docstring? |
||
| """ | ||
|
|
||
| from pygments.util import ClassNotFound | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid |
||
|
|
||
|
|
||
| STYLE_ENTRY_POINT = 'vardbg.assets.styles' | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need for an absolute package path here. |
||
|
|
||
|
|
||
| def iter_entry_points(group_name): | ||
| try: | ||
| import pkg_resources | ||
| except (ImportError, IOError): | ||
| return [] | ||
|
|
||
| return pkg_resources.iter_entry_points(group_name) | ||
|
|
||
| def find_plugin_styles(): | ||
| for entrypoint in iter_entry_points(STYLE_ENTRY_POINT): | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need for runtime scheme discovery here. For something simple like this, it's fine to just import everything in |
||
| yield entrypoint.name, entrypoint.load() | ||
|
|
||
| #: Maps style names to 'submodule::dictname'. | ||
| STYLE_MAP = { | ||
| 'wood': 'wood::scheme' | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This shouldn't be hard-coded. |
||
| } | ||
|
|
||
|
|
||
| def get_style_by_name(name): | ||
| if name in STYLE_MAP: | ||
| mod, cls = STYLE_MAP[name].split('::') | ||
| builtin = "yes" | ||
| else: | ||
| for found_name, style in find_plugin_styles(): | ||
| if name == found_name: | ||
| return style | ||
| # perhaps it got dropped into our styles package | ||
| builtin = "" | ||
| mod = name | ||
| cls = name.title() + "Style" | ||
| print(mod) | ||
|
|
||
| try: | ||
| mod = __import__('vardbg.assets.styles.' + mod, None, None, [cls]) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need to use an internal Python function here. |
||
| except ImportError: | ||
| raise ClassNotFound("Could not find style module %r" % mod + | ||
| (builtin and ", though it should be builtin") + ".") | ||
| try: | ||
| return getattr(mod, cls) | ||
| except AttributeError: | ||
| raise ClassNotFound("Could not find style class %r in style module." % cls) | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The assets directory is for static assets. There should not be any Python code in it.