mirror of
https://git.lolcat.ca/lolcat/4get.git
synced 2024-11-08 17:43:07 -05:00
8762d68466
incl. a calculator, a hash encoder + rot13 and b64!, and a "what time is it" with timezone selection frontend injected in $payload["left"] in web.php you can see this live [on my instance](https://4get.silly.computer/web?s=7%2B8(9%5E2)&scraper=brave&nsfw=yes) (there are some issues that aren't related to this PR. favicons, etc. I'll fix them later.) Reviewed-on: https://git.lolcat.ca/lolcat/4get/pulls/10 Co-authored-by: cynic <admin@cynic.moe> Co-committed-by: cynic <admin@cynic.moe>
516 lines
11 KiB
PHP
516 lines
11 KiB
PHP
<?php
|
|
|
|
/*
|
|
Initialize random shit
|
|
*/
|
|
include "lib/frontend.php";
|
|
$frontend = new frontend();
|
|
|
|
[$scraper, $filters] = $frontend->getscraperfilters("web");
|
|
|
|
$get = $frontend->parsegetfilters($_GET, $filters);
|
|
|
|
$frontend->loadheader(
|
|
$get,
|
|
$filters,
|
|
"web"
|
|
);
|
|
|
|
$payload = [
|
|
"class" => "",
|
|
"right-left" => "",
|
|
"right-right" => "",
|
|
"left" => ""
|
|
];
|
|
|
|
try{
|
|
$results = $scraper->web($get);
|
|
|
|
}catch(Exception $error){
|
|
|
|
echo
|
|
$frontend->drawerror(
|
|
"Shit",
|
|
'This scraper returned an error:' .
|
|
'<div class="code">' . htmlspecialchars($error->getMessage()) . '</div>' .
|
|
'Things you can try:' .
|
|
'<ul>' .
|
|
'<li>Use a different scraper</li>' .
|
|
'<li>Remove keywords that could cause errors</li>' .
|
|
'<li>Use another 4get instance</li>' .
|
|
'</ul><br>' .
|
|
'If the error persists, please <a href="/about">contact the administrator</a>.'
|
|
);
|
|
die();
|
|
}
|
|
|
|
$answerlen = 0;
|
|
|
|
/*
|
|
Spelling checker
|
|
*/
|
|
if($results["spelling"]["type"] != "no_correction"){
|
|
|
|
switch($results["spelling"]["type"]){
|
|
|
|
case "including":
|
|
$type = "Including results for";
|
|
break;
|
|
|
|
case "not_many":
|
|
$type = "Not many results contains";
|
|
break;
|
|
}
|
|
|
|
$payload["left"] .=
|
|
'<div class="infobox">' .
|
|
$type . ' <b>' . htmlspecialchars($results["spelling"]["using"]) . '</b>.<br>' .
|
|
'Did you mean <a href="?s=' .
|
|
urlencode($results["spelling"]["correction"]) .
|
|
'&' .
|
|
$frontend->buildquery($get, true) .
|
|
'&spellcheck=no">' .
|
|
$results["spelling"]["correction"] .
|
|
'</a>?' .
|
|
'</div>';
|
|
}
|
|
|
|
/*
|
|
Populate links
|
|
*/
|
|
if(count($results["web"]) === 0){
|
|
|
|
$payload["left"] .=
|
|
'<div class="infobox">' .
|
|
"<h1>Nobody here but us chickens!</h1>" .
|
|
'Have you tried:' .
|
|
'<ul>' .
|
|
'<li>Using a different scraper</li>' .
|
|
'<li>Using fewer keywords</li>' .
|
|
'<li>Defining broader filters (Is NSFW turned off?)</li>' .
|
|
'</ul>' .
|
|
'</div>';
|
|
}
|
|
|
|
foreach($results["web"] as $site){
|
|
|
|
$n = null;
|
|
|
|
if($site["date"] !== null){
|
|
|
|
$date = date("jS M y @ g:ia", $site["date"]);
|
|
}else{
|
|
|
|
$date = null;
|
|
}
|
|
|
|
$payload["left"] .= $frontend->drawtextresult($site, $date, $n, $get["s"]);
|
|
}
|
|
|
|
$right = [];
|
|
|
|
/*
|
|
Generate images
|
|
*/
|
|
if(count($results["image"]) !== 0){
|
|
|
|
$answerlen++;
|
|
$right["image"] =
|
|
'<div class="answer-wrapper">' .
|
|
'<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
|
|
'<div class="answer">' .
|
|
'<div class="answer-title">' .
|
|
'<a class="answer-title" href="/images?s=' . urlencode($get["s"]) . '"><h2>Images</h2></a>' .
|
|
'</div>' .
|
|
'<div class="images">';
|
|
|
|
foreach($results["image"] as $image){
|
|
|
|
$right["image"] .=
|
|
'<a class="image" href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow" title="' . htmlspecialchars($image["title"]) . '" data-json="' . htmlspecialchars(json_encode($image["source"])) . '" tabindex="-1">' .
|
|
'<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "square") . '" alt="thumb">' .
|
|
'<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>' .
|
|
'</a>';
|
|
}
|
|
|
|
$right["image"] .=
|
|
'</div></div>' .
|
|
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
|
|
}
|
|
|
|
/*
|
|
Generate videos
|
|
*/
|
|
if(count($results["video"]) !== 0){
|
|
|
|
$answerlen++;
|
|
$right["video"] =
|
|
'<div class="answer-wrapper">' .
|
|
'<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
|
|
'<div class="answer">' .
|
|
'<div class="answer-title">' .
|
|
'<a class="answer-title" href="/videos?s=' . urlencode($get["s"]) . '"><h2>Videos</h2></a>' .
|
|
'</div>';
|
|
|
|
foreach($results["video"] as $video){
|
|
|
|
if($video["views"] !== null){
|
|
|
|
$greentext = number_format($video["views"]) . " views";
|
|
}else{
|
|
|
|
$greentext = null;
|
|
}
|
|
|
|
if($video["date"] !== null){
|
|
|
|
if($greentext !== null){
|
|
|
|
$greentext .= " • ";
|
|
}
|
|
|
|
$greentext .= date("jS M y @ g:ia", $video["date"]);
|
|
}
|
|
|
|
if($video["duration"] !== null){
|
|
|
|
if($video["duration"] == "_LIVE"){
|
|
|
|
$duration = 'LIVE';
|
|
}else{
|
|
|
|
$duration = $frontend->s_to_timestamp($video["duration"]);
|
|
}
|
|
}else{
|
|
|
|
$duration = null;
|
|
}
|
|
|
|
$right["video"] .= $frontend->drawtextresult($video, $greentext, $duration, $get["s"], false);
|
|
}
|
|
|
|
$right["video"] .=
|
|
'</div>' .
|
|
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
|
|
}
|
|
|
|
/*
|
|
Generate news
|
|
*/
|
|
if(count($results["news"]) !== 0){
|
|
|
|
$answerlen++;
|
|
$right["news"] =
|
|
'<div class="answer-wrapper">' .
|
|
'<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
|
|
'<div class="answer">' .
|
|
'<div class="answer-title">' .
|
|
'<a class="answer-title" href="/news?s=' . urlencode($get["s"]) . '"><h2>News</h2></a>' .
|
|
'</div>';
|
|
|
|
foreach($results["news"] as $news){
|
|
|
|
if($news["date"] !== null){
|
|
|
|
$greentext = date("jS M y @ g:ia", $news["date"]);
|
|
}else{
|
|
|
|
$greentext = null;
|
|
}
|
|
|
|
$right["news"] .= $frontend->drawtextresult($news, $greentext, null, $get["s"], false);
|
|
}
|
|
|
|
$right["news"] .=
|
|
'</div>' .
|
|
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
|
|
}
|
|
|
|
/*
|
|
Generate answers
|
|
*/
|
|
if(count($results["answer"]) !== 0){
|
|
|
|
$right["answer"] = "";
|
|
|
|
foreach($results["answer"] as $answer){
|
|
|
|
$answerlen++;
|
|
$right["answer"] .=
|
|
'<div class="answer-wrapper">' .
|
|
'<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
|
|
'<div class="answer"><div class="wiki-head">';
|
|
|
|
if(!empty($answer["title"])){
|
|
|
|
$right["answer"] .=
|
|
'<div class="answer-title">';
|
|
|
|
if(!empty($answer["url"])){
|
|
|
|
$right["answer"] .= '<a class="answer-title" href="' . htmlspecialchars($answer["url"]) . '" rel="noreferrer nofollow">';
|
|
}
|
|
|
|
$right["answer"] .= '<h1>' . htmlspecialchars($answer["title"]) . '</h1>';
|
|
|
|
if(!empty($answer["url"])){
|
|
|
|
$right["answer"] .= '</a>';
|
|
}
|
|
|
|
|
|
$right["answer"] .= '</div>';
|
|
}
|
|
|
|
if(!empty($answer["url"])){
|
|
|
|
$right["answer"] .=
|
|
$frontend->drawlink($answer["url"]);
|
|
}
|
|
|
|
$right["answer"] .= '<div class="description">';
|
|
|
|
if(!empty($answer["thumb"])){
|
|
|
|
$right["answer"] .=
|
|
'<a href="' . htmlspecialchars($answer["thumb"]) . '" rel="noreferrer nofollow" class="photo">' .
|
|
'<img src="' . $frontend->htmlimage($answer["thumb"], "cover") . '" alt="thumb" class="openimg">' .
|
|
'</a>';
|
|
}
|
|
|
|
foreach($answer["description"] as $description){
|
|
|
|
switch($description["type"]){
|
|
|
|
case "text":
|
|
$right["answer"] .= $frontend->highlighttext($get["s"], $description["value"]);
|
|
break;
|
|
|
|
case "title":
|
|
$right["answer"] .=
|
|
'<h2>' .
|
|
htmlspecialchars($description["value"]) .
|
|
'</h2>';
|
|
break;
|
|
|
|
case "italic":
|
|
$right["answer"] .=
|
|
'<i>' .
|
|
$frontend->highlighttext($get["s"], $description["value"]) .
|
|
'</i>';
|
|
break;
|
|
|
|
case "quote":
|
|
$right["answer"] .=
|
|
'<div class="quote">' .
|
|
$frontend->highlighttext($get["s"], $description["value"]) .
|
|
'</div>';
|
|
break;
|
|
|
|
case "code":
|
|
$right["answer"] .=
|
|
'<div class="code" tabindex="-1">' .
|
|
$frontend->highlightcode($description["value"], true) .
|
|
'</div>';
|
|
break;
|
|
|
|
case "inline_code":
|
|
$right["answer"] .=
|
|
'<div class="code-inline">' .
|
|
htmlspecialchars($description["value"]) .
|
|
'</div>';
|
|
break;
|
|
|
|
case "link":
|
|
$right["answer"] .=
|
|
'<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" class="underline" tabindex="-1">' . htmlspecialchars($description["value"]) . '</a>';
|
|
break;
|
|
|
|
case "image":
|
|
$right["answer"] .=
|
|
'<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" tabindex="-1"><img src="' . $frontend->htmlimage($description["url"], "thumb") . '" alt="image" class="fullimg openimg"></a>';
|
|
break;
|
|
|
|
case "audio":
|
|
$right["answer"] .=
|
|
'<audio src="/audio?s=' . urlencode($description["url"]) . '" controls><a href="/audio.php?s=' . urlencode($description["url"]) . '">Listen to the pronunciation audio</a></audio>';
|
|
break;
|
|
}
|
|
}
|
|
|
|
$right["answer"] .= '</div>';
|
|
|
|
if(count($answer["table"]) !== 0){
|
|
|
|
$right["answer"] .= '<table>';
|
|
|
|
foreach($answer["table"] as $info => $value){
|
|
|
|
$right["answer"] .=
|
|
'<tr>' .
|
|
'<td>' . $info . '</td>' .
|
|
'<td>' . $value . '</td>' .
|
|
'</tr>';
|
|
}
|
|
|
|
$right["answer"] .= '</table>';
|
|
}
|
|
|
|
if(count($answer["sublink"]) !== 0){
|
|
|
|
$right["answer"] .= '<div class="socials">';
|
|
$icons = glob("static/icon/*");
|
|
|
|
foreach($answer["sublink"] as $website => $url){
|
|
|
|
$flag = false;
|
|
$icon = str_replace(" ", "", strtolower($website));
|
|
|
|
foreach($icons as $path){
|
|
|
|
if(pathinfo($path, PATHINFO_FILENAME) == $icon){
|
|
|
|
$flag = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if($flag === false){
|
|
|
|
$icon = "website";
|
|
}
|
|
|
|
$right["answer"] .=
|
|
'<a href="' . htmlspecialchars($url) . '" rel="noreferrer nofollow" tabindex="-1">' .
|
|
'<div class="center">' .
|
|
'<img src="/static/icon/' . $icon . '.png" alt="icon">' .
|
|
'<div class="title">' . $website . '</div>' .
|
|
'</div>' .
|
|
'</a>';
|
|
}
|
|
|
|
$right["answer"] .= '</div>';
|
|
}
|
|
|
|
$right["answer"] .=
|
|
'</div></div>' .
|
|
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
|
|
}
|
|
}
|
|
|
|
/*
|
|
Add right containers
|
|
*/
|
|
if(isset($right["answer"])){
|
|
|
|
if(count($right) >= 2){
|
|
|
|
$payload["right-right"] = $right["answer"];
|
|
unset($right["answer"]);
|
|
}
|
|
}
|
|
|
|
$c = 0;
|
|
foreach($right as $snippet){
|
|
|
|
if($c % 2 === 0){
|
|
|
|
$payload["right-left"] .= $snippet;
|
|
}else{
|
|
|
|
$payload["right-right"] .= $snippet;
|
|
}
|
|
|
|
$c++;
|
|
}
|
|
|
|
if($c !== 0){
|
|
|
|
$payload["class"] = " has-answer";
|
|
}
|
|
|
|
/*
|
|
Generate related searches
|
|
*/
|
|
$c = count($results["related"]);
|
|
|
|
if($c !== 0){
|
|
$payload["left"] .= '<h3>Related searches</h3><table class="related">';
|
|
|
|
$opentr = false;
|
|
|
|
for($i=0; $i<$c; $i++){
|
|
|
|
if(($i % 2) === 0){
|
|
|
|
$opentr = true;
|
|
$payload["left"] .= '<tr>';
|
|
}else{
|
|
|
|
$opentr = false;
|
|
}
|
|
|
|
$payload["left"] .=
|
|
'<td>' .
|
|
'<a href="/web?s=' .
|
|
urlencode($results["related"][$i]) . "&" .
|
|
$frontend->buildquery($get, true) .
|
|
'">' .
|
|
htmlspecialchars($results["related"][$i]) .
|
|
'</a>';
|
|
|
|
$payload["left"] .= '</td>';
|
|
|
|
if($opentr === false){
|
|
|
|
$payload["left"] .= '</tr>';
|
|
}
|
|
}
|
|
|
|
if($opentr === true){
|
|
|
|
$payload["left"] .= '<td></td></tr>';
|
|
}
|
|
|
|
$payload["left"] .= '</table>';
|
|
}
|
|
|
|
/*
|
|
Prepend Oracle output, if applicable
|
|
*/
|
|
include_once("oracles/encoder.php");
|
|
include_once("oracles/calc.php");
|
|
include_once("oracles/time.php");
|
|
include_once("oracles/numerics.php");
|
|
$oracles = [new calculator(), new encoder(), new time(), new numerics()];
|
|
$fortune = "";
|
|
foreach ($oracles as $oracle) {
|
|
if ($oracle->check_query($_GET["s"])) {
|
|
$resp = $oracle->generate_response($_GET["s"]);
|
|
if ($resp != "") {
|
|
$fortune .= "<div class=\"infobox\">";
|
|
foreach ($resp as $title => $r) {
|
|
if ($title) {
|
|
$fortune .= "<h3>".htmlspecialchars($title)."</h3><div class=\"code\">".htmlspecialchars($r)."</div>";
|
|
}
|
|
else {
|
|
$fortune .= "<i>".$r."</i><br>";
|
|
}
|
|
}
|
|
$fortune .= "<small>Answer provided by oracle: ".$oracle->info["name"]."</small></div>";
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
$payload["left"] = $fortune . $payload["left"];
|
|
|
|
/*
|
|
Load next page
|
|
*/
|
|
if($results["npt"] !== null){
|
|
|
|
$payload["left"] .=
|
|
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "web") . '" class="nextpage">Next page ></a>';
|
|
}
|
|
|
|
echo $frontend->load("search.html", $payload);
|