-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
index.js
56 lines (48 loc) · 1.42 KB
/
index.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
export default function buildMatchFn(args) {
return function(dirtyString, dirtyOptions) {
var string = String(dirtyString)
var options = dirtyOptions || {}
var width = options.width
var matchPattern =
(width && args.matchPatterns[width]) ||
args.matchPatterns[args.defaultMatchWidth]
var matchResult = string.match(matchPattern)
if (!matchResult) {
return null
}
var matchedString = matchResult[0]
var parsePatterns =
(width && args.parsePatterns[width]) ||
args.parsePatterns[args.defaultParseWidth]
var value
if (Object.prototype.toString.call(parsePatterns) === '[object Array]') {
value = findIndex(parsePatterns, function(pattern) {
return pattern.test(matchedString)
})
} else {
value = findKey(parsePatterns, function(pattern) {
return pattern.test(matchedString)
})
}
value = args.valueCallback ? args.valueCallback(value) : value
value = options.valueCallback ? options.valueCallback(value) : value
return {
value: value,
rest: string.slice(matchedString.length)
}
}
}
function findKey(object, predicate) {
for (var key in object) {
if (object.hasOwnProperty(key) && predicate(object[key])) {
return key
}
}
}
function findIndex(array, predicate) {
for (var key = 0; key < array.length; key++) {
if (predicate(array[key])) {
return key
}
}
}