'use strict';
|
|
var Type = require('../../type');
|
|
function resolveJavascriptRegExp(data) {
|
if (data === null) return false;
|
if (data.length === 0) return false;
|
|
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;
|
}
|
|
return true;
|
}
|
|
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.prototype.toString.call(object) === '[object RegExp]';
|
}
|
|
module.exports = new Type('tag:yaml.org,2002:js/regexp', {
|
kind: 'scalar',
|
resolve: resolveJavascriptRegExp,
|
construct: constructJavascriptRegExp,
|
predicate: isRegExp,
|
represent: representJavascriptRegExp
|
});
|