httpie-cli/httpie/pretty.py

69 lines
2.2 KiB
Python
Raw Normal View History

import os
2012-02-25 13:39:38 +01:00
import json
import pygments
from pygments import token
from pygments.util import ClassNotFound
2012-02-25 13:39:38 +01:00
from pygments.lexers import get_lexer_for_mimetype
from pygments.formatters.terminal256 import Terminal256Formatter
from pygments.formatters.terminal import TerminalFormatter
from pygments.lexer import RegexLexer, bygroups
from pygments.styles import get_style_by_name, STYLE_MAP
from .pygson import JSONLexer
from . import solarized
2012-02-25 13:39:38 +01:00
DEFAULT_STYLE = 'solarized'
AVAILABLE_STYLES = [DEFAULT_STYLE] + STYLE_MAP.keys()
FORMATTER = (Terminal256Formatter
if '256color' in os.environ.get('TERM', '')
else TerminalFormatter)
2012-02-25 13:39:38 +01:00
class HTTPLexer(RegexLexer):
name = 'HTTP'
aliases = ['http']
filenames = ['*.http']
tokens = {
'root': [
(r'\s+', token.Text),
2012-03-14 19:30:58 +01:00
# Request-Line
(r'([A-Z]+\s+)(/.*?)(\s+HTTP/[\d.]+)', bygroups(
token.Keyword, token.String, token.Keyword)),
# Status-Line
2012-02-25 13:39:38 +01:00
(r'(HTTP/[\d.]+\s+)(\d+)(\s+.+)', bygroups(
2012-03-14 19:30:58 +01:00
token.Keyword, token.Number, token.String)),
# Header
(r'(.*?:)(.+)', bygroups(token.Name, token.Keyword))
2012-02-25 13:39:38 +01:00
]}
class PrettyHttp(object):
2012-02-25 13:39:38 +01:00
def __init__(self, style_name):
if style_name == 'solarized':
style = solarized.SolarizedStyle
else:
style = get_style_by_name(style_name)
self.formatter = FORMATTER(style=style)
2012-02-25 13:39:38 +01:00
def headers(self, content):
2012-03-04 13:03:21 +01:00
return pygments.highlight(content, HTTPLexer(), self.formatter)
2012-02-25 13:39:38 +01:00
def body(self, content, content_type):
lexer = None
content_type = content_type.split(';')[0]
if 'json' in content_type:
lexer = JSONLexer()
try:
# Indent the JSON data.
content = json.dumps(json.loads(content),
sort_keys=True, indent=4)
except Exception:
pass
if not lexer:
2012-03-05 18:58:21 +01:00
try:
lexer = get_lexer_for_mimetype(content_type)
except ClassNotFound:
return content
return pygments.highlight(content, lexer, self.formatter)