summaryrefslogtreecommitdiff
path: root/themes/theme/source/js/search.js
blob: 27abb4e0b3fde7507e1e12565c5ea50d3f993e5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Search functionality for standalone search page

(function () {
  'use strict';

  let localSearch = null;
  let isDataLoaded = false;

  function initSearch() {
    const input = document.getElementById('search-input');
    const container = document.getElementById('search-results');

    if (!input || !container || typeof LocalSearch === 'undefined') {
      container.innerHTML = '<div class="search-result-message">搜索功能初始化失败</div>';
      return;
    }

    localSearch = new LocalSearch({
      path: searchConfig.path,
      top_n_per_article: searchConfig.top_n_per_article,
      unescape: searchConfig.unescape
    });

    localSearch.fetchData();

    window.addEventListener('search:loaded', function () {
      isDataLoaded = true;
      container.innerHTML = '<div class="search-result-message"></div>';
    });

    function displaySearchResult() {
      if (!isDataLoaded) {
        container.innerHTML = '<div class="search-result-message">加载中...</div>';
        return;
      }

      const searchText = input.value.trim().toLowerCase();

      if (searchText.length === 0) {
        container.innerHTML = '<div class="search-result-message"></div>';
        return;
      }

      const keywords = searchText.split(/[-\s]+/);
      const resultItems = localSearch.getResultItems(keywords);

      if (resultItems.length === 0) {
        container.innerHTML = '<div class="search-result-message">未找到相关结果</div>';
      } else {
        container.innerHTML = `
          <div class="search-result-message">找到 ${resultItems.length} 个结果</div>
          <ul class="search-result-list">
            ${resultItems.map(result => result.item).join('')}
          </ul>
        `;
      }
    }

    input.addEventListener('input', displaySearchResult);
    input.focus();
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initSearch);
  } else {
    initSearch();
  }
})();