@@ -2,8 +2,24 @@ import {
2
2
getAndRemoveConfig ,
3
3
getAndRemoveDocisfyIgnoreConfig ,
4
4
} from '../../core/render/utils.js' ;
5
+ import Dexie from 'dexie' ;
5
6
6
- let INDEXS = { } ;
7
+ let INDEXES = { } ;
8
+
9
+ const db = new Dexie ( 'DocsifySearchDB' ) ;
10
+ db . version ( 1 ) . stores ( {
11
+ search : 'key, value' ,
12
+ } ) ;
13
+
14
+ 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 ) } ) ;
17
+ }
18
+
19
+ async function getData ( key ) {
20
+ const item = await db . search . get ( key ) ;
21
+ return item ? item . value : null ;
22
+ }
7
23
8
24
const LOCAL_STORAGE = {
9
25
EXPIRE_KEY : 'docsify.search.expires' ,
@@ -73,11 +89,6 @@ function getListData(token) {
73
89
return token . text ;
74
90
}
75
91
76
- function saveData ( maxAge , expireKey , indexKey ) {
77
- localStorage . setItem ( expireKey , Date . now ( ) + maxAge ) ;
78
- localStorage . setItem ( indexKey , JSON . stringify ( INDEXS ) ) ;
79
- }
80
-
81
92
export function genIndex ( path , content = '' , router , depth ) {
82
93
const tokens = window . marked . lexer ( content ) ;
83
94
const slugify = window . Docsify . slugify ;
@@ -149,10 +160,10 @@ export function ignoreDiacriticalMarks(keyword) {
149
160
export function search ( query ) {
150
161
const matchingResults = [ ] ;
151
162
let data = [ ] ;
152
- Object . keys ( INDEXS ) . forEach ( key => {
163
+ Object . keys ( INDEXES ) . forEach ( key => {
153
164
data = [
154
165
...data ,
155
- ...Object . keys ( INDEXS [ key ] ) . map ( page => INDEXS [ key ] [ page ] ) ,
166
+ ...Object . keys ( INDEXES [ key ] ) . map ( page => INDEXES [ key ] [ page ] ) ,
156
167
] ;
157
168
} ) ;
158
169
@@ -240,7 +251,7 @@ export function search(query) {
240
251
return matchingResults . sort ( ( r1 , r2 ) => r2 . score - r1 . score ) ;
241
252
}
242
253
243
- export function init ( config , vm ) {
254
+ export async function init ( config , vm ) {
244
255
const isAuto = config . paths === 'auto' ;
245
256
const paths = isAuto ? getAllPaths ( vm . router ) : config . paths ;
246
257
@@ -274,12 +285,12 @@ export function init(config, vm) {
274
285
const expireKey = resolveExpireKey ( config . namespace ) + namespaceSuffix ;
275
286
const indexKey = resolveIndexKey ( config . namespace ) + namespaceSuffix ;
276
287
277
- const isExpired = localStorage . getItem ( expireKey ) < Date . now ( ) ;
288
+ const isExpired = ( await getData ( expireKey ) ) < Date . now ( ) ;
278
289
279
- INDEXS = JSON . parse ( localStorage . getItem ( indexKey ) ) ;
290
+ INDEXES = JSON . parse ( await getData ( indexKey ) ) ;
280
291
281
292
if ( isExpired ) {
282
- INDEXS = { } ;
293
+ INDEXES = { } ;
283
294
} else if ( ! isAuto ) {
284
295
return ;
285
296
}
@@ -288,14 +299,16 @@ export function init(config, vm) {
288
299
let count = 0 ;
289
300
290
301
paths . forEach ( path => {
291
- if ( INDEXS [ path ] ) {
302
+ if ( INDEXES [ path ] ) {
292
303
return count ++ ;
293
304
}
294
305
295
306
Docsify . get ( vm . router . getFile ( path ) , false , vm . config . requestHeaders ) . then (
296
- result => {
297
- INDEXS [ path ] = genIndex ( path , result , vm . router , config . depth ) ;
298
- len === ++ count && saveData ( config . maxAge , expireKey , indexKey ) ;
307
+ async result => {
308
+ INDEXES [ path ] = genIndex ( path , result , vm . router , config . depth ) ;
309
+ if ( len === ++ count ) {
310
+ await saveData ( config . maxAge , expireKey , indexKey ) ;
311
+ }
299
312
} ,
300
313
) ;
301
314
} ) ;
0 commit comments