-
Notifications
You must be signed in to change notification settings - Fork 0
/
bicaps.js
63 lines (51 loc) · 1.28 KB
/
bicaps.js
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
52
53
54
55
56
57
58
59
60
61
62
63
'use strict';
const MODULE_REQUIRE = 1
/* built-in */
/* NPM */
, noda = require('noda')
/* in-package */
, Case = noda.inRequire('class/Case')
;
function wordFormatter(word, index) {
if (word.length == 1 && index == 0) return word.toLowerCase();
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
}
function wordParser(word, index) {
if (index == 0 && word.length == 1) return /[a-z]/.test(word) ? word : false;
return /^[A-Z][a-z]*$/.test(word) ? word.toLowerCase() : false;
}
const baseOptions = {
splitter: /(?=[A-Z])/,
wordFormatter,
wordParser,
};
/**
* Create a camel case which may contain specified terms.
* @param {string|string[]} terms
*/
function terms(terms) {
if (typeof terms == 'string') terms = [ terms ];
let splitter = text => {
let words = [];
while (text.length) {
let word = null;
for (let i = 0; i < terms.length; i++) {
if (text.startsWith(terms[i])) {
word = terms[i];
break;
}
}
if (!word) {
/^(.[^A-Z]*)/.test(text);
word = RegExp.$1;
}
words.push(word);
text = text.substr(word.length);
}
return words;
}
return new Case(Object.assign(baseOptions, { terms, splitter }));
}
const bicaps = new Case(baseOptions);
Object.assign(bicaps, { terms });
module.exports = bicaps;