Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions src/decoder.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
var chars = require("./chars").chars;
var appCharsArr = require("./chars").charsArr;

decoder.prototype._d = function(schema){
if(ifNil(this.currentChar())){
Expand Down Expand Up @@ -85,15 +86,27 @@ decoder.prototype.readFieldValue = function(schemaOfCurrentKey){
var len = this.dataToDecode.length;
var start = this.index;

for(;this.index < len && until.indexOf(this.currentChar()) === -1;this.index++);
for(;this.index < len; this.index++){
if(this.currentChar() === '\\' && this.index+1 < len
&& appCharsArr.indexOf(this.dataToDecode[this.index+1]) !== -1){
// remove the backslash
this.dataToDecode = this.dataToDecode.substr(0,this.index)
+ this.dataToDecode.substr(this.index+1,this.dataToDecode.length);
continue;
}
if(until.indexOf(this.currentChar()) === -1){
// not ending char
continue;
}
break;
};
return this.dataToDecode.substr(start, this.index-start);
}
}else{
return this.dataToDecode[this.index++];
}
}


decoder.prototype.decode = function(objStr){
this.index= 0;
if(!objStr || typeof objStr !== "string" || objStr.length === 0) throw Error("input should be a valid string");
Expand Down
26 changes: 21 additions & 5 deletions src/encoder.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
var chars = require("./chars").chars;
var appCharsArr = require("./chars").charsArr;

const appCharRegex = new RegExp(appCharsArr.join('|'), 'g');

Encoder.prototype._e = function(jObj,e_schema){
if(typeof e_schema.type === "string"){//premitive
return this.getValue(jObj,e_schema.type);
Expand Down Expand Up @@ -35,27 +37,41 @@ Encoder.prototype._e = function(jObj,e_schema){
}

Encoder.prototype.processValue= function(str,r){
if(!this.isAppChar(r[0]) && !this.isAppChar(str[str.length -1])){
if(!this.isAppChar(r[0]) && (!this.isAppChar(str[str.length -1])
|| (this.isAppChar(str[str.length -1]) && str.length>1
&& str[str.length - 2] === '\\'))){
str += chars.boundryChar;
}
return str + r;
}

/**
*
* @param {*} a
* @param {*} value
* @param {*} type
* @return {string} return either the parsed value or a special char representing the value
*/
Encoder.prototype.getValue= function(a,type){
switch(a){
Encoder.prototype.getValue= function(value,type){
switch(value){
case undefined: return chars.missingPremitive;
case null: return chars.nilPremitive;
case "": return chars.emptyValue;
default: return this.dataHandlers[type].parse(a);
default: return sanitizeData(this.dataHandlers[type].parse(value));
}
}

/**
*
* @param {string} data
* @return {string} return the sanitized string by adding backslash to the special chars
*/
function sanitizeData(data) {
if(typeof data === "string"){
data = data.replace(appCharRegex, '\\$&');
}
return data;
}

/**
* Check if the given object is empty, null, or undefined. Returns true otherwise.
* @param {*} jObj
Expand Down
60 changes: 60 additions & 0 deletions tests/encode_arr_backslash_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
var nimn = require("../src/nimn");
var chars = require("../src/chars").chars;
var char = require("../src/util").char;

describe('', function(){
it("backslash in array should be encoded and decoded correctly", function () {
var schema = {
"age": "number",
"names" : ["string" ],
"str": "string",
"names2" : ["string" ],
"bool": "boolean",
"names3" : ["string" ]
}

var nimnEncoder = new nimn();
nimnEncoder.addSchema(schema);

var jData = {
age : 32,
names : [ chars.arrStart + "amit" + chars.arrayEnd,
chars.boundryChar + "kumar" + chars.emptyChar],
}
var expected = chars.objStart
+ "32"
+ chars.arrStart + '\\' + chars.arrStart
+ "amit" + '\\' + chars.arrayEnd + chars.boundryChar
+ '\\' + chars.boundryChar + "kumar"
+ '\\' + chars.emptyChar + chars.arrayEnd
+ chars.missingPremitive + chars.missingChar
+ chars.missingPremitive + chars.missingChar;

var result = nimnEncoder.encode(jData);
expect(result).toEqual(expected);
result = nimnEncoder.decode(result);
expect(result).toEqual(jData);

var jData = {
age : 32,
names : [chars.missingChar + "amit" + chars.nilPremitive,
chars.nilChar + "kumar" + chars.arrayEnd],
names2 : ["amit2", "kumar2"],
bool: false
}
var expected = chars.objStart + "32"
+ chars.arrStart + '\\' + chars.missingChar
+ "amit" + '\\' + chars.nilPremitive + chars.boundryChar
+ '\\' + chars.nilChar + "kumar" + '\\' + chars.arrayEnd + chars.arrayEnd
+ chars.missingPremitive
+ chars.arrStart
+ "amit2" + chars.boundryChar + "kumar2" + chars.arrayEnd
+ char(183) + chars.missingChar;

var result = nimnEncoder.encode(jData);
expect(result).toEqual(expected);
result = nimnEncoder.decode(result);
expect(result).toEqual(jData);
});

});
Loading