modularize
[m6w6/replicator] / public / index.php
1 <?php
2
3 use http\Env\Request;
4 use http\Env\Response;
5 use http\Header;
6
7 const UNITS = ["Bytes", "KB", "MB"];
8
9 function human_size($s) {
10 $l = floor(log10($s));
11 return sprintf("%1.1F %s", $s/pow(10,$l-($l%3)), UNITS[$l/3]);
12 }
13
14 function human_date($t) {
15 $d = date_create("@".$_SERVER["REQUEST_TIME"]);
16 for ($i = 1; $i < 7; ++$i) {
17 if ($t > $d->modify("-$i days")->format("U")) {
18 switch ($i) {
19 case 1:
20 return "today";
21 case 2:
22 return "yesterday";
23 default:
24 return "$i days ago";
25 }
26 }
27 }
28 return gmdate("Y-m-d", $t);
29 }
30
31 function package_versions($package) {
32 $versions = [];
33 foreach (glob("phars/$package/*.ext.phar*") as $phar) {
34 list($name, $enc) = explode(".ext.phar", basename($phar));
35 $data = new Phar($phar);
36 $meta = $data->getMetadata();
37 if ($meta) {
38 $release = $meta["release"];
39 } else {
40 $release = substr($name, strlen($package)+1);
41 }
42
43 $size = filesize($phar);
44 $date = isset($meta["date"]) ? strtotime($meta["date"]) : filemtime($phar);
45 $pharext = isset($meta["version"]) ? $meta["version"] : "2.0.1";
46 $versions[$release][$enc] = compact("phar", "date", "size", "pharext");
47 uksort($versions[$release], function($a, $b) {
48 $al = strlen($a);
49 $bl = strlen($b);
50 if ($al < $bl) return -1;
51 if ($al > $bl) return 1;
52 return 0;
53 });
54 }
55 uksort($versions, "version_compare");
56 return $versions;
57 }
58
59 $packages = array_map("basename", glob("phars/*", GLOB_NOSORT|GLOB_ONLYDIR));
60 sort($packages, SORT_NATURAL|SORT_FLAG_CASE);
61
62 if (in_array($_SERVER["QUERY_STRING"], $packages, true)) {
63 $package = $_SERVER["QUERY_STRING"];
64 }
65
66 $res = new Response;
67 $req = new Request;
68
69 if (!defined("INCLUDED")) {
70 if (($acc = $req->getHeader("Accept", Header::class))) {
71 $neg = basename($acc->negotiate(["text/html", "application/json"]));
72 } else {
73 $neg = "html";
74 }
75 include_once "$neg.php";
76 }