blob: 74977d9f892d68bd1dcc1f0bfdf2172ace484b35 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
// Utilities
const lowerCase = require('./lower-case')
const specials = require('./specials')
const regex = /(?:(?:(\s?(?:^|[.\(\)!?;:"-])\s*)(\w))|(\w))(\w*[’']*\w*)/g
const convertToRegExp = specials => specials.map(s => [new RegExp(`\\b${s}\\b`, 'gi'), s])
function parseMatch(match) {
const firstCharacter = match[0]
// test first character
if (/\s/.test(firstCharacter)) {
// if whitespace - trim and return
return match.substr(1)
}
if (/[\(\)]/.test(firstCharacter)) {
// if parens - this shouldn't be replaced
return null
}
return match
}
module.exports = (str, options = {}) => {
str = str.toLowerCase().replace(regex, (m, lead = '', forced, lower, rest) => {
const parsedMatch = parseMatch(m)
if (!parsedMatch) {
return m
}
if (!forced) {
const fullLower = lower + rest
if (lowerCase.has(fullLower)) {
return parsedMatch
}
}
return lead + (lower || forced).toUpperCase() + rest
})
const customSpecials = options.special || []
const replace = [...specials, ...customSpecials]
const replaceRegExp = convertToRegExp(replace)
replaceRegExp.forEach(([pattern, s]) => {
str = str.replace(pattern, s)
})
return str
}
|