"use strict";
/**
* This is all about generating strings in one form or another. Yo.
* @author Terry Weiss
* @author zumbrunn
* @author Esa-Matti Suurone
* @module ink/strings/generators
*/
/**
* function repeats a string passed as argument
*
* @param {String}
* string the string to reproduce
* @param {Number}
* num amount of repetitions
* @param {string=} sep Separate the strings with this
* @returns {String} resulting string
* @example
* var strings = require("ink-strings");
* strings.repeat( "there's no place line home", 3, " " )
* -> "there's no place line home there's no place line home there's no place line home"
*
*/
exports.repeat = function ( string, num, sep ) {
sep = sep || '';
var list = [];
for ( var i = 0; i < num; i++ ) {
list[ i ] = string;
}
return list.join( sep );
};
/**
* factory to create functions for sorting objects in an array
*
* @param {String}
* field name of the field each object is compared with
* @param {Number}
* order (ascending or descending)
* @returns {Function} ready for use in Array.prototype.sort
* @example
* var characters = [{name:"rory", age:30}, {name: "amy", age:30}, {"mr weasley": age:60}];
* var strings = require("ink-strings");
* characters.sort(string.sorter("name"));
* -> [{name:"amy", age:30}, {name: "mr weasley", age:60}, {"rory": age:30}];
*/
exports.sorter = function ( field, order ) {
if ( !order ) {
order = 1;
}
return function ( a, b ) {
var str1 = String( a[ field ] || '' ).toLowerCase();
var str2 = String( b[ field ] || '' ).toLowerCase();
if ( str1 > str2 ) { return order; }
if ( str1 < str2 ) { return order * -1; }
return 0;
};
};
/**
* create a string from a bunch of substrings
*
* @param {String}
* one or more strings as arguments
* @returns {String} the resulting string
*/
exports.compose = function () {
return Array.join( arguments, '' );
};
/**
* creates a random string (numbers and chars)
*
* @param {Number}
* len length of key
* @param {Number}
* mode determines which letters to use. null or 0 = all letters; 1 = skip 0, 1, l and o which can easily be
* mixed with numbers; 2 = use numbers only
* @returns random string
*/
exports.random = function ( len, mode ) {
var x;
if ( mode === 2 ) {
x = Math.random() * Math.pow( 10, len );
return Math.floor( x );
}
var keystr = '';
for ( var i = 0; i < len; i++ ) {
x = Math.floor( ( Math.random() * 36 ) );
if ( mode === 1 ) {
// skip 0,1
x = ( x < 2 ) ? x + 2 : x;
// don't use the letters l (charCode 21+87) and o (24+87)
x = ( x === 21 ) ? 22 : x;
x = ( x === 24 ) ? 25 : x;
}
if ( x < 10 ) {
keystr += String( x );
} else {
keystr += String.fromCharCode( x + 87 );
}
}
return keystr;
};
/**
* Creates a random string, in this case a UUID-like thingy. I call it a Uniquely Interesting ID. It is *not* globally unique
* or even really unique. Just random and with a known format. Also available as uiid
*
* @returns {string}
* @method
*
*/
exports.tempKey = exports.uiid = function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( /[xy]/g, function ( c ) {
//noinspection JSHint
var r = Math.random() * 16 | 0, v = c === 'x' ? r : ( r & 0x3 | 0x8 );
return v.toString( 16 );
} );
};