Skip to content

Commit eef97c0

Browse files
author
Brian Vaughn
committed
StopWordsMap no longer relies on Object.create; inherited properties are instead masked by default to prevent false positive. This allows users to easily disable individual stop-words without having to recreate the entire map.
1 parent 9fc24cd commit eef97c0

File tree

2 files changed

+137
-121
lines changed

2 files changed

+137
-121
lines changed

source/StopWordsMap.js

Lines changed: 130 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -3,124 +3,133 @@
33
/**
44
* Stop words list copied from Lunr JS.
55
*/
6-
export var StopWordsMap = Object.create(null, ({
7-
a: { get: () => true },
8-
able: { get: () => true },
9-
about: { get: () => true },
10-
across: { get: () => true },
11-
after: { get: () => true },
12-
all: { get: () => true },
13-
almost: { get: () => true },
14-
also: { get: () => true },
15-
am: { get: () => true },
16-
among: { get: () => true },
17-
an: { get: () => true },
18-
and: { get: () => true },
19-
any: { get: () => true },
20-
are: { get: () => true },
21-
as: { get: () => true },
22-
at: { get: () => true },
23-
be: { get: () => true },
24-
because: { get: () => true },
25-
been: { get: () => true },
26-
but: { get: () => true },
27-
by: { get: () => true },
28-
can: { get: () => true },
29-
cannot: { get: () => true },
30-
could: { get: () => true },
31-
dear: { get: () => true },
32-
did: { get: () => true },
33-
'do': { get: () => true },
34-
does: { get: () => true },
35-
either: { get: () => true },
36-
'else': { get: () => true },
37-
ever: { get: () => true },
38-
every: { get: () => true },
39-
'for': { get: () => true },
40-
from: { get: () => true },
41-
'get': { get: () => true },
42-
got: { get: () => true },
43-
had: { get: () => true },
44-
has: { get: () => true },
45-
have: { get: () => true },
46-
he: { get: () => true },
47-
her: { get: () => true },
48-
hers: { get: () => true },
49-
him: { get: () => true },
50-
his: { get: () => true },
51-
how: { get: () => true },
52-
however: { get: () => true },
53-
i: { get: () => true },
54-
'if': { get: () => true },
55-
'in': { get: () => true },
56-
into: { get: () => true },
57-
is: { get: () => true },
58-
it: { get: () => true },
59-
its: { get: () => true },
60-
just: { get: () => true },
61-
least: { get: () => true },
62-
let: { get: () => true },
63-
like: { get: () => true },
64-
likely: { get: () => true },
65-
may: { get: () => true },
66-
me: { get: () => true },
67-
might: { get: () => true },
68-
most: { get: () => true },
69-
must: { get: () => true },
70-
my: { get: () => true },
71-
neither: { get: () => true },
72-
no: { get: () => true },
73-
nor: { get: () => true },
74-
not: { get: () => true },
75-
of: { get: () => true },
76-
off: { get: () => true },
77-
often: { get: () => true },
78-
on: { get: () => true },
79-
only: { get: () => true },
80-
or: { get: () => true },
81-
other: { get: () => true },
82-
our: { get: () => true },
83-
own: { get: () => true },
84-
rather: { get: () => true },
85-
said: { get: () => true },
86-
say: { get: () => true },
87-
says: { get: () => true },
88-
she: { get: () => true },
89-
should: { get: () => true },
90-
since: { get: () => true },
91-
so: { get: () => true },
92-
some: { get: () => true },
93-
than: { get: () => true },
94-
that: { get: () => true },
95-
the: { get: () => true },
96-
their: { get: () => true },
97-
them: { get: () => true },
98-
then: { get: () => true },
99-
there: { get: () => true },
100-
these: { get: () => true },
101-
they: { get: () => true },
102-
'this': { get: () => true },
103-
tis: { get: () => true },
104-
to: { get: () => true },
105-
too: { get: () => true },
106-
twas: { get: () => true },
107-
us: { get: () => true },
108-
wants: { get: () => true },
109-
was: { get: () => true },
110-
we: { get: () => true },
111-
were: { get: () => true },
112-
what: { get: () => true },
113-
when: { get: () => true },
114-
where: { get: () => true },
115-
which: { get: () => true },
116-
'while': { get: () => true },
117-
who: { get: () => true },
118-
whom: { get: () => true },
119-
why: { get: () => true },
120-
will: { get: () => true },
121-
'with': { get: () => true },
122-
would: { get: () => true },
123-
yet: { get: () => true },
124-
you: { get: () => true },
125-
your: { get: () => true }
126-
} : any));
6+
export var StopWordsMap : Object = {
7+
a: true,
8+
able: true,
9+
about: true,
10+
across: true,
11+
after: true,
12+
all: true,
13+
almost: true,
14+
also: true,
15+
am: true,
16+
among: true,
17+
an: true,
18+
and: true,
19+
any: true,
20+
are: true,
21+
as: true,
22+
at: true,
23+
be: true,
24+
because: true,
25+
been: true,
26+
but: true,
27+
by: true,
28+
can: true,
29+
cannot: true,
30+
could: true,
31+
dear: true,
32+
did: true,
33+
'do': true,
34+
does: true,
35+
either: true,
36+
'else': true,
37+
ever: true,
38+
every: true,
39+
'for': true,
40+
from: true,
41+
'get': true,
42+
got: true,
43+
had: true,
44+
has: true,
45+
have: true,
46+
he: true,
47+
her: true,
48+
hers: true,
49+
him: true,
50+
his: true,
51+
how: true,
52+
however: true,
53+
i: true,
54+
'if': true,
55+
'in': true,
56+
into: true,
57+
is: true,
58+
it: true,
59+
its: true,
60+
just: true,
61+
least: true,
62+
let: true,
63+
like: true,
64+
likely: true,
65+
may: true,
66+
me: true,
67+
might: true,
68+
most: true,
69+
must: true,
70+
my: true,
71+
neither: true,
72+
no: true,
73+
nor: true,
74+
not: true,
75+
of: true,
76+
off: true,
77+
often: true,
78+
on: true,
79+
only: true,
80+
or: true,
81+
other: true,
82+
our: true,
83+
own: true,
84+
rather: true,
85+
said: true,
86+
say: true,
87+
says: true,
88+
she: true,
89+
should: true,
90+
since: true,
91+
so: true,
92+
some: true,
93+
than: true,
94+
that: true,
95+
the: true,
96+
their: true,
97+
them: true,
98+
then: true,
99+
there: true,
100+
these: true,
101+
they: true,
102+
'this': true,
103+
tis: true,
104+
to: true,
105+
too: true,
106+
twas: true,
107+
us: true,
108+
wants: true,
109+
was: true,
110+
we: true,
111+
were: true,
112+
what: true,
113+
when: true,
114+
where: true,
115+
which: true,
116+
'while': true,
117+
who: true,
118+
whom: true,
119+
why: true,
120+
will: true,
121+
'with': true,
122+
would: true,
123+
yet: true,
124+
you: true,
125+
your: true
126+
};
127+
128+
// Prevent false positives for inherited properties
129+
StopWordsMap.constructor = false;
130+
StopWordsMap.hasOwnProperty = false;
131+
StopWordsMap.isPrototypeOf = false;
132+
StopWordsMap.propertyIsEnumerable = false;
133+
StopWordsMap.toLocaleString = false;
134+
StopWordsMap.toString = false;
135+
StopWordsMap.valueOf = false;

source/Tokenizer/StopWordsTokenizer.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { SimpleTokenizer } from './SimpleTokenizer';
22
import { StopWordsTokenizer } from './StopWordsTokenizer';
3+
import { StopWordsMap } from '../StopWordsMap';
34

45
describe('StopWordsTokenizer', function() {
56
var tokenizer;
@@ -31,4 +32,10 @@ describe('StopWordsTokenizer', function() {
3132
expect(tokenizer.tokenize('toString')).toEqual(['toString']);
3233
expect(tokenizer.tokenize('valueOf')).toEqual(['valueOf']);
3334
});
35+
36+
it('should allow stop-words to be overridden', function() {
37+
StopWordsMap.the = false;
38+
expect(tokenizer.tokenize('a and the')).toEqual(['the']);
39+
StopWordsMap.the = true;
40+
});
3441
});

0 commit comments

Comments
 (0)