Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81154 views
1
'use strict';
2
3
var Type = require('../../type');
4
5
function resolveJavascriptRegExp(data) {
6
if (null === data) {
7
return false;
8
}
9
10
if (0 === data.length) {
11
return false;
12
}
13
14
var regexp = data,
15
tail = /\/([gim]*)$/.exec(data),
16
modifiers = '';
17
18
// if regexp starts with '/' it can have modifiers and must be properly closed
19
// `/foo/gim` - modifiers tail can be maximum 3 chars
20
if ('/' === regexp[0]) {
21
if (tail) {
22
modifiers = tail[1];
23
}
24
25
if (modifiers.length > 3) { return false; }
26
// if expression starts with /, is should be properly terminated
27
if (regexp[regexp.length - modifiers.length - 1] !== '/') { return false; }
28
29
regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
30
}
31
32
try {
33
var dummy = new RegExp(regexp, modifiers);
34
return true;
35
} catch (error) {
36
return false;
37
}
38
}
39
40
function constructJavascriptRegExp(data) {
41
var regexp = data,
42
tail = /\/([gim]*)$/.exec(data),
43
modifiers = '';
44
45
// `/foo/gim` - tail can be maximum 4 chars
46
if ('/' === regexp[0]) {
47
if (tail) {
48
modifiers = tail[1];
49
}
50
regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
51
}
52
53
return new RegExp(regexp, modifiers);
54
}
55
56
function representJavascriptRegExp(object /*, style*/) {
57
var result = '/' + object.source + '/';
58
59
if (object.global) {
60
result += 'g';
61
}
62
63
if (object.multiline) {
64
result += 'm';
65
}
66
67
if (object.ignoreCase) {
68
result += 'i';
69
}
70
71
return result;
72
}
73
74
function isRegExp(object) {
75
return '[object RegExp]' === Object.prototype.toString.call(object);
76
}
77
78
module.exports = new Type('tag:yaml.org,2002:js/regexp', {
79
kind: 'scalar',
80
resolve: resolveJavascriptRegExp,
81
construct: constructJavascriptRegExp,
82
predicate: isRegExp,
83
represent: representJavascriptRegExp
84
});
85
86