mikuli.cz

:)
git clone https://git.sr.ht/~ashymad/mikuli.cz
Log | Files | Refs

commit c352b1e5d4d20ba790d2a469642e8155b39ebc9b
parent e9f35f25915709bbf30dbb43134893d599f5249d
Author: markseu <mark2011@mayberg.se>
Date:   Sat, 21 Dec 2013 14:10:15 +0100

Core update (sinus iridum remix)

Diffstat:
Msystem/core/core-commandline.php | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Msystem/core/core-markdownextra.php | 8++++----
Msystem/core/core-webinterface.php | 87++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Msystem/core/core.php | 240++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msystem/snippets/footer.php | 4+++-
5 files changed, 287 insertions(+), 151 deletions(-)

diff --git a/system/core/core-commandline.php b/system/core/core-commandline.php @@ -5,7 +5,7 @@ // Command line core plugin class YellowCommandline { - const Version = "0.2.1"; + const Version = "0.2.2"; var $yellow; //access to API // Initialise plugin @@ -17,41 +17,49 @@ class YellowCommandline $this->yellow->config->setDefault("commandBuildCustomErrorFile", "error404.html"); } + // Handle command help + function onCommandHelp() + { + $help .= "version\n"; + $help .= "build DIRECTORY [LOCATION]\n"; + return $help; + } + // Handle command function onCommand($args) { list($name, $command) = $args; switch($command) { - case "build": $statusCode = $this->build($args); break; - case "version": $statusCode = $this->version(); break; - default: $statusCode = $this->help(); + case "": $statusCode = $this->helpCommand(); break; + case "version": $statusCode = $this->versionCommand(); break; + case "build": $statusCode = $this->buildCommand($args); break; + default: $statusCode = $this->pluginCommand($args); break; } return $statusCode; } // Show available commands - function help() + function helpCommand() { echo "Yellow command line ".YellowCommandline::Version."\n"; - echo "Syntax: yellow.php build DIRECTORY [LOCATION]\n"; - echo " yellow.php version\n"; - return 0; + foreach($this->getCommandHelp() as $line) echo (++$lineCounter>1 ? " " : "Syntax: ")."yellow.php $line\n"; + return 200; } // Show software version - function version() + function versionCommand() { echo "Yellow ".Yellow::Version."\n"; foreach($this->yellow->plugins->plugins as $key=>$value) echo "$value[class] $value[version]\n"; - return 0; + return 200; } // Build website - function build($args) + function buildCommand($args) { $statusCode = 0; - list($name, $command, $path, $location) = $args; + list($dummy, $command, $path, $location) = $args; if(!empty($path) && $path!="/") { if($this->yellow->config->isExisting("serverName")) @@ -64,11 +72,12 @@ class YellowCommandline $fileName = $this->yellow->config->get("configDir").$this->yellow->config->get("configFile"); echo "ERROR bulding website: Please configure serverName and serverBase in file '$fileName'!\n"; } - echo "Yellow build: $content content, $media media, $system system"; + echo "Yellow $command: $content content, $media media, $system system"; echo ", $error error".($error!=1 ? 's' : ''); echo ", status $statusCode\n"; } else { - echo "Yellow build: Invalid arguments\n"; + echo "Yellow $command: Invalid arguments\n"; + $statusCode = 400; } return $statusCode; } @@ -87,7 +96,8 @@ class YellowCommandline ".", "/.*\\".$this->yellow->config->get("commandBuildCustomMediaExtension")."/", false, false)); $fileNamesSystem = array($this->yellow->config->get("commandBuildCustomErrorFile")); } else { - $pages = new YellowPageCollection($this->yellow, $location); + if($location[0] != '/') $location = '/'.$location; + $pages = new YellowPageCollection($this->yellow); $pages->append(new YellowPage($this->yellow, $location)); $fileNamesMedia = array(); $fileNamesSystem = array(); @@ -150,18 +160,18 @@ class YellowCommandline $fileName = $this->getStaticFileName($location, $path); $fileData = ob_get_contents(); if($statusCode>=301 && $statusCode<=303) $fileData = $this->getStaticRedirect($this->yellow->page->getHeader("Location")); - $fileOk = $this->makeStaticFile($fileName, $fileData, $modified); + $fileOk = $this->createStaticFile($fileName, $fileData, $modified); } else { if(!$this->yellow->toolbox->isFileLocation($location)) { $fileName = $this->getStaticFileName($location, $path); $fileData = $this->getStaticRedirect("http://$serverName$serverBase$staticLocation"); - $fileOk = $this->makeStaticFile($fileName, $fileData, $modified); + $fileOk = $this->createStaticFile($fileName, $fileData, $modified); if($fileOk) { $fileName = $this->getStaticFileName($staticLocation, $path); $fileData = ob_get_contents(); - $fileOk = $this->makeStaticFile($fileName, $fileData, $modified); + $fileOk = $this->createStaticFile($fileName, $fileData, $modified); } } else { $statusCode = 409; @@ -190,7 +200,7 @@ class YellowCommandline if($statusCode == $statusCodeRequest) { $modified = strtotime($this->yellow->page->getHeader("Last-Modified")); - if(!$this->makeStaticFile($fileName, ob_get_contents(), $modified)) + if(!$this->createStaticFile($fileName, ob_get_contents(), $modified)) { $statusCode = 500; $this->yellow->page->error($statusCode, "Can't write file '$fileName'!"); @@ -201,9 +211,9 @@ class YellowCommandline } // Create static file - function makeStaticFile($fileName, $fileData, $modified) + function createStaticFile($fileName, $fileData, $modified) { - return $this->yellow->toolbox->makeFile($fileName, $fileData, true) && + return $this->yellow->toolbox->createFile($fileName, $fileData, true) && $this->yellow->toolbox->modifyFile($fileName, $modified); } @@ -253,14 +263,49 @@ class YellowCommandline // Return static redirect data function getStaticRedirect($url) { - $data = "<!DOCTYPE html><html>\n"; - $data .= "<head>\n"; - $data .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n"; - $data .= "<meta http-equiv=\"refresh\" content=\"0;url=$url\" />\n"; - $data .= "</head>\n"; - $data .= "</html>\n"; + $text = "<!DOCTYPE html><html>\n"; + $text .= "<head>\n"; + $text .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n"; + $text .= "<meta http-equiv=\"refresh\" content=\"0;url=$url\" />\n"; + $text .= "</head>\n"; + $text .= "</html>\n"; + return $text; + } + + // Return command help + function getCommandHelp() + { + $data = array(); + foreach($this->yellow->plugins->plugins as $key=>$value) + { + if(method_exists($value["obj"], "onCommandHelp")) + { + foreach(preg_split("/[\r\n]+/", $value["obj"]->onCommandHelp()) as $line) + { + list($command, $text) = explode(' ', $line, 2); + if(!empty($command) && is_null($data[$command])) $data[$command] = $line; + } + } + } + uksort($data, strnatcasecmp); return $data; } + + // Forward plugin command + function pluginCommand($args) + { + $statusCode = 0; + foreach($this->yellow->plugins->plugins as $key=>$value) + { + if($key == "commandline") continue; + if(method_exists($value["obj"], "onCommand")) + { + $statusCode = $value["obj"]->onCommand($args); + if($statusCode != 0) break; + } + } + return $statusCode; + } } $yellow->registerPlugin("commandline", "YellowCommandline", YellowCommandline::Version); diff --git a/system/core/core-markdownextra.php b/system/core/core-markdownextra.php @@ -2,10 +2,10 @@ // Copyright (c) 2013 Datenstrom, http://datenstrom.se // This file may be used and distributed under the terms of the public license. -// Markdown extra parser core plugin +// Markdown extra core plugin class YellowMarkdownExtra { - const Version = "0.2.4"; + const Version = "0.2.5"; var $yellow; //access to API var $textHtml; //generated text (HTML format) @@ -15,8 +15,8 @@ class YellowMarkdownExtra $this->yellow = $yellow; } - // Parse text - function parse($text) + // Handle text parsing + function onParse($text) { $markdown = new YellowMarkdownExtraParser($this->yellow); return $this->textHtml = $markdown->transform($text); diff --git a/system/core/core-webinterface.php b/system/core/core-webinterface.php @@ -5,7 +5,7 @@ // Web interface core plugin class YellowWebinterface { - const Version = "0.2.3"; + const Version = "0.2.4"; var $yellow; //access to API var $users; //web interface users var $activeLocation; //web interface location? (boolean) @@ -19,7 +19,7 @@ class YellowWebinterface $this->yellow = $yellow; $this->yellow->config->setDefault("webinterfaceLocation", "/edit/"); $this->yellow->config->setDefault("webinterfaceUserFile", "user.ini"); - $this->users = new YellowWebinterfaceUsers(); + $this->users = new YellowWebinterfaceUsers($yellow); $this->users->load($this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile")); } @@ -30,8 +30,7 @@ class YellowWebinterface if($this->checkWebinterfaceLocation($location)) { $serverBase .= rtrim($this->yellow->config->get("webinterfaceLocation"), '/'); - $location = $this->yellow->getRelativeLocation($serverBase); - $fileName = $this->yellow->getContentFileName($location); + list($location, $fileName) = $this->yellow->getRequestLocationFile($serverBase); if($this->checkUser()) $statusCode = $this->processRequestAction($serverName, $serverBase, $location, $fileName); if($statusCode == 0) $statusCode = $this->yellow->processRequest($serverName, $serverBase, $location, $fileName, false, $this->activeUserFail ? 401 : 0); @@ -101,6 +100,43 @@ class YellowWebinterface return $header; } + // Handle command help + function onCommandHelp() + { + return "user EMAIL PASSWORD [NAME LANGUAGE]\n"; + } + + // Handle command + function onCommand($args) + { + list($name, $command) = $args; + switch($command) + { + case "user": $statusCode = $this->userCommand($args); break; + default: $statusCode = 0; + } + return $statusCode; + } + + // Create or update user + function userCommand($args) + { + $statusCode = 0; + list($dummy, $command, $email, $password, $name, $language) = $args; + if(!empty($email) && !empty($password) ) + { + $fileName = $this->yellow->config->get("configDir").$this->yellow->config->get("webinterfaceUserFile"); + $statusCode = $this->users->createUser($fileName, $email, $password, $name, $language) ? 200 : 500; + if($statusCode != 200) echo "ERROR updating configuration: Can't write file '$fileName'!\n"; + echo "Yellow $command: User account ".($statusCode!=200 ? "not " : ""); + echo ($this->users->isExisting($email) ? "updated" : "created")."\n"; + } else { + echo "Yellow $command: Invalid arguments\n"; + $statusCode = 400; + } + return $statusCode; + } + // Process request for an action function processRequestAction($serverName, $serverBase, $location, $fileName) { @@ -110,7 +146,7 @@ class YellowWebinterface case "edit": if(!empty($_POST["rawdata"]) && $this->checkUserPermissions($location, $fileName)) { $this->rawDataOriginal = $_POST["rawdata"]; - if($this->yellow->toolbox->makeFile($fileName, $_POST["rawdata"])) + if($this->yellow->toolbox->createFile($fileName, $_POST["rawdata"])) { $statusCode = 303; $locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, $location); @@ -134,7 +170,7 @@ class YellowWebinterface break; default: if(!is_readable($fileName)) { - if($this->yellow->toolbox->isFileLocation($location) && is_dir($this->yellow->getContentDirectory("$location/"))) + if($this->yellow->toolbox->isFileLocation($location) && $this->yellow->isContentDirectory("$location/")) { $statusCode = 301; $locationHeader = $this->yellow->toolbox->getHttpLocationHeader($serverName, $serverBase, "$location/"); @@ -230,10 +266,12 @@ class YellowWebinterface // Yellow web interface users class YellowWebinterfaceUsers { + var $yellow; //access to API var $users; //registered users - function __construct() + function __construct($yellow) { + $this->yellow = $yellow; $this->users = array(); } @@ -255,6 +293,41 @@ class YellowWebinterfaceUsers } } } + + // Create or update user in file + function createUser($fileName, $email, $password, $name, $language) + { + $email = strreplaceu(',', '-', $email); + $password = hash("sha256", $email.$password); + $fileNewUser = true; + $fileData = @file($fileName); + if($fileData) + { + foreach($fileData as $line) + { + preg_match("/^(.*?),\s*(.*?),\s*(.*?),\s*(.*?)\s*$/", $line, $matches); + if(!empty($matches[1]) && !empty($matches[2]) && !empty($matches[3]) && !empty($matches[4])) + { + if($matches[1] == $email) + { + $name = strreplaceu(',', '-', empty($name) ? $matches[3] : $name); + $language = strreplaceu(',', '-', empty($language) ? $matches[4] : $language); + $fileDataNew .= "$email,$password,$name,$language\n"; + $fileNewUser = false; + continue; + } + } + $fileDataNew .= $line; + } + } + if($fileNewUser) + { + $name = strreplaceu(',', '-', empty($name) ? $this->yellow->config->get("sitename") : $name); + $language = strreplaceu(',', '-', empty($language) ? $this->yellow->config->get("language") : $language); + $fileDataNew .= "$email,$password,$name,$language\n"; + } + return $this->yellow->toolbox->createFile($fileName, $fileDataNew); + } // Set user data function setUser($email, $password, $name, $language) diff --git a/system/core/core.php b/system/core/core.php @@ -5,7 +5,7 @@ // Yellow main class class Yellow { - const Version = "0.2.4"; + const Version = "0.2.5"; var $page; //current page data var $pages; //current page tree from file system var $config; //configuration @@ -59,8 +59,7 @@ class Yellow $statusCode = 0; $serverName = $this->config->get("serverName"); $serverBase = $this->config->get("serverBase"); - $location = $this->getRelativeLocation($serverBase); - $fileName = $this->getContentFileName($location); + list($location, $fileName) = $this->getRequestLocationFile($serverBase); $this->page = new YellowPage($this, $location); foreach($this->plugins->plugins as $key=>$value) { @@ -103,11 +102,11 @@ class Yellow $fileName = $this->readPage($serverBase, $location, $fileName, $cacheable, $statusCode); } else { $statusCode = 303; - $locationArgs = $this->toolbox->getLocationArgsCleanUrl(); + $locationArgs = $this->toolbox->getLocationArgsCleanUrl($location); $this->sendStatus($statusCode, $this->toolbox->getHttpLocationHeader($serverName, $serverBase, $location.$locationArgs)); } } else { - if($this->toolbox->isFileLocation($location) && is_dir($this->getContentDirectory("$location/"))) + if($this->toolbox->isFileLocation($location) && $this->isContentDirectory("$location/")) { $statusCode = 301; $this->sendStatus($statusCode, $this->toolbox->getHttpLocationHeader($serverName, $serverBase, "$location/")); @@ -191,7 +190,8 @@ class Yellow $this->toolbox->isFileNotModified($this->page->getHeader("Last-Modified"))) { $statusCode = 304; - $this->page->clean($statusCode); + if($this->page->isHeader("Cache-Control")) $responseHeader = "Cache-Control: ".$this->page->getHeader("Cache-Control"); + $this->page->clean($statusCode, $responseHeader); } if($this->page->isExisting("pageClean")) ob_clean(); if(PHP_SAPI != "cli") @@ -217,6 +217,25 @@ class Yellow } } + // Return request location and file name, without server base + function getRequestLocationFile($serverBase) + { + $location = $this->toolbox->getLocationNormalised(); + $location = substru($location, strlenu($serverBase)); + $fileName = $this->toolbox->findFileFromLocation($location, + $this->config->get("contentDir"), $this->config->get("contentHomeDir"), + $this->config->get("contentDefaultFile"), $this->config->get("contentExtension")); + if(!$this->toolbox->isFileLocation($location) && !is_file($fileName) && + preg_match("/[^\/]+:.*/", rawurldecode($this->toolbox->getLocation()))) + { + $location = rtrim($location, '/'); + $fileName = $this->toolbox->findFileFromLocation($location, + $this->config->get("contentDir"), $this->config->get("contentHomeDir"), + $this->config->get("contentDefaultFile"), $this->config->get("contentExtension")); + } + return array($location, $fileName); + } + // Return name of request handler function getRequestHandler() { @@ -229,7 +248,7 @@ class Yellow return isset($_GET["clean-url"]) || isset($_POST["clean-url"]); } - // Check for request error + // Check if request error happened function isRequestError() { $serverBase = $this->config->get("serverBase"); @@ -240,6 +259,14 @@ class Yellow return $this->page->isExisting("pageError"); } + // Check if content directory exists + function isContentDirectory($location) + { + $path = $this->toolbox->findFileFromLocation($location, + $this->config->get("contentDir"), $this->config->get("contentHomeDir"), "", ""); + return is_dir($path); + } + // Execute template function template($name) { @@ -284,29 +311,6 @@ class Yellow return $header; } - // Return content location for current HTTP request, without server base - function getRelativeLocation($serverBase) - { - $location = $this->toolbox->getLocation(); - $location = $this->toolbox->normaliseLocation($location); - return substru($location, strlenu($serverBase)); - } - - // Return content file name from location - function getContentFileName($location) - { - return $this->toolbox->findFileFromLocation($location, - $this->config->get("contentDir"), $this->config->get("contentHomeDir"), - $this->config->get("contentDefaultFile"), $this->config->get("contentExtension")); - } - - // Return content directory from location - function getContentDirectory($location) - { - return $this->toolbox->findFileFromLocation($location, - $this->config->get("contentDir"), $this->config->get("contentHomeDir"), "", ""); - } - // Execute plugin command function plugin($name, $args = NULL) { @@ -439,11 +443,15 @@ class YellowPage $this->parser = new stdClass; if($this->yellow->plugins->isExisting($this->get("parser"))) { - $this->parser = $this->yellow->plugins->plugins[$this->get("parser")]["obj"]; - $this->parser->parse($this->getContent(true)); - $location = $this->yellow->toolbox->getDirectoryLocation($this->getLocation()); - $this->parser->textHtml = preg_replace("#<a(.*?)href=\"(?!javascript:)([^\/\"]+)\"(.*?)>#", - "<a$1href=\"$location$2\"$3>", $this->parser->textHtml); + $plugin = $this->yellow->plugins->plugins[$this->get("parser")]; + if(method_exists($plugin["obj"], "onParse")) + { + $this->parser = $plugin["obj"]; + $this->parser->onParse($this->getContent(true)); + $location = $this->yellow->toolbox->getDirectoryLocation($this->getLocation()); + $this->parser->textHtml = preg_replace("#<a(.*?)href=\"(?!javascript:)([^\/\"]+)\"(.*?)>#", + "<a$1href=\"$location$2\"$3>", $this->parser->textHtml); + } } foreach($this->yellow->plugins->plugins as $key=>$value) { @@ -762,10 +770,10 @@ class YellowPageCollection extends ArrayObject { if($pageNumber>=1 && $pageNumber<=$this->paginationCount) { - $locationArgs = $this->yellow->toolbox->getLocationArgs($pageNumber>1 ? "page:$pageNumber" : "page:"); - $location = $this->yellow->page->getLocation().$locationArgs; + $location = $this->yellow->page->getLocation(); + $locationArgs = $this->yellow->toolbox->getLocationArgs($location, $pageNumber>1 ? "page:$pageNumber" : "page:"); } - return $location; + return $location.$locationArgs; } // Return absolute location for previous page in pagination @@ -1203,11 +1211,50 @@ class YellowToolbox return ($pos = strposu($uri, '?')) ? substru($uri, 0, $pos) : $uri; } + // Return location from current HTTP request, remove unwanted path tokens and location arguments + function getLocationNormalised() + { + $string = rawurldecode($this->getLocation()); + $location = ($string[0]=='/') ? '' : '/'; + for($pos=0; $pos<strlenb($string); ++$pos) + { + if($string[$pos] == '/') + { + if($string[$pos+1] == '/') continue; + if($string[$pos+1] == '.') + { + $posNew = $pos+1; while($string[$posNew] == '.') ++$posNew; + if($string[$posNew]=='/' || $string[$posNew]=='') + { + $pos = $posNew-1; + continue; + } + } + } + $location .= $string[$pos]; + } + if(preg_match("/^(.*?\/)([^\/]+:.*)$/", $location, $matches)) + { + $location = $matches[1]; + foreach(explode('/', $matches[2]) as $token) + { + preg_match("/^(.*?):(.*)$/", $token, $matches); + if(!empty($matches[1]) && !strempty($matches[2])) + { + $matches[1] = strreplaceu(array("\x1c", "\x1d"), array('/', ':'), $matches[1]); + $matches[2] = strreplaceu(array("\x1c", "\x1d"), array('/', ':'), $matches[2]); + $_REQUEST[$matches[1]] = $matches[2]; + } + } + } + return $location; + } + // Return location arguments from current HTTP request - function getLocationArgs($arg = "") + function getLocationArgs($location, $arg = "") { preg_match("/^(.*?):(.*)$/", $arg, $args); - if(preg_match("/^(.*?\/)(\w+:.*)$/", rawurldecode(self::getLocation()), $matches)) + if(preg_match("/^(.*?\/)([^\/]+:.*)$/", rawurldecode($this->getLocation()), $matches)) { foreach(explode('/', $matches[2]) as $token) { @@ -1225,13 +1272,16 @@ class YellowToolbox if(!empty($locationArgs)) $locationArgs .= '/'; $locationArgs .= "$args[1]:$args[2]"; } - $locationArgs = rawurlencode($locationArgs); - $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), $locationArgs); + if(!empty($locationArgs)) + { + if($this->isFileLocation($location)) $locationArgs = '/'.$locationArgs; + $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), rawurlencode($locationArgs)); + } return $locationArgs; } // Return location arguments from current HTTP request, convert form into clean URL - function getLocationArgsCleanUrl() + function getLocationArgsCleanUrl($location) { foreach(array_merge($_GET, $_POST) as $key=>$value) { @@ -1243,50 +1293,14 @@ class YellowToolbox $locationArgs .= "$key:$value"; } } - $locationArgs = rawurlencode($locationArgs); - $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), $locationArgs); - return $locationArgs; - } - - // Normalise location and remove unwanted path tokens - function normaliseLocation($location, $convertArgs = true) - { - $string = rawurldecode($location); - $location = ($string[0]=='/') ? '' : '/'; - for($pos=0; $pos<strlenb($string); ++$pos) - { - if($string[$pos] == '/') - { - if($string[$pos+1] == '/') continue; - if($string[$pos+1] == '.') - { - $posNew = $pos+1; while($string[$posNew] == '.') ++$posNew; - if($string[$posNew]=='/' || $string[$posNew]=='') - { - $pos = $posNew-1; - continue; - } - } - } - $location .= $string[$pos]; - } - if($convertArgs && preg_match("/^(.*?\/)(\w+:.*)$/", $location, $matches)) + if(!empty($locationArgs)) { - $location = $matches[1]; - foreach(explode('/', $matches[2]) as $token) - { - preg_match("/^(.*?):(.*)$/", $token, $matches); - if(!empty($matches[1]) && !strempty($matches[2])) - { - $matches[1] = strreplaceu(array("\x1c", "\x1d"), array('/', ':'), $matches[1]); - $matches[2] = strreplaceu(array("\x1c", "\x1d"), array('/', ':'), $matches[2]); - $_REQUEST[$matches[1]] = $matches[2]; - } - } + if($this->isFileLocation($location)) $locationArgs = '/'.$locationArgs; + $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), rawurlencode($locationArgs)); } - return $location; + return $locationArgs; } - + // Check if file is unmodified since last HTTP request function isFileNotModified($lastModified) { @@ -1304,7 +1318,7 @@ class YellowToolbox { $string = ""; $tokens = explode('/', $location); - for($i=1; $i<count($tokens); ++$i) $string .= '/'.self::normaliseName($tokens[$i]); + for($i=1; $i<count($tokens); ++$i) $string .= '/'.$this->normaliseName($tokens[$i]); return $location == $string; } @@ -1344,32 +1358,32 @@ class YellowToolbox for($i=1; $i<count($tokens)-1; ++$i) { $token = $tokens[$i]; - if(self::normaliseName($token) != $token) $invalid = true; + if($this->normaliseName($token) != $token) $invalid = true; $regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/"; - foreach(self::getDirectoryEntries($path, $regex) as $entry) + foreach($this->getDirectoryEntries($path, $regex) as $entry) { - if(self::normaliseName($entry) == $token) { $token = $entry; break; } + if($this->normaliseName($entry) == $token) { $token = $entry; break; } } $path .= "$token/"; } } else { $i = 1; $token = rtrim($pathHome, '/'); - if(self::normaliseName($token) != $token) $invalid = true; + if($this->normaliseName($token) != $token) $invalid = true; $regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/"; - foreach(self::getDirectoryEntries($path, $regex) as $entry) + foreach($this->getDirectoryEntries($path, $regex) as $entry) { - if(self::normaliseName($entry) == $token) { $token = $entry; break; } + if($this->normaliseName($entry) == $token) { $token = $entry; break; } } $path .= "$token/"; } $token = !empty($tokens[$i]) ? $tokens[$i].$fileExtension : $fileDefault; if(!empty($tokens[$i]) && $tokens[$i].$fileExtension==$fileDefault) $invalid = true; - if(self::normaliseName($token) != $token) $invalid = true; + if($this->normaliseName($token) != $token) $invalid = true; $regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/"; - foreach(self::getDirectoryEntries($path, $regex, false, false) as $entry) + foreach($this->getDirectoryEntries($path, $regex, false, false) as $entry) { - if(self::normaliseName($entry) == $token) { $token = $entry; break; } + if($this->normaliseName($entry) == $token) { $token = $entry; break; } } $path .= $token; return $invalid ? "" : $path; @@ -1383,11 +1397,11 @@ class YellowToolbox $tokens = explode('/', $fileName); for($i=0; $i<count($tokens)-1; ++$i) { - $token = self::normaliseName($tokens[$i]).'/'; + $token = $this->normaliseName($tokens[$i]).'/'; if($i || $token!=$pathHome) $location .= $token; } - $token = self::normaliseName($tokens[$i]); - if($token != $fileDefault) $location .= self::normaliseName($tokens[$i], true); + $token = $this->normaliseName($tokens[$i]); + if($token != $fileDefault) $location .= $this->normaliseName($tokens[$i], true); return $location; } @@ -1411,6 +1425,7 @@ class YellowToolbox case 302: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Moved temporarily"; break; case 303: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Reload please"; break; case 304: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Not modified"; break; + case 400: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Bad request"; break; case 401: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Unauthorised"; break; case 404: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Not found"; break; case 409: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Conflict"; break; @@ -1442,7 +1457,7 @@ class YellowToolbox // Return HTTP location header function getHttpLocationHeader($serverName, $serverBase, $location) { - return "Location: ".self::getHttpUrl($serverName, $serverBase, $location); + return "Location: ".$this->getHttpUrl($serverName, $serverBase, $location); } // Return directory location @@ -1481,20 +1496,20 @@ class YellowToolbox function getDirectoryEntriesRecursive($path, $regex = "/.*/", $sort = false, $directories = true, $levelMax = 0) { $entries = array(); - foreach(self::getDirectoryEntries($path, $regex, $sort, $directories) as $entry) array_push($entries, "$path/$entry"); + foreach($this->getDirectoryEntries($path, $regex, $sort, $directories) as $entry) array_push($entries, "$path/$entry"); --$levelMax; if($levelMax != 0) { - foreach(self::getDirectoryEntries($path, "/.*/", $sort, true) as $entry) + foreach($this->getDirectoryEntries($path, "/.*/", $sort, true) as $entry) { - $entries = array_merge($entries, self::getDirectoryEntriesRecursive("$path/$entry", $regex, $sort, $directories, $levelMax)); + $entries = array_merge($entries, $this->getDirectoryEntriesRecursive("$path/$entry", $regex, $sort, $directories, $levelMax)); } } return $entries; } // Create file - function makeFile($fileName, $fileData, $mkdir = false) + function createFile($fileName, $fileData, $mkdir = false) { $ok = false; if($mkdir) @@ -1585,12 +1600,17 @@ class YellowToolbox $offsetBytes = $elementOffsetBytes + strlenb($element); } $output = rtrim($output); + for($i=count($elementsOpen)-1; $i>=0; --$i) + { + if(!preg_match("/^(dl|ol|ul|table|tbody|thead|tfoot|tr)/i", $elementsOpen[$i])) break; + $output .= "</".$elementsOpen[$i].">"; + } if($lengthMax <= 0) $output .= $endMarkerFound ? $endMarkerText : "…"; - for($t=count($elementsOpen)-1; $t>=0; --$t) $output .= "</".$elementsOpen[$t].">"; + for(; $i>=0; --$i) $output .= "</".$elementsOpen[$i].">"; } return $output; } - + // Create keywords from text string function createTextKeywords($text, $keywordsMax) { @@ -1688,14 +1708,10 @@ class YellowPlugins function load() { global $yellow; - require_once("core-commandline.php"); - require_once("core-markdownextra.php"); - require_once("core-webinterface.php"); - foreach($yellow->toolbox->getDirectoryEntries($yellow->config->get("pluginDir"), "/.*\.php/", true, false) as $entry) - { - $fileNamePlugin = $yellow->config->get("pluginDir")."/$entry"; - require_once($fileNamePlugin); - } + $path = dirname(__FILE__); + foreach($yellow->toolbox->getDirectoryEntries($path, "/.*\.php/", true, false) as $entry) require_once("$path/$entry"); + $path = $yellow->config->get("pluginDir"); + foreach($yellow->toolbox->getDirectoryEntries($path, "/.*\.php/", true, false) as $entry) require_once("$path/$entry"); foreach($this->plugins as $key=>$value) { $this->plugins[$key]["obj"] = new $value["class"]; diff --git a/system/snippets/footer.php b/system/snippets/footer.php @@ -1,4 +1,6 @@ -<div class="footer">&copy; 2013 <?php echo $yellow->page->getHtml("sitename") ?>. Built with <a href="https://github.com/markseu/yellowcms">Yellow</a></div> +<div class="footer"> +&copy; 2013 <?php echo $yellow->page->getHtml("sitename") ?>. Built with <a href="https://github.com/markseu/yellowcms">Yellow</a> +</div> </div> </body> </html> \ No newline at end of file