@@ -6,19 +6,27 @@ import Dexie from 'dexie';
6
6
7
7
let INDEXES = { } ;
8
8
9
- const db = new Dexie ( 'DocsifySearchDB ' ) ;
9
+ const db = new Dexie ( 'docsify ' ) ;
10
10
db . version ( 1 ) . stores ( {
11
- search : 'key, value' ,
11
+ search : 'slug, title, body, path, indexKey' ,
12
+ expires : 'key, value' ,
12
13
} ) ;
13
14
14
15
async function saveData ( maxAge , expireKey , indexKey ) {
15
- await db . search . put ( { key : expireKey , value : Date . now ( ) + maxAge } ) ;
16
- await db . search . put ( { key : indexKey , value : JSON . stringify ( INDEXES ) } ) ;
16
+ await db . search . bulkPut (
17
+ Object . values ( INDEXES ) . flatMap ( innerData => Object . values ( innerData ) ) ,
18
+ ) ;
19
+ await db . expires . put ( { key : expireKey , value : Date . now ( ) + maxAge } ) ;
17
20
}
18
21
19
- async function getData ( key ) {
20
- const item = await db . search . get ( key ) ;
21
- return item ? item . value : null ;
22
+ async function getData ( key , isExpireKey = false ) {
23
+ if ( isExpireKey ) {
24
+ const item = await db . expires . get ( key ) ;
25
+ return item ? item . value : 0 ;
26
+ }
27
+
28
+ const item = await db . search . where ( { indexKey : key } ) . toArray ( ) ;
29
+ return item ? item : null ;
22
30
}
23
31
24
32
const LOCAL_STORAGE = {
@@ -89,7 +97,7 @@ function getListData(token) {
89
97
return token . text ;
90
98
}
91
99
92
- export function genIndex ( path , content = '' , router , depth ) {
100
+ export function genIndex ( path , content = '' , router , depth , indexKey ) {
93
101
const tokens = window . marked . lexer ( content ) ;
94
102
const slugify = window . Docsify . slugify ;
95
103
const index = { } ;
@@ -112,14 +120,22 @@ export function genIndex(path, content = '', router, depth) {
112
120
title = getAndRemoveDocsifyIgnoreConfig ( str ) . content ;
113
121
}
114
122
115
- index [ slug ] = { slug, title : title , body : '' } ;
123
+ index [ slug ] = {
124
+ slug,
125
+ title : title ,
126
+ body : '' ,
127
+ path : path ,
128
+ indexKey : indexKey ,
129
+ } ;
116
130
} else {
117
131
if ( tokenIndex === 0 ) {
118
132
slug = router . toURL ( path ) ;
119
133
index [ slug ] = {
120
134
slug,
121
135
title : path !== '/' ? path . slice ( 1 ) : 'Home Page' ,
122
136
body : token . text || '' ,
137
+ path : path ,
138
+ indexKey : indexKey ,
123
139
} ;
124
140
}
125
141
@@ -140,6 +156,9 @@ export function genIndex(path, content = '', router, depth) {
140
156
141
157
index [ slug ] . body = token . text || '' ;
142
158
}
159
+
160
+ index [ slug ] . path = path ;
161
+ index [ slug ] . indexKey = indexKey ;
143
162
}
144
163
} ) ;
145
164
slugify . clear ( ) ;
@@ -159,21 +178,14 @@ export function ignoreDiacriticalMarks(keyword) {
159
178
*/
160
179
export function search ( query ) {
161
180
const matchingResults = [ ] ;
162
- let data = [ ] ;
163
- Object . keys ( INDEXES ) . forEach ( key => {
164
- data = [
165
- ...data ,
166
- ...Object . keys ( INDEXES [ key ] ) . map ( page => INDEXES [ key ] [ page ] ) ,
167
- ] ;
168
- } ) ;
169
181
170
182
query = query . trim ( ) ;
171
183
let keywords = query . split ( / [ \s \- , \\ / ] + / ) ;
172
184
if ( keywords . length !== 1 ) {
173
185
keywords = [ query , ...keywords ] ;
174
186
}
175
187
176
- for ( const post of data ) {
188
+ for ( const post of INDEXES ) {
177
189
let matchesScore = 0 ;
178
190
let resultStr = '' ;
179
191
let handlePostTitle = '' ;
@@ -280,9 +292,9 @@ export async function init(config, vm) {
280
292
const expireKey = resolveExpireKey ( config . namespace ) + namespaceSuffix ;
281
293
const indexKey = resolveIndexKey ( config . namespace ) + namespaceSuffix ;
282
294
283
- const isExpired = ( await getData ( expireKey ) ) < Date . now ( ) ;
295
+ const isExpired = ( await getData ( expireKey , true ) ) < Date . now ( ) ;
284
296
285
- INDEXES = JSON . parse ( await getData ( indexKey ) ) ;
297
+ INDEXES = await getData ( indexKey ) ;
286
298
287
299
if ( isExpired ) {
288
300
INDEXES = { } ;
@@ -294,13 +306,22 @@ export async function init(config, vm) {
294
306
let count = 0 ;
295
307
296
308
paths . forEach ( path => {
297
- if ( INDEXES [ path ] ) {
309
+ const pathExists = Array . isArray ( INDEXES )
310
+ ? INDEXES . some ( obj => obj . path === path )
311
+ : false ;
312
+ if ( pathExists ) {
298
313
return count ++ ;
299
314
}
300
315
301
316
Docsify . get ( vm . router . getFile ( path ) , false , vm . config . requestHeaders ) . then (
302
317
async result => {
303
- INDEXES [ path ] = genIndex ( path , result , vm . router , config . depth ) ;
318
+ INDEXES [ path ] = genIndex (
319
+ path ,
320
+ result ,
321
+ vm . router ,
322
+ config . depth ,
323
+ indexKey ,
324
+ ) ;
304
325
if ( len === ++ count ) {
305
326
await saveData ( config . maxAge , expireKey , indexKey ) ;
306
327
}
0 commit comments