UNPKG

jseoq1

Version:

WARNING: EOQ1 is depricated and should not be used any longer. Use JsEOQ2 This lib is for legacy reasons only.

294 lines (276 loc) 12.2 kB
var jseoq = jseoq || {}; jseoq.ValueParser = (function() { function isAlpha(str) { return str.length === 1 && str.match(/[a-z]/i); }; function ValueToString (value) { if(value.type == jseoq.model.ValueTypesE.INT) { return value.v.toString(); } else if(value.type == jseoq.model.ValueTypesE.FLOAT) { if(Number.isInteger(value.v)) { return value.v.toString()+".0"; } else { return value.v.toString(); } } else if(value.type == jseoq.model.ValueTypesE.BOOL) { if(value.v) { return 'true'; } else { return 'false'; } } else if(value.type == jseoq.model.ValueTypesE.STRING) { return "'"+encodeURIComponent(value.v)+"'"; } else if(value.type == jseoq.model.ValueTypesE.OBJECTREF) { return '#'+value.v; } else if(value.type == jseoq.model.ValueTypesE.HISTORYREF) { return '$'+value.v; } else if(value.type == jseoq.model.ValueTypesE.EMPTY) { return '%'; } else if(value.type == jseoq.model.ValueTypesE.LIST) { var substrs = []; for(var i=0; i<value.v.length; i++) { var subvalue = value.v[i]; substrs.push(ValueToString(subvalue)); } return '['+substrs.join(',')+']'; } else { throw new Error('Cannot convert EOQ value of type '+value.type+' string'); } }; function StringToValue (valueStr) { //definition of the parser states var VALUE_START = 1; var VALUE = 2; var VALUE_END = 3; //start of parsing var rootValueContainer = new jseoq.model.ListValue(); //initialize the value with an empty list var currentValueContainer = rootValueContainer; var parentContainers = []; var state = VALUE_START; var valueStart = 0; var valueEnd = 0; var valueType = 0; var nOpenBrakets = 0; var n = valueStr.length; for(var i=0;i<n;i++) { var c = valueStr[i]; if(VALUE_START == state) { valueStart = i; valueEnd = i; if(('0' <= c && c <= '9') || '-' == c) { valueType = jseoq.model.ValueTypesE.INT; state = VALUE; } else if('.'==c) { valueType = jseoq.model.ValueTypesE.FLOAT; state = VALUE; } else if('t'==c || 'f'==c) { valueType = jseoq.model.ValueTypesE.BOOL; state = VALUE; } else if('#'==c) { valueStart = i+1; valueEnd = i+1; valueType = jseoq.model.ValueTypesE.OBJECTREF; state = VALUE; } else if('\''==c) { valueStart = i+1; valueEnd = i+1; valueType = jseoq.model.ValueTypesE.STRING; state = VALUE; } else if('%'==c) { valueStart = i+1; valueEnd = i+1; valueType = jseoq.model.ValueTypesE.EMPTY; state = VALUE; } else if('$'==c) { valueStart = i+1; valueEnd = i+1; valueType = jseoq.model.ValueTypesE.HISTORYREF; state = VALUE; } else if('['==c) { valueType = jseoq.model.ValueTypesE.LIST; nOpenBrakets += 1; sublist = new jseoq.model.ListValue(); currentValueContainer.v.push(sublist); parentContainers.push(currentValueContainer); currentValueContainer = sublist; state = VALUE_START; } else if(']'==c) { //occures only for empty lists nOpenBrakets -= 1; currentValueContainer = parentContainers.pop(); state = VALUE_END; } else { throw new Error('Unexpected character \''+c+'\' at '+i+' in '+valueStr); } } else if(VALUE == state) { if(']'==c) { currentValueContainer.v.push(__StringToPritiveValue(valueStr.substring(valueStart,valueEnd+1),valueType)); nOpenBrakets -= 1; currentValueContainer = parentContainers.pop(); state = VALUE_END; //change the state to prevent that the next closing ] saves the value again } else if(','==c && nOpenBrakets>0) { currentValueContainer.v.push(__StringToPritiveValue(valueStr.substring(valueStart,valueEnd+1),valueType)); state = VALUE_START; } else if(jseoq.model.ValueTypesE.OBJECTREF==valueType && ('0' <= c && c <= '9')) { valueEnd = i; } else if((jseoq.model.ValueTypesE.INT==valueType || jseoq.model.ValueTypesE.FLOAT==valueType) && ('0' <= c && c <= '9')) { valueEnd = i; } else if(jseoq.model.ValueTypesE.INT==valueType && '.'==c) { valueEnd = i; valueType = jseoq.model.ValueTypesE.FLOAT } else if(jseoq.model.ValueTypesE.FLOAT==valueType && ('0' <= c && c <= '9')) { valueEnd = i; } else if(jseoq.model.ValueTypesE.HISTORYREF==valueType && (('0' <= c && c <= '9') || '-' == c)) { valueEnd = i; } else if(jseoq.model.ValueTypesE.BOOL==valueType && isAlpha(c)) { valueEnd = i; } else if(jseoq.model.ValueTypesE.STRING==valueType && '\''!=c) { valueEnd = i; } else if(jseoq.model.ValueTypesE.STRING==valueType && '\''==c) { valueEnd = i-1; //this is necessary for emtpy string } else { throw new Error('Unexpected character \''+c+'\' at '+i+' in '+valueStr); } } else if(VALUE_END==state) { if(']'==c) { nOpenBrakets -= 1 currentValueContainer = parentContainers.pop(); //TODO } else if(','==c && nOpenBrakets>0) { state = VALUE_START; } else { throw new Error('Unexpected character \''+c+'\' at '+i+' in '+valueStr); } } } if(nOpenBrakets>0) { throw new Error(nOpenBrakets+' lists are not closed in '+ valueStr); } if(VALUE==state) { currentValueContainer.v.push(__StringToPritiveValue(valueStr.substring(valueStart,valueEnd+1),valueType)); } return rootValueContainer.v[0]; }; function __StringToPritiveValue (valueStr,valueType) { var value = null; if(valueType == jseoq.model.ValueTypesE.INT) { value = new jseoq.model.IntValue(); value.v = Number.parseInt(valueStr); } else if(valueType == jseoq.model.ValueTypesE.FLOAT) { value = new jseoq.model.FloatValue(); value.v = Number.parseFloat(valueStr); } else if(valueType == jseoq.model.ValueTypesE.STRING) { value = new jseoq.model.StringValue(); value.v = decodeURIComponent(valueStr); } else if(valueType == jseoq.model.ValueTypesE.BOOL) { value = new jseoq.model.BoolValue(); if('true' == valueStr) { value.v = true; } else if('false' == valueStr) { value.v = false; } else { throw new Error("Unsupported boolean value '"+valueStr+". Should be 'true' or 'false'"); } } else if(valueType == jseoq.model.ValueTypesE.OBJECTREF) { value = new jseoq.model.ObjectRefValue(); value.v = Number.parseInt(valueStr); } else if(valueType == jseoq.model.ValueTypesE.EMPTY) { value = new jseoq.model.EmptyValue(); } else if(valueType == jseoq.model.ValueTypesE.HISTORYREF) { value = new jseoq.model.HistoryRefValue(); value.v = Number.parseInt(valueStr); } else { throw new Error("Unknown value type "+ valueType); } return value; }; function JsToValue (pvalue) { var value = 0; if(typeof pvalue == "number" && Number.isInteger(pvalue)) { value = new jseoq.model.IntValue(); value.v=pvalue; } else if(typeof pvalue == "number" /*&& Number.isFloat(pvalue)*/) { value = new jseoq.model.FloatValue(); value.v = pvalue; } else if(typeof pvalue == "boolean") { value = new jseoq.model.BoolValue(); value.v = pvalue; } else if(typeof pvalue == "string") { value = new jseoq.model.StringValue(); value.v = pvalue; } else if(pvalue instanceof jseoq.model.ObjectRefValue) { value = pvalue; } else if(pvalue instanceof jseoq.model.HistoryRefValue) { value = pvalue; } else if(null == pvalue) { value = new jseoq.model.EmptyValue(); } else if(pvalue instanceof Array) { value = new jseoq.model.ListValue(); for(var i=0;i<pvalue.length;i++) { value.v.push(this.JsToValue(pvalue[i])); } return value; } else { throw Error('Cannot convert python data type '+(typeof pvalue)+' to EOQ value: '+pvalue); } return value; }; function ValueToJs (value) { if([jseoq.model.ValueTypesE.INT,jseoq.model.ValueTypesE.FLOAT,jseoq.model.ValueTypesE.BOOL,jseoq.model.ValueTypesE.STRING].includes(value.type)) { return value.v; } else if([jseoq.model.ValueTypesE.OBJECTREF,jseoq.model.ValueTypesE.HISTORYREF].includes(value.type)) { return value; } else if(value.type == jseoq.model.ValueTypesE.EMPTY) { return null } else if(value.type == jseoq.model.ValueTypesE.LIST) { var pvalue = []; for(var i=0;i<value.v.length;i++) { pvalue.push(this.ValueToJs(value.v[i])); } return pvalue; }else { throw new Error('Cannot convert EOQ value '+(typeof value)+' to python data type '+value); } }; function IsList(value) { return (value.type == jseoq.model.ValueTypesE.LIST); }; function IsBool(value) { return (value.type == jseoq.model.ValueTypesE.BOOL); }; function IsInt(value) { return (value.type == jseoq.model.ValueTypesE.INT); }; function IsFloat(value) { return (value.type == jseoq.model.ValueTypesE.FLOAT); }; function IsString(value) { return (value.type == jseoq.model.ValueTypesE.STRING); }; function IsObjectRef(value) { return (value.type == jseoq.model.ValueTypesE.OBJECTREF); }; function IsHistoryRef(value) { return (value.type == jseoq.model.ValueTypesE.HISTORYREF); }; function IsEmpty(value) { return (value.type == jseoq.model.ValueTypesE.EMPTY); } return { ValueToString : ValueToString, StringToValue : StringToValue, JsToValue : JsToValue, ValueToJs : ValueToJs, IsList : IsList, IsBool : IsBool, IsInt : IsInt, IsFloat : IsFloat, IsString : IsString, IsObjectRef : IsObjectRef, IsHistoryRef : IsHistoryRef, IsEmpty : IsEmpty }; })();