@@ -6,19 +6,27 @@ import Dexie from 'dexie';
66
77let INDEXES = { } ;
88
9- const db = new Dexie ( 'DocsifySearchDB ' ) ;
9+ const db = new Dexie ( 'docsify ' ) ;
1010db . version ( 1 ) . stores ( {
11- search : 'key, value' ,
11+ search : 'slug, title, body, path, indexKey' ,
12+ expires : 'key, value' ,
1213} ) ;
1314
1415async 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 } ) ;
1720}
1821
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 ;
2230}
2331
2432const LOCAL_STORAGE = {
@@ -89,7 +97,7 @@ function getListData(token) {
8997 return token . text ;
9098}
9199
92- export function genIndex ( path , content = '' , router , depth ) {
100+ export function genIndex ( path , content = '' , router , depth , indexKey ) {
93101 const tokens = window . marked . lexer ( content ) ;
94102 const slugify = window . Docsify . slugify ;
95103 const index = { } ;
@@ -112,14 +120,22 @@ export function genIndex(path, content = '', router, depth) {
112120 title = getAndRemoveDocsifyIgnoreConfig ( str ) . content ;
113121 }
114122
115- index [ slug ] = { slug, title : title , body : '' } ;
123+ index [ slug ] = {
124+ slug,
125+ title : title ,
126+ body : '' ,
127+ path : path ,
128+ indexKey : indexKey ,
129+ } ;
116130 } else {
117131 if ( tokenIndex === 0 ) {
118132 slug = router . toURL ( path ) ;
119133 index [ slug ] = {
120134 slug,
121135 title : path !== '/' ? path . slice ( 1 ) : 'Home Page' ,
122136 body : token . text || '' ,
137+ path : path ,
138+ indexKey : indexKey ,
123139 } ;
124140 }
125141
@@ -140,6 +156,9 @@ export function genIndex(path, content = '', router, depth) {
140156
141157 index [ slug ] . body = token . text || '' ;
142158 }
159+
160+ index [ slug ] . path = path ;
161+ index [ slug ] . indexKey = indexKey ;
143162 }
144163 } ) ;
145164 slugify . clear ( ) ;
@@ -159,21 +178,14 @@ export function ignoreDiacriticalMarks(keyword) {
159178 */
160179export function search ( query ) {
161180 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- } ) ;
169181
170182 query = query . trim ( ) ;
171183 let keywords = query . split ( / [ \s \- , \\ / ] + / ) ;
172184 if ( keywords . length !== 1 ) {
173185 keywords = [ query , ...keywords ] ;
174186 }
175187
176- for ( const post of data ) {
188+ for ( const post of INDEXES ) {
177189 let matchesScore = 0 ;
178190 let resultStr = '' ;
179191 let handlePostTitle = '' ;
@@ -280,9 +292,9 @@ export async function init(config, vm) {
280292 const expireKey = resolveExpireKey ( config . namespace ) + namespaceSuffix ;
281293 const indexKey = resolveIndexKey ( config . namespace ) + namespaceSuffix ;
282294
283- const isExpired = ( await getData ( expireKey ) ) < Date . now ( ) ;
295+ const isExpired = ( await getData ( expireKey , true ) ) < Date . now ( ) ;
284296
285- INDEXES = JSON . parse ( await getData ( indexKey ) ) ;
297+ INDEXES = await getData ( indexKey ) ;
286298
287299 if ( isExpired ) {
288300 INDEXES = { } ;
@@ -294,13 +306,22 @@ export async function init(config, vm) {
294306 let count = 0 ;
295307
296308 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 ) {
298313 return count ++ ;
299314 }
300315
301316 Docsify . get ( vm . router . getFile ( path ) , false , vm . config . requestHeaders ) . then (
302317 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+ ) ;
304325 if ( len === ++ count ) {
305326 await saveData ( config . maxAge , expireKey , indexKey ) ;
306327 }
0 commit comments