ui-template-muc
Version:
A fantastic mobile ui lib implement by Vue
78 lines (66 loc) • 2.43 kB
JavaScript
import {isArray} from '@utils/helpers'
const preserveCamelCase = string => {
let isLastCharLower = false
let isLastCharUpper = false
let isLastLastCharUpper = false
for (let i = 0; i < string.length; i++) {
const character = string[i]
if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
string = string.slice(0, i) + '-' + string.slice(i)
isLastCharLower = false
isLastLastCharUpper = isLastCharUpper
isLastCharUpper = true
i++
} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {
string = string.slice(0, i - 1) + '-' + string.slice(i - 1)
isLastLastCharUpper = isLastCharUpper
isLastCharUpper = false
isLastCharLower = true
} else {
isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character
isLastLastCharUpper = isLastCharUpper
isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character
}
}
return string
}
const camelCase = (input, options) => {
if (!(typeof input === 'string' || isArray(input))) {
throw new TypeError('Expected the input to be `string | string[]`')
}
options = Object.assign({
pascalCase: false
}, options)
const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x
if (Array.isArray(input)) {
input = input.map(x => x.trim())
.filter(x => x.length)
.join('-')
} else {
input = input.trim()
}
if (input.length === 0) {
return ''
}
if (input.length === 1) {
return options.pascalCase ? input.toUpperCase() : input.toLowerCase()
}
const hasUpperCase = input !== input.toLowerCase()
if (hasUpperCase) {
input = preserveCamelCase(input)
}
input = input
.replace(/^[_.\- ]+/, '')
.toLowerCase()
.replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
.replace(/\d+(\w|$)/g, m => m.toUpperCase())
return postProcess(input)
}
export function uppercamelcase (input, options) {
let str = camelCase(input, options)
return str.charAt(0).toUpperCase() + str.slice(1)
}
export function lowercamelcase (input, options) {
let str = camelCase(input, options)
return str.charAt(0).toLowerCase() + str.slice(1)
}