import util from '../lib/util'
import stringify from '../lib/stringify.es6'
import highlight from '../lib/highlight.es6'
import beautify from 'js-beautify'
export default class Log
{
constructor({
type = 'log',
args = [],
idx = 0,
displayHeader = false,
ignoreFilter = false})
{
this.type = type;
this.args = args;
this.idx = idx;
this.displayHeader = displayHeader;
this.ignoreFilter = false;
if (displayHeader)
{
this.time = getCurTime();
this.from = getFrom();
}
}
get formattedMsg()
{
if (!this._formattedMsg) this._formatMsg();
return this._formattedMsg;
}
_needSrc()
{
let {type, args} = this;
if (type === 'html') return false;
if (args.length === 1)
{
let arg = args[0];
if (util.isStr(arg)) return false;
if (util.isBool(arg)) return false;
if (util.isNum(arg)) return false;
}
return true;
}
_formatMsg()
{
let {type, idx, displayHeader, time, from, args} = this;
if (this._needSrc())
{
this.src = extractObj(args.length === 1 && util.isObj(args[0]) ? args[0] : args, false);
}
let msg = '', icon;
switch (type)
{
case 'log':
case 'info':
case 'warn':
msg = formatMsg(args);
break;
case 'error':
let err = args[0];
icon = 'times-circle';
err = util.isErr(args[0]) ? args[0] : new Error(err);
msg = formatErr(err);
break;
case 'table':
msg = formatTable(args);
break;
case 'html':
msg = args[0];
break;
case 'input':
msg = formatJs(args[0]);
icon = 'chevron-right';
break;
case 'output':
msg = formatMsg(args);
icon = 'chevron-left';
break;
}
msg = render({msg, type, icon, idx, displayHeader, time, from});
delete this.args;
this._formattedMsg = msg;
}
}
function formatTable(args)
{
return '';
}
var regJsUrl = /https?:\/\/([0-9.\-A-Za-z]+)(?::(\d+))?\/[A-Z.a-z0-9/]*\.js/g;
function formatErr(err)
{
var lines = err.stack.split('\n'),
msg = `${err.message || lines[0]}
`;
lines = lines.filter(val => val.indexOf('eruda') < 0);
var stack = `
${highlight(beautify.html(val.outerHTML), 'html')}`;
}
function getCurTime()
{
let d = new Date();
return `${padZero(d.getHours())}:${padZero(d.getMinutes())}:${padZero(d.getSeconds())}`;
}
function getFrom()
{
let e = new Error(),
ret = '',
lines = e.stack.split('\n');
for (let i = 0, len = lines.length; i < len; i++)
{
ret = lines[i];
if (ret.indexOf('winConsole') > -1 && i < len - 1)
{
ret = lines[i+1];
break;
}
}
return ret;
}
function getObjType(obj)
{
if (obj.constructor) return obj.constructor.name;
return util.upperFirst(({}).toString.call(obj).replace(/(\[object )|]/g, ''));
}
var padZero = (num) => util.lpad(util.toStr(num), 2, '0');
var tpl = require('./Log.hbs');
var render = data => tpl(data);
var extractObj = (obj, simple) => JSON.parse(stringify(obj, {simple}));