You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.9 KiB
50 lines
1.9 KiB
5 months ago
|
var toValueString = require('./toValueString')
|
||
|
var helperStringSubstring = require('./helperStringSubstring')
|
||
|
var helperStringLowerCase = require('./helperStringLowerCase')
|
||
|
|
||
|
var kebabCacheMaps = {}
|
||
|
|
||
|
/**
|
||
|
* 将带驼峰字符串转成字符串,例如: projectName 转为 project-name
|
||
|
*
|
||
|
* @param {String} str 字符串
|
||
|
* @return {String}
|
||
|
*/
|
||
|
function kebabCase (str) {
|
||
|
str = toValueString(str)
|
||
|
if (kebabCacheMaps[str]) {
|
||
|
return kebabCacheMaps[str]
|
||
|
}
|
||
|
if (/^[A-Z]+$/.test(str)) {
|
||
|
return helperStringLowerCase(str)
|
||
|
}
|
||
|
var rest = str.replace(/^([a-z])([A-Z]+)([a-z]+)$/, function (text, prevLower, upper, nextLower) {
|
||
|
var upperLen = upper.length
|
||
|
if (upperLen > 1) {
|
||
|
return prevLower + '-' + helperStringLowerCase(helperStringSubstring(upper, 0, upperLen - 1)) + '-' + helperStringLowerCase(helperStringSubstring(upper, upperLen - 1, upperLen)) + nextLower
|
||
|
}
|
||
|
return helperStringLowerCase(prevLower + '-' + upper + nextLower)
|
||
|
}).replace(/^([A-Z]+)([a-z]+)?$/, function (text, upper, nextLower) {
|
||
|
var upperLen = upper.length
|
||
|
return helperStringLowerCase(helperStringSubstring(upper, 0, upperLen - 1) + '-' + helperStringSubstring(upper, upperLen - 1, upperLen) + (nextLower || ''))
|
||
|
}).replace(/([a-z]?)([A-Z]+)([a-z]?)/g, function (text, prevLower, upper, nextLower, index) {
|
||
|
var upperLen = upper.length
|
||
|
if (upperLen > 1) {
|
||
|
if (prevLower) {
|
||
|
prevLower += '-'
|
||
|
}
|
||
|
if (nextLower) {
|
||
|
return (prevLower || '') + helperStringLowerCase(helperStringSubstring(upper, 0, upperLen - 1)) + '-' + helperStringLowerCase(helperStringSubstring(upper, upperLen - 1, upperLen)) + nextLower
|
||
|
}
|
||
|
}
|
||
|
return (prevLower || '') + (index ? '-' : '') + helperStringLowerCase(upper) + (nextLower || '')
|
||
|
})
|
||
|
rest = rest.replace(/([-]+)/g, function (text, flag, index) {
|
||
|
return index && index + flag.length < rest.length ? '-' : ''
|
||
|
})
|
||
|
kebabCacheMaps[str] = rest
|
||
|
return rest
|
||
|
}
|
||
|
|
||
|
module.exports = kebabCase
|