69 lines
1.3 KiB
JavaScript
69 lines
1.3 KiB
JavaScript
/**
|
|
* The MIT License (MIT)
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <[email protected]>
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* A regexp-tree plugin to translate `/./s` to `/[\0-\uFFFF]/`.
|
|
*/
|
|
|
|
module.exports = {
|
|
|
|
// Whether `u` flag present. In which case we transform to
|
|
// \u{10FFFF} instead of \uFFFF.
|
|
_hasUFlag: false,
|
|
|
|
// Only run this plugin if we have `s` flag.
|
|
shouldRun: function shouldRun(ast) {
|
|
var shouldRun = ast.flags.includes('s');
|
|
|
|
if (!shouldRun) {
|
|
return false;
|
|
}
|
|
|
|
// Strip the `s` flag.
|
|
ast.flags = ast.flags.replace('s', '');
|
|
|
|
// Whether we have also `u`.
|
|
this._hasUFlag = ast.flags.includes('u');
|
|
|
|
return true;
|
|
},
|
|
Char: function Char(path) {
|
|
var node = path.node;
|
|
|
|
|
|
if (node.kind !== 'meta' || node.value !== '.') {
|
|
return;
|
|
}
|
|
|
|
var toValue = '\\uFFFF';
|
|
var toSymbol = '\uFFFF';
|
|
|
|
if (this._hasUFlag) {
|
|
toValue = '\\u{10FFFF}';
|
|
toSymbol = '\uDBFF\uDFFF';
|
|
}
|
|
|
|
path.replace({
|
|
type: 'CharacterClass',
|
|
expressions: [{
|
|
type: 'ClassRange',
|
|
from: {
|
|
type: 'Char',
|
|
value: '\\0',
|
|
kind: 'decimal',
|
|
symbol: '\0'
|
|
},
|
|
to: {
|
|
type: 'Char',
|
|
value: toValue,
|
|
kind: 'unicode',
|
|
symbol: toSymbol
|
|
}
|
|
}]
|
|
});
|
|
}
|
|
}; |