commit
c9898cf261
95 changed files with 5217 additions and 0 deletions
71
engines/text/brave.php
Normal file
71
engines/text/brave.php
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
class BraveSearchRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
// TODO find the right parameters for the url
|
||||
$url = "https://search.brave.com/search?q=$query_encoded&nfpr=1&spellcheck=0&start=$this->page";
|
||||
|
||||
if (3 > strlen($results_language) && 0 < strlen($results_language)) {
|
||||
$url .= "&lr=lang_$results_language";
|
||||
$url .= "&hl=$results_language";
|
||||
}
|
||||
|
||||
if (3 > strlen($number_of_results) && 0 < strlen($number_of_results))
|
||||
$url .= "&num=$number_of_results";
|
||||
|
||||
if (isset($_COOKIE["safe_search"]))
|
||||
$url .= "&safe=medium";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
foreach($xpath->query("//div[@id='results']//div[contains(@class, 'snippet')]") as $result) {
|
||||
$url = $xpath->evaluate(".//a[contains(@class, 'h')]//@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
if (!empty($results) && array_key_exists("url", end($results)) && end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
|
||||
$title = $xpath->evaluate(".//a[contains(@class, 'h')]//div[contains(@class, 'url')]", $result)[0];
|
||||
|
||||
if ($title == null)
|
||||
continue;
|
||||
$title = $title->textContent;
|
||||
|
||||
$title = end(explode("›", $title));
|
||||
|
||||
$description = ($xpath->evaluate(".//div[contains(@class, 'snippet-content')]//div[contains(@class, 'snippet-description')]", $result)[0] ?? null) ?->textContent ?? '';
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
64
engines/text/duckduckgo.php
Normal file
64
engines/text/duckduckgo.php
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
class DuckDuckGoRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
$results = array();
|
||||
|
||||
$domain = 'com';
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
$url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $this->page;
|
||||
|
||||
if (3 > strlen($results_language) && 0 < strlen($results_language))
|
||||
$url .= "&lr=lang_$results_language";
|
||||
|
||||
if (3 > strlen($number_of_results) && 0 < strlen($number_of_results))
|
||||
$url .= "&num=$number_of_results";
|
||||
|
||||
if (isset($_COOKIE["safe_search"]))
|
||||
$url .= "&safe=medium";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
foreach($xpath->query("/html/body/div[1]/div[". count($xpath->query('/html/body/div[1]/div')) ."]/div/div/div[contains(@class, 'web-result')]/div") as $result) {
|
||||
$url = $xpath->evaluate(".//h2[@class='result__title']//a/@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
if (!empty($results)) { // filter duplicate results
|
||||
if (end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
}
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
$title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0];
|
||||
$description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0];
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title->textContent),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description->textContent)
|
||||
)
|
||||
);
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
63
engines/text/ecosia.php
Normal file
63
engines/text/ecosia.php
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
class EcosiaSearchRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
// TODO figure out how to not autocorrect
|
||||
$url = "https://www.ecosia.org/search?method=index&q=$query_encoded&p=$this->page";
|
||||
|
||||
if (!is_null($results_language))
|
||||
$url .= "&lang=$results_language";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
|
||||
foreach($xpath->query("//div[contains(@class, 'mainline__result-wrapper')]") as $result) {
|
||||
$url = $xpath->evaluate(".//article//div[contains(@class, 'result__body')]//div[contains(@class, 'result__header')]//div[contains(@class, 'result__info')]//a[contains(@class, 'result__link')]//@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
if (!empty($results) && array_key_exists("url", end($results)) && end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
|
||||
$title = $xpath->evaluate(".//article//div[contains(@class, 'result__body')]//div[contains(@class, 'result__header')]//div[contains(@class, 'result__title')]//a//h2", $result)[0];
|
||||
|
||||
if ($title == null)
|
||||
continue;
|
||||
|
||||
$title = $title->textContent;
|
||||
|
||||
$description = $xpath->evaluate(".//article//div[contains(@class, 'result__body')]//div[contains(@class, 'result__columns')]//div[contains(@class, 'result__columns-start')]//div//div//div/p", $result)[0]->textContent;
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
79
engines/text/google.php
Normal file
79
engines/text/google.php
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
class GoogleRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
$results = array();
|
||||
|
||||
$domain = $this->opts->google_domain;
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
$url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$this->page";
|
||||
|
||||
if (3 > strlen($results_language) && 0 < strlen($results_language)) {
|
||||
$url .= "&lr=lang_$results_language";
|
||||
$url .= "&hl=$results_language";
|
||||
}
|
||||
|
||||
if (3 > strlen($number_of_results) && 0 < strlen($number_of_results))
|
||||
$url .= "&num=$number_of_results";
|
||||
|
||||
if (isset($_COOKIE["safe_search"]))
|
||||
$url .= "&safe=medium";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
$didyoumean = $xpath->query(".//a[@class='gL9Hy']")[0];
|
||||
|
||||
if (!is_null($didyoumean))
|
||||
array_push($results, array(
|
||||
"did_you_mean" => $didyoumean->textContent
|
||||
));
|
||||
|
||||
foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result) {
|
||||
$url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
if (!empty($results) && array_key_exists("url", end($results)) && end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
$title = $xpath->evaluate(".//h3", $result)[0];
|
||||
$description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0];
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title->textContent),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description->textContent)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (empty($results) && !str_contains($response, "Our systems have detected unusual traffic from your computer network.")) {
|
||||
$results["error"] = array(
|
||||
"message" => TEXTS["failure_empty"]
|
||||
);
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
?>
|
||||
64
engines/text/mojeek.php
Normal file
64
engines/text/mojeek.php
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
class MojeekSearchRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
// TODO figure out how to not autocorrect
|
||||
$url = "https://www.mojeek.com/search?q=$query_encoded&p=$this->page";
|
||||
|
||||
// TODO language setting
|
||||
if (!is_null($results_language))
|
||||
$url .= "&lang=$results_language";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
|
||||
foreach($xpath->query("//ul[contains(@class, 'results-standard')]//li") as $result) {
|
||||
$url = $xpath->evaluate(".//h2//a[contains(@class, 'title')]//@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
if (!empty($results) && array_key_exists("url", $results) && end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
|
||||
$title = $xpath->evaluate(".//h2//a[contains(@class, 'title')]", $result)[0];
|
||||
|
||||
if ($title == null)
|
||||
continue;
|
||||
|
||||
$title = $title->textContent;
|
||||
|
||||
$description = ($xpath->evaluate(".//p[contains(@class, 's')]", $result)[0] ?? null) ?->textContent ?? '';
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
220
engines/text/text.php
Normal file
220
engines/text/text.php
Normal file
|
|
@ -0,0 +1,220 @@
|
|||
<?php
|
||||
function get_engines() {
|
||||
return array("google", "duckduckgo", "brave", "yandex", "ecosia", "mojeek");
|
||||
}
|
||||
|
||||
class TextSearch extends EngineRequest {
|
||||
protected $cache_key, $engine, $engines, $engine_request, $special_request;
|
||||
public function __construct($opts, $mh) {
|
||||
$this->engines = get_engines();
|
||||
shuffle($this->engines);
|
||||
|
||||
$this->query = $opts->query;
|
||||
$this->cache_key = "text:" . $this->query . "p" . $opts->page . "l" . $opts->language;
|
||||
|
||||
$this->page = $opts->page;
|
||||
$this->opts = $opts;
|
||||
|
||||
$this->engine = $opts->engine;
|
||||
|
||||
$query_parts = explode(" ", $this->query);
|
||||
$last_word_query = end($query_parts);
|
||||
if (substr($this->query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!")
|
||||
check_ddg_bang($this->query, $opts);
|
||||
|
||||
if (has_cached_results($this->cache_key))
|
||||
return;
|
||||
|
||||
if ($this->engine == "auto")
|
||||
$this->engine = $this->select_engine();
|
||||
|
||||
// no engine was selected
|
||||
if (is_null($this->engine))
|
||||
return;
|
||||
|
||||
// this only happens if a specific engine was selected, not if auto is used
|
||||
if (has_cooldown($this->engine, $this->opts->cooldowns))
|
||||
return;
|
||||
|
||||
$this->engine_request = $this->get_engine_request($this->engine, $opts, $mh);
|
||||
|
||||
if (is_null($this->engine_request))
|
||||
return;
|
||||
|
||||
require_once "engines/special/special.php";
|
||||
$this->special_request = get_special_search_request($opts, $mh);
|
||||
}
|
||||
private function select_engine() {
|
||||
if (sizeof($this->engines) == 0)
|
||||
return null;
|
||||
|
||||
$engine = array_pop($this->engines);
|
||||
|
||||
// if this engine is on cooldown, try again
|
||||
if (!has_cooldown($engine, $this->opts->cooldowns))
|
||||
return $engine;
|
||||
|
||||
return $this->select_engine();
|
||||
}
|
||||
|
||||
private function get_engine_request($engine, $opts, $mh) {
|
||||
if ($engine == "google") {
|
||||
require_once "engines/text/google.php";
|
||||
return new GoogleRequest($opts, $mh);
|
||||
}
|
||||
|
||||
if ($engine == "duckduckgo") {
|
||||
require_once "engines/text/duckduckgo.php";
|
||||
return new DuckDuckGoRequest($opts, $mh);
|
||||
}
|
||||
|
||||
if ($engine == "brave") {
|
||||
require_once "engines/text/brave.php";
|
||||
return new BraveSearchRequest($opts, $mh);
|
||||
}
|
||||
|
||||
if ($engine == "yandex") {
|
||||
require_once "engines/text/yandex.php";
|
||||
return new YandexSearchRequest($opts, $mh);
|
||||
}
|
||||
|
||||
if ($engine == "ecosia") {
|
||||
require_once "engines/text/ecosia.php";
|
||||
return new EcosiaSearchRequest($opts, $mh);
|
||||
}
|
||||
|
||||
if ($engine == "mojeek") {
|
||||
require_once "engines/text/mojeek.php";
|
||||
return new MojeekSearchRequest($opts, $mh);
|
||||
}
|
||||
|
||||
// if an invalid engine is selected, don't give any results
|
||||
return null;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
if (has_cached_results($this->cache_key))
|
||||
return fetch_cached_results($this->cache_key);
|
||||
|
||||
if (!isset($this->engine_request))
|
||||
return array();
|
||||
|
||||
$results = $this->engine_request->get_results();
|
||||
|
||||
if (empty($results)) {
|
||||
set_cooldown($this->engine, ($this->opts->request_cooldown ?? "1") * 60, $this->opts->cooldowns);
|
||||
} else {
|
||||
if ($this->special_request) {
|
||||
$special_result = $this->special_request->get_results();
|
||||
|
||||
if ($special_result)
|
||||
$results = array_merge(array($special_result), $results);
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($results)) {
|
||||
$results["results_source"] = parse_url($this->engine_request->url)["host"];
|
||||
store_cached_results($this->cache_key, $results, $this->opts->cache_time * 60);
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public static function print_results($results, $opts) {
|
||||
|
||||
if (empty($results)) {
|
||||
echo "<div class=\"text-result-container\"><p>An error occured fetching results</p></div>";
|
||||
return;
|
||||
}
|
||||
|
||||
if (array_key_exists("error", $results)) {
|
||||
echo "<div class=\"text-result-container\"><p>" . $results["error"]["message"] . "</p></div>";
|
||||
return;
|
||||
}
|
||||
|
||||
$special = $results[0];
|
||||
|
||||
if (array_key_exists("did_you_mean", $special)) {
|
||||
$didyoumean = $special["did_you_mean"];
|
||||
$new_url = "/search.php?q=" . urlencode($didyoumean);
|
||||
echo "<p class=\"did-you-mean\">Did you mean ";
|
||||
echo "<a href=\"$new_url\">$didyoumean</a>";
|
||||
echo "?</p>";
|
||||
}
|
||||
|
||||
if (array_key_exists("special_response", $special)) {
|
||||
$response = $special["special_response"]["response"];
|
||||
$source = $special["special_response"]["source"];
|
||||
|
||||
echo "<p class=\"special-result-container\">";
|
||||
if (array_key_exists("image", $special["special_response"])) {
|
||||
$image_url = $special["special_response"]["image"];
|
||||
echo "<img src=\"image_proxy.php?url=$image_url\">";
|
||||
}
|
||||
echo $response;
|
||||
if ($source) {
|
||||
$source = check_for_privacy_frontend($source, $opts);
|
||||
echo "<a href=\"$source\" rel=\"noreferer noopener\" target=\"_blank\">$source</a>";
|
||||
}
|
||||
echo "</p>";
|
||||
}
|
||||
|
||||
echo "<div class=\"text-result-container\">";
|
||||
|
||||
foreach($results as $result) {
|
||||
if (!is_array($result))
|
||||
continue;
|
||||
if (!array_key_exists("title", $result))
|
||||
continue;
|
||||
|
||||
$title = $result["title"];
|
||||
$url = $result["url"];
|
||||
$url = check_for_privacy_frontend($url, $opts);
|
||||
|
||||
$base_url = get_base_url($url);
|
||||
$description = $result["description"];
|
||||
|
||||
echo "<div class=\"text-result-wrapper\">";
|
||||
echo "<a rel=\"noreferer noopener\" href=\"$url\">";
|
||||
echo "$base_url";
|
||||
echo "<h2>$title</h2>";
|
||||
echo "</a>";
|
||||
echo "<span>$description</span>";
|
||||
echo "</div>";
|
||||
}
|
||||
|
||||
echo "</div>";
|
||||
}
|
||||
}
|
||||
|
||||
function check_ddg_bang($query, $opts) {
|
||||
|
||||
$bangs_json = file_get_contents("static/misc/ddg_bang.json");
|
||||
$bangs = json_decode($bangs_json, true);
|
||||
|
||||
if (substr($query, 0, 1) == "!")
|
||||
$search_word = substr(explode(" ", $query)[0], 1);
|
||||
else
|
||||
$search_word = substr(end(explode(" ", $query)), 1);
|
||||
|
||||
$bang_url = null;
|
||||
|
||||
foreach($bangs as $bang) {
|
||||
if ($bang["t"] == $search_word) {
|
||||
$bang_url = $bang["u"];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($bang_url) {
|
||||
$bang_query_array = explode("!" . $search_word, $query);
|
||||
$bang_query = trim(implode("", $bang_query_array));
|
||||
|
||||
$request_url = str_replace("{{{s}}}", str_replace('%26quot%3B','%22', urlencode($bang_query)), $bang_url);
|
||||
|
||||
header("Location: " . $request_url);
|
||||
die();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
68
engines/text/yandex.php
Normal file
68
engines/text/yandex.php
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
class YandexSearchRequest extends EngineRequest {
|
||||
public function get_request_url() {
|
||||
$query_encoded = str_replace("%22", "\"", urlencode($this->query));
|
||||
|
||||
$results_language = $this->opts->language;
|
||||
$number_of_results = $this->opts->number_of_results;
|
||||
|
||||
$url = "https://yandex.com/search?text=$query_encoded&nfpr=1&p=$this->page&noreask=1";
|
||||
|
||||
if (!is_null($results_language))
|
||||
$url .= "&lang=$results_language";
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
public function parse_results($response) {
|
||||
$results = array();
|
||||
$xpath = get_xpath($response);
|
||||
|
||||
if (!$xpath)
|
||||
return $results;
|
||||
|
||||
$r = $xpath->query("//ul[@id='search-result']");
|
||||
if (empty($r))
|
||||
return array("error" => array(
|
||||
"message" => TEXTS["failure_empty"]
|
||||
));
|
||||
|
||||
foreach($xpath->query("//li[contains(@class, 'serp-item')]") as $result) {
|
||||
$url = $xpath->evaluate(".//div//div//a[contains(@class, 'link')]//@href", $result)[0];
|
||||
|
||||
if ($url == null)
|
||||
continue;
|
||||
|
||||
$url = $url->textContent;
|
||||
|
||||
if (!empty($results) && array_key_exists("url", $results) && end($results)["url"] == $url->textContent)
|
||||
continue;
|
||||
|
||||
$title = $xpath->evaluate(".//div//div//a[contains(@class, 'link')]//h2[contains(@class, 'OrganicTitle-LinkText')]//span", $result)[0];
|
||||
|
||||
if ($title == null)
|
||||
continue;
|
||||
|
||||
$title = $title->textContent;
|
||||
|
||||
$description = $xpath->evaluate(".//div[contains(@class, 'Organic-ContentWrapper')]//div[contains(@class, 'text-container')]//span", $result)[0]->textContent;
|
||||
|
||||
array_push($results,
|
||||
array (
|
||||
"title" => htmlspecialchars($title),
|
||||
"url" => htmlspecialchars($url),
|
||||
// base_url is to be removed in the future, see #47
|
||||
"base_url" => htmlspecialchars(get_base_url($url)),
|
||||
"description" => $description == null ?
|
||||
TEXTS["result_no_description"] :
|
||||
htmlspecialchars($description)
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
Loading…
Add table
Add a link
Reference in a new issue