You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
'use strict';
var extglob = require('extglob'); var nanomatch = require('nanomatch'); var regexNot = require('regex-not'); var toRegex = require('to-regex'); var not;
/** * Characters to use in negation regex (we want to "not" match * characters that are matched by other parsers) */
var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+'; var createNotRegex = function(opts) { return not || (not = textRegex(TEXT)); };
/** * Parsers */
module.exports = function(snapdragon) { var parsers = snapdragon.parser.parsers;
// register nanomatch parsers
snapdragon.use(nanomatch.parsers);
// get references to some specific nanomatch parsers before they
// are overridden by the extglob and/or parsers
var escape = parsers.escape; var slash = parsers.slash; var qmark = parsers.qmark; var plus = parsers.plus; var star = parsers.star; var dot = parsers.dot;
// register extglob parsers
snapdragon.use(extglob.parsers);
// custom micromatch parsers
snapdragon.parser .use(function() { // override "notRegex" created in nanomatch parser
this.notRegex = /^\!+(?!\()/; }) // reset the referenced parsers
.capture('escape', escape) .capture('slash', slash) .capture('qmark', qmark) .capture('star', star) .capture('plus', plus) .capture('dot', dot)
/** * Override `text` parser */
.capture('text', function() { if (this.isInside('bracket')) return; var pos = this.position(); var m = this.match(createNotRegex(this.options)); if (!m || !m[0]) return;
// escape regex boundary characters and simple brackets
var val = m[0].replace(/([[\]^$])/g, '\\$1');
return pos({ type: 'text', val: val }); }); };
/** * Create text regex */
function textRegex(pattern) { var notStr = regexNot.create(pattern, {contains: true, strictClose: false}); var prefix = '(?:[\\^]|\\\\|'; return toRegex(prefix + notStr + ')', {strictClose: false}); }
|