Welcome to mirror list, hosted at ThFree Co, Russian Federation.

search.js « js « assets - github.com/matsuyoshi30/harbor.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2da9df38d7a041bfa2c29eef054f7d308b46f28d (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
{{ $searchData := resources.Get "list.json" | resources.ExecuteAsTemplate "search-data.json" . }}
const searchDataURL = '{{ $searchData.RelPermalink }}'

const init = () => {
  const searchBox = document.querySelector('#searchBox')
  if (searchBox === null) {
    return
  }

  let index = new FlexSearch.Document({
    tokenize: 'reverse',
    document: {
      field: ['title', 'body'],
      store: ['title', 'href', 'body']
    },
  })

  fetch(searchDataURL)
    .then(pages => pages.json())
    .then(pages => {
      for(let i = 0; i < pages.length; i++){
        index.add(i, pages[i]);
      }
    })

  searchBox.addEventListener('keyup', function (event) {
    let searchResultsArea = document.querySelector('#searchResults')
    let query = event.currentTarget.value

    // Only trigger a search when 2 chars. at least have been provided
    if (query.length < 2) {
      searchResultsArea.style.display = 'none'
      return
    }

    // Display search results
    renderResults(index.search(query, 10, { enrich: true }));
    searchResultsArea.style.display = 'block'
  })
}

/**
 * Rendering search results
 * @param {Object[]} results Array of search results ( fields[] => { field, result[] => { document }} )
 */
const renderResults = (results) => {
  const searchResults = document.querySelector('#searchResults')
  const query = document.querySelector('#searchBox').value
  const BODY_LENGTH = 100

  // Clear search result
  while (searchResults.firstChild)
    searchResults.removeChild(searchResults.firstChild)

  // Show message when results is empty
  if (!results.length) {
    let resultPage = document.createElement('div')
    resultPage.className = 'searchResultPage'
    resultPage.innerHTML = 'No results found for query "' + query + '"'
    searchResults.append(resultPage)
    return
  }

  let arr = results[0].result
  if (results.length > 1) {
    arr.concat(results[1].result)
  }
  arr.filter((element, index, self) =>
    self.findIndex(e => e.id === element.id) === index)

  let instance = new Mark(document.querySelector('#searchResults'))
  arr.forEach((result) => {
    let resultPage = document.createElement('div')
    resultPage.className = 'searchResultPage'

    let resultTitle = document.createElement('a')
    resultTitle.className = 'searchResultTitle'
    resultTitle.href = result.doc.href
    resultTitle.innerHTML = result.doc.title
    resultPage.append(resultTitle)

    let resultBody = document.createElement('div')
    resultBody.className = 'searchResultBody'
    let matchPos = result.doc.body.indexOf(query)
    let bodyStartPos = matchPos - BODY_LENGTH / 2 > 0 ? matchPos - BODY_LENGTH / 2 : 0
    resultBody.innerHTML = result.doc.body.substr(bodyStartPos, BODY_LENGTH)
    resultPage.append(resultBody)
    searchResults.append(resultPage)

    instance.mark(query)
  })
}

init();