Skip to content

Commit bbe3cff

Browse files
committed
feat: use rows and columns
1 parent a88f44c commit bbe3cff

File tree

1 file changed

+42
-21
lines changed

1 file changed

+42
-21
lines changed

src/plugins/search/search.js

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,27 @@ import Dexie from 'dexie';
66

77
let INDEXES = {};
88

9-
const db = new Dexie('DocsifySearchDB');
9+
const db = new Dexie('docsify');
1010
db.version(1).stores({
11-
search: 'key, value',
11+
search: 'slug, title, body, path, indexKey',
12+
expires: 'key, value',
1213
});
1314

1415
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 });
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

2432
const 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
*/
160179
export 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

Comments
 (0)