diff --git a/src/1-one/match/methods/parseMatch/02-parseToken.js b/src/1-one/match/methods/parseMatch/02-parseToken.js index 55df529..c4af9cc 100644 --- a/src/1-one/match/methods/parseMatch/02-parseToken.js +++ b/src/1-one/match/methods/parseMatch/02-parseToken.js @@ -31,7 +31,7 @@ const stripBoth = function (str) { return str } // -const parseToken = function (w, opts, aliases) { +const parseToken = function (w, opts) { const obj = {} //collect any flags (do it twice) for (let i = 0; i < 2; i += 1) { @@ -73,7 +73,7 @@ const parseToken = function (w, opts, aliases) { } } //back-flags - if (end(w) === '+' && !w.endsWith('\\+')) { + if (end(w) === '+') { obj.greedy = true w = stripEnd(w) } @@ -98,7 +98,7 @@ const parseToken = function (w, opts, aliases) { } //regex - if (start(w) === '/' && end(w) === '/' && w.length > 2) { + if (start(w) === '/' && end(w) === '/') { w = stripBoth(w) if (opts.caseSensitive) { obj.use = 'text' @@ -156,7 +156,7 @@ const parseToken = function (w, opts, aliases) { obj.choices = obj.choices.filter(s => s) //recursion alert! obj.choices = obj.choices.map(str => { - return str.split(/ /g).map(s => parseToken(s, opts, aliases)) + return str.split(/ /g).map(s => parseToken(s, opts)) }) w = '' } @@ -197,12 +197,8 @@ const parseToken = function (w, opts, aliases) { } //do the actual token content if (start(w) === '#') { - const name = stripStart(w) - obj.tag = aliases?.[name] - if (!obj.tag) { - obj.tag = titleCase(name) - obj.tag = aliases?.[obj.tag] || obj.tag - } + obj.tag = stripStart(w) + obj.tag = titleCase(obj.tag) return obj } //dynamic function on a term object @@ -225,8 +221,6 @@ const parseToken = function (w, opts, aliases) { //somehow handle encoded-chars? w = w.replace('\\*', '*') w = w.replace('\\.', '.') - w = w.replace('\\+', '+') - w = w.replace('\\/', '/') if (opts.caseSensitive) { obj.use = 'text' } else { diff --git a/tests/one/match/encoding.test.js b/tests/one/match/encoding.test.js new file mode 100644 index 0000000..f8bc748 --- /dev/null +++ b/tests/one/match/encoding.test.js @@ -0,0 +1,64 @@ +import test from 'tape' +import nlp from '../_lib.js' +const here = '[one/encoding] ' + +// test('encoding-match:', function (t) { +// let r = nlp('it is * nice') +// let str = r.match('is \\*').out().trim() +// t.equal(str, 'is *', 'encode asterix') + +// r = nlp('it is + nice'); +// str = r.match('is \\+ nice').trim().out(); +// t.equal(str, 'is + nice', 'encode plus'); + +// t.end() +// }) + +test('reserved-word-in-src:', function (t) { + const r = nlp('buy eggs constructor yeah prototype') + t.equal(r.has(`backburner`), false, here + 'single') + t.equal(r.has(`#Foo`), false, here + 'tag') + t.equal(r.has(`(upcoming|backburner)`), false, here + 'anyOf') + t.equal(r.has(`lala+`), false, here + 'manyOf') + t.equal(r.has(`nword{2,4}`), false, here + 'someOf') + t.end() +}) + +test('reserved-word-in-match:', function (t) { + const r = nlp('fo foo fulala repeat') + t.equal(r.has(`constructor`), false, here + 'single') + t.equal(r.has(`#constructor`), false, here + 'tag') + t.equal(r.has(`(upcoming|constructor)`), false, here + 'anyOf') + t.equal(r.has(`constructor+`), false, here + 'manyOf') + t.equal(r.has(`constructor{2,4}`), false, here + 'someOf') + t.end() +}) + +test('test-infinite-loop', function (t) { + const weirdDoc = nlp('^ ? * . + $') + weirdDoc.match('is?') + weirdDoc.match('.?') + weirdDoc.match('*') + weirdDoc.match('.+') + weirdDoc.match('+') + weirdDoc.match('?') + weirdDoc.match('.') + weirdDoc.match('? * . +') + weirdDoc.not('?') + weirdDoc.not('*') + weirdDoc.not('^') + weirdDoc.not('$') + weirdDoc.not('+') + weirdDoc.not('? * . +') + t.ok(true, here + 'didnt regress') + + let str = 'And you are?. Marshal' + let have = nlp(str).all().out() + t.equal(have, str, here + 'regression #1') + + str = `- where is she.Oh. you guys don't know?` + have = nlp(str).all().out() + t.equal(have, str, here + 'regression #2') + + t.end() +})