You've already forked search-query-parser
Return the character offsets of parsed search parts. The use case is that browser code using the library might want to track the cursor position (eg in an HTML <input> element) to understand which part of the search query the user is editing. It could then show an editor specific to that keyboard, such as a calendar picker, and then splice in the edited value back into the search string.
This commit is contained in:
250
test/test.js
250
test/test.js
@@ -23,6 +23,12 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.not.have.property('text');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 16
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -34,6 +40,20 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.have.property('text', 'hey buddy!');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 16
|
||||
}, {
|
||||
text: 'hey',
|
||||
offsetStart: 17,
|
||||
offsetEnd: 20
|
||||
}, {
|
||||
text: 'buddy!',
|
||||
offsetStart: 21,
|
||||
offsetEnd: 27
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -45,6 +65,20 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.have.property('text', 'hey you!');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
text: 'hey',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 3
|
||||
}, {
|
||||
text: 'you!',
|
||||
offsetStart: 4,
|
||||
offsetEnd: 8
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 9,
|
||||
offsetEnd: 25
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -56,6 +90,24 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.have.property('text', 'hey you! pouet');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
text: 'hey',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 3
|
||||
}, {
|
||||
text: 'you!',
|
||||
offsetStart: 4,
|
||||
offsetEnd: 8
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 9,
|
||||
offsetEnd: 25
|
||||
}, {
|
||||
text: 'pouet',
|
||||
offsetStart: 26,
|
||||
offsetEnd: 31
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -68,6 +120,24 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.have.property('text', 'hey you! pouet');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
text: 'hey',
|
||||
offsetStart: 3,
|
||||
offsetEnd: 6
|
||||
}, {
|
||||
text: 'you!',
|
||||
offsetStart: 11,
|
||||
offsetEnd: 15
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 16,
|
||||
offsetEnd: 32
|
||||
}, {
|
||||
text: 'pouet',
|
||||
offsetStart: 35,
|
||||
offsetEnd: 40
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -80,6 +150,37 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.have.property('to', 'bar@hey.ya');
|
||||
parsedSearchQuery.should.have.property('text', 'hey, so what\'s up gents');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
text: 'hey,',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 4
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 5,
|
||||
offsetEnd: 21
|
||||
}, {
|
||||
keyword: 'to',
|
||||
value: 'bar@hey.ya',
|
||||
offsetStart: 22,
|
||||
offsetEnd: 35
|
||||
}, {
|
||||
text: 'so',
|
||||
offsetStart: 36,
|
||||
offsetEnd: 38
|
||||
}, {
|
||||
text: 'what\'s',
|
||||
offsetStart: 39,
|
||||
offsetEnd: 45
|
||||
}, {
|
||||
text: 'up',
|
||||
offsetStart: 46,
|
||||
offsetEnd: 48
|
||||
}, {
|
||||
text: 'gents',
|
||||
offsetStart: 49,
|
||||
offsetEnd: 54
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -95,6 +196,21 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.from.length.should.equal(2);
|
||||
parsedSearchQuery.from.should.containEql('jul@foo.com');
|
||||
parsedSearchQuery.from.should.containEql('bar@hey.ya');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 16
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'bar@hey.ya',
|
||||
offsetStart: 17,
|
||||
offsetEnd: 32
|
||||
}, {
|
||||
text: 'vaccationessss',
|
||||
offsetStart: 33,
|
||||
offsetEnd: 47
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -109,6 +225,12 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.from.length.should.equal(2);
|
||||
parsedSearchQuery.from.should.containEql('jul@foo.com');
|
||||
parsedSearchQuery.from.should.containEql('bar@hey.ya');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com,bar@hey.ya',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 27
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -126,6 +248,21 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.from.should.containEql('bar@hey.ya');
|
||||
parsedSearchQuery.from.should.containEql('a@b.c');
|
||||
parsedSearchQuery.from.should.containEql('d@e.f');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com,bar@hey.ya',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 27
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'a@b.c,d@e.f',
|
||||
offsetStart: 28,
|
||||
offsetEnd: 44
|
||||
}, {
|
||||
text: 'ouch!#',
|
||||
offsetStart: 45,
|
||||
offsetEnd: 51
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -139,6 +276,16 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.have.property('date');
|
||||
parsedSearchQuery.date.should.be.an.Object;
|
||||
parsedSearchQuery.date.from.should.containEql('12/12/2012');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'date',
|
||||
value: '12/12/2012',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 15
|
||||
}, {
|
||||
text: 'ahaha',
|
||||
offsetStart: 16,
|
||||
offsetEnd: 21
|
||||
}]);
|
||||
});
|
||||
|
||||
it('should parse range with 2 ends and free text', function () {
|
||||
@@ -152,6 +299,16 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.date.should.be.an.Object;
|
||||
parsedSearchQuery.date.from.should.containEql('12/12/2012');
|
||||
parsedSearchQuery.date.to.should.containEql('01/01/2014');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'date',
|
||||
value: '12/12/2012-01/01/2014',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 26
|
||||
}, {
|
||||
text: 'ahaha',
|
||||
offsetStart: 27,
|
||||
offsetEnd: 32
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -198,6 +355,48 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.to.length.should.equal(2);
|
||||
parsedSearchQuery.to.should.containEql('me@me.com');
|
||||
parsedSearchQuery.to.should.containEql('toto@hey.co');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'date',
|
||||
value: '12/12/2012-01/01/2014',
|
||||
offsetStart: 3,
|
||||
offsetEnd: 29
|
||||
}, {
|
||||
text: 'ahaha',
|
||||
offsetStart: 30,
|
||||
offsetEnd: 35
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com,bar@hey.ya',
|
||||
offsetStart: 36,
|
||||
offsetEnd: 63
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'a@b.c,d@e.f',
|
||||
offsetStart: 64,
|
||||
offsetEnd: 80
|
||||
}, {
|
||||
text: 'ouch!#',
|
||||
offsetStart: 81,
|
||||
offsetEnd: 87
|
||||
}, {
|
||||
keyword: 'to',
|
||||
value: 'me@me.com',
|
||||
offsetStart: 90,
|
||||
offsetEnd: 102
|
||||
}, {
|
||||
keyword: 'to',
|
||||
value: 'toto@hey.co',
|
||||
offsetStart: 103,
|
||||
offsetEnd: 117
|
||||
}, {
|
||||
text: 'about',
|
||||
offsetStart: 118,
|
||||
offsetEnd: 123
|
||||
}, {
|
||||
text: 'that',
|
||||
offsetStart: 124,
|
||||
offsetEnd: 128
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -209,6 +408,17 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('name', 'Bob Saget');
|
||||
parsedSearchQuery.should.have.property('description', 'Banana Sandwiche');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'name',
|
||||
value: 'Bob Saget',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 16
|
||||
}, {
|
||||
keyword: 'description',
|
||||
value: 'Banana Sandwiche',
|
||||
offsetStart: 17,
|
||||
offsetEnd: 47
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -220,6 +430,17 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
parsedSearchQuery.should.have.property('case1', 'This "is" \'a\' test');
|
||||
parsedSearchQuery.should.have.property('case2', 'This "is" \'a\' test');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'case1',
|
||||
value: 'This "is" \'a\' test',
|
||||
offsetStart: 0,
|
||||
offsetEnd: 28
|
||||
}, {
|
||||
keyword: 'case2',
|
||||
value: 'This "is" \'a\' test',
|
||||
offsetStart: 29,
|
||||
offsetEnd: 57
|
||||
}]);
|
||||
});
|
||||
|
||||
|
||||
@@ -232,6 +453,12 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.exclude.should.be.an.Object;
|
||||
parsedSearchQuery.exclude.should.have.property('from', 'jul@foo.com');
|
||||
parsedSearchQuery.should.not.have.property('text');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com',
|
||||
offsetStart: 1,
|
||||
offsetEnd: 17
|
||||
}]);
|
||||
});
|
||||
|
||||
it('should concatenate a keyword multiple values in exclusion syntax', function() {
|
||||
@@ -244,11 +471,19 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.exclude.from.should.containEql('jul@foo.com');
|
||||
parsedSearchQuery.exclude.from.should.containEql('mar@foo.com');
|
||||
parsedSearchQuery.should.not.have.property('text');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com,mar@foo.com',
|
||||
offsetStart: 1,
|
||||
offsetEnd: 29
|
||||
}]);
|
||||
});
|
||||
|
||||
it('should support keywords which appear multiple times with exclusion syntax', function() {
|
||||
var searchQuery = '-from:jul@foo.com,mar@foo.com -from:jan@foo.com';
|
||||
var options = {keywords: ['from']};
|
||||
var options = {
|
||||
keywords: ['from']
|
||||
};
|
||||
var parsedSearchQuery = searchquery.parse(searchQuery, options);
|
||||
|
||||
parsedSearchQuery.should.be.an.Object;
|
||||
@@ -257,5 +492,16 @@ describe('Search query syntax parser', function () {
|
||||
parsedSearchQuery.exclude.from.should.containEql('mar@foo.com');
|
||||
parsedSearchQuery.exclude.from.should.containEql('jan@foo.com');
|
||||
parsedSearchQuery.should.not.have.property('text');
|
||||
parsedSearchQuery.should.have.property('offsets', [{
|
||||
keyword: 'from',
|
||||
value: 'jul@foo.com,mar@foo.com',
|
||||
offsetStart: 1,
|
||||
offsetEnd: 29
|
||||
}, {
|
||||
keyword: 'from',
|
||||
value: 'jan@foo.com',
|
||||
offsetStart: 31,
|
||||
offsetEnd: 47
|
||||
}]);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user