diff --git a/lib/util.js b/lib/util.js index a12fc5bb..ffc16ec8 100644 --- a/lib/util.js +++ b/lib/util.js @@ -3,13 +3,16 @@ exports.split = function (str) { var results = []; var word = ''; + var validWord for (var i = 0; i < str.length;) { if (/\s/.test(str[i])) { + //Skips spaces. while (i < str.length && /\s/.test(str[i])) { i++; } results.push(word); word = ''; + validWord = false; continue; } @@ -17,6 +20,27 @@ exports.split = function (str) { i++; while (i < str.length) { if (str[i] === '"') { + validWord = true; + break; + } + + if (str[i] === '\\') { + i++; + word += str[i++]; + continue; + } + + word += str[i++]; + } + i++; + continue; + } + + if (str[i] === '\'') { + i++; + while (i < str.length) { + if (str[i] === '\'') { + validWord = true; break; } @@ -37,10 +61,10 @@ exports.split = function (str) { word += str[i++]; continue; } - + validWord = true; word += str[i++]; } - if (word.length > 0) { + if (validWord) { results.push(word); } return results; diff --git a/test/test-util.js b/test/test-util.js new file mode 100644 index 00000000..5e0e9f71 --- /dev/null +++ b/test/test-util.js @@ -0,0 +1,42 @@ +var myUtil = require('../lib/util'); + +module.exports = { + setUp: function (callback) { + callback(); + }, + testStandard: function (test) { + var result = myUtil.split("set key value"); + test.ok(arraysEqual(result, ['set', 'key', 'value'])); + test.done(); + }, + testEmptyQuotes: function (test) { + var result = myUtil.split("get \"\""); + test.ok(arraysEqual(result, ['get', ""])); + test.done(); + }, + testQuotedKey: function (test) { + var result = myUtil.split("set \"key\" value"); + test.ok(arraysEqual(result, ['set', 'key', 'value'])); + test.done(); + }, + testBackslashIgnoresNextCharacter: function (test) { + var result = myUtil.split("set \"key\\ name\" value"); + test.ok(arraysEqual(result, ['set', 'key name', 'value'])); + test.done(); + }, + testHandlesSingleTicks: function (test) { + var result = myUtil.split("set \'keyname\' value"); + test.ok(arraysEqual(result, ['set', 'keyname', 'value'])); + test.done(); + }, + testIgnoresUnterminatedStrings : function (test) { + var result = myUtil.split("set \"keyname value"); + test.ok(arraysEqual(result, ['set'])); + test.done(); + } + +}; + +function arraysEqual(a1,a2) { + return JSON.stringify(a1)==JSON.stringify(a2); +} \ No newline at end of file