From ad02fd4b81a5881b13f51fe1ceb1f0731e008c12 Mon Sep 17 00:00:00 2001 From: volpino Date: Fri, 20 Jul 2012 15:12:44 +0200 Subject: [PATCH] euscanwww: Added ansi to html helper Signed-off-by: volpino --- .../djeuscan/templates/euscan/package.html | 2 +- .../djeuscan/templatetags/djeuscan_helpers.py | 8 ++ euscanwww/djeuscan/utils.py | 89 +++++++++++++++++++ pym/euscan/out.py | 18 ++-- 4 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 euscanwww/djeuscan/utils.py diff --git a/euscanwww/djeuscan/templates/euscan/package.html b/euscanwww/djeuscan/templates/euscan/package.html index 97d1b55..ef4b753 100644 --- a/euscanwww/djeuscan/templates/euscan/package.html +++ b/euscanwww/djeuscan/templates/euscan/package.html @@ -160,7 +160,7 @@

Date: {{ log.datetime }}

-      {{ log.result }}
+      {{ log.result|ansi_to_html|safe }}
     
{% endif %} diff --git a/euscanwww/djeuscan/templatetags/djeuscan_helpers.py b/euscanwww/djeuscan/templatetags/djeuscan_helpers.py index 9689163..2df1d07 100644 --- a/euscanwww/djeuscan/templatetags/djeuscan_helpers.py +++ b/euscanwww/djeuscan/templatetags/djeuscan_helpers.py @@ -3,8 +3,11 @@ from django.conf import settings from euscan.version import is_version_type_stable, get_version_type +from djeuscan.utils import plaintext2html + register = template.Library() + @register.inclusion_tag('euscan/_packages.html', takes_context=True) def packages(context, pkgs): context['packages'] = pkgs @@ -66,3 +69,8 @@ def is_stable(version_type): @register.filter def version_type(version): return get_version_type(version) + + +@register.filter +def ansi_to_html(text): + return plaintext2html(text) diff --git a/euscanwww/djeuscan/utils.py b/euscanwww/djeuscan/utils.py new file mode 100644 index 0000000..fcd9384 --- /dev/null +++ b/euscanwww/djeuscan/utils.py @@ -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'''\1''' % color, text + ) + + +def bold(text): + regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['bold'] + regexp = regexp.replace('[', r'\[') + return re.sub(regexp, r'\1', text) + + +def underline(text): + regexp = "(?:%s)(.*?)(?:%s)" % colorcodes['underline'] + regexp = regexp.replace('[', r'\[') + return re.sub( + regexp, r'\1', 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 '
' + elif c['space']: + t = m.group().replace('\t', ' ' * tabstop) + t = t.replace(' ', ' ') + 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 = '
' + return '%s%s' % (prefix, url) + re_string = re.compile( + r'(?P[<&>])|(?P^[ \t]+)|(?P\r\n|\r|\n)|' + r'(?P(^|\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 diff --git a/pym/euscan/out.py b/pym/euscan/out.py index 40374ab..c0ed61b 100644 --- a/pym/euscan/out.py +++ b/pym/euscan/out.py @@ -9,6 +9,7 @@ import portage from portage.output import EOutput, TermProgressBar from gentoolkit import pprinter as pp + class ProgressHandler(object): def __init__(self, progress_bar): self.curval = 0 @@ -72,24 +73,26 @@ def transform_url(config, cpv, url): url = to_ebuild_uri(cpv, url) return url + def to_ebuild_uri(cpv, url): cat, pkg, ver, rev = portage.catpkgsplit(cpv) p = '%s-%s' % (pkg, ver) pvr = '%s%s' % (ver, '-%s' % rev if rev != 'r0' else '') pf = '%s-%s' % (pkg, pvr) evars = ( - (p , 'P'), + (p, 'P'), (pkg, 'PN'), (ver, 'PV'), (rev, 'PR'), (pvr, 'PVR'), - (pf , 'PF'), + (pf, 'PF'), (cat, 'CATEGORY') ) for src, dst in evars: url = url.replace(src, '${%s}' % dst) return url + def to_mirror(url): mirrors = portage.settings.thirdpartymirrors() for mirror_name in mirrors: @@ -113,7 +116,7 @@ class EOutputMem(EOutput): self.out = StringIO() def getvalue(self): - return clean_colors(self.out.getvalue()) + return self.out.getvalue() def _write(self, f, msg): super(EOutputMem, self)._write(self.out, msg) @@ -173,9 +176,11 @@ class EuscanOutput(object): from euscan.version import get_version_type 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["result"].append( { @@ -195,8 +200,7 @@ class EuscanOutput(object): def metadata(self, key, value, show=True): if self.config["format"]: - self.queries[self.current_query]["metadata"][key] = \ - clean_colors(value) + self.queries[self.current_query]["metadata"][key] = value elif show: print "%s: %s" % (key.capitalize(), value)