thumb: only shrink larger images
[minimedit.git] / article.inc.php
index 3e67d6f1a457d59a9646babcbe83f2aa242821eb..f56b2bedd27439e40e001e2141fbbdf2e9d5ca80 100644 (file)
@@ -7,9 +7,9 @@ class ArchiveArticle
 
        function __construct($path)
        {
-               $this->page = preg_replace('{^\.(?:/|$)}', '', $path);
-               $this->link = preg_replace('{(?:(?:/|^)index)?\.html$}', '', $this->page);
-               $this->raw($this->page);
+               $this->file = preg_replace('{^\.(?:/|$)}', '', $path);
+               $this->link = preg_replace('{(?:(?:/|^)index)?\.html$}', '', $this->file);
+               $this->raw($this->file);
        }
 
        function raw($page)
@@ -65,6 +65,18 @@ class ArchiveArticle
                return;
        }
 
+       function index()
+       {
+               $this->handler;
+               if (empty($this->handler)) {
+                       return;
+               }
+               $User = NULL;
+               $Page = $this;
+               $res = include "./{$this->handler}/index.php";
+               return $res;
+       }
+
        function restricted()
        {
                $this->handler;
@@ -77,12 +89,12 @@ class ArchiveArticle
        }
        function name()
        {
-               return $this->safetitle ?: $this->link;
+               return $this->safetitle ?: htmlspecialchars($this->link);
        }
 
        function last()
        {
-               return filemtime($this->page);
+               return filemtime($this->file);
        }
        function lastiso()
        {
@@ -91,7 +103,7 @@ class ArchiveArticle
 
        function dateparts()
        {
-               preg_match('< / (\d{4}) [/-] (\d{2}) (?:- (\d{2}) )? - >x', $this->page, $ymd);
+               preg_match('< / (\d{4}) [/-] (\d{2}) (?:- (\d{2}) )? - >x', $this->file, $ymd);
                array_shift($ymd);
                return $ymd;
        }
@@ -208,8 +220,13 @@ class ArchiveArticle
 
                # keep either login or logout parts depending on user level
                global $User;
-               $hideclass = $User && property_exists($User, 'login') && $User->login ? 'logout' : 'login';
-               $doc = preg_replace('{\s*<([a-z]+) class="'.$hideclass.'">.*?</\1>}s', '', $doc);
+               $userexists = $User && property_exists($User, 'login') && $User->login;
+               if (! ($userexists and $User->admin("edit {$this->link}")) ) {
+                       # remove matching elements until first corresponding closing tag
+                       $hideclass = $userexists ? 'logout' : 'login';
+                       $tagmatch = '<([a-z]+) class="'.$hideclass.'"[^>]*>';
+                       $doc = preg_replace("{\s*{$tagmatch}.*?</\\1>}s", '', $doc);
+               }
 
                return preg_replace_callback(
                        '{ \[\[ ([^] ]+) ([^]]*) \]\] }x',
@@ -231,6 +248,8 @@ class ArchiveArticle
 
 class PageSearch
 {
+       public $handlers = [];
+
        function __construct($path = '.')
        {
                $this->iterator = new RecursiveCallbackFilterIterator(
@@ -240,6 +259,11 @@ class PageSearch
                                        # skip hidden files and directories
                                        return FALSE;
                                }
+                               if (file_exists($current->getFilename() . '/index.php')) {
+                                       # contents better provided by handler code
+                                       $this->handlers[ $current->getPathname() ] = $current;
+                                       return FALSE;
+                               }
                                if ($current->isLink()) {
                                        # ignore symlinks, original contents only
                                        return FALSE;
@@ -257,12 +281,12 @@ class PageSearch
        function files()
        {
                # order alphabetically by link
-               $dir = iterator_to_array(new RecursiveIteratorIterator($this->iterator));
-               array_walk($dir, function (&$row, $name) {
-                       # prepare values for sorting (directory index first)
-                       $row = preg_replace('{/index\.html$}', '', $name);
-               });
-               asort($dir);
+               $dir = [];
+               foreach (new RecursiveIteratorIterator($this->iterator) as $name) {
+                       $article = new ArchiveArticle($name);
+                       $dir[$article->link] = $article;
+               }
+               ksort($dir);
                return $dir;
        }
 }