3 var posix = require('posix-character-classes');
5 module.exports = function(brackets) {
12 .set('escape', function(node) {
13 return this.emit('\\' + node.val.replace(/^\\/, ''), node);
20 .set('text', function(node) {
21 return this.emit(node.val.replace(/([{}])/g, '\\$1'), node);
25 * POSIX character classes
28 .set('posix', function(node) {
29 if (node.val === '[::]') {
30 return this.emit('\\[::\\]', node);
33 var val = posix[node.inner];
34 if (typeof val === 'undefined') {
35 val = '[' + node.inner + ']';
37 return this.emit(val, node);
44 .set('bracket', function(node) {
45 return this.mapVisit(node.nodes);
47 .set('bracket.open', function(node) {
48 return this.emit(node.val, node);
50 .set('bracket.inner', function(node) {
53 if (inner === '[' || inner === ']') {
54 return this.emit('\\' + node.val, node);
57 return this.emit('^\\]', node);
60 return this.emit('^', node);
63 if (/-/.test(inner) && !/(\d-\d|\w-\w)/.test(inner)) {
64 inner = inner.split('-').join('\\-');
67 var isNegated = inner.charAt(0) === '^';
68 // add slashes to negated brackets, per spec
69 if (isNegated && inner.indexOf('/') === -1) {
72 if (isNegated && inner.indexOf('.') === -1) {
76 // don't unescape `0` (octal literal)
77 inner = inner.replace(/\\([1-9])/g, '$1');
78 return this.emit(inner, node);
80 .set('bracket.close', function(node) {
81 var val = node.val.replace(/^\\/, '');
82 if (node.parent.escaped === true) {
83 return this.emit('\\' + val, node);
85 return this.emit(val, node);