| | |
| | | |
| | | const highlight = (content, term) => { |
| | | const highlightWindow = 20 |
| | | |
| | | // try to find direct match first |
| | | const directMatchIdx = content.indexOf(term) |
| | | if (directMatchIdx !== -1) { |
| | | const h = highlightWindow / 2 |
| | | console.log(directMatchIdx) |
| | | const h = highlightWindow |
| | | const before = content.substring(0, directMatchIdx).split(" ").slice(-h) |
| | | const after = content |
| | | .substring(directMatchIdx + term.length, content.length - 1) |
| | | .substring(directMatchIdx + term.length, content.length - 2) |
| | | .split(" ") |
| | | .slice(0, h) |
| | | console.log(before, after) |
| | | return ( |
| | | (before.length == h ? `...${before.join(" ")}` : before.join(" ")) + |
| | | `<span class="search-highlight">${term}</span>` + |
| | |
| | | |
| | | // Common utilities for search |
| | | const resultToHTML = ({ url, title, content }) => { |
| | | const cleaned = removeMarkdown(content) |
| | | return `<button class="result-card" id="${url}"> |
| | | <h3>${title}</h3> |
| | | <p>${cleaned}</p> |
| | | <p>${content}</p> |
| | | </button>` |
| | | } |
| | | |
| | |
| | | return resultToHTML({ |
| | | url: result.url, |
| | | title: highlight(result.title, term), |
| | | content: highlight(result.content, term) |
| | | content: highlight(removeMarkdown(result.content), term) |
| | | }) |
| | | } else { |
| | | return resultToHTML(result) |