airbug/bugcore

View on GitHub
libraries/bugcore/js/src/util/StringUtil.js

Summary

Maintainability
D
2 days
Test Coverage
/*
 * Copyright (c) 2016 airbug Inc. http://airbug.com
 *
 * bugcore may be freely distributed under the MIT license.
 */


//-------------------------------------------------------------------------------
// Annotations
//-------------------------------------------------------------------------------

//@Export('StringUtil')

//@Require('Class')
//@Require('Obj')
//@Require('TypeUtil')


//-------------------------------------------------------------------------------
// Context
//-------------------------------------------------------------------------------

require('bugpack').context("*", function(bugpack) {

    //-------------------------------------------------------------------------------
    // BugPack
    //-------------------------------------------------------------------------------

    var Class       = bugpack.require('Class');
    var Obj         = bugpack.require('Obj');
    var TypeUtil    = bugpack.require('TypeUtil');


    //-------------------------------------------------------------------------------
    // Declare Class
    //-------------------------------------------------------------------------------

    /**
     * @class
     * @extends {Obj}
     */
    var StringUtil = Class.extend(Obj, {
        _name: 'StringUtil'
    });


    //-------------------------------------------------------------------------------
    // Static Methods
    //-------------------------------------------------------------------------------

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.camelCase = function(value) {
        return StringUtil.lowerFirst(
            StringUtil.words(value)
            .map(StringUtil.capitalize)
            .join('')
        );
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.capitalize = function(value) {
        var strings = value.split(" ");
        var result;
        if (strings.map) {
            result = strings.map(function(string, index, array) {
                return string[0].toUpperCase() + string.substring(1);
            });
        } else {
            result = [];
            strings.forEach(function(string){
                result.push(string[0].toUpperCase() + string.substring(1));
            });
        }
        return result.join(" ");
    };

    /**
     * @static
     * @param {string} value
     * @param {string} string
     * @return {boolean}
     */
    StringUtil.contains = function(value, string) {
        if (!TypeUtil.isString(value)) {
            throw new TypeError( "'value' must be an String");
        }
        if (!TypeUtil.isString(string)) {
            throw new TypeError( "'string' must be an String");
        }
        return value.indexOf(string) > -1;
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.escapeRegExp = function(value) {
        return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.escapeString = function(value) {
        return (value + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
    };

    /**
     * @static
     * @param {string} value
     * @param {string} pad
     * @param {number} size
     * @return {string}
     */
    StringUtil.lpad = function(value, pad, size) {
        var result = value + "";
        while (result.length < size) {
            result = pad + result;
        }
        return result;
    };

    /**
     * @static
     * @param {string} value
     * @param {string} separator
     * @return {string}
     */
    StringUtil.lowerCamelToSeparator = function(value, separator) {
        return value
            .replace(/([A-Z])([A-Z])/g, "$1" + separator + ("$2"))
            .replace(/([a-z\d])([A-Z])/g, "$1" + separator + ("$2"))
            .toLowerCase();
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.lowerFirst = function(value) {
        value = StringUtil.toString(value);
        var char = value.charAt(0);
        return char.toLowerCase() + value.substr(1);
    };

    /**
     * @static
     * @param {string} value
     * @param {string=} chars
     * @return {string}
     */
    StringUtil.ltrim = function(value, chars) {
        chars = chars || "\\s";
        return value.replace(new RegExp("^[" + chars + "]+", "g"), "");
    };

    /**
     * @static
     * @param {string} value
     * @param {string} pad
     * @param {number} size
     * @return {string}
     */
    StringUtil.pad = function(value, pad, size) {
        // Ensure string
        var result = value + "";
        while (result.length < size) {
            result = pad + result + pad;
        }
        return result;
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.pluralize = function(value) {
        //TODO also add irregular patterns
        var irregularPlurals = {
            winklevoss: "winklevii"
        };
        if (irregularPlurals[value]) {
            return irregularPlurals[value]
        } else {
            return value + "s";
        }
    };

    /**
     * @static
     * @param {string} value
     * @param {string} search
     * @param {string} replacement
     * @return {string}
     */
    StringUtil.replaceAll = function(value, search, replacement) {
        return value.replace(new RegExp(StringUtil.escapeRegExp(search), 'g'), replacement);
    };

    /**
     * @static
     * @param {string} value
     * @param {string} pad
     * @param {number} size
     * @return {string}
     */
    StringUtil.rpad = function(value, pad, size) {
        var result = value + "";
        while (result.length < size) {
            result = result + pad;
        }
        return result;
    };

    /**
     * @static
     * @param {string} value
     * @param {string=} chars
     * @return {string}
     */
    StringUtil.rtrim = function(value, chars) {
        chars = chars || "\\s";
        return value.replace(new RegExp("[" + chars + "]+$", "g"), "");
    };

    /**
     * @static
     * @param {string} value
     * @param {string} separator
     * @param {(function(string, number, Array.<string>):*)=} lineProcessor
     * @return {Array.<string>}
     */
    StringUtil.split = function(value, separator, lineProcessor) {
        var lines = value.split(separator);
        if (lineProcessor) {
            lines = lines.map(lineProcessor);
        }
        return lines;
    };

    /**
     * @static
     * @param {*} value
     * @return {string}
     */
    StringUtil.toString = function(value) {
        if (TypeUtil.isString(value)) {
            return value;
        }
        if (value == null) {
            return '';
        }
        if (TypeUtil.isSymbol(value)) {
            return Symbol ? Symbol.prototype.toString.call(value) : '';
        }
        var result = (value + '');
        return (result == '0' && (1 / value) == -Infinity) ? '-0' : result;
    };

    /**
     * @static
     * @param {string} value
     * @param {string=} chars
     * @return {string}
     */
    StringUtil.trim = function(value, chars) {
        chars = chars || "\\s";
        return value.replace(new RegExp("^[" + chars + "]+|[" + chars + "]+$", "g"), "");
    };

    /**
     * @static
     * @param {string} value
     * @return {string}
     */
    StringUtil.uncapitalize = function(value) {
        var strings = value.split(" ");
        var result;
        if (strings.map) {
            result = strings.map(function(string, index, array) {
                return string[0].toLowerCase() + string.substring(1);
            });
        } else {
            result = [];
            strings.forEach(function(string) {
                result.push(string[0].toLowerCase() + string.substring(1));
            });
        }
        return result.join(" ");
    };

    /**
     * @static
     * @param {string} value
     * @param {RegExp=} pattern
     * @return {Array.<string>}
     */
    StringUtil.words = function(value, pattern) {
        pattern = pattern || StringUtil.wordRegex;
        return value.match(pattern);
    };


    //-------------------------------------------------------------------------------
    // Private Static Properties
    //-------------------------------------------------------------------------------

    /**
     * @private
     * @static
     * @type {RegExp}
     */
    StringUtil.wordRegex = /([0-9]+)|([a-zA-Z]+)/g;


    //-------------------------------------------------------------------------------
    // Exports
    //-------------------------------------------------------------------------------

    bugpack.export('StringUtil', StringUtil);
});