c9f0ef2e1ec53877cf58862c21b4095daf90c3418888217aa8995d2116ab07c64fec2eaefa47f27384e9cf2fb83590c5a15cb541fa2e36c2c36c31692bb69f 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use strict';
  2. var Type = require('../../type');
  3. function resolveJavascriptRegExp(data) {
  4. if (data === null) return false;
  5. if (data.length === 0) return false;
  6. var regexp = data,
  7. tail = /\/([gim]*)$/.exec(data),
  8. modifiers = '';
  9. // if regexp starts with '/' it can have modifiers and must be properly closed
  10. // `/foo/gim` - modifiers tail can be maximum 3 chars
  11. if (regexp[0] === '/') {
  12. if (tail) modifiers = tail[1];
  13. if (modifiers.length > 3) return false;
  14. // if expression starts with /, is should be properly terminated
  15. if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;
  16. }
  17. return true;
  18. }
  19. function constructJavascriptRegExp(data) {
  20. var regexp = data,
  21. tail = /\/([gim]*)$/.exec(data),
  22. modifiers = '';
  23. // `/foo/gim` - tail can be maximum 4 chars
  24. if (regexp[0] === '/') {
  25. if (tail) modifiers = tail[1];
  26. regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
  27. }
  28. return new RegExp(regexp, modifiers);
  29. }
  30. function representJavascriptRegExp(object /*, style*/) {
  31. var result = '/' + object.source + '/';
  32. if (object.global) result += 'g';
  33. if (object.multiline) result += 'm';
  34. if (object.ignoreCase) result += 'i';
  35. return result;
  36. }
  37. function isRegExp(object) {
  38. return Object.prototype.toString.call(object) === '[object RegExp]';
  39. }
  40. module.exports = new Type('tag:yaml.org,2002:js/regexp', {
  41. kind: 'scalar',
  42. resolve: resolveJavascriptRegExp,
  43. construct: constructJavascriptRegExp,
  44. predicate: isRegExp,
  45. represent: representJavascriptRegExp
  46. });