/** * Extracts the last `length` characters from `subject`. * * @function last * @static * @since 1.0.0 * @memberOf Chop * @param {string} [subject=''] The string to extract from. * @param {int} [length=1] The number of characters to extract. * @return {string} Returns the last characters string. * @example * v.last('helicopter'); * // => 'r' * * v.last('vehicle', 2); * // => 'le' * * v.last('car', 5); * // => 'car' */ export default function last(subject, length) { const subjectString = coerceToString(subject); const lengthInt = isNil(length) ? 1 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER); if (subjectString.length <= lengthInt) { return subjectString; } return subjectString.substr(subjectString.length - lengthInt, lengthInt); }
/** * Get the string representation of the `value`. * Converts the `value` to string. * If `value` is `null` or `undefined`, return `defaultValue`. * * @ignore * @function toString * @param {*} value The value to convert. * @param {*} [defaultValue=''] The default value to return. * @return {string|null} Returns the string representation of `value`. Returns `defaultValue` if `value` is * `null` or `undefined`. */ export default function coerceToString(value, defaultValue = '') { if (isNil(value)) { return defaultValue; } if (isString(value)) { return value; } return String(value); }
/** * Truncates `subject` to a new `length`. * * @function truncate * @static * @since 1.0.0 * @memberOf Chop * @param {string} [subject=''] The string to truncate. * @param {int} length The length to truncate the string. * @param {string} [end='...'] The string to be added at the end. * @return {string} Returns the truncated string. * @example * v.truncate('Once upon a time', 7); * // => 'Once...' * * v.truncate('Good day, Little Red Riding Hood', 14, ' (...)'); * // => 'Good day (...)' * * v.truncate('Once upon', 10); * // => 'Once upon' */ export default function truncate(subject, length, end) { const subjectString = coerceToString(subject); const lengthInt = isNil(length) ? subjectString.length : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER); const endString = coerceToString(end, '...'); if (lengthInt >= subjectString.length) { return subjectString; } return subjectString.substr(0, length - endString.length) + endString; }
/** * Get the string representation of the `value`. * Converts the `value` to string. * * @ignore * @function toString * @param {*} value The value to convert. * @return {string|null} Returns the string representation of `value`. */ export default function toString(value) { if (isNil(value)) { return null; } if (isString(value)) { return value; } return String(value); }
/** * Pads `subject` from left to a new `length`. * * @function padLeft * @static * @since 1.0.0 * @memberOf Manipulate * @param {string} [subject=''] The string to pad. * @param {int} [length=0] The length to left pad the string. No changes are made if `length` is less than `subject.length`. * @param {string} [pad=' '] The string to be used for padding. * @return {string} Returns the left padded string. * @example * v.padLeft('dog', 5); * // => ' dog' * * v.padLeft('bird', 6, '-'); * // => '--bird' * * v.padLeft('cat', 6, '-='); * // => '-=-cat' */ export default function padLeft(subject, length, pad) { const subjectString = coerceToString(subject); const lengthInt = isNil(length) ? 0 : clipNumber(toInteger(length), 0, MAX_SAFE_INTEGER); const padString = coerceToString(pad, ' '); if (lengthInt <= subjectString.length) { return subjectString; } return buildPadding(padString, lengthInt - subjectString.length) + subjectString; }
/** * Validates the specifier type and replacement position. * * @ignore * @throws {Error} Throws an exception on insufficient arguments or unknown specifier. * @param {number} index The index of the matched specifier. * @param {number} replacementsLength The number of replacements. * @param {ConversionSpecification} conversion The conversion specification object. * @return {undefined} */ export default function validate(index, replacementsLength, conversion) { if (isNil(conversion.typeSpecifier)) { throw new Error('sprintf(): Unknown type specifier'); } if (index > replacementsLength - 1) { throw new Error('sprintf(): Too few arguments'); } if (index < 0) { throw new Error('sprintf(): Argument number must be greater than zero'); } }
/** * Removes whitespaces from the right side of the `subject`. * * @function trimRight * @static * @since 1.0.0 * @memberOf Manipulate * @param {string} [subject=''] The string to trim. * @param {string} [whitespace=whitespace] The whitespace characters to trim. List all characters that you want to be stripped. * @return {string} Returns the trimmed string. * @example * v.trimRight('the fire rises '); * // => 'the fire rises' * * v.trimRight('do you feel in charge?!!!', '!'); * // => 'do you feel in charge?' */ export default function trimRight(subject, whitespace) { const subjectString = coerceToString(subject); if (whitespace === '' || subjectString === '') { return subjectString; } const whitespaceString = toString(whitespace); if (isNil(whitespaceString)) { return subjectString.replace(REGEXP_TRIM_RIGHT, ''); } let matchWhitespace = true; return reduceRight.call(subjectString, function(trimmed, character) { if (matchWhitespace && includes(whitespaceString, character)) { return trimmed; } matchWhitespace = false; return character + trimmed; }, ''); }