77 lines
1.7 KiB
JavaScript
77 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
var Type = require('../../type');
|
|
|
|
function resolveJavascriptRegExp(data) {
|
|
var regexp = data,
|
|
tail = /\/([gim]*)$/.exec(data),
|
|
modifiers = '';
|
|
|
|
// if regexp starts with '/' it can have modifiers and must be properly closed
|
|
// `/foo/gim` - modifiers tail can be maximum 3 chars
|
|
if ('/' === regexp[0]) {
|
|
if (tail) {
|
|
modifiers = tail[1];
|
|
}
|
|
|
|
if (modifiers.length > 3) { return false; }
|
|
// if expression starts with /, is should be properly terminated
|
|
if (regexp[regexp.length - modifiers.length - 1] !== '/') { return false; }
|
|
|
|
regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
|
|
}
|
|
|
|
try {
|
|
var dummy = new RegExp(regexp, modifiers);
|
|
return true;
|
|
} catch (error) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function constructJavascriptRegExp(data) {
|
|
var regexp = data,
|
|
tail = /\/([gim]*)$/.exec(data),
|
|
modifiers = '';
|
|
|
|
// `/foo/gim` - tail can be maximum 4 chars
|
|
if ('/' === regexp[0]) {
|
|
if (tail) {
|
|
modifiers = tail[1];
|
|
}
|
|
regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
|
|
}
|
|
|
|
return new RegExp(regexp, modifiers);
|
|
}
|
|
|
|
function representJavascriptRegExp(object /*, style*/) {
|
|
var result = '/' + object.source + '/';
|
|
|
|
if (object.global) {
|
|
result += 'g';
|
|
}
|
|
|
|
if (object.multiline) {
|
|
result += 'm';
|
|
}
|
|
|
|
if (object.ignoreCase) {
|
|
result += 'i';
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function isRegExp(object) {
|
|
return '[object RegExp]' === Object.prototype.toString.call(object);
|
|
}
|
|
|
|
module.exports = new Type('tag:yaml.org,2002:js/regexp', {
|
|
kind: 'scalar',
|
|
resolve: resolveJavascriptRegExp,
|
|
construct: constructJavascriptRegExp,
|
|
predicate: isRegExp,
|
|
represent: representJavascriptRegExp
|
|
});
|