Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
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.

es.regexp.constructor.js 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. var DESCRIPTORS = require('../internals/descriptors');
  2. var global = require('../internals/global');
  3. var isForced = require('../internals/is-forced');
  4. var inheritIfRequired = require('../internals/inherit-if-required');
  5. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  6. var defineProperty = require('../internals/object-define-property').f;
  7. var getOwnPropertyNames = require('../internals/object-get-own-property-names').f;
  8. var isRegExp = require('../internals/is-regexp');
  9. var getFlags = require('../internals/regexp-flags');
  10. var stickyHelpers = require('../internals/regexp-sticky-helpers');
  11. var redefine = require('../internals/redefine');
  12. var fails = require('../internals/fails');
  13. var has = require('../internals/has');
  14. var enforceInternalState = require('../internals/internal-state').enforce;
  15. var setSpecies = require('../internals/set-species');
  16. var wellKnownSymbol = require('../internals/well-known-symbol');
  17. var UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');
  18. var UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');
  19. var MATCH = wellKnownSymbol('match');
  20. var NativeRegExp = global.RegExp;
  21. var RegExpPrototype = NativeRegExp.prototype;
  22. // TODO: Use only propper RegExpIdentifierName
  23. var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
  24. var re1 = /a/g;
  25. var re2 = /a/g;
  26. // "new" should create a new object, old webkit bug
  27. var CORRECT_NEW = new NativeRegExp(re1) !== re1;
  28. var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;
  29. var BASE_FORCED = DESCRIPTORS &&
  30. (!CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {
  31. re2[MATCH] = false;
  32. // RegExp constructor can alter flags and IsRegExp works correct with @@match
  33. return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
  34. }));
  35. var handleDotAll = function (string) {
  36. var length = string.length;
  37. var index = 0;
  38. var result = '';
  39. var brackets = false;
  40. var chr;
  41. for (; index <= length; index++) {
  42. chr = string.charAt(index);
  43. if (chr === '\\') {
  44. result += chr + string.charAt(++index);
  45. continue;
  46. }
  47. if (!brackets && chr === '.') {
  48. result += '[\\s\\S]';
  49. } else {
  50. if (chr === '[') {
  51. brackets = true;
  52. } else if (chr === ']') {
  53. brackets = false;
  54. } result += chr;
  55. }
  56. } return result;
  57. };
  58. var handleNCG = function (string) {
  59. var length = string.length;
  60. var index = 0;
  61. var result = '';
  62. var named = [];
  63. var names = {};
  64. var brackets = false;
  65. var ncg = false;
  66. var groupid = 0;
  67. var groupname = '';
  68. var chr;
  69. for (; index <= length; index++) {
  70. chr = string.charAt(index);
  71. if (chr === '\\') {
  72. chr = chr + string.charAt(++index);
  73. } else if (chr === ']') {
  74. brackets = false;
  75. } else if (!brackets) switch (true) {
  76. case chr === '[':
  77. brackets = true;
  78. break;
  79. case chr === '(':
  80. if (IS_NCG.test(string.slice(index + 1))) {
  81. index += 2;
  82. ncg = true;
  83. }
  84. result += chr;
  85. groupid++;
  86. continue;
  87. case chr === '>' && ncg:
  88. if (groupname === '' || has(names, groupname)) {
  89. throw new SyntaxError('Invalid capture group name');
  90. }
  91. names[groupname] = true;
  92. named.push([groupname, groupid]);
  93. ncg = false;
  94. groupname = '';
  95. continue;
  96. }
  97. if (ncg) groupname += chr;
  98. else result += chr;
  99. } return [result, named];
  100. };
  101. // `RegExp` constructor
  102. // https://tc39.es/ecma262/#sec-regexp-constructor
  103. if (isForced('RegExp', BASE_FORCED)) {
  104. var RegExpWrapper = function RegExp(pattern, flags) {
  105. var thisIsRegExp = this instanceof RegExpWrapper;
  106. var patternIsRegExp = isRegExp(pattern);
  107. var flagsAreUndefined = flags === undefined;
  108. var groups = [];
  109. var rawPattern = pattern;
  110. var rawFlags, dotAll, sticky, handled, result, state;
  111. if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
  112. return pattern;
  113. }
  114. if (patternIsRegExp || pattern instanceof RegExpWrapper) {
  115. pattern = pattern.source;
  116. if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags.call(rawPattern);
  117. }
  118. pattern = pattern === undefined ? '' : String(pattern);
  119. flags = flags === undefined ? '' : String(flags);
  120. rawPattern = pattern;
  121. if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {
  122. dotAll = !!flags && flags.indexOf('s') > -1;
  123. if (dotAll) flags = flags.replace(/s/g, '');
  124. }
  125. rawFlags = flags;
  126. if (UNSUPPORTED_Y && 'sticky' in re1) {
  127. sticky = !!flags && flags.indexOf('y') > -1;
  128. if (sticky) flags = flags.replace(/y/g, '');
  129. }
  130. if (UNSUPPORTED_NCG) {
  131. handled = handleNCG(pattern);
  132. pattern = handled[0];
  133. groups = handled[1];
  134. }
  135. result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);
  136. if (dotAll || sticky || groups.length) {
  137. state = enforceInternalState(result);
  138. if (dotAll) {
  139. state.dotAll = true;
  140. state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
  141. }
  142. if (sticky) state.sticky = true;
  143. if (groups.length) state.groups = groups;
  144. }
  145. if (pattern !== rawPattern) try {
  146. // fails in old engines, but we have no alternatives for unsupported regex syntax
  147. createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
  148. } catch (error) { /* empty */ }
  149. return result;
  150. };
  151. var proxy = function (key) {
  152. key in RegExpWrapper || defineProperty(RegExpWrapper, key, {
  153. configurable: true,
  154. get: function () { return NativeRegExp[key]; },
  155. set: function (it) { NativeRegExp[key] = it; }
  156. });
  157. };
  158. for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {
  159. proxy(keys[index++]);
  160. }
  161. RegExpPrototype.constructor = RegExpWrapper;
  162. RegExpWrapper.prototype = RegExpPrototype;
  163. redefine(global, 'RegExp', RegExpWrapper);
  164. }
  165. // https://tc39.es/ecma262/#sec-get-regexp-@@species
  166. setSpecies('RegExp');