FSM log parser
by whelkaholism
HTML
<div id="t"></div>
<hr/>
<div id="d"></div>
CSS
#t {
color: blue;
white-space: pre-wrap
}
JavaScript
var text ='reason=refrefes, original=[MonthlyRent=1500.00,A=B,C=[D=E]], issuedtolandlord=False, issuedtotenants=[Rob,Stu], rent=Recalculated\\, okay';
//var text ='a=hi\\,there, b=world';
var log = function(msg, c, state)
{
document.getElementById('d').innerHTML += msg + (c ? ' "' + c + '"' : '') + '</br>';
}
var Logging = {};
Logging.deserializeMessage = function(s)
{
var res = {};
var currname = '';
var currvalue = '';
var curr = res;
var stack = [res];
var f_addtoarr = function(o, n)
{
o['[]'] = o['[]'] || [];
o['[]'].push(n);
};
var actions = {
buildprop: function(c, s) { currname += c; log('buildprop', c, s);},
addprop: function(c, s) { curr[currname] = null; log('addprop', c, s);},
addpropasvalue: function(c, s) { f_addtoarr(curr, currname); currname = ''; log('addpropasvalue', c, s);},
//
buildvalue: function(c, s) { currvalue += c; log('buildvalue', c, s); },
addvalue: function(c, s) { curr[currname] = currvalue; currname = ''; currvalue = ''; log('buildvalue', c, s); },
//
push: function(c, s) { curr[currname] = {}; curr = curr[currname]; stack.push(curr); currname = ''; log('push (-> ' + JSON.stringify(curr) + ')'); },
pop: function(c, s) { if(currname) { f_addtoarr(curr, currname); currname = ''; } stack.pop(); curr = stack[stack.length - 1]; log('pop (-> ' + JSON.stringify(curr) + ')'); }
};
var transitions = {
'_reserved': { '=':true, ',':true, '[':true, ']':true },
'_escape': '\\',
'_start': {
'*': { s: 'propname', a: actions.buildprop }
},
'propname': {
'=': { s: 'value', a: actions.addprop },
',': { a: actions.addpropasvalue },
']': { s: 'skip', a: actions.pop },
'*': { a: actions.buildprop }
},
'value': {
',': { s: 'propname', a: actions.addvalue },
'[': { s:'propname', a: actions.push },
']': { s: 'skip', a: [actions.addvalue, actions.pop] }, //!!!
'*': { a: actions.buildvalue...