103 lines
3 KiB
JavaScript
103 lines
3 KiB
JavaScript
Elm.Native.Regex = {};
|
|
Elm.Native.Regex.make = function(elm) {
|
|
elm.Native = elm.Native || {};
|
|
elm.Native.Regex = elm.Native.Regex || {};
|
|
if (elm.Native.Regex.values) return elm.Native.Regex.values;
|
|
if ('values' in Elm.Native.Regex)
|
|
return elm.Native.Regex.values = Elm.Native.Regex.values;
|
|
|
|
var Maybe = Elm.Maybe.make(elm);
|
|
var JS = Elm.JavaScript.make(elm);
|
|
|
|
function escape(str) {
|
|
return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
}
|
|
function caseInsensitive(re) {
|
|
return new RegExp(re.source, 'gi');
|
|
}
|
|
function regex(raw) {
|
|
return new RegExp(raw, 'g');
|
|
}
|
|
|
|
function contains(re, string) {
|
|
return re.test(JS.fromString(string));
|
|
}
|
|
|
|
function find(n, re, str) {
|
|
n = n.ctor === "All" ? Infinity : n._0;
|
|
var out = [];
|
|
var number = 0;
|
|
var string = JS.fromString(str);
|
|
var result;
|
|
while (number++ < n && (result = re.exec(string))) {
|
|
var i = result.length - 1;
|
|
var subs = new Array(i);
|
|
while (i > 0) {
|
|
var submatch = result[i];
|
|
subs[--i] = submatch === undefined
|
|
? Maybe.Nothing
|
|
: Maybe.Just(JS.toString(submatch));
|
|
}
|
|
out.push({
|
|
_:{},
|
|
match: JS.toString(result[0]),
|
|
submatches: JS.toList(subs),
|
|
index: result.index,
|
|
number: number,
|
|
});
|
|
}
|
|
return JS.toList(out);
|
|
}
|
|
|
|
function replace(n, re, replacer, string) {
|
|
n = n.ctor === "All" ? Infinity : n._0;
|
|
var count = 0;
|
|
function jsReplacer(match) {
|
|
if (count++ > n) return match;
|
|
var i = arguments.length-3;
|
|
var submatches = new Array(i);
|
|
while (i > 0) {
|
|
var submatch = arguments[i];
|
|
submatches[--i] = submatch === undefined
|
|
? Maybe.Nothing
|
|
: Maybe.Just(JS.toString(submatch));
|
|
}
|
|
return JS.fromString(replacer({
|
|
_:{},
|
|
match:match,
|
|
submatches:JS.toList(submatches),
|
|
index:arguments[i-1],
|
|
number:count
|
|
}));
|
|
}
|
|
return string.replace(re, jsReplacer);
|
|
}
|
|
|
|
function split(n, re, str) {
|
|
if (n === Infinity) {
|
|
return JS.toList(JS.fromString(string).split(re));
|
|
}
|
|
var string = JS.fromString(str);
|
|
var result;
|
|
var out = [];
|
|
var start = re.lastIndex;
|
|
while (n--) {
|
|
if (!(result = re.exec(string))) break;
|
|
out.push(string.slice(start, result.index));
|
|
start = re.lastIndex;
|
|
}
|
|
out.push(string.slice(start));
|
|
return JS.toList(out);
|
|
}
|
|
|
|
return Elm.Native.Regex.values = {
|
|
regex: regex,
|
|
caseInsensitive: caseInsensitive,
|
|
escape: escape,
|
|
|
|
contains: F2(contains),
|
|
find: F3(find),
|
|
replace: F4(replace),
|
|
split: F3(split),
|
|
};
|
|
};
|