euscanwww: Added ansi to html helper

Signed-off-by: volpino <fox91@anche.no>
This commit is contained in:
volpino 2012-07-20 15:12:44 +02:00
parent 1aaee90ab7
commit ad02fd4b81
4 changed files with 109 additions and 8 deletions

View File

@ -160,7 +160,7 @@
<dd> <dd>
<p>Date: {{ log.datetime }} <p>Date: {{ log.datetime }}
<pre class="log"> <pre class="log">
{{ log.result }} {{ log.result|ansi_to_html|safe }}
</pre> </pre>
</dd> </dd>
{% endif %} {% endif %}

View File

@ -3,8 +3,11 @@ from django.conf import settings
from euscan.version import is_version_type_stable, get_version_type from euscan.version import is_version_type_stable, get_version_type
from djeuscan.utils import plaintext2html
register = template.Library() register = template.Library()
@register.inclusion_tag('euscan/_packages.html', takes_context=True) @register.inclusion_tag('euscan/_packages.html', takes_context=True)
def packages(context, pkgs): def packages(context, pkgs):
context['packages'] = pkgs context['packages'] = pkgs
@ -66,3 +69,8 @@ def is_stable(version_type):
@register.filter @register.filter
def version_type(version): def version_type(version):
return get_version_type(version) return get_version_type(version)
@register.filter
def ansi_to_html(text):
return plaintext2html(text)

View File

@ -0,0 +1,89 @@
import re
import cgi
colorcodes = {
'bold': ('\033[1m', '\033[22m'),
'cyan': ('\033[36m', '\033[39m'),
'blue': ('\033[34m', '\033[39m'),
'red': ('\033[31m', '\033[39m'),
'magenta': ('\033[35m', '\033[39m'),
'green': ('\033[32m', '\033[39m'),
'underline': ('\033[4m', '\033[24m'),
}
def recolor(color, text):
regexp = "(?:%s)(.*?)(?:%s)" % colorcodes[color]
regexp = regexp.replace('[', r'\[')
return re.sub(
regexp, r'''<span style="color: %s">\1</span>''' % color, text
)
def bold(text):
regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['bold']
regexp = regexp.replace('[', r'\[')
return re.sub(regexp, r'<span style="font-weight:bold">\1</span>', text)
def underline(text):
regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['underline']
regexp = regexp.replace('[', r'\[')
return re.sub(
regexp, r'<span style="text-decoration: underline">\1</span>', text
)
def removebells(text):
return text.replace('\07', '')
def removebackspaces(text):
backspace_or_eol = r'(.\010)|(\033\[K)'
n = 1
while n > 0:
text, n = re.subn(backspace_or_eol, '', text, 1)
return text
def plaintext2html(text, tabstop=4):
def do_sub(m):
c = m.groupdict()
if c['htmlchars']:
return cgi.escape(c['htmlchars'])
if c['lineend']:
return '<br>'
elif c['space']:
t = m.group().replace('\t', '&nbsp;' * tabstop)
t = t.replace(' ', '&nbsp;')
return t
elif c['space'] == '\t':
return ' ' * tabstop
else:
url = m.group('protocal')
if url.startswith(' '):
prefix = ' '
url = url[1:]
else:
prefix = ''
last = m.groups()[-1]
if last in ['\n', '\r', '\r\n']:
last = '<br>'
return '%s%s' % (prefix, url)
re_string = re.compile(
r'(?P<htmlchars>[<&>])|(?P<space>^[ \t]+)|(?P<lineend>\r\n|\r|\n)|'
r'(?P<protocal>(^|\s)((http|ftp)://.*?))(\s|$)',
re.S | re.M | re.I
)
result = re.sub(re_string, do_sub, text)
result = recolor('cyan', result)
result = recolor('blue', result)
result = recolor('red', result)
result = recolor('magenta', result)
result = recolor('green', result)
result = bold(result)
result = underline(result)
result = removebells(result)
result = removebackspaces(result)
return result

View File

@ -9,6 +9,7 @@ import portage
from portage.output import EOutput, TermProgressBar from portage.output import EOutput, TermProgressBar
from gentoolkit import pprinter as pp from gentoolkit import pprinter as pp
class ProgressHandler(object): class ProgressHandler(object):
def __init__(self, progress_bar): def __init__(self, progress_bar):
self.curval = 0 self.curval = 0
@ -72,6 +73,7 @@ def transform_url(config, cpv, url):
url = to_ebuild_uri(cpv, url) url = to_ebuild_uri(cpv, url)
return url return url
def to_ebuild_uri(cpv, url): def to_ebuild_uri(cpv, url):
cat, pkg, ver, rev = portage.catpkgsplit(cpv) cat, pkg, ver, rev = portage.catpkgsplit(cpv)
p = '%s-%s' % (pkg, ver) p = '%s-%s' % (pkg, ver)
@ -90,6 +92,7 @@ def to_ebuild_uri(cpv, url):
url = url.replace(src, '${%s}' % dst) url = url.replace(src, '${%s}' % dst)
return url return url
def to_mirror(url): def to_mirror(url):
mirrors = portage.settings.thirdpartymirrors() mirrors = portage.settings.thirdpartymirrors()
for mirror_name in mirrors: for mirror_name in mirrors:
@ -113,7 +116,7 @@ class EOutputMem(EOutput):
self.out = StringIO() self.out = StringIO()
def getvalue(self): def getvalue(self):
return clean_colors(self.out.getvalue()) return self.out.getvalue()
def _write(self, f, msg): def _write(self, f, msg):
super(EOutputMem, self)._write(self.out, msg) super(EOutputMem, self)._write(self.out, msg)
@ -173,9 +176,11 @@ class EuscanOutput(object):
from euscan.version import get_version_type from euscan.version import get_version_type
cpv = '%s-%s' % (cp, version) cpv = '%s-%s' % (cp, version)
urls = ' '.join(transform_url(self.config, cpv, url) for url in urls.split()) urls = ' '.join(
transform_url(self.config, cpv, url) for url in urls.split()
)
if self.config['format'] in ['json']: if self.config['format'] in ['json', 'dict']:
_curr = self.queries[self.current_query] _curr = self.queries[self.current_query]
_curr["result"].append( _curr["result"].append(
{ {
@ -195,8 +200,7 @@ class EuscanOutput(object):
def metadata(self, key, value, show=True): def metadata(self, key, value, show=True):
if self.config["format"]: if self.config["format"]:
self.queries[self.current_query]["metadata"][key] = \ self.queries[self.current_query]["metadata"][key] = value
clean_colors(value)
elif show: elif show:
print "%s: %s" % (key.capitalize(), value) print "%s: %s" % (key.capitalize(), value)