123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- 'use strict';
- var $TypeError = require('es-errors/type');
- var regexTester = require('safe-regex-test');
- var every = require('../helpers/every');
- var inspect = require('object-inspect');
- var Get = require('./Get');
- var IsArray = require('./IsArray');
- var min = require('./min');
- var StringIndexOf = require('./StringIndexOf');
- var StringToNumber = require('./StringToNumber');
- var substring = require('./substring');
- var ToString = require('./ToString');
- var Type = require('./Type');
- var isInteger = require('../helpers/isInteger');
- var isStringOrUndefined = require('../helpers/isStringOrUndefined');
- var isPrefixOf = require('../helpers/isPrefixOf');
- var startsWithDollarDigit = regexTester(/^\$[0-9]/);
- module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacementTemplate) {
- if (typeof matched !== 'string') {
- throw new $TypeError('Assertion failed: `matched` must be a String');
- }
- if (typeof str !== 'string') {
- throw new $TypeError('Assertion failed: `str` must be a String');
- }
- if (!isInteger(position) || position < 0) {
- throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, got ' + inspect(position));
- }
- if (!IsArray(captures) || !every(captures, isStringOrUndefined)) {
- throw new $TypeError('Assertion failed: `captures` must be a possibly-empty List of Strings or `undefined`, got ' + inspect(captures));
- }
- if (typeof namedCaptures !== 'undefined' && Type(namedCaptures) !== 'Object') {
- throw new $TypeError('Assertion failed: `namedCaptures` must be `undefined` or an Object');
- }
- if (typeof replacementTemplate !== 'string') {
- throw new $TypeError('Assertion failed: `replacementTemplate` must be a String');
- }
- var stringLength = str.length;
- if (position > stringLength) {
- throw new $TypeError('Assertion failed: position > stringLength, got ' + inspect(position));
- }
- var templateRemainder = replacementTemplate;
- var result = '';
- while (templateRemainder !== '') {
-
- var ref, refReplacement, found, capture;
- if (isPrefixOf('$$', templateRemainder)) {
- ref = '$$';
- refReplacement = '$';
- } else if (isPrefixOf('$`', templateRemainder)) {
- ref = '$`';
- refReplacement = substring(str, 0, position);
- } else if (isPrefixOf('$&', templateRemainder)) {
- ref = '$&';
- refReplacement = matched;
- } else if (isPrefixOf('$\'', templateRemainder)) {
- ref = '$\'';
- var matchLength = matched.length;
- var tailPos = position + matchLength;
- refReplacement = substring(str, min(tailPos, stringLength));
-
- } else if (startsWithDollarDigit(templateRemainder)) {
- found = false;
- for (var d = 2; d > 0; d -= 1) {
-
- if (!found) {
- found = true;
- ref = substring(templateRemainder, 0, 1 + d);
- var digits = substring(templateRemainder, 1, 1 + d);
- var index = StringToNumber(digits);
- if (index < 0 || index > 99) {
- throw new $TypeError('Assertion failed: `index` must be >= 0 and <= 99');
- }
- if (index === 0) {
- refReplacement = ref;
- } else if (index <= captures.length) {
- capture = captures[index - 1];
- if (typeof capture === 'undefined') {
- refReplacement = '';
- } else {
- refReplacement = capture;
- }
- } else {
- refReplacement = ref;
- }
- }
- }
- } else if (isPrefixOf('$<', templateRemainder)) {
- var gtPos = StringIndexOf(templateRemainder, '>', 0);
- if (gtPos === -1 || typeof namedCaptures === 'undefined') {
- ref = '$<';
- refReplacement = ref;
- } else {
- ref = substring(templateRemainder, 0, gtPos + 1);
- var groupName = substring(templateRemainder, 2, gtPos);
- if (Type(namedCaptures) !== 'Object') {
- throw new $TypeError('Assertion failed: Type(namedCaptures) is not Object');
- }
- capture = Get(namedCaptures, groupName);
- if (typeof capture === 'undefined') {
- refReplacement = '';
- } else {
- refReplacement = ToString(capture);
- }
- }
- } else {
- ref = substring(templateRemainder, 0, 1);
- refReplacement = ref;
- }
- var refLength = ref.length;
- templateRemainder = substring(templateRemainder, refLength);
- result += refReplacement;
- }
- return result;
- };
|