##// END OF EJS Templates
Mechanism for testing terminal interact loop in-process....
Mechanism for testing terminal interact loop in-process. While this is complex, I much prefer it to starting a separate process and piping commands in.

File last commit:

r13441:b1511842
r13528:0fc72785
Show More
ansi.py
158 lines | 4.6 KiB | text/x-python | PythonLexer
Jonathan Frederic
Cleanup and refactor of filters
r10676 """Filters for processing ANSI colors within Jinja templates.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2013, the IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Jonathan Frederic
Post code-review, extended refactor.
r10485 import re
jakobgager
Update imports
r10946 from IPython.utils import coloransi
Jonathan Frederic
Post code-review, extended refactor.
r10485
Jonathan Frederic
Cleanup and refactor of filters
r10676 #-----------------------------------------------------------------------------
# Classes and functions
#-----------------------------------------------------------------------------
Jonathan Frederic
Post code-review, extended refactor.
r10485
Brian E. Granger
Fixing import logic.
r11088 __all__ = [
Jonathan Frederic
Filter names cleanup
r11685 'strip_ansi',
Brian E. Granger
Fixing import logic.
r11088 'ansi2html',
'single_ansi2latex',
'ansi2latex'
]
Jonathan Frederic
Filter names cleanup
r11685 def strip_ansi(source):
Jonathan Frederic
Cleanup and refactor of filters
r10676 """
Remove ansi from text
Parameters
----------
source : str
Source to remove the ansi from
"""
Jonathan Frederic
Fixed still broken remove_ansi, : to ;
r11435 return re.sub(r'\033\[(\d|;)+?m', '', source)
Jonathan Frederic
Post code-review, extended refactor.
r10485
Jonathan Frederic
Cleanup and refactor of filters
r10676
def ansi2html(text):
"""
Conver ansi colors to html colors.
Parameters
----------
text : str
Text containing ansi colors to convert to html
"""
Jonathan Frederic
Post code-review, extended refactor.
r10485 ansi_colormap = {
'30': 'ansiblack',
'31': 'ansired',
'32': 'ansigreen',
'33': 'ansiyellow',
'34': 'ansiblue',
'35': 'ansipurple',
'36': 'ansicyan',
'37': 'ansigrey',
'01': 'ansibold',
}
# do ampersand first
Jonathan Frederic
Cleanup and refactor of filters
r10676 text = text.replace('&', '&')
Jonathan Frederic
Post code-review, extended refactor.
r10485 html_escapes = {
'<': '&lt;',
'>': '&gt;',
"'": '&apos;',
'"': '&quot;',
'`': '&#96;',
}
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624
Thomas Kluyver
Fix references to dict.iteritems and dict.itervalues
r13361 for c, escape in html_escapes.items():
Jonathan Frederic
Cleanup and refactor of filters
r10676 text = text.replace(c, escape)
Jonathan Frederic
Post code-review, extended refactor.
r10485
ansi_re = re.compile('\x1b' + r'\[([\dA-Fa-f;]*?)m')
Jonathan Frederic
Cleanup and refactor of filters
r10676 m = ansi_re.search(text)
Jonathan Frederic
Post code-review, extended refactor.
r10485 opened = False
cmds = []
opener = ''
closer = ''
while m:
cmds = m.groups()[0].split(';')
closer = '</span>' if opened else ''
Jonathan Frederic
Fixed all broken references, refactored some stuff here and there,...
r10624
Jonathan Frederic
Post code-review, extended refactor.
r10485 # True if there is there more than one element in cmds, *or*
# if there is only one but it is not equal to a string of zeroes.
opened = len(cmds) > 1 or cmds[0] != '0' * len(cmds[0])
classes = []
for cmd in cmds:
if cmd in ansi_colormap:
classes.append(ansi_colormap.get(cmd))
if classes:
opener = '<span class="%s">' % (' '.join(classes))
else:
opener = ''
Jonathan Frederic
Cleanup and refactor of filters
r10676 text = re.sub(ansi_re, closer + opener, text, 1)
Jonathan Frederic
Post code-review, extended refactor.
r10485
Jonathan Frederic
Cleanup and refactor of filters
r10676 m = ansi_re.search(text)
Jonathan Frederic
Post code-review, extended refactor.
r10485
if opened:
Jonathan Frederic
Cleanup and refactor of filters
r10676 text += '</span>'
return text
jakobgager
move Ansi related filters to ansi.py
r10943
def single_ansi2latex(code):
"""Converts single ansi markup to latex format
Return latex code and number of open brackets.
"""
for color in coloransi.color_templates:
Jonathan Frederic
Fix, ansi2latex style-less code support...
r11495
#Make sure to get the color code (which is a part of the overall style)
# i.e. 0;31 is valid
# 31 is also valid, and means the same thing
#coloransi.color_templates stores the longer of the two formats %d;%d
#Get the short format so we can parse that too. Short format only exist
#if no other formating is applied (the other number must be a 0)!
style_code = getattr(coloransi.TermColors, color[0])
color_code = style_code.split(';')[1]
is_normal = style_code.split(';')[0] == '0'
MinRK
fix ansi coloring...
r13441 # regular weight
Jonathan Frederic
Fix, ansi2latex style-less code support...
r11495 if (code == style_code) or (is_normal and code == color_code):
MinRK
fix ansi coloring...
r13441
return r'{\color{'+color[0].lower()+'}', 1
# bold
Jonathan Frederic
Fix, ansi2latex style-less code support...
r11495 if code == style_code[:3]+str(1)+style_code[3:]:
MinRK
fix ansi coloring...
r13441 return r'\textbf{\color{'+color[0].lower()+'}', 1
jakobgager
move Ansi related filters to ansi.py
r10943 return '', 0
def ansi2latex(text):
"""Converts ansi formated text to latex version
based on https://bitbucket.org/birkenfeld/sphinx-contrib/ansi.py
"""
color_pattern = re.compile('\x1b\\[([^m]+)m')
last_end = 0
openbrack = 0
outstring = ''
for match in color_pattern.finditer(text):
head = text[last_end:match.start()]
outstring += head
if openbrack:
outstring += '}'*openbrack
openbrack = 0
Jonathan Frederic
Fixes for Py3.3
r11547 if not (match.group() == coloransi.TermColors.Normal or openbrack):
jakobgager
move Ansi related filters to ansi.py
r10943 texform, openbrack = single_ansi2latex(match.group())
outstring += texform
last_end = match.end()
MinRK
fix ansi coloring...
r13441
# Add the remainer of the string and THEN close any remaining color brackets.
Jonathan Frederic
Fix ansi2latex color remainer of string.
r11496 outstring += text[last_end:]
jakobgager
move Ansi related filters to ansi.py
r10943 if openbrack:
outstring += '}'*openbrack
return outstring.strip()