blob: 23c314f60373194d16e13625f3bdadd15fe3f339 (
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
|
<?php
use GeminiFoundation\Client;
use GeminiFoundation\Gemtext;
require __DIR__ . '/vendor/autoload.php';
$geminiHost = $_ENV['GEMINI_HOST'];
$url = parse_url(
"//$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"
);
$url['query'] ??= '';
$client = new Client($geminiHost);
$response = $client->request("$url[path]$url[query]");
ob_start();
$mime = explode(';', $response->getMeta())[0];
if (strpos($mime, 'text/gemini') === 0) {
$parser = new Gemtext($response->getBody());
$lines = $parser->parse();
$wasListItem = false;
$currentListItems = [];
foreach ($lines as $line) {
if ($wasListItem && $line['type'] !== 'listitem') {
echo "<ul>";
foreach ($currentListItems as $listItem) {
echo "<li>$listItem[text]</li>";
}
echo "</ul>";
$wasListItem = false;
$currentListItems = [];
}
if ($line['type'] === 'preformatted_on') {
echo "<div>$line[alt]</div><pre>";
}
else if ($line['type'] === 'preformatted') {
echo htmlentities($line['raw']);
}
else if ($line['type'] === 'preformatted_off') {
echo "</pre>";
}
else if ($line['type'] === 'heading') {
echo "<h$line[size]>$line[text]</h$line[size]>";
}
else if ($line['type'] === 'listitem') {
$currentListItems[] = $line;
$wasListItem = true;
}
else if ($line['type'] === 'quote') {
echo "<blockquote>$line[text]</blockquote>";
}
else if ($line['type'] === 'link') {
$line['link'] = str_replace(["gemini://$geminiHost", $geminiHost], "https://$geminiHost", $line['link']);
$line['text'] = $line['text'] ?: $line['link'];
echo "<a href=\"$line[link]\">$line[text]</a>";
}
else if ($line['type'] === 'text') {
echo "<p>$line[text]</p>";
}
}
}
else if (strpos($mime, 'image') === 0) {
echo "<img src=\"data:{$mime};base64," . base64_encode($response->getBody()) . "\">";
}
echo "<hr>";
echo "Proxied from <a href=\"gemini://$geminiHost$url[path]$url[query]\">gemini://$geminiHost$url[path]$url[query]</a>";
$content = ob_get_clean();
?>
<!doctype html>
<html>
<head>
</head>
<body>
<?php echo $content; ?>
</body>
</html>
|