-
Notifications
You must be signed in to change notification settings - Fork 0
/
range-selection-parser.js
64 lines (52 loc) · 1.75 KB
/
range-selection-parser.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
// NB! REQUIRES UNDERSCORE TO BE EXPOSED IN WINDOW //
angular.module('range-selection-parser', [])
.factory('rangeSelectionParser', [function() {
function parse(str, array) {
var selection = []
, rangeRegExp = /(\d+)\s*-\s*(\d+)/g
, openRangeRegExp = /(\d+)\s*-$/
, singleItemRegExp = /(\d+)/g
, rangeStart
, rangeEnd
, singleItem
, pickFromArray = array instanceof Array
, arrayLength = pickFromArray ? array.length : null
, i;
// find all ranges
while (rangeRegExp.exec(str)) {
rangeStart = parseInt(RegExp.$1, 10);
rangeEnd = parseInt(RegExp.$2, 10);
if (!isNaN(rangeStart) && rangeEnd && rangeEnd > rangeStart) {
for (i = rangeStart; i < rangeEnd + 1; i++) {
selection.push(i);
}
}
}
// find open range
if (pickFromArray && openRangeRegExp.exec(str)) {
rangeStart = parseInt(RegExp.$1, 10);
if (!isNaN(rangeStart) && rangeStart < arrayLength + 1) {
for (i = rangeStart; i < arrayLength + 1; i++) {
selection.push(i);
}
}
}
// find single items
while (singleItemRegExp.exec(str)) {
singleItem = parseInt(RegExp.$1, 10);
if (!isNaN(singleItem) && !_.contains(selection, singleItem)) selection.push(singleItem);
}
return pickFromArray ?
_.filter(array, function(val, index) {
return _.contains(selection, index + 1); }) :
_.sortBy(selection, function(num) { return num; });
}
return {
parseSelectionString: function(str) {
return parse(str);
},
selectFromArray: function(array, str) {
return parse(str, array);
}
};
}]);