X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=mdref%2FAction.php;h=deb62e5a64c1260d59607950e29d0cefc8867ba6;hb=687f5fcb8de9250739a01d5855faa868f593fb73;hp=05e007fe37b0ea176dda8d9be8b738c2e273294e;hpb=904fc60f05894d6207e9ae85abda8c94283f7d28;p=mdref%2Fmdref diff --git a/mdref/Action.php b/mdref/Action.php index 05e007f..deb62e5 100644 --- a/mdref/Action.php +++ b/mdref/Action.php @@ -4,6 +4,7 @@ namespace mdref; use http\Env\Request; use http\Env\Response; +use http\Message\Body; /** * Request handler @@ -29,7 +30,7 @@ class Action { * @var \http\Url */ private $baseUrl; - + /** * Initialize the reference */ @@ -44,7 +45,7 @@ class Action { function esc($txt) { return htmlspecialchars($txt); } - + /** * Create the view payload * @param \http\Controller $ctl @@ -52,8 +53,9 @@ class Action { */ private function createPayload() { $pld = new \stdClass; - + $pld->esc = "htmlspecialchars"; + $pld->anchor = [$this->reference, "formatAnchor"]; $pld->quick = [$this->reference, "formatString"]; $pld->file = [$this->reference, "formatFile"]; @@ -62,10 +64,10 @@ class Action { $pld->refs = $this->reference; $pld->baseUrl = $this->baseUrl; - + return $pld; } - + /** * Redirect to canononical url * @param string $cnn @@ -75,7 +77,7 @@ class Action { $this->response->setResponseCode(301); $this->response->send(); } - + /** * Serve index.css */ @@ -84,7 +86,7 @@ class Action { $this->response->setBody(new \http\Message\Body(fopen(ROOT."/public/index.css", "r"))); $this->response->send(); } - + /** * Serve index.js */ @@ -93,10 +95,26 @@ class Action { $this->response->setBody(new \http\Message\Body(fopen(ROOT."/public/index.js", "r"))); $this->response->send(); } - + + /** + * Server a PHP stub + */ + private function serveStub() { + $name = $this->request->getQuery("ref", "s"); + $repo = $this->reference->getRepoForEntry($name); + if (!$repo->hasStub($stub)) { + throw new Exception(404, "Stub not found"); + } + $this->response->setHeader("Content-Type", "application/x-php"); + $this->response->setContentDisposition(["attachment" => ["filename" => "$name.stub.php"]]); + $this->response->setBody(new Body(fopen($stub, "r"))); + $this->response->send(); + } + /** * Serve a preset * @param \stdClass $pld + * @return true to continue serving the payload * @throws Exception */ private function servePreset($pld) { @@ -105,16 +123,20 @@ class Action { case "LICENSE": case "VERSION": $pld->text = file_get_contents(ROOT."/$pld->ref"); - break; + return true; case "index.css": $this->serveStylesheet(); break; case "index.js": $this->serveJavascript(); break; + case "stub": + $this->serveStub(); + break; default: throw new Exception(404, "$pld->ref not found"); } + return false; } private function serve() { @@ -122,7 +144,7 @@ class Action { include ROOT."/views/layout.phtml"; $this->response->send(); } - + public function handle() { try { @@ -138,15 +160,15 @@ class Action { /* direct match */ $pld->entry = $repo->getEntry($pld->ref); } - } else { - return $this->servePreset($pld); + } elseif (!$this->servePreset($pld)) { + return; } } - + } catch (\Exception $e) { $pld->exception = $e; } $this->serve($pld); } -} \ No newline at end of file +}