diff --git a/assets/ts/search.tsx b/assets/ts/search.tsx index 3acf59c..1dec462 100644 --- a/assets/ts/search.tsx +++ b/assets/ts/search.tsx @@ -72,24 +72,30 @@ class Search { const item = matches[i]; if (item.start > lastIndex) { - resultArray.push(str.substring(lastIndex, item.start)); + if (item.start - 20 > lastIndex) { + resultArray.push(`${replaceHTMLEnt(str.substring(lastIndex, lastIndex + 20))}`); + resultArray.push(` [...] ${replaceHTMLEnt(str.substring(item.start - 20, item.start))}`); + } + else { + resultArray.push(replaceHTMLEnt(str.substring(lastIndex, item.start))); + } } let j = i + 1, end = item.end; while (j < matches.length && matches[j].start <= end) { - end = matches[j].end; - j++; + end = Math.max(matches[j].end, end); + ++j; } - resultArray.push(`${str.substring(item.start, end)}`); + resultArray.push(`${replaceHTMLEnt(str.substring(item.start, end))}`); i = j; lastIndex = end; } - resultArray.push(str.substring(lastIndex)); + resultArray.push(replaceHTMLEnt(str.substring(lastIndex))); return resultArray; } @@ -111,40 +117,28 @@ class Search { for (const keyword of keywords) { if (keyword === '') continue; - const regex = new RegExp(escapeRegExp(replaceHTMLEnt(keyword)), 'gi'); + const regex = new RegExp(escapeRegExp(keyword), 'gi'); - const contentMatch = regex.exec(result.content); - regex.lastIndex = 0; /// Reset regex - - const titleMatch = regex.exec(result.title); - regex.lastIndex = 0; /// Reset regex - - if (titleMatch) { - titleMatches.push({ - start: titleMatch.index, - end: titleMatch.index + titleMatch[0].length - }); - } - - if (contentMatch) { + const contentMatchAll = item.content.matchAll(regex); + for (const match of Array.from(contentMatchAll)) { contentMatches.push({ - start: contentMatch.index, - end: contentMatch.index + contentMatch[0].length + start: match.index, + end: match.index + match[0].length + }); + } + + const titleMatchAll = item.title.matchAll(regex); + for (const match of Array.from(titleMatchAll)) { + titleMatches.push({ + start: match.index, + end: match.index + match[0].length }); } } - if (titleMatches.length > 0) { - result.title = Search.processMatches(result.title, titleMatches).join(''); - } - - if (contentMatches.length > 0) { - result.preview = Search.processMatches(result.content, contentMatches).join(''); - } - - if (titleMatches.length > 0 || contentMatches.length > 0) { - results.push(result); - } + if (titleMatches.length > 0) result.title = Search.processMatches(result.title, titleMatches).join(''); + if (contentMatches.length > 0) result.preview = Search.processMatches(result.content, contentMatches).join(''); + if (titleMatches.length > 0 || contentMatches.length > 0) results.push(result); } /** Result with more matches appears first */ @@ -181,6 +175,11 @@ class Search { /// Not fetched yet const jsonURL = this.form.dataset.json; this.data = await fetch(jsonURL).then(res => res.json()); + + for (const item of this.data) { + const parser = new DOMParser(); + item.content = parser.parseFromString(item.content, 'text/html').documentElement.textContent; + } } return this.data;