index.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. ts = {
  2. selected: null,
  3. numItems: 0
  4. };
  5. window.onload = (event) => {
  6. const searchInput = document.getElementById('search');
  7. const length = searchInput.value.length;
  8. searchInput.setSelectionRange(length, length);
  9. searchInput.oninput = e => {
  10. console.log("Key", e.key);
  11. console.log(searchInput.value);
  12. const encodedValue = encodeURIComponent(searchInput.value);
  13. fetch('/search?s=' + encodedValue).then(response => {
  14. clearResults();
  15. console.log(response);
  16. response.json().then(content => {
  17. console.log(content);
  18. for (const [i, element] of content.entries()) {
  19. addResult(element.title, element.extract, element.url, i);
  20. };
  21. ts.selected = null;
  22. ts.numItems = content.length;
  23. });
  24. });
  25. };
  26. // Handle moving the selected item up and down
  27. document.addEventListener('keydown', (e) => {
  28. console.log("Key press", e);
  29. if (e.key == 'ArrowDown') {
  30. selectNextItem();
  31. e.preventDefault();
  32. } else if (e.key == 'ArrowUp') {
  33. selectPreviousItem();
  34. e.preventDefault();
  35. } else if (e.key == 'Enter') {
  36. // const form = document.getElementById('search-form');
  37. // form.submit();
  38. // event.preventDefault();
  39. }
  40. });
  41. // Handle pressing enter
  42. const form = document.getElementById('search-form');
  43. form.addEventListener("submit", event => {
  44. event.preventDefault();
  45. clickSelected();
  46. });
  47. searchInput.focus();
  48. };
  49. function selectNextItem() {
  50. if (ts.selected === null) {
  51. ts.selected = 0;
  52. } else if (ts.selected < ts.numItems -1) {
  53. ts.selected++;
  54. }
  55. updateSelected();
  56. }
  57. function clickSelected() {
  58. if (ts.selected !== null) {
  59. const selectedResult = document.getElementById(ts.selected.toString());
  60. selectedResult.click();
  61. }
  62. }
  63. function selectPreviousItem() {
  64. if (ts.selected === null) {
  65. return;
  66. } else if (ts.selected > 0) {
  67. ts.selected--;
  68. } else if (ts.selected == 0) {
  69. ts.selected = null;
  70. }
  71. updateSelected();
  72. }
  73. function updateSelected() {
  74. const results = document.querySelectorAll('.result');
  75. results.forEach(child => {
  76. child.classList.remove('selected');
  77. });
  78. if (ts.selected !== null) {
  79. const selectedResult = document.getElementById(ts.selected.toString());
  80. selectedResult.classList.add('selected');
  81. }
  82. }
  83. function clearResults() {
  84. const results = document.getElementById('results');
  85. results.innerHTML = '';
  86. }
  87. function addResult(title, extract, url, id) {
  88. const par = document.createElement("p");
  89. const titleText = createBoldedSpan(title);
  90. titleText.classList.add('title');
  91. const extractText = createBoldedSpan(extract);
  92. extractText.classList.add('extract');
  93. par.appendChild(titleText);
  94. separator = document.createTextNode(' - ')
  95. par.appendChild(separator);
  96. par.appendChild(extractText);
  97. const div = document.createElement("div");
  98. div.classList.add('result');
  99. div.id = id.toString();
  100. const urlPar = document.createElement("p");
  101. const urlText = document.createTextNode(url);
  102. urlPar.appendChild(urlText);
  103. urlPar.classList.add('url');
  104. div.appendChild(urlPar);
  105. div.appendChild(par);
  106. const link = document.createElement("a");
  107. link.appendChild(div);
  108. link.href = url;
  109. const results = document.getElementById('results');
  110. results.appendChild(link);
  111. }
  112. function createBoldedSpan(title) {
  113. span = document.createElement('span');
  114. title.forEach(element => {
  115. text = document.createTextNode(element.value);
  116. if (element.is_bold) {
  117. b = document.createElement('span');
  118. b.classList.add('term');
  119. b.appendChild(text);
  120. span.appendChild(b);
  121. } else {
  122. span.appendChild(text);
  123. }
  124. });
  125. return span;
  126. }