mirror of
https://github.com/kennethreitz-archive/bpython-gist.git
synced 2026-06-05 23:50:18 +00:00
7a1ebadb52
Pascal Bleser was kind enough to package bpython for OpenSUSE and sent me a patch to have it working with distutils, which is always nice, so thanks a lot for that, here's the new dir structure.
100 lines
3.3 KiB
Python
100 lines
3.3 KiB
Python
# The MIT License
|
|
#
|
|
# Copyright (c) 2008 Bob Farrell
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in
|
|
# all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
# THE SOFTWARE.
|
|
|
|
# A simple formatter for bpython to work with Pygments.
|
|
# Pygments really kicks ass, it made it really easy to
|
|
# get the exact behaviour I wanted, thanks Pygments. :)
|
|
|
|
from pygments.formatter import Formatter
|
|
from pygments.token import Keyword, Name, Comment, String, Error, \
|
|
Number, Operator, Generic, Token, Whitespace, Literal, Punctuation
|
|
|
|
"""These format strings are pretty ugly.
|
|
\x01 represents a colour marker, which
|
|
can be proceded by one or two of
|
|
the following letters:
|
|
k, r, g, y, b, m, c, w, d
|
|
Which represent:
|
|
blacK, Red, Green, Yellow, Blue, Magenta,
|
|
Cyan, White, Default
|
|
e.g. \x01y for yellow,
|
|
\x01gb for green on blue background
|
|
|
|
\x02 represents the bold attribute
|
|
|
|
\x03 represents the start of the actual
|
|
text that is output (in this case it's
|
|
a %s for substitution)
|
|
|
|
\x04 represents the end of the string; this is
|
|
necessary because the strings are all joined
|
|
together at the end so the parser needs them
|
|
as delimeters
|
|
|
|
"""
|
|
|
|
f_strings = {
|
|
Keyword : "\x01y\x03%s\x04",
|
|
Name : "\x01w\x02\x03%s\x04",
|
|
Comment : "\x01b\x03%s\x04",
|
|
String : "\x01m\x03%s\x04",
|
|
Error : "\x01r\x03%s\x04",
|
|
Literal : "\x01r\x03%s\x04",
|
|
Literal.String : "\x01m\x03%s\x04",
|
|
Token.Literal.Number.Float : "\x01g\x02\x03%s\x04",
|
|
Number : "\x01g\x03%s\x04",
|
|
Operator : "\x01c\x02\x03%s\x04",
|
|
Operator.Word : "\x01c\x02\x03%s\x04",
|
|
Punctuation : "\x01c\x02\x03%s\x04",
|
|
Generic : "\x01d\x03%s\x04",
|
|
Token : "\x01g\x03%s\x04",
|
|
Whitespace : "\x02d\x03%s\x04"
|
|
}
|
|
|
|
class BPythonFormatter( Formatter ):
|
|
"""This is the custom formatter for bpython.
|
|
Its format() method receives the tokensource
|
|
and outfile params passed to it from the
|
|
Pygments highlight() method and slops
|
|
them into the appropriate format string
|
|
as defined above, then writes to the outfile
|
|
object the final formatted string.
|
|
|
|
See the Pygments source for more info; it's pretty
|
|
straightforward."""
|
|
|
|
def __init__(self, **options):
|
|
Formatter.__init__(self, **options)
|
|
|
|
def format( self, tokensource, outfile ):
|
|
o = ''
|
|
for token, text in tokensource:
|
|
if text == '\n':
|
|
continue
|
|
|
|
if token in f_strings:
|
|
o += f_strings[ token ] % text
|
|
else:
|
|
o += f_strings[ Token ] % text
|
|
outfile.write( o.rstrip() )
|
|
|