From 28beff80f7cf5956bd02f78d0fc4ee650636fcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=B7?= Date: Wed, 5 Dec 2018 02:29:44 +0000 Subject: [PATCH] feat(search-plugin): add namespace option (#706) * feat(search-plugin): add namespace option * docs(search-plugin): update doc for option namespace --- docs/plugins.md | 4 ++++ src/plugins/search/index.js | 4 +++- src/plugins/search/search.js | 28 ++++++++++++++++++++++------ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 34614a120..3706b897a 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -40,6 +40,10 @@ By default, the hyperlink on the current page is recognized and the content is s depth: 2, hideOtherSidebarContent: false, // whether or not to hide other sidebar content + + // To avoid search index collision + // between multiple websites under the same domain + namespace: 'website-1', } } diff --git a/src/plugins/search/index.js b/src/plugins/search/index.js index d1409a4d8..bbd3af6f0 100644 --- a/src/plugins/search/index.js +++ b/src/plugins/search/index.js @@ -7,7 +7,8 @@ const CONFIG = { paths: 'auto', depth: 2, maxAge: 86400000, // 1 day - hideOtherSidebarContent: false + hideOtherSidebarContent: false, + namespace: undefined } const install = function (hook, vm) { @@ -23,6 +24,7 @@ const install = function (hook, vm) { CONFIG.noData = opts.noData || CONFIG.noData CONFIG.depth = opts.depth || CONFIG.depth CONFIG.hideOtherSidebarContent = opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent + CONFIG.namespace = opts.namespace || CONFIG.namespace } const isAuto = CONFIG.paths === 'auto' diff --git a/src/plugins/search/search.js b/src/plugins/search/search.js index 1f246ed36..4f14ecd78 100644 --- a/src/plugins/search/search.js +++ b/src/plugins/search/search.js @@ -1,5 +1,17 @@ let INDEXS = {} +const LOCAL_STORAGE = { + EXPIRE_KEY: 'docsify.search.expires', + INDEX_KEY: 'docsify.search.index' +} + +function resolveExpireKey(namespace) { + return namespace ? `${LOCAL_STORAGE.EXPIRE_KEY}/${namespace}` : LOCAL_STORAGE.EXPIRE_KEY +} +function resolveIndexKey(namespace) { + return namespace ? `${LOCAL_STORAGE.INDEX_KEY}/${namespace}` : LOCAL_STORAGE.INDEX_KEY +} + function escapeHtml(string) { const entityMap = { '&': '&', @@ -33,9 +45,9 @@ function getAllPaths(router) { return paths } -function saveData(maxAge) { - localStorage.setItem('docsify.search.expires', Date.now() + maxAge) - localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS)) +function saveData(maxAge, expireKey, indexKey) { + localStorage.setItem(expireKey, Date.now() + maxAge) + localStorage.setItem(indexKey, JSON.stringify(INDEXS)) } export function genIndex(path, content = '', router, depth) { @@ -149,9 +161,13 @@ export function search(query) { export function init(config, vm) { const isAuto = config.paths === 'auto' - const isExpired = localStorage.getItem('docsify.search.expires') < Date.now() - INDEXS = JSON.parse(localStorage.getItem('docsify.search.index')) + const expireKey = resolveExpireKey(config.namespace) + const indexKey = resolveIndexKey(config.namespace) + + const isExpired = localStorage.getItem(expireKey) < Date.now() + + INDEXS = JSON.parse(localStorage.getItem(indexKey)) if (isExpired) { INDEXS = {} @@ -172,7 +188,7 @@ export function init(config, vm) { .get(vm.router.getFile(path), false, vm.config.requestHeaders) .then(result => { INDEXS[path] = genIndex(path, result, vm.router, config.depth) - len === ++count && saveData(config.maxAge) + len === ++count && saveData(config.maxAge, expireKey, indexKey) }) }) }