login/pass: error messages below page title
[minimedit.git] / article.inc.php
index 7f8e622cde5297f5d71523a42b106a14983f09eb..093852f96753e712014e0f07961f6c8a34cb8552 100644 (file)
@@ -4,12 +4,13 @@ class ArchiveArticle
        public $raw, $title, $body; # file contents
        public $meta = [];  # head metadata properties
        public $place = []; # template variables replaced in render()
+       public $api = FALSE; # requested programming interface
 
        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)
@@ -47,7 +48,7 @@ class ArchiveArticle
                $this->path = '';
                $this->restricted = FALSE;
                while (TRUE) {
-                       if (file_exists("$path/.private")) {
+                       if (file_exists("$path/.private") and !$this->restricted) {
                                $this->restricted = $path;
                        }
 
@@ -65,16 +66,16 @@ class ArchiveArticle
                return;
        }
 
-       function index()
+       function index($api = TRUE)
        {
                $this->handler;
                if (empty($this->handler)) {
                        return;
                }
-               $User = NULL;
+               $this->api = $api;
                $Page = $this;
-               $res = include "./{$this->handler}/index.php";
-               return $res;
+               global $User;
+               return require "./{$this->handler}/index.php";
        }
 
        function restricted()
@@ -89,12 +90,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()
        {
@@ -103,7 +104,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;
        }
@@ -165,8 +166,9 @@ class ArchiveArticle
                        return ltrim($this->image, '/');
                }
                return preg_replace(
-                       ['{^(?:/thumb/[^/]*)?}', '/\.groot(?=\.\w+$)/'], ["thumb/$size", ''],
-                       $this->image
+                       ['{^(?:/thumb/[^/]*)?}', '/\.groot(?=\.\w+$)/', '/(?:\.jpg)?$/'],
+                       [      "thumb/$size",    '',                         '.jpg'    ],
+                       $this->image, 1
                );
        }
 
@@ -185,7 +187,7 @@ class ArchiveArticle
                else {
                        foreach (explode(' ', $params) as $param) {
                                if ($set = strpos($param, '=')) {
-                                       $Page->place[ substr($param, 0, $set) ] = substr($param, $set + 1);
+                                       $Page->place[ substr($param, 0, $set) ] = urldecode(substr($param, $set + 1));
                                }
                                elseif (!empty($param)) {
                                        $Page->place[] = $param;
@@ -220,8 +222,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 !empty($this->editable)) ) {
+                       # 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',