47 lines
1.6 KiB
JavaScript
47 lines
1.6 KiB
JavaScript
'use strict';
|
|
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);
|
|
// eslint-disable-next-line redos/no-vulnerable -- safe
|
|
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;
|
|
});
|
|
};
|