237 lines
8.5 KiB
Python
237 lines
8.5 KiB
Python
|
"""
|
||
|
The default styling.
|
||
|
"""
|
||
|
|
||
|
from __future__ import annotations
|
||
|
|
||
|
from prompt_toolkit.cache import memoized
|
||
|
|
||
|
from .base import ANSI_COLOR_NAMES, BaseStyle
|
||
|
from .named_colors import NAMED_COLORS
|
||
|
from .style import Style, merge_styles
|
||
|
|
||
|
__all__ = [
|
||
|
"default_ui_style",
|
||
|
"default_pygments_style",
|
||
|
]
|
||
|
|
||
|
#: Default styling. Mapping from classnames to their style definition.
|
||
|
PROMPT_TOOLKIT_STYLE = [
|
||
|
# Highlighting of search matches in document.
|
||
|
("search", "bg:ansibrightyellow ansiblack"),
|
||
|
("search.current", ""),
|
||
|
# Incremental search.
|
||
|
("incsearch", ""),
|
||
|
("incsearch.current", "reverse"),
|
||
|
# Highlighting of select text in document.
|
||
|
("selected", "reverse"),
|
||
|
("cursor-column", "bg:#dddddd"),
|
||
|
("cursor-line", "underline"),
|
||
|
("color-column", "bg:#ccaacc"),
|
||
|
# Highlighting of matching brackets.
|
||
|
("matching-bracket", ""),
|
||
|
("matching-bracket.other", "#000000 bg:#aacccc"),
|
||
|
("matching-bracket.cursor", "#ff8888 bg:#880000"),
|
||
|
# Styling of other cursors, in case of block editing.
|
||
|
("multiple-cursors", "#000000 bg:#ccccaa"),
|
||
|
# Line numbers.
|
||
|
("line-number", "#888888"),
|
||
|
("line-number.current", "bold"),
|
||
|
("tilde", "#8888ff"),
|
||
|
# Default prompt.
|
||
|
("prompt", ""),
|
||
|
("prompt.arg", "noinherit"),
|
||
|
("prompt.arg.text", ""),
|
||
|
("prompt.search", "noinherit"),
|
||
|
("prompt.search.text", ""),
|
||
|
# Search toolbar.
|
||
|
("search-toolbar", "bold"),
|
||
|
("search-toolbar.text", "nobold"),
|
||
|
# System toolbar
|
||
|
("system-toolbar", "bold"),
|
||
|
("system-toolbar.text", "nobold"),
|
||
|
# "arg" toolbar.
|
||
|
("arg-toolbar", "bold"),
|
||
|
("arg-toolbar.text", "nobold"),
|
||
|
# Validation toolbar.
|
||
|
("validation-toolbar", "bg:#550000 #ffffff"),
|
||
|
("window-too-small", "bg:#550000 #ffffff"),
|
||
|
# Completions toolbar.
|
||
|
("completion-toolbar", "bg:#bbbbbb #000000"),
|
||
|
("completion-toolbar.arrow", "bg:#bbbbbb #000000 bold"),
|
||
|
("completion-toolbar.completion", "bg:#bbbbbb #000000"),
|
||
|
("completion-toolbar.completion.current", "bg:#444444 #ffffff"),
|
||
|
# Completions menu.
|
||
|
("completion-menu", "bg:#bbbbbb #000000"),
|
||
|
("completion-menu.completion", ""),
|
||
|
# (Note: for the current completion, we use 'reverse' on top of fg/bg
|
||
|
# colors. This is to have proper rendering with NO_COLOR=1).
|
||
|
("completion-menu.completion.current", "fg:#888888 bg:#ffffff reverse"),
|
||
|
("completion-menu.meta.completion", "bg:#999999 #000000"),
|
||
|
("completion-menu.meta.completion.current", "bg:#aaaaaa #000000"),
|
||
|
("completion-menu.multi-column-meta", "bg:#aaaaaa #000000"),
|
||
|
# Fuzzy matches in completion menu (for FuzzyCompleter).
|
||
|
("completion-menu.completion fuzzymatch.outside", "fg:#444444"),
|
||
|
("completion-menu.completion fuzzymatch.inside", "bold"),
|
||
|
("completion-menu.completion fuzzymatch.inside.character", "underline"),
|
||
|
("completion-menu.completion.current fuzzymatch.outside", "fg:default"),
|
||
|
("completion-menu.completion.current fuzzymatch.inside", "nobold"),
|
||
|
# Styling of readline-like completions.
|
||
|
("readline-like-completions", ""),
|
||
|
("readline-like-completions.completion", ""),
|
||
|
("readline-like-completions.completion fuzzymatch.outside", "#888888"),
|
||
|
("readline-like-completions.completion fuzzymatch.inside", ""),
|
||
|
("readline-like-completions.completion fuzzymatch.inside.character", "underline"),
|
||
|
# Scrollbars.
|
||
|
("scrollbar.background", "bg:#aaaaaa"),
|
||
|
("scrollbar.button", "bg:#444444"),
|
||
|
("scrollbar.arrow", "noinherit bold"),
|
||
|
# Start/end of scrollbars. Adding 'underline' here provides a nice little
|
||
|
# detail to the progress bar, but it doesn't look good on all terminals.
|
||
|
# ('scrollbar.start', 'underline #ffffff'),
|
||
|
# ('scrollbar.end', 'underline #000000'),
|
||
|
# Auto suggestion text.
|
||
|
("auto-suggestion", "#666666"),
|
||
|
# Trailing whitespace and tabs.
|
||
|
("trailing-whitespace", "#999999"),
|
||
|
("tab", "#999999"),
|
||
|
# When Control-C/D has been pressed. Grayed.
|
||
|
("aborting", "#888888 bg:default noreverse noitalic nounderline noblink"),
|
||
|
("exiting", "#888888 bg:default noreverse noitalic nounderline noblink"),
|
||
|
# Entering a Vi digraph.
|
||
|
("digraph", "#4444ff"),
|
||
|
# Control characters, like ^C, ^X.
|
||
|
("control-character", "ansiblue"),
|
||
|
# Non-breaking space.
|
||
|
("nbsp", "underline ansiyellow"),
|
||
|
# Default styling of HTML elements.
|
||
|
("i", "italic"),
|
||
|
("u", "underline"),
|
||
|
("s", "strike"),
|
||
|
("b", "bold"),
|
||
|
("em", "italic"),
|
||
|
("strong", "bold"),
|
||
|
("del", "strike"),
|
||
|
("hidden", "hidden"),
|
||
|
# It should be possible to use the style names in HTML.
|
||
|
# <reverse>...</reverse> or <noreverse>...</noreverse>.
|
||
|
("italic", "italic"),
|
||
|
("underline", "underline"),
|
||
|
("strike", "strike"),
|
||
|
("bold", "bold"),
|
||
|
("reverse", "reverse"),
|
||
|
("noitalic", "noitalic"),
|
||
|
("nounderline", "nounderline"),
|
||
|
("nostrike", "nostrike"),
|
||
|
("nobold", "nobold"),
|
||
|
("noreverse", "noreverse"),
|
||
|
# Prompt bottom toolbar
|
||
|
("bottom-toolbar", "reverse"),
|
||
|
]
|
||
|
|
||
|
|
||
|
# Style that will turn for instance the class 'red' into 'red'.
|
||
|
COLORS_STYLE = [(name, "fg:" + name) for name in ANSI_COLOR_NAMES] + [
|
||
|
(name.lower(), "fg:" + name) for name in NAMED_COLORS
|
||
|
]
|
||
|
|
||
|
|
||
|
WIDGETS_STYLE = [
|
||
|
# Dialog windows.
|
||
|
("dialog", "bg:#4444ff"),
|
||
|
("dialog.body", "bg:#ffffff #000000"),
|
||
|
("dialog.body text-area", "bg:#cccccc"),
|
||
|
("dialog.body text-area last-line", "underline"),
|
||
|
("dialog frame.label", "#ff0000 bold"),
|
||
|
# Scrollbars in dialogs.
|
||
|
("dialog.body scrollbar.background", ""),
|
||
|
("dialog.body scrollbar.button", "bg:#000000"),
|
||
|
("dialog.body scrollbar.arrow", ""),
|
||
|
("dialog.body scrollbar.start", "nounderline"),
|
||
|
("dialog.body scrollbar.end", "nounderline"),
|
||
|
# Buttons.
|
||
|
("button", ""),
|
||
|
("button.arrow", "bold"),
|
||
|
("button.focused", "bg:#aa0000 #ffffff"),
|
||
|
# Menu bars.
|
||
|
("menu-bar", "bg:#aaaaaa #000000"),
|
||
|
("menu-bar.selected-item", "bg:#ffffff #000000"),
|
||
|
("menu", "bg:#888888 #ffffff"),
|
||
|
("menu.border", "#aaaaaa"),
|
||
|
("menu.border shadow", "#444444"),
|
||
|
# Shadows.
|
||
|
("dialog shadow", "bg:#000088"),
|
||
|
("dialog.body shadow", "bg:#aaaaaa"),
|
||
|
("progress-bar", "bg:#000088"),
|
||
|
("progress-bar.used", "bg:#ff0000"),
|
||
|
]
|
||
|
|
||
|
|
||
|
# The default Pygments style, include this by default in case a Pygments lexer
|
||
|
# is used.
|
||
|
PYGMENTS_DEFAULT_STYLE = {
|
||
|
"pygments.whitespace": "#bbbbbb",
|
||
|
"pygments.comment": "italic #408080",
|
||
|
"pygments.comment.preproc": "noitalic #bc7a00",
|
||
|
"pygments.keyword": "bold #008000",
|
||
|
"pygments.keyword.pseudo": "nobold",
|
||
|
"pygments.keyword.type": "nobold #b00040",
|
||
|
"pygments.operator": "#666666",
|
||
|
"pygments.operator.word": "bold #aa22ff",
|
||
|
"pygments.name.builtin": "#008000",
|
||
|
"pygments.name.function": "#0000ff",
|
||
|
"pygments.name.class": "bold #0000ff",
|
||
|
"pygments.name.namespace": "bold #0000ff",
|
||
|
"pygments.name.exception": "bold #d2413a",
|
||
|
"pygments.name.variable": "#19177c",
|
||
|
"pygments.name.constant": "#880000",
|
||
|
"pygments.name.label": "#a0a000",
|
||
|
"pygments.name.entity": "bold #999999",
|
||
|
"pygments.name.attribute": "#7d9029",
|
||
|
"pygments.name.tag": "bold #008000",
|
||
|
"pygments.name.decorator": "#aa22ff",
|
||
|
# Note: In Pygments, Token.String is an alias for Token.Literal.String,
|
||
|
# and Token.Number as an alias for Token.Literal.Number.
|
||
|
"pygments.literal.string": "#ba2121",
|
||
|
"pygments.literal.string.doc": "italic",
|
||
|
"pygments.literal.string.interpol": "bold #bb6688",
|
||
|
"pygments.literal.string.escape": "bold #bb6622",
|
||
|
"pygments.literal.string.regex": "#bb6688",
|
||
|
"pygments.literal.string.symbol": "#19177c",
|
||
|
"pygments.literal.string.other": "#008000",
|
||
|
"pygments.literal.number": "#666666",
|
||
|
"pygments.generic.heading": "bold #000080",
|
||
|
"pygments.generic.subheading": "bold #800080",
|
||
|
"pygments.generic.deleted": "#a00000",
|
||
|
"pygments.generic.inserted": "#00a000",
|
||
|
"pygments.generic.error": "#ff0000",
|
||
|
"pygments.generic.emph": "italic",
|
||
|
"pygments.generic.strong": "bold",
|
||
|
"pygments.generic.prompt": "bold #000080",
|
||
|
"pygments.generic.output": "#888",
|
||
|
"pygments.generic.traceback": "#04d",
|
||
|
"pygments.error": "border:#ff0000",
|
||
|
}
|
||
|
|
||
|
|
||
|
@memoized()
|
||
|
def default_ui_style() -> BaseStyle:
|
||
|
"""
|
||
|
Create a default `Style` object.
|
||
|
"""
|
||
|
return merge_styles(
|
||
|
[
|
||
|
Style(PROMPT_TOOLKIT_STYLE),
|
||
|
Style(COLORS_STYLE),
|
||
|
Style(WIDGETS_STYLE),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
|
||
|
@memoized()
|
||
|
def default_pygments_style() -> Style:
|
||
|
"""
|
||
|
Create a `Style` object that contains the default Pygments style.
|
||
|
"""
|
||
|
return Style.from_dict(PYGMENTS_DEFAULT_STYLE)
|