on 63243ca help sign in
elk/libraries/Native/Regex.js
112 lines 3.3 kB history raw
1Elm.Native.Regex = {};
2Elm.Native.Regex.make = function(elm) {
3 elm.Native = elm.Native || {};
4 elm.Native.Regex = elm.Native.Regex || {};
5 if (elm.Native.Regex.values) return elm.Native.Regex.values;
6 if ('values' in Elm.Native.Regex)
7 return elm.Native.Regex.values = Elm.Native.Regex.values;
9 var Maybe = Elm.Maybe.make(elm);
10 var JS = Elm.JavaScript.make(elm);
12 function escape(str) {
13 return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
14 }
15 function caseInsensitive(re) {
16 return new RegExp(re.source, 'gi');
17 }
18 function pattern(raw) {
19 return new RegExp(raw, 'g');
20 }
22 function contains(re, string) {
23 return re.test(JS.fromString(string));
24 }
26 function findAll(re, string) {
27 return find(Infinity, re, string);
28 }
29 function find(n, re, str) {
30 var out = [];
31 var number = 0;
32 var string = JS.fromString(str);
33 var result;
34 while (number++ < n && (result = re.exec(string))) {
35 var i = result.length - 1;
36 var subs = new Array(i);
37 while (i > 0) {
38 var submatch = result[i];
39 subs[--i] = submatch === undefined
40 ? Maybe.Nothing
41 : Maybe.Just(JS.toString(submatch));
42 }
43 out.push({
44 _:{},
45 match: JS.toString(result[0]),
46 submatches: JS.toList(subs),
47 index: result.index,
48 number: number,
49 });
50 }
51 return JS.toList(out);
52 }
54 function replaceAll(re, replacer, string) {
55 return replace(Infinity, re, replacer, string);
56 }
57 function replace(n, re, replacer, string) {
58 var count = 0;
59 function jsReplacer(match) {
60 if (count++ > n) return match;
61 var i = arguments.length-3;
62 var submatches = new Array(i);
63 while (i > 0) {
64 var submatch = arguments[i];
65 submatches[--i] = submatch === undefined
66 ? Maybe.Nothing
67 : Maybe.Just(JS.toString(submatch));
68 }
69 return JS.fromString(replacer({
70 _:{},
71 match:match,
72 submatches:JS.toList(submatches),
73 index:arguments[i-1],
74 number:count
75 }));
76 }
77 return string.replace(re, jsReplacer);
78 }
80 function split(re, string) {
81 return JS.toList(JS.fromString(string).split(re));
82 }
83 function splitN(n, re, str) {
84 var string = JS.fromString(str);
85 var result;
86 var out = [];
87 var start = re.lastIndex;
88 while (n--) {
89 if (!(result = re.exec(string))) break;
90 out.push(string.slice(start, result.index));
91 start = re.lastIndex;
92 }
93 out.push(string.slice(start));
94 return JS.toList(out);
95 }
97 return Elm.Native.Regex.values = {
98 pattern: pattern,
99 caseInsensitive: caseInsensitive,
100 escape: escape,
102 contains: F2(contains),
103 findAll: F2(findAll),
104 find: F3(find),
106 replaceAll: F3(replaceAll),
107 replace: F4(replace),
109 split: F2(split),
110 splitN: F3(splitN),
111 };
112};