@@ -2,8 +2,33 @@ import {
2
2
getAndRemoveConfig ,
3
3
getAndRemoveDocsifyIgnoreConfig ,
4
4
} from '../../core/render/utils.js' ;
5
+ import Dexie from 'dexie' ;
6
+
7
+ let INDEXES = { } ;
8
+
9
+ const db = new Dexie ( 'docsify' ) ;
10
+ db . version ( 1 ) . stores ( {
11
+ search : 'slug, title, body, path, indexKey' ,
12
+ expires : 'key, value' ,
13
+ } ) ;
14
+
15
+ async function saveData ( maxAge , expireKey ) {
16
+ INDEXES = Object . values ( INDEXES ) . flatMap ( innerData =>
17
+ Object . values ( innerData ) ,
18
+ ) ;
19
+ await db . search . bulkPut ( INDEXES ) ;
20
+ await db . expires . put ( { key : expireKey , value : Date . now ( ) + maxAge } ) ;
21
+ }
5
22
6
- let INDEXS = { } ;
23
+ async function getData ( key , isExpireKey = false ) {
24
+ if ( isExpireKey ) {
25
+ const item = await db . expires . get ( key ) ;
26
+ return item ? item . value : 0 ;
27
+ }
28
+
29
+ const item = await db . search . where ( { indexKey : key } ) . toArray ( ) ;
30
+ return item ? item : null ;
31
+ }
7
32
8
33
const LOCAL_STORAGE = {
9
34
EXPIRE_KEY : 'docsify.search.expires' ,
@@ -73,12 +98,7 @@ function getListData(token) {
73
98
return token . text ;
74
99
}
75
100
76
- function saveData ( maxAge , expireKey , indexKey ) {
77
- localStorage . setItem ( expireKey , Date . now ( ) + maxAge ) ;
78
- localStorage . setItem ( indexKey , JSON . stringify ( INDEXS ) ) ;
79
- }
80
-
81
- export function genIndex ( path , content = '' , router , depth ) {
101
+ export function genIndex ( path , content = '' , router , depth , indexKey ) {
82
102
const tokens = window . marked . lexer ( content ) ;
83
103
const slugify = window . Docsify . slugify ;
84
104
const index = { } ;
@@ -101,14 +121,22 @@ export function genIndex(path, content = '', router, depth) {
101
121
title = getAndRemoveDocsifyIgnoreConfig ( str ) . content ;
102
122
}
103
123
104
- index [ slug ] = { slug, title : title , body : '' } ;
124
+ index [ slug ] = {
125
+ slug,
126
+ title : title ,
127
+ body : '' ,
128
+ path : path ,
129
+ indexKey : indexKey ,
130
+ } ;
105
131
} else {
106
132
if ( tokenIndex === 0 ) {
107
133
slug = router . toURL ( path ) ;
108
134
index [ slug ] = {
109
135
slug,
110
136
title : path !== '/' ? path . slice ( 1 ) : 'Home Page' ,
111
137
body : token . text || '' ,
138
+ path : path ,
139
+ indexKey : indexKey ,
112
140
} ;
113
141
}
114
142
@@ -129,6 +157,9 @@ export function genIndex(path, content = '', router, depth) {
129
157
130
158
index [ slug ] . body = token . text || '' ;
131
159
}
160
+
161
+ index [ slug ] . path = path ;
162
+ index [ slug ] . indexKey = indexKey ;
132
163
}
133
164
} ) ;
134
165
slugify . clear ( ) ;
@@ -148,21 +179,14 @@ export function ignoreDiacriticalMarks(keyword) {
148
179
*/
149
180
export function search ( query ) {
150
181
const matchingResults = [ ] ;
151
- let data = [ ] ;
152
- Object . keys ( INDEXS ) . forEach ( key => {
153
- data = [
154
- ...data ,
155
- ...Object . keys ( INDEXS [ key ] ) . map ( page => INDEXS [ key ] [ page ] ) ,
156
- ] ;
157
- } ) ;
158
182
159
183
query = query . trim ( ) ;
160
184
let keywords = query . split ( / [ \s \- , \\ / ] + / ) ;
161
185
if ( keywords . length !== 1 ) {
162
186
keywords = [ query , ...keywords ] ;
163
187
}
164
188
165
- for ( const post of data ) {
189
+ for ( const post of INDEXES ) {
166
190
let matchesScore = 0 ;
167
191
let resultStr = '' ;
168
192
let handlePostTitle = '' ;
@@ -235,7 +259,7 @@ export function search(query) {
235
259
return matchingResults . sort ( ( r1 , r2 ) => r2 . score - r1 . score ) ;
236
260
}
237
261
238
- export function init ( config , vm ) {
262
+ export async function init ( config , vm ) {
239
263
const isAuto = config . paths === 'auto' ;
240
264
const paths = isAuto ? getAllPaths ( vm . router ) : config . paths ;
241
265
@@ -269,12 +293,12 @@ export function init(config, vm) {
269
293
const expireKey = resolveExpireKey ( config . namespace ) + namespaceSuffix ;
270
294
const indexKey = resolveIndexKey ( config . namespace ) + namespaceSuffix ;
271
295
272
- const isExpired = localStorage . getItem ( expireKey ) < Date . now ( ) ;
296
+ const isExpired = ( await getData ( expireKey , true ) ) < Date . now ( ) ;
273
297
274
- INDEXS = JSON . parse ( localStorage . getItem ( indexKey ) ) ;
298
+ INDEXES = await getData ( indexKey ) ;
275
299
276
300
if ( isExpired ) {
277
- INDEXS = { } ;
301
+ INDEXES = { } ;
278
302
} else if ( ! isAuto ) {
279
303
return ;
280
304
}
@@ -283,14 +307,25 @@ export function init(config, vm) {
283
307
let count = 0 ;
284
308
285
309
paths . forEach ( path => {
286
- if ( INDEXS [ path ] ) {
310
+ const pathExists = Array . isArray ( INDEXES )
311
+ ? INDEXES . some ( obj => obj . path === path )
312
+ : false ;
313
+ if ( pathExists ) {
287
314
return count ++ ;
288
315
}
289
316
290
317
Docsify . get ( vm . router . getFile ( path ) , false , vm . config . requestHeaders ) . then (
291
- result => {
292
- INDEXS [ path ] = genIndex ( path , result , vm . router , config . depth ) ;
293
- len === ++ count && saveData ( config . maxAge , expireKey , indexKey ) ;
318
+ async result => {
319
+ INDEXES [ path ] = genIndex (
320
+ path ,
321
+ result ,
322
+ vm . router ,
323
+ config . depth ,
324
+ indexKey ,
325
+ ) ;
326
+ if ( len === ++ count ) {
327
+ await saveData ( config . maxAge , expireKey ) ;
328
+ }
294
329
} ,
295
330
) ;
296
331
} ) ;
0 commit comments