diff --git a/src/util/string-util.js b/src/util/string-util.js new file mode 100644 index 000000000..6270cd885 --- /dev/null +++ b/src/util/string-util.js @@ -0,0 +1,17 @@ +var StringUtil = function () {}; + +StringUtil.withoutTrailingDigits = function (s) { + var i = s.length - 1; + while ((i >= 0) && ('0123456789'.indexOf(s.charAt(i)) > -1)) i--; + return s.slice(0, i + 1); +}; + +StringUtil.unusedName = function (name, existingNames) { + if (existingNames.indexOf(name) < 0) return name; + name = StringUtil.withoutTrailingDigits(name); + var i = 2; + while (existingNames.indexOf(name + i) >= 0) i++; + return name + i; +}; + +module.exports = StringUtil; diff --git a/test/unit/util_string.js b/test/unit/util_string.js new file mode 100644 index 000000000..fdcd439d3 --- /dev/null +++ b/test/unit/util_string.js @@ -0,0 +1,57 @@ +var test = require('tap').test; +var StringUtil = require('../../src/util/string-util'); + +test('withoutTrailingDigits', function (t) { + t.strictEqual(StringUtil.withoutTrailingDigits('boeing747'), 'boeing'); + t.strictEqual(StringUtil.withoutTrailingDigits('boeing747 '), 'boeing747 '); + t.strictEqual(StringUtil.withoutTrailingDigits('boeing𝟨'), 'boeing𝟨'); + t.strictEqual(StringUtil.withoutTrailingDigits('boeing 747'), 'boeing '); + t.strictEqual(StringUtil.withoutTrailingDigits('747'), ''); + t.end(); +}); + +test('unusedName', function (t) { + t.strictEqual( + StringUtil.unusedName( + 'name', + ['not the same name'] + ), + 'name' + ); + t.strictEqual( + StringUtil.unusedName( + 'name', + ['name'] + ), + 'name2' + ); + t.strictEqual( + StringUtil.unusedName( + 'name', + ['name30'] + ), + 'name' + ); + t.strictEqual( + StringUtil.unusedName( + 'name', + ['name', 'name2'] + ), + 'name3' + ); + t.strictEqual( + StringUtil.unusedName( + 'name', + ['name', 'name3'] + ), + 'name2' + ); + t.strictEqual( + StringUtil.unusedName( + 'boeing747', + ['boeing747'] + ), + 'boeing2' // Yup, this matches scratch-flash... + ); + t.end(); +});