Browse Source

Discover the previous and next pages of all pages

Daniel Rudolf 8 years ago
parent
commit
2e880d6c7f
1 changed files with 46 additions and 25 deletions
  1. 46 25
      lib/Pico.php

+ 46 - 25
lib/Pico.php

@@ -391,6 +391,7 @@ class Pico
 
 
         $this->readPages();
         $this->readPages();
         $this->sortPages();
         $this->sortPages();
+        $this->discoverPageSiblings();
         $this->discoverCurrentPage();
         $this->discoverCurrentPage();
 
 
         $this->triggerEvent('onPagesLoaded', array(
         $this->triggerEvent('onPagesLoaded', array(
@@ -1237,8 +1238,11 @@ class Pico
      * | date_formatted | string | formatted date of the page               |
      * | date_formatted | string | formatted date of the page               |
      * | raw_content    | string | raw, not yet parsed contents of the page |
      * | raw_content    | string | raw, not yet parsed contents of the page |
      * | meta           | string | parsed meta data of the page             |
      * | meta           | string | parsed meta data of the page             |
+     * | previous_page  | &array | reference to the previous page           |
+     * | next_page      | &array | reference to the next page               |
      *
      *
      * @see    Pico::sortPages()
      * @see    Pico::sortPages()
+     * @see    Pico::discoverPageSiblings()
      * @see    Pico::getPages()
      * @see    Pico::getPages()
      * @return void
      * @return void
      */
      */
@@ -1372,11 +1376,47 @@ class Pico
         }
         }
     }
     }
 
 
+    /**
+     * Walks through the list of all known pages and discovers the previous and
+     * next page respectively
+     *
+     * @see    Pico::readPages()
+     * @see    Pico::getPages()
+     * @return void
+     */
+    protected function discoverPageSiblings()
+    {
+        if (($this->getConfig('order_by') === 'date') && ($this->getConfig('order') === 'desc')) {
+            $precedingPageKey = 'next_page';
+            $succeedingPageKey = 'previous_page';
+        } else {
+            $precedingPageKey = 'previous_page';
+            $succeedingPageKey = 'next_page';
+        }
+
+        $precedingPageId = null;
+        foreach ($this->pages as $id => &$pageData) {
+            $pageData[$precedingPageKey] = null;
+            $pageData[$succeedingPageKey] = null;
+
+            if ($pageData['hidden']) {
+                continue;
+            }
+
+            if ($precedingPageId !== null) {
+                $precedingPageData = &$this->pages[$precedingPageId];
+                $pageData[$precedingPageKey] = &$precedingPageData;
+                $precedingPageData[$succeedingPageKey] = &$pageData;
+            }
+
+            $precedingPageId = $id;
+        }
+    }
+
     /**
     /**
      * Returns the list of known pages
      * Returns the list of known pages
      *
      *
      * @see    Pico::readPages()
      * @see    Pico::readPages()
-     * @see    Pico::sortPages()
      * @return array[]|null the data of all pages
      * @return array[]|null the data of all pages
      */
      */
     public function getPages()
     public function getPages()
@@ -1385,8 +1425,8 @@ class Pico
     }
     }
 
 
     /**
     /**
-     * Walks through the list of known pages and discovers the requested page
-     * as well as the previous and next page relative to it
+     * Discovers the page data of the requested page as well as the previous
+     * and next page relative to it
      *
      *
      * @see    Pico::getCurrentPage()
      * @see    Pico::getCurrentPage()
      * @see    Pico::getPreviousPage()
      * @see    Pico::getPreviousPage()
@@ -1395,8 +1435,6 @@ class Pico
      */
      */
     protected function discoverCurrentPage()
     protected function discoverCurrentPage()
     {
     {
-        $pageIds = array_keys($this->pages);
-
         $contentDir = $this->getConfig('content_dir');
         $contentDir = $this->getConfig('content_dir');
         $contentDirLength = strlen($contentDir);
         $contentDirLength = strlen($contentDir);
 
 
@@ -1407,27 +1445,10 @@ class Pico
         }
         }
 
 
         $currentPageId = substr($this->requestFile, $contentDirLength, -strlen($this->getConfig('content_ext')));
         $currentPageId = substr($this->requestFile, $contentDirLength, -strlen($this->getConfig('content_ext')));
-        $currentPageIndex = array_search($currentPageId, $pageIds);
-        if ($currentPageIndex !== false) {
+        if (isset($this->pages[$currentPageId])) {
             $this->currentPage = &$this->pages[$currentPageId];
             $this->currentPage = &$this->pages[$currentPageId];
-
-            if (($this->getConfig('order_by') === 'date') && ($this->getConfig('order') === 'desc')) {
-                $previousPageOffset = 1;
-                $nextPageOffset = -1;
-            } else {
-                $previousPageOffset = -1;
-                $nextPageOffset = 1;
-            }
-
-            if (isset($pageIds[$currentPageIndex + $previousPageOffset])) {
-                $previousPageId = $pageIds[$currentPageIndex + $previousPageOffset];
-                $this->previousPage = &$this->pages[$previousPageId];
-            }
-
-            if (isset($pageIds[$currentPageIndex + $nextPageOffset])) {
-                $nextPageId = $pageIds[$currentPageIndex + $nextPageOffset];
-                $this->nextPage = &$this->pages[$nextPageId];
-            }
+            $this->previousPage = &$this->pages[$currentPageId]['previous_page'];
+            $this->nextPage = &$this->pages[$currentPageId]['next_page'];
         }
         }
     }
     }