text.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. function check_for_special_search($query)
  3. {
  4. $query_lower = strtolower($query);
  5. $split_query = explode(" ", $query);
  6. if (strpos($query_lower, "to") && count($split_query) >= 4) // currency
  7. {
  8. $amount_to_convert = floatval($split_query[0]);
  9. if ($amount_to_convert != 0)
  10. return 1;
  11. }
  12. else if (strpos($query_lower, "mean") && count($split_query) >= 2) // definition
  13. return 2;
  14. else if (3 > count(explode(" ", $query))) // wikipedia
  15. return 3;
  16. return 0;
  17. }
  18. function get_text_results($query, $page=0)
  19. {
  20. global $config;
  21. $mh = curl_multi_init();
  22. $query_lower = strtolower($query);
  23. $query_encoded = urlencode($query);
  24. $results = array();
  25. $url = "https://www.google.$config->google_domain/search?&q=$query_encoded&start=$page&hl=$config->google_language";
  26. $google_ch = curl_init($url);
  27. curl_setopt_array($google_ch, $config->curl_settings);
  28. curl_multi_add_handle($mh, $google_ch);
  29. $special_search = $page == 0 ? check_for_special_search($query) : 0;
  30. $special_ch = null;
  31. $url = null;
  32. if ($special_search != 0)
  33. {
  34. switch ($special_search)
  35. {
  36. case 1:
  37. $url = "https://cdn.moneyconvert.net/api/latest.json";
  38. break;
  39. case 2:
  40. $split_query = explode(" ", $query);
  41. $reversed_split_q = array_reverse($split_query);
  42. $word_to_define = $reversed_split_q[1];
  43. $url = "https://api.dictionaryapi.dev/api/v2/entries/en/$word_to_define";
  44. break;
  45. case 3:
  46. $url = "https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&explaintext&redirects=1&titles=$query_encoded";
  47. break;
  48. }
  49. $special_ch = curl_init($url);
  50. curl_setopt_array($special_ch, $config->curl_settings);
  51. curl_multi_add_handle($mh, $special_ch);
  52. }
  53. $running = null;
  54. do {
  55. curl_multi_exec($mh, $running);
  56. } while ($running);
  57. if ($special_search != 0)
  58. {
  59. $special_result = null;
  60. switch ($special_search)
  61. {
  62. case 1:
  63. require "engines/special/currency.php";
  64. $special_result = currency_results($query, curl_multi_getcontent($special_ch));
  65. break;
  66. case 2:
  67. require "engines/special/definition.php";
  68. $special_result = definition_results($query, curl_multi_getcontent($special_ch));
  69. break;
  70. case 3:
  71. require "engines/special/wikipedia.php";
  72. $special_result = wikipedia_results($query, curl_multi_getcontent($special_ch));
  73. break;
  74. }
  75. if ($special_result != null)
  76. array_push($results, $special_result);
  77. }
  78. $xpath = get_xpath(curl_multi_getcontent($google_ch));
  79. foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result)
  80. {
  81. $url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0];
  82. if ($url == null)
  83. continue;
  84. if (!empty($results)) // filter duplicate results, ignore special result
  85. {
  86. if (!array_key_exists("special_response", end($results)))
  87. if (end($results)["url"] == $url->textContent)
  88. continue;
  89. }
  90. $url = $url->textContent;
  91. $url = check_for_privacy_friendly_alternative($url);
  92. $title = $xpath->evaluate(".//h3", $result)[0];
  93. $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0];
  94. array_push($results,
  95. array (
  96. "title" => htmlspecialchars($title->textContent),
  97. "url" => htmlspecialchars($url),
  98. "base_url" => htmlspecialchars(get_base_url($url)),
  99. "description" => $description == null ?
  100. "No description was provided for this site." :
  101. htmlspecialchars($description->textContent)
  102. )
  103. );
  104. }
  105. return $results;
  106. }
  107. function print_text_results($results)
  108. {
  109. echo "<div class=\"text-result-container\">";
  110. $special = $results[0];
  111. if (array_key_exists("special_response", $special))
  112. {
  113. $response = $special["special_response"]["response"];
  114. $source = $special["special_response"]["source"];
  115. echo "<p class=\"special-result-container\">";
  116. echo $response;
  117. echo "<a href=\"$source\" target=\"_blank\">$source</a>";
  118. echo "</p>";
  119. array_shift($results);
  120. }
  121. foreach($results as $result)
  122. {
  123. $title = $result["title"];
  124. $url = $result["url"];
  125. $base_url = $result["base_url"];
  126. $description = $result["description"];
  127. echo "<div class=\"text-result-wrapper\">";
  128. echo "<a href=\"$url\">";
  129. echo "$base_url";
  130. echo "<h2>$title</h2>";
  131. echo "</a>";
  132. echo "<span>$description</span>";
  133. echo "</div>";
  134. }
  135. echo "</div>";
  136. }
  137. ?>