You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.5 KiB
45 lines
1.5 KiB
3 years ago
|
var uncurryThis = require('../internals/function-uncurry-this');
|
||
|
var toObject = require('../internals/to-object');
|
||
|
|
||
|
var floor = Math.floor;
|
||
|
var charAt = uncurryThis(''.charAt);
|
||
|
var replace = uncurryThis(''.replace);
|
||
|
var stringSlice = uncurryThis(''.slice);
|
||
|
var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
|
||
|
var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
|
||
|
|
||
|
// `GetSubstitution` abstract operation
|
||
|
// https://tc39.es/ecma262/#sec-getsubstitution
|
||
|
module.exports = function (matched, str, position, captures, namedCaptures, replacement) {
|
||
|
var tailPos = position + matched.length;
|
||
|
var m = captures.length;
|
||
|
var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
|
||
|
if (namedCaptures !== undefined) {
|
||
|
namedCaptures = toObject(namedCaptures);
|
||
|
symbols = SUBSTITUTION_SYMBOLS;
|
||
|
}
|
||
|
return replace(replacement, symbols, function (match, ch) {
|
||
|
var capture;
|
||
|
switch (charAt(ch, 0)) {
|
||
|
case '$': return '$';
|
||
|
case '&': return matched;
|
||
|
case '`': return stringSlice(str, 0, position);
|
||
|
case "'": return stringSlice(str, tailPos);
|
||
|
case '<':
|
||
|
capture = namedCaptures[stringSlice(ch, 1, -1)];
|
||
|
break;
|
||
|
default: // \d\d?
|
||
|
var n = +ch;
|
||
|
if (n === 0) return match;
|
||
|
if (n > m) {
|
||
|
var f = floor(n / 10);
|
||
|
if (f === 0) return match;
|
||
|
if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);
|
||
|
return match;
|
||
|
}
|
||
|
capture = captures[n - 1];
|
||
|
}
|
||
|
return capture === undefined ? '' : capture;
|
||
|
});
|
||
|
};
|