@spare/phrasing
Version:
Convert among snake/kebab/camel/pascal phrasings
128 lines (114 loc) • 3.86 kB
JavaScript
import { INILOW, CAPWORD, WORD } from '@spare/regex-phrasing';
export { CAMEL, CAPREST, CAPWORD, DASH_CAPREST, INILOW, INIWORD, WORD } from '@spare/regex-phrasing';
import { mutate } from '@vect/vector-mapper';
import { _decoVector } from '@spare/deco-vector';
import { SP } from '@spare/enum-chars';
const capitalize = word => word[0].toUpperCase() + word.substring(1).toLowerCase();
/**
* Camel/pascal case phrase -> Lowercase dashed phrase, loom or kebab.
* Snake: fox_jumps_over_dog
* Kebab: fox-jumps-over-dog
* @example 'TheCyberPunk2077Cdpr' -> 'the-cyber-punk-2077nd-cdpr'
* @param {string} phrase camel/pascal-case phrase
* @param {string} de
* @returns {string} lowercase dashed phrase
*/
function camelToSnake(phrase, de = '-') {
let ms, wd, ph = '';
if (((ms = INILOW.exec(phrase)) || (ms = CAPWORD.exec(phrase))) && ([wd] = ms)) ph = wd.toLowerCase();
while ((ms = CAPWORD.exec(phrase)) && ([wd] = ms)) ph += de + wd.toLowerCase();
return ph
}
/**
* loom or kebab phrase -> camel-case phrase
* @example 'THE_CYBER-PUNK.2077 cdpr' -> 'theCyberPunk2077Cdpr'
* @param {string} dashed dashed phrase
* @param {string} de
* @returns {string} camel phrase
*/
const snakeToCamel = (dashed, de = '') => {
let ms, wd, ph = '';
if ((ms = WORD.exec(dashed)) && ([wd] = ms)) ph = wd.toLowerCase();
while ((ms = WORD.exec(dashed)) && ([wd] = ms)) ph += de + capitalize(wd);
return ph
};
/**
* loom/kebab phrase -> pascal-case phrase
* @example 'THE_CYBER-PUNK.2077 cdpr' -> 'TheCyberPunk2077Cdpr'
* @param {string} dashed dashed phrase
* @param {string} de
* @returns {string} camel phrase
*/
const snakeToPascal = (dashed, de = '') => {
let ms, wd, ph = '';
if ((ms = WORD.exec(dashed)) && ([wd] = ms)) ph = capitalize(wd);
while ((ms = WORD.exec(dashed)) && ([wd] = ms)) ph += de + capitalize(wd);
return ph
};
/**
*
* @param word
* @return {string}
* @deprecated use capitalize instead
*/
const wordToCap = word => word[0].toUpperCase() + word.substring(1).toLowerCase();
const wordsToCamel = words => {
let i = 0, l = words?.length;
if (l) words[i] = words[i].toLowerCase();
while (++i < l) words[i] = capitalize(words[i]);
return words
};
const wordsToPascal = words => mutate(words, capitalize);
/**
* Camel/pascal case phrase -> split vector
* Snake: fox_jumps_over_dog
* Kebab: fox-jumps-over-dog
* @param {string} phrase camel/pascal-case phrase
* @returns {string[]}
* @deprecated use splitCamel in @spare/splitter
*/
function camelToVector (phrase) {
let ms, wd, ve = [];
if ((ms = INILOW.exec(phrase)) && ([wd] = ms)) ve.push(wd);
while ((ms = CAPWORD.exec(phrase)) && ([wd] = ms)) ve.push(wd);
return ve
}
/**
* loom or kebab phrase -> split vector
* @param {string} phrase - dashed phrase
* @returns {string[]}
* @deprecated use splitSnake in @spare/splitter
*/
const snakeToVector = (phrase) => phrase.split(/\W/g);
const presetAdjoin = p => {
p = p ?? {};
p.delim = p.delim ?? SP;
return p
};
/**
*
* @param words
* @return {string}
* @deprecated use adjoin in @spare/tap
*/
const adjoin = function (...words) {
const ve = [], config = presetAdjoin(this);
for (let word of words)
if (word?.length)
ve.push(word);
return _decoVector.call(config, ve)
};
/**
*
* @param {Object} p
*
* @param {string} [p.delim=',\n']
* @param {boolean|number} [p.bracket=true] - BRK = 1
* @param {Function} [p.read]
* @param {Object|Object[]} [p.presets=[FRESH, JUNGLE]]
*
* @returns {Function}
* @deprecated use Adjoin in @spare/tap
*/
const Adjoin = (p = {}) => adjoin.bind(p);
export { Adjoin, adjoin, camelToSnake, camelToVector, capitalize, snakeToCamel, snakeToPascal, snakeToVector, wordToCap, wordsToCamel, wordsToPascal };