07ef5218ed91f02d51995ec23ed6cbb6e28ab25f
[platform/framework/web/crosswalk-tizen.git] /
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 });