summaryrefslogtreecommitdiff
path: root/index.php
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>