1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 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;
- });
- };
|