1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 'use strict';
- function preserveCamelCase(str) {
- let isLastCharLower = false;
- let isLastCharUpper = false;
- let isLastLastCharUpper = false;
- for (let i = 0; i < str.length; i++) {
- const c = str[i];
- if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) {
- str = str.substr(0, i) + '-' + str.substr(i);
- isLastCharLower = false;
- isLastLastCharUpper = isLastCharUpper;
- isLastCharUpper = true;
- i++;
- } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) {
- str = str.substr(0, i - 1) + '-' + str.substr(i - 1);
- isLastLastCharUpper = isLastCharUpper;
- isLastCharUpper = false;
- isLastCharLower = true;
- } else {
- isLastCharLower = c.toLowerCase() === c;
- isLastLastCharUpper = isLastCharUpper;
- isLastCharUpper = c.toUpperCase() === c;
- }
- }
- return str;
- }
- module.exports = function (str) {
- if (arguments.length > 1) {
- str = Array.from(arguments)
- .map(x => x.trim())
- .filter(x => x.length)
- .join('-');
- } else {
- str = str.trim();
- }
- if (str.length === 0) {
- return '';
- }
- if (str.length === 1) {
- return str.toLowerCase();
- }
- if (/^[a-z0-9]+$/.test(str)) {
- return str;
- }
- const hasUpperCase = str !== str.toLowerCase();
- if (hasUpperCase) {
- str = preserveCamelCase(str);
- }
- return str
- .replace(/^[_.\- ]+/, '')
- .toLowerCase()
- .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase());
- };
|