Follow terminal ANSI color styles

Removes the default solarized color scheme and custom http lexer class.
This commit is contained in:
Davorin Šego 2017-03-06 01:05:50 +01:00
parent f74670fac1
commit b0fde07cfd
2 changed files with 8 additions and 144 deletions

View File

@ -20,7 +20,7 @@ from httpie.input import (
PRETTY_STDOUT_TTY_ONLY, SessionNameValidator, PRETTY_STDOUT_TTY_ONLY, SessionNameValidator,
readable_file_arg, SSL_VERSION_ARG_MAPPING readable_file_arg, SSL_VERSION_ARG_MAPPING
) )
from httpie.output.formatters.colors import AVAILABLE_STYLES, DEFAULT_STYLE from httpie.output.formatters.colors import AVAILABLE_STYLES
from httpie.plugins import plugin_manager from httpie.plugins import plugin_manager
from httpie.plugins.builtin import BuiltinAuthPlugin from httpie.plugins.builtin import BuiltinAuthPlugin
from httpie.sessions import DEFAULT_SESSIONS_DIR from httpie.sessions import DEFAULT_SESSIONS_DIR
@ -204,10 +204,9 @@ output_processing.add_argument(
'--style', '-s', '--style', '-s',
dest='style', dest='style',
metavar='STYLE', metavar='STYLE',
default=DEFAULT_STYLE,
choices=AVAILABLE_STYLES, choices=AVAILABLE_STYLES,
help=""" help="""
Output coloring style (default is "{default}"). One of: Output coloring style. One of:
{available} {available}
@ -216,7 +215,6 @@ output_processing.add_argument(
(e.g., via `export TERM=xterm-256color' in your ~/.bashrc). (e.g., via `export TERM=xterm-256color' in your ~/.bashrc).
""".format( """.format(
default=DEFAULT_STYLE,
available='\n'.join( available='\n'.join(
'{0}{1}'.format(8 * ' ', line.strip()) '{0}{1}'.format(8 * ' ', line.strip())
for line in wrap(', '.join(sorted(AVAILABLE_STYLES)), 60) for line in wrap(', '.join(sorted(AVAILABLE_STYLES)), 60)

View File

@ -10,20 +10,12 @@ from pygments.formatters.terminal import TerminalFormatter
from pygments.formatters.terminal256 import Terminal256Formatter from pygments.formatters.terminal256 import Terminal256Formatter
from pygments.lexers.special import TextLexer from pygments.lexers.special import TextLexer
from pygments.util import ClassNotFound from pygments.util import ClassNotFound
from pygments.lexers.text import HttpLexer
from httpie.compat import is_windows
from httpie.plugins import FormatterPlugin from httpie.plugins import FormatterPlugin
AVAILABLE_STYLES = set(pygments.styles.STYLE_MAP.keys()) AVAILABLE_STYLES = set(pygments.styles.STYLE_MAP.keys())
AVAILABLE_STYLES.add('solarized')
if is_windows:
# Colors on Windows via colorama don't look that
# great and fruity seems to give the best result there
DEFAULT_STYLE = 'fruity'
else:
DEFAULT_STYLE = 'solarized'
class ColorFormatter(FormatterPlugin): class ColorFormatter(FormatterPlugin):
@ -37,7 +29,7 @@ class ColorFormatter(FormatterPlugin):
group_name = 'colors' group_name = 'colors'
def __init__(self, env, explicit_json=False, def __init__(self, env, explicit_json=False,
color_scheme=DEFAULT_STYLE, **kwargs): color_scheme=None, **kwargs):
super(ColorFormatter, self).__init__(**kwargs) super(ColorFormatter, self).__init__(**kwargs)
if not env.colors: if not env.colors:
self.enabled = False self.enabled = False
@ -46,19 +38,13 @@ class ColorFormatter(FormatterPlugin):
# --json, -j # --json, -j
self.explicit_json = explicit_json self.explicit_json = explicit_json
try: if color_scheme and env.colors == 256:
style_class = pygments.styles.get_style_by_name(color_scheme) self.formatter = Terminal256Formatter(style=color_scheme)
except ClassNotFound:
style_class = Solarized256Style
if env.colors == 256:
fmt_class = Terminal256Formatter
else: else:
fmt_class = TerminalFormatter self.formatter = TerminalFormatter()
self.formatter = fmt_class(style=style_class)
def format_headers(self, headers): def format_headers(self, headers):
return pygments.highlight(headers, HTTPLexer(), self.formatter).strip() return pygments.highlight(headers, HttpLexer(), self.formatter).strip()
def format_body(self, body, mime): def format_body(self, body, mime):
lexer = self.get_lexer(mime, body) lexer = self.get_lexer(mime, body)
@ -119,123 +105,3 @@ def get_lexer(mime, explicit_json=False, body=''):
lexer = pygments.lexers.get_lexer_by_name('json') lexer = pygments.lexers.get_lexer_by_name('json')
return lexer return lexer
class HTTPLexer(pygments.lexer.RegexLexer):
"""Simplified HTTP lexer for Pygments.
It only operates on headers and provides a stronger contrast between
their names and values than the original one bundled with Pygments
(:class:`pygments.lexers.text import HttpLexer`), especially when
Solarized color scheme is used.
"""
name = 'HTTP'
aliases = ['http']
filenames = ['*.http']
tokens = {
'root': [
# Request-Line
(r'([A-Z]+)( +)([^ ]+)( +)(HTTP)(/)(\d+\.\d+)',
pygments.lexer.bygroups(
pygments.token.Name.Function,
pygments.token.Text,
pygments.token.Name.Namespace,
pygments.token.Text,
pygments.token.Keyword.Reserved,
pygments.token.Operator,
pygments.token.Number
)),
# Response Status-Line
(r'(HTTP)(/)(\d+\.\d+)( +)(\d{3})( +)(.+)',
pygments.lexer.bygroups(
pygments.token.Keyword.Reserved, # 'HTTP'
pygments.token.Operator, # '/'
pygments.token.Number, # Version
pygments.token.Text,
pygments.token.Number, # Status code
pygments.token.Text,
pygments.token.Name.Exception, # Reason
)),
# Header
(r'(.*?)( *)(:)( *)(.+)', pygments.lexer.bygroups(
pygments.token.Name.Attribute, # Name
pygments.token.Text,
pygments.token.Operator, # Colon
pygments.token.Text,
pygments.token.String # Value
))
]
}
class Solarized256Style(pygments.style.Style):
"""
solarized256
------------
A Pygments style inspired by Solarized's 256 color mode.
:copyright: (c) 2011 by Hank Gay, (c) 2012 by John Mastro.
:license: BSD, see LICENSE for more details.
"""
BASE03 = "#1c1c1c"
BASE02 = "#262626"
BASE01 = "#4e4e4e"
BASE00 = "#585858"
BASE0 = "#808080"
BASE1 = "#8a8a8a"
BASE2 = "#d7d7af"
BASE3 = "#ffffd7"
YELLOW = "#af8700"
ORANGE = "#d75f00"
RED = "#af0000"
MAGENTA = "#af005f"
VIOLET = "#5f5faf"
BLUE = "#0087ff"
CYAN = "#00afaf"
GREEN = "#5f8700"
background_color = BASE03
styles = {
pygments.token.Keyword: GREEN,
pygments.token.Keyword.Constant: ORANGE,
pygments.token.Keyword.Declaration: BLUE,
pygments.token.Keyword.Namespace: ORANGE,
pygments.token.Keyword.Reserved: BLUE,
pygments.token.Keyword.Type: RED,
pygments.token.Name.Attribute: BASE1,
pygments.token.Name.Builtin: BLUE,
pygments.token.Name.Builtin.Pseudo: BLUE,
pygments.token.Name.Class: BLUE,
pygments.token.Name.Constant: ORANGE,
pygments.token.Name.Decorator: BLUE,
pygments.token.Name.Entity: ORANGE,
pygments.token.Name.Exception: YELLOW,
pygments.token.Name.Function: BLUE,
pygments.token.Name.Tag: BLUE,
pygments.token.Name.Variable: BLUE,
pygments.token.String: CYAN,
pygments.token.String.Backtick: BASE01,
pygments.token.String.Char: CYAN,
pygments.token.String.Doc: CYAN,
pygments.token.String.Escape: RED,
pygments.token.String.Heredoc: CYAN,
pygments.token.String.Regex: RED,
pygments.token.Number: CYAN,
pygments.token.Operator: BASE1,
pygments.token.Operator.Word: GREEN,
pygments.token.Comment: BASE01,
pygments.token.Comment.Preproc: GREEN,
pygments.token.Comment.Special: GREEN,
pygments.token.Generic.Deleted: CYAN,
pygments.token.Generic.Emph: 'italic',
pygments.token.Generic.Error: RED,
pygments.token.Generic.Heading: ORANGE,
pygments.token.Generic.Inserted: GREEN,
pygments.token.Generic.Strong: 'bold',
pygments.token.Generic.Subheading: ORANGE,
pygments.token.Token: BASE1,
pygments.token.Token.Other: ORANGE,
}