Merge branch 'autocracy'
[mdref/mdref] / mdref / Action.php
index 223e532ca00d934f5143c6c12a3b5e0784442065..462e35b56e0e4810cbee75aa1e6ddeb382abe990 100644 (file)
@@ -4,37 +4,52 @@ namespace mdref;
 
 use http\Controller\Observer;
 
+/**
+ * The sole action controller of mdref
+ */
 class Action extends Observer
 {
+       private function serveReference(\http\Controller $ctl) {
+               $payload = $ctl->getPayload();
+               $finder = new Finder($this->baseUrl, REFS);
+               $path = $finder->find(new \http\Url($ctl->getRequest()->getRequestUrl()));
+               $payload->listing = new RefListing($path, 
+                               $finder->glob($path, "/[_a-zA-Z]*.md"));
+               $payload->title = $payload->listing->getSelf()->formatLink();
+               $payload->refs = $finder;
+               if ($path->isFile()) {
+                       $payload->html = new Markdown($path);
+                       $payload->sublisting = new RefListing($path, 
+                                       $finder->glob($path, "/[_a-z]*.md"));
+                       return true;
+               }
+       }
+       
+       private function serveInternal(\http\Controller $ctl) {
+               $payload = $ctl->getPayload();
+               $finder = new Finder($this->baseUrl, ROOT);
+               $url = new \http\Url($ctl->getRequest()->getRequestUrl());
+               $path = $finder->find($url, "");
+               if ($path->isFile("")) {
+                       $payload->html = $path->toHtml();
+               } else if (strcmp($url, $this->baseUrl)) {
+                       throw new \http\Controller\Exception(404, "Could not find '$path'");
+               }
+       }
+
+       /**
+        * Implements \SplObserver
+        * @param \SplSubject $ctl
+        */
        function update(\SplSubject $ctl) {
                /* @var \http\Controller $ctl */
                try {
-                       $payload = $ctl->getPayload();
-                       $request = $ctl->getRequest();
-
-                       $finder = new Finder($this->baseUrl, REFS);
-                       $url = new \http\Url($request->getRequestUrl());
-                       if (!$path = $finder->find($url)) {
-                               $path = new Path;
-                       }
-
-                       $payload->baseUrl = $this->baseUrl;
-                       $payload->requestUrl = $url;
-
-                       $payload->listing = new RefListing($path, 
-                                       $finder->glob($path, "/[_a-zA-Z]*.md"));
+                       $ctl->getPayload()->baseUrl = $this->baseUrl;
 
-                       if ($path->isFile()) {
-                               $payload->markdown = new Markdown($path);
-                               $payload->sublisting = new RefListing($path, 
-                                               $finder->glob($path, "/[_a-z]*.md"));
-                       } else if ($path($url)->isFile("")) {
-                               $payload->markdown = $path->toHtml();
-                       } else if (strcmp($url, $this->baseUrl)) {
-                               throw new \http\Controller\Exception(404, "Could not find '$url'");
+                       if (!$this->serveReference($ctl)) {
+                               $this->serveInternal($ctl);
                        }
                } catch (\Exception $e) {
-                       $payload->baseUrl = $this->baseUrl;
                        $ctl->getPayload()->exception = $e;
                }
        }