From 312a76690189b762125a3a14f48db5ec9865cb9d Mon Sep 17 00:00:00 2001 From: Harry <66169324+Rr210@users.noreply.github.com> Date: Wed, 6 Oct 2021 14:52:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=90=9C=E7=B4=A2=E4=BD=BF?= =?UTF-8?q?=E7=94=A8json=E6=9B=BF=E6=8D=A2xml,=E9=80=9F=E5=BA=A6=E6=9B=B4?= =?UTF-8?q?=E5=BF=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## xml文件格式本地测试 ![](https://cdn.jsdelivr.net/gh/Rr210/image@master/hexo/api/20211006095512.png) ## json文件本地测试 ![](https://cdn.jsdelivr.net/gh/Rr210/image@master/hexo/api/20211006095847.png) ## json文件线上测试 ![](https://cdn.jsdelivr.net/gh/Rr210/image@master/hexo/api/20211006100635.png) ## 模式切换 两种模式 切换 只需要修改全局配置文件的搜索插件文件格式(json/xml) --- source/js/search/local-search.js | 197 ++++++++++++++++--------------- 1 file changed, 101 insertions(+), 96 deletions(-) diff --git a/source/js/search/local-search.js b/source/js/search/local-search.js index 5b13445..a28ca79 100644 --- a/source/js/search/local-search.js +++ b/source/js/search/local-search.js @@ -10,7 +10,7 @@ window.addEventListener('load', () => { loadFlag = true } // shortcut: ESC - document.addEventListener('keydown', function f (event) { + document.addEventListener('keydown', function f(event) { if (event.code === 'Escape') { closeSearch() document.removeEventListener('keydown', f) @@ -41,107 +41,112 @@ window.addEventListener('load', () => { searchClickFn() }) - function search (path) { - fetch(GLOBAL_CONFIG.root + path) - .then(response => response.text()) - .then(str => new window.DOMParser().parseFromString(str, 'text/xml')) - .then(data => { - const datas = [...data.querySelectorAll('entry')].map(function (item) { - const content = item.querySelector('content') - return { - title: item.querySelector('title').textContent, - content: content ? content.textContent : '', - url: item.querySelector('url').textContent - } - }) - - const $input = document.querySelector('#local-search-input input') - const $resultContent = document.getElementById('local-search-results') - $input.addEventListener('input', function () { - let str = '
' - const keywords = this.value.trim().toLowerCase().split(/[\s]+/) - $resultContent.innerHTML = '' - if (this.value.trim().length <= 0) return - let count = 0 - // perform local searching - datas.forEach(function (data) { - let isMatch = true - if (!data.title || data.title.trim() === '') { - data.title = 'Untitled' - } - let dataTitle = data.title.trim().toLowerCase() - const dataContent = data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() - const dataUrl = data.url.startsWith('/') ? data.url : GLOBAL_CONFIG.root + data.url - let indexTitle = -1 - let indexContent = -1 - let firstOccur = -1 - // only match artiles with not empty titles and contents - if (dataTitle !== '' || dataContent !== '') { - keywords.forEach(function (keyword, i) { - indexTitle = dataTitle.indexOf(keyword) - indexContent = dataContent.indexOf(keyword) - if (indexTitle < 0 && indexContent < 0) { - isMatch = false - } else { - if (indexContent < 0) { - indexContent = 0 - } - if (i === 0) { - firstOccur = indexContent - } - } - }) - } else { + async function search(path) { + let datas = [] + const typeF = path.split('.')[1] + const response = await fetch(GLOBAL_CONFIG.root + path) + if (typeF === 'json') { + datas = await response.json() + } else if (typeF === 'xml') { + let res = await response.text() + let t = await new window.DOMParser().parseFromString(res, 'text/xml') + let a = await t + datas = [...a.querySelectorAll('entry')].map(function (item) { + return { + title: item.querySelector('title').textContent, + content: item.querySelector('content').textContent, + url: item.querySelector('url').textContent + } + }) + } + const $input = document.querySelector('#local-search-input input') + const $resultContent = document.getElementById('local-search-results') + $input.addEventListener('input', function () { + let str = '
' + const keywords = this.value.trim().toLowerCase().split(/[\s]+/) + $resultContent.innerHTML = '' + if (this.value.trim().length <= 0) return + let count = 0 + // perform local searching + datas.forEach(function (data) { + let isMatch = true + if (!data.title || data.title.trim() === '') { + data.title = 'Untitled' + } + let dataTitle = data.title.trim().toLowerCase() + const dataContent = data.content.trim().replace(/<[^>]+>/g, '').toLowerCase() + const dataUrl = data.url.startsWith('/') ? data.url : GLOBAL_CONFIG.root + data.url + let indexTitle = -1 + let indexContent = -1 + let firstOccur = -1 + // only match artiles with not empty titles and contents + if (dataTitle !== '' || dataContent !== '') { + keywords.forEach(function (keyword, i) { + indexTitle = dataTitle.indexOf(keyword) + indexContent = dataContent.indexOf(keyword) + if (indexTitle < 0 && indexContent < 0) { isMatch = false - } - - // show search results - if (isMatch) { - const content = data.content.trim().replace(/<[^>]+>/g, '') - if (firstOccur >= 0) { - // cut out 130 characters - let start = firstOccur - 30 - let end = firstOccur + 100 - - if (start < 0) { - start = 0 - } - - if (start === 0) { - end = 100 - } - - if (end > content.length) { - end = content.length - } - - let matchContent = content.substring(start, end) - - // highlight all keywords - keywords.forEach(function (keyword) { - const regS = new RegExp(keyword, 'gi') - matchContent = matchContent.replace(regS, '' + keyword + '') - dataTitle = dataTitle.replace(regS, '' + keyword + '') - }) - - str += '
' + dataTitle + '' - count += 1 - - if (dataContent !== '') { - str += '

' + matchContent + '...

' - } + } else { + if (indexContent < 0) { + indexContent = 0 + } + if (i === 0) { + firstOccur = indexContent } - str += '
' } }) - if (count === 0) { - str += '
' + GLOBAL_CONFIG.localSearch.languages.hits_empty.replace(/\$\{query}/, this.value.trim()) + - '
' + } else { + isMatch = false + } + + // show search results + if (isMatch) { + const content = data.content.trim().replace(/<[^>]+>/g, '') + if (firstOccur >= 0) { + // cut out 130 characters + // let start = firstOccur - 30 < 0 ? 0 : firstOccur - 30 + // let end = firstOccur + 50 > content.length ? content.length : firstOccur + 50 + let start = firstOccur - 30 + let end = firstOccur + 100 + + if (start < 0) { + start = 0 + } + + if (start === 0) { + end = 100 + } + + if (end > content.length) { + end = content.length + } + + let matchContent = content.substring(start, end) + + // highlight all keywords + keywords.forEach(function (keyword) { + const regS = new RegExp(keyword, 'gi') + matchContent = matchContent.replace(regS, '' + keyword + '') + dataTitle = dataTitle.replace(regS, '' + keyword + '') + }) + + str += '
' + dataTitle + '' + count += 1 + + if (dataContent !== '') { + str += '

' + matchContent + '...

' + } } str += '
' - $resultContent.innerHTML = str - window.pjax && window.pjax.refresh($resultContent) - }) + } }) + if (count === 0) { + str += '
' + GLOBAL_CONFIG.localSearch.languages.hits_empty.replace(/\$\{query}/, this.value.trim()) + + '
' + } + str += '
' + $resultContent.innerHTML = str + window.pjax && window.pjax.refresh($resultContent) + }) } })