Skip to content

Commit

Permalink
Keys and values are properly escaped through the editor.
Browse files Browse the repository at this point in the history
  • Loading branch information
xavi- committed Aug 18, 2015
1 parent 38c83cf commit be6c12b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 3 deletions.
39 changes: 36 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,34 @@ function isNewLineRange(range) {
return false;
}

function escapeMaker(escapes) {
return function escapeKey(key) {
var zeros = [ "", "0", "00", "000" ];
var buf = [];

for(var i = 0; i < key.length; i++) {
var chr = key.charAt(i);

if(escapes[chr]) { buf.push(escapes[chr]); continue; }

var code = chr.codePointAt(0);

if(code <= 0x7F) { buf.push(chr); continue; }

var hex = code.toString(16);

buf.push("\\u");
buf.push(zeros[4 - hex.length]);
buf.push(hex);
}

return buf.join("");
};
}

var escapeKey = escapeMaker({ " ": "\\ ", "\n": "\\n", ":": "\\:", "=": "\\=" });
var escapeVal = escapeMaker({ "\n": "\\n" });

function Editor(text, options) {
if (typeof text === 'object') {
options = text;
Expand Down Expand Up @@ -252,10 +280,15 @@ function Editor(text, options) {
if(val == null) { this.unset(key); return; }

obj[key] = val;
var escapedKey = escapeKey(key);
var escapedVal = escapeVal(val);

var range = keyRange[key];
if(!range) {
keyRange[key] = range = { type: "literal", text: key + separator + val };
keyRange[key] = range = {
type: "literal",
text: escapedKey + separator + escapedVal
};

var prevRange = ranges[ranges.length - 1];
if(prevRange != null && !isNewLineRange(prevRange)) {
Expand All @@ -270,10 +303,10 @@ function Editor(text, options) {
}

if(range.type === "literal") {
range.text = key + separator + val;
range.text = escapedKey + separator + escapedVal;
if(range.comment != null) { range.text = range.comment + range.text; }
} else if(range.type === "key-value") {
range.children[2] = { type: "literal", text: val };
range.children[2] = { type: "literal", text: escapedVal };
} else {
throw "Unknown node type: " + range.type;
}
Expand Down
17 changes: 17 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,5 +123,22 @@ prop.createEditor("./test-cases.properties", function(err, editor) {
);
});

// Escaping keys
var editor4 = prop.createEditor();
editor4.set("space test", "value");
editor4.set("equals=key", "value");
editor4.set("colon:key", "value");
editor4.set("new\nline", "value");
editor4.set("üñîçø∂é", "value");

assert.equal(
editor4.toString(),
"space\\ test=value\n" +
"equals\\=key=value\n" +
"colon\\:key=value\n" +
"new\\nline=value\n" +
"\\u00fc\\u00f1\\u00ee\\u00e7\\u00f8\\u2202\\u00e9=value"
);

// java ReadProperties test-cases.properties
// javac ReadProperties.java

0 comments on commit be6c12b

Please sign in to comment.