Skip to content
Snippets Groups Projects
ipaaca-catlog 6.24 KiB
Newer Older
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This file is part of IPAACA, the
#  "Incremental Processing Architecture
#   for Artificial Conversational Agents".
#
# Copyright (c) 2009-2015 Social Cognitive Systems Group
#                         CITEC, Bielefeld University
#
# http://opensource.cit-ec.de/projects/ipaaca/
# http://purl.org/net/ipaaca
#
# This file may be licensed under the terms of of the
# GNU Lesser General Public License Version 3 (the ``LGPL''),
# or (at your option) any later version.
#
# Software distributed under the License is distributed
# on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
# express or implied. See the LGPL for the specific language
# governing rights and limitations.
#
# You should have received a copy of the LGPL along with this
# program. If not, go to http://www.gnu.org/licenses/lgpl.html
# or write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# The development of this software was supported by the
# Excellence Cluster EXC 277 Cognitive Interaction Technology.
# The Excellence Cluster EXC 277 is a grant of the Deutsche
# Forschungsgemeinschaft (DFG) in the context of the German
# Excellence Initiative.


from __future__ import division, print_function

import sys
import ipaaca
def pretty_printed_time(t):
	if t<0:
		t = -t
		sign = '-'
	else:
		sign = ' '
	s = float(t)
	h = int(s/3600)
	m = int(s/60) - h*60
	s -= h*3600 + m*60
	ms = int((s-int(s))*1000)
	return sign+'%01d:%02d:%02d.%03d'%(h, m, int(s), ms)

REPLACEMENT_COLORS={
			'30': 'black',
			'31': 'red',
			'32': 'green',
			'33': 'cyan',
			'34': 'blue',
			'35': 'brown',
			'36': 'magenta',
			'37': 'grey',
			'248': 'lightgray',
			# should add more colors
		}

def replace_ansi_html(s):
	r = u''
	in_esc = False
	last_color = u''
	#skip_one_double_wide_bar = False
	for c in s:
		if in_esc:
			if c=='m':
				in_esc = False
				itms = last_color.replace('[','').replace(']','').split(';')
				col = None
				bold = False
				if itms[0]=='':
					r += '</code></font><code>'
				else:
					for i in itms:
						if i=='1':
							bold = True
						elif i in REPLACEMENT_COLORS:
							col = REPLACEMENT_COLORS[i]
					if col is None:
						if bold:
							col = 'grey'
						else:
							col = 'black'
							print('Warning: unknown colors '+str(itms))
					r += '</code><font color="'+col+'"><code>'
			else:
				last_color += c
		else:
			#if c in u'▁▂▃▄▅▆▇█':
			#	if skip_one_double_wide_bar:
			#		skip_one_double_wide_bar = False
			#	else:
			#		r += c
			#		skip_one_double_wide_bar = True
			#el
			if c=='':
				in_esc = True
				last_color = ''
			else:
				r += c
	return r

def print_header(formt, fields):
	s = u''
	if formt=='html':
		s += '<html><head><meta charset="UTF-8"><title>flexdiam log view</title></head>\n<body>\n<table width="100%" border="1" bordercolor="lightgray" style="white-space:pre">\n<tr>'
		for f in fields:
			s+='<th>'+f+'</th>'
		s += '</tr>'
	return s

def print_footer(formt):
	s = u''
	if formt=='html':
		s += '</tr>\n</body>\n</html>'
	return s

def print_record(data, delimiter, formt):
	if formt=='html':
		s = u'<tr>'
		for d in data:
			d2 = d.replace('<', '&lt;').replace('>', '&gt;').replace('\n', '<br/>').replace('"', '&quot;')
			d3 = replace_ansi_html(d2)
			#s += u'<td><code>' + d2.replace('<', '&lt;').replace('>', '&gt;').replace('\n', '<br/>') + u'</code></td>'
			s += u'<td><code>' + d3 + u'</code></td>'
		s += u'</tr>'
		return s
	else:
		return delimiter.join(data)

def modify(key, value, strip=False, pretty_printed_times=False, time_offset=0.0):
	if key=='time':
		f = float(value.strip()) - time_offset
		return pretty_printed_time(f) if pretty_printed_times else str(f)
	else:
		return value.strip() if strip else value

	try:
		iap = ipaaca.IpaacaArgumentParser('ipaaca-logcat')
		iap.add_argument(
			'-s', '--strip-fields',
			dest='strip', action='store_true',
			default=False,
			help='Strip leading/trailing whitespace from all fields')
		iap.add_argument(
			'-p', '--pretty-printed-times',
			dest='pretty_printed_times', action='store_true',
			default=False,
			help='Print human-readable times (hh:mm:ss.ms) instead of float seconds')
		iap.add_argument(
			'--format',
			dest='format', nargs=1,
			default=['plain'],
			help='output format (plain, html) (default plain)')
		iap.add_argument(
			'-o', '--output-file',
			dest='output_file', nargs=1,
			default=['-'],
			help='output file name (default \'-\' -> standard terminal output)')
		iap.add_argument(
			'-d', '--delimiter',
			dest='delimiter', nargs=1,
			default=['\t'],
			help='field delimiter, interpreted as python unicode string (default \'\\t\')')
		iap.add_argument(
			'-t', '--align-times',
			dest='align_times', nargs=2,
			default=['0', '0'],
			help='Calculate relative output timestamps (default: 0  0 => keep)\nFirst argument is a reference event timestamp from the log file\nSecond argument is the new output time for that same event')
		iap.add_argument(
			'-f', '--fields',
			dest='fields', default=['time', 'text'], nargs='+',
			help='fields to print (defaults: \'time\' \'text\')')
		arguments = iap.parse_args()
		delimiter = eval("u'"+arguments.delimiter[0]+"'", {"__builtins__":None}, {} )
		ref_t, out_t = float(arguments.align_times[0]), float(arguments.align_times[1])
		time_offset = ref_t - out_t
		#print(arguments); sys.exit(1)
		#modify = (lambda s: s.strip()) if arguments.strip else (lambda s: s)
		#modify = lambda s: type(s).__name__
		fil = sys.stdout
		if arguments.output_file[0] != '-':
			fil = io.open(arguments.output_file[0], 'w', encoding='utf8')
		fil.write(print_header(arguments.format[0], arguments.fields)+'\n')
		for line in sys.stdin:
			record = eval(line.strip(), {"__builtins__":None}, {} )
			data = [modify(f, unicode(record[f]), arguments.strip, arguments.pretty_printed_times, time_offset) for f in arguments.fields]
			u = print_record(data, delimiter, arguments.format[0])
			res = u'{}'.format(u) #.decode('utf-8')
			fil.write(u''+res+'\n' )
		fil.write(print_footer(arguments.format[0])+'\n')
		if fil != sys.stdout: fil.close()
	except (KeyboardInterrupt, SystemExit):
		pass # ret below
	except Exception, e:
		print(u'Exception: '+unicode(traceback.format_exc()))
		ipaaca.exit(1)
	ipaaca.exit(0)