-
Notifications
You must be signed in to change notification settings - Fork 0
/
case-score.js
71 lines (69 loc) · 1.99 KB
/
case-score.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
64
65
66
67
68
69
70
71
const stringScore = require("./string-score");
function caseScore(str, name) {
const scores = stringScore(str);
switch (name) {
case "upper":
const upperMultiplier = scores.upper === str.length ? 2 : 1;
const upperScore = (scores.upper - scores.lower) * upperMultiplier;
return upperScore
? upperScore - scores.snake - scores.kebab - scores.camel
: upperScore;
case "lower":
const lowerMultiplier = scores.lower === str.length ? 2 : 1;
const lowerScore = (scores.lower - scores.upper) * lowerMultiplier;
return lowerScore
? lowerScore - scores.snake - scores.kebab - scores.camel
: lowerScore;
case "kebab":
// Either fully lower, fully upper, or prefer lower over upper.
const kebabMultiplier =
scores.lower === 0
? scores.upper
: scores.upper === 0
? scores.lower
: scores.lower - scores.upper;
return (
scores.kebab -
scores.pascal -
scores.snake -
scores.camel +
kebabMultiplier
);
case "snake":
const snakeMultiplier =
scores.lower === 0
? scores.upper
: scores.upper === 0
? scores.lower
: scores.lower - scores.upper;
return (
scores.snake -
scores.camel -
scores.pascal -
scores.kebab +
snakeMultiplier
);
case "pascal":
return (
scores.pascal +
scores.camel -
scores.kebab -
scores.snake +
scores.upper +
scores.lower
);
case "camel":
// If it starts with capital letter, deduct 1, else add 1.
const camelPenalty = scores.pascal ? 1 : -1;
const camelScore =
scores.camel -
scores.kebab -
scores.snake +
scores.upper +
scores.lower;
return camelScore ? camelScore - camelPenalty : camelScore;
default:
throw new Error(`"${name}" is not valid`);
}
}
module.exports = caseScore;