StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
/** * The StringUtil... * * @class StringUtil * @module StructureJS * @submodule util * @author Robert S. (www.codeBelt.com) * @static */ class StringUtil { constructor() { throw new Error('[StringUtil] Do not instantiate the StringUtil class because it is a static class.'); } /** * Gets the extension name off the string being passed in. * * @method getExtension * @param filename {string} * @param withDot {boolean} If you want the period to be included in the extension name. * @returns {string} * @public * @static * @example * StringUtil.getExtension('file.exe'); * // 'exe' * * StringUtil.getExtension('file.exe', true); * // '.exe' */ public static getExtension(filename:string, withDot:boolean = false):string { const num:number = (withDot === true) ? 0 : 1; return filename.slice(filename.lastIndexOf('.') + num, filename.length); } /** * Converts a string to a sentence case string. * * @method toSentence * @param str {string} * @param [separator] {string} Can be any string you want to use as a separator. * @returns {string} * @public * @static * @example * StringUtil.toSentence("liveDown_by-the.River"); * // 'live down by the river' * * StringUtil.toSentence("liveDown_by-the.River", '-'); * // 'live-down-by-the-river' * * StringUtil.toSentence("liveDown_by-the.River", '_'); * // 'live_down_by_the_river' * * StringUtil.toSentence("liveDown_by-the.River", '/'); * // 'live/down/by/the/river' */ public static toSentence(str:string, separator:string = ' '):string { return String(str) // Add a space after any digits. .replace(/(\d+)/g, ' $1 ') // Add a space before any upper case characters. .replace(/([a-z](?=[A-Z]))/g, '$1 ') // Remove all non-word characters and replace with a single space. .replace(/[^a-zA-Z0-9 ]/g, ' ') // Replace multiple Spaces with a single space. .replace(/\s+/g, ' ') // Trim whitespace around the string. .replace(/^ | $/g, '') // Lower case the entire string. .toLowerCase() // If a separator is passed in then replace the space with it. .replace(/\s+/g, separator); } /** * Converts a string to a camel case string. * * @method toCamelCase * @param str {string} * @returns {string} * @public * @static * @example * StringUtil.toCamelCase("liveDown_by-the.River"); * // 'liveDownByTheRiver' */ public static toCamelCase(str:string):string { return StringUtil.toSentence(str) // Replace spaces between words with a string upper cased character. .replace(/ (\w)/g, function (_, $1) { return $1.toUpperCase(); }); } /** * Converts a hyphen string to a pascal case string. * * @method toPascalCase * @param str {string} * @returns {string} * @public * @static * @example * StringUtil.toPascalCase("liveDown_by-the.River"); * // 'LiveDownByTheRiver' */ public static toPascalCase(str:string):string { return StringUtil.toCamelCase(str) // Make first character uppercase. .replace(/^[a-zA-Z]/, function (a, b, c) { return a.toUpperCase(); }); } /** * Converts a string to a constant case string. * * @method toConstantCase * @param str {string} * @returns {string} * @public * @static * @example * StringUtil.toConstantCase("liveDown_by-the.River"); * // 'LIVE_DOWN_BY_THE_RIVER' */ public static toConstantCase(str:string):string { return StringUtil.toSentence(str, '_') .toUpperCase(); } /** * Creates a universally unique identifier. * * @method createUUID * @returns {string} * @public * @static * @example * StringUtil.createUUID(); * // 'a95d7134-3342-4001-bcea-cc0371b70dec' */ public static createUUID():string { const uuid = ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx').replace(/[xy]/g, function (c) { let r = Math.random() * 16 | 0; let v = (c == 'x') ? r : (r & 0x3 | 0x8); return v.toString(16); }); return uuid; } /** * Converts a query string to an object. * * @method queryStringToObject * @param queryString {string} * @param [useParseFloat=false] {boolean} If true converts strings to numbers. * @returns {Object|Null} * @public * @static * @example * StringUtil.queryStringToObject('?name=Robert&age=23&gender=male'); * // {name: 'Robert', age: '23', gender: 'male'} * * StringUtil.queryStringToObject('?name=Robert&age=23&gender=male', true); * // {name: 'Robert', age: 23, gender: 'male'} */ public static queryStringToObject(queryString:string, useParseFloat:boolean = false):any { let params:any = {}; let temp:any = null; const str:string = queryString.substring(queryString.indexOf('?') + 1); if (str === '') { return null; } // Split into key/value pairs const queries = str.split('&'); // Convert the array of strings into an object const len:number = queries.length; for (let i = 0; i < len; i++) { temp = queries[i].split('='); params[temp[0]] = (useParseFloat === true && isNaN(parseFloat(temp[1])) === false) ? parseFloat(temp[1]) : temp[1]; } return params; } /** * Converts a query string to an object. * * @method toQueryString * @param obj {Object} * @public * @static * @example * StringUtil.toQueryString({name: 'Robert', age: '23', gender: 'male'}); * // name=Robert&age=23&gender=male' */ public static toQueryString(obj:any):string { const str = []; for(let property in obj) { if (obj.hasOwnProperty(property)) { str.push(`${property}=${obj[property]}`); } } return str.join("&"); } /** * Remove all whitespace from the string passed in. * * @method removeAllWhitespace * @param str {string} * @returns {string} * @public * @static * @example * let str = ' a b c d e f g '; * StringUtil.removeAllWhitespace(str); * // 'abcdefg' */ public static removeAllWhitespace(str:string):string { return str.replace(/\s+/g, ''); } /** * Remove leading and trailing whitespace. * * @method removeLeadingTrailingWhitespace * @param str {string} * @returns {string} * @public * @static * @example * let str = ' a b c d e f g '; * StringUtil.removeLeadingTrailingWhitespace(str); * // 'a b c d e f g' */ public static removeLeadingTrailingWhitespace(str:string):string { return str.replace(/(^\s+|\s+$)/g, ''); } /** * * @method truncate * @param text {string} * @param length {int} * @param indicator {string} * @returns {string} * @public * @static * @example * StringUtil.truncate('Robert is cool and he likes bruschetta.', 14)); * // 'Robert is cool...' * * StringUtil.truncate('Robert is cool and he likes bruschetta.', 14, '!!!')); * // 'Robert is cool!!!' */ public static truncate(text:string, length:number, indicator:string = '...'):string { if (text.length <= length) { return text; } else { return text.substr(0, length) + indicator; } } /** * Replaces each format item in a specified string with the text equivalent of a corresponding object's value. * * @method format * @returns {string} * @param str {string} * @param ...rest {Array.<any>} * @public * @static * @example * StringUtil.format('Robert is {0}. Very {0} and {1}!', 'cool', 'smart'); * // 'Robert is cool. Very cool and smart!' */ public static format(str:string, ...rest:Array<any>):string { const length = rest.length; let value:string = str; for (let i:number = 0; i < length; i++) { let reg = new RegExp('\\{' + i + '\\}', 'gm'); value = value.replace(reg, rest[i]); } return value; } /** * Updates a value in the query string by its key name. * * @method paramReplace * @param queryString * @param name * @param value * @returns {string|void} * @example * StringUtil.paramReplace('?name=Robert&age=23&gender=male', 'gender', 'female'); * // '?name=Robert&age=23&gender=female' */ public static paramReplace(queryString, name, value) { // Find the param with regex // Grab the first character in the returned string (should be ? or &) // Replace our href string with our new value, passing on the name and delimiter const re = new RegExp('[\\?&]' + name + '=([^&#]*)'); const delimiter = re.exec(queryString)[0].charAt(0); return queryString.replace(re, delimiter + name + '=' + value); } } export default StringUtil;