Better error handling
This commit is contained in:
parent
286c37b8b3
commit
86661607c5
6 changed files with 273 additions and 210 deletions
|
@ -2,7 +2,7 @@
|
|||
Title: Home
|
||||
---
|
||||
Yes, your Yellow installation works!
|
||||
You can now [edit this page](@baselocation/edit/) or use your favorite text editor.
|
||||
You can now [edit this page](@pageedit) or use your favorite text editor.
|
||||
Information for web designers are in the [documentation](https://github.com/markseu/yellowcms-extensions/blob/master/documentation/README.md).
|
||||
|
||||
Have fun making your website.
|
|
@ -4,9 +4,9 @@
|
|||
sitename = Website
|
||||
author = Website
|
||||
language = en
|
||||
parser = markdown
|
||||
template = default
|
||||
style = default
|
||||
parser = markdown
|
||||
|
||||
styleLocation = /media/styles/
|
||||
imageLocation = /media/images/
|
||||
|
|
4
system/config/error500.txt
Normal file
4
system/config/error500.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
Title: Server error
|
||||
---
|
||||
Something went wrong. @pageerror
|
|
@ -5,13 +5,13 @@
|
|||
// Yellow main class
|
||||
class Yellow
|
||||
{
|
||||
const Version = "0.1.5";
|
||||
const Version = "0.1.6";
|
||||
var $page; //current page data
|
||||
var $pages; //current page tree from file system
|
||||
var $toolbox; //toolbox with helpers
|
||||
var $config; //site configuration
|
||||
var $text; //site text strings
|
||||
var $plugins; //site plugins
|
||||
var $config; //configuration
|
||||
var $text; //text strings
|
||||
var $plugins; //plugins
|
||||
|
||||
function __construct()
|
||||
{
|
||||
|
@ -22,9 +22,9 @@ class Yellow
|
|||
$this->config->setDefault("sitename", "Yellow");
|
||||
$this->config->setDefault("author", "Yellow");
|
||||
$this->config->setDefault("language", "en");
|
||||
$this->config->setDefault("parser", "markdown");
|
||||
$this->config->setDefault("template", "default");
|
||||
$this->config->setDefault("style", "default");
|
||||
$this->config->setDefault("parser", "markdown");
|
||||
$this->config->setDefault("yellowVersion", Yellow::Version);
|
||||
$this->config->setDefault("serverName", $this->toolbox->getServerName());
|
||||
$this->config->setDefault("baseLocation", $this->toolbox->getServerBase());
|
||||
|
@ -63,10 +63,10 @@ class Yellow
|
|||
function processRequest()
|
||||
{
|
||||
ob_start();
|
||||
$statusCode = 0;
|
||||
$baseLocation = $this->config->get("baseLocation");
|
||||
$location = $this->getRelativeLocation($baseLocation);
|
||||
$fileName = $this->getContentFileName($location);
|
||||
$statusCode = 0;
|
||||
foreach($this->plugins->plugins as $key=>$value)
|
||||
{
|
||||
if(method_exists($value["obj"], "onRequest"))
|
||||
|
@ -75,98 +75,123 @@ class Yellow
|
|||
if($statusCode) break;
|
||||
}
|
||||
}
|
||||
if($statusCode == 0) $statusCode = $this->processRequestFile($baseLocation, $location, $fileName, $statusCode);
|
||||
if(defined("DEBUG") && DEBUG>=1) echo "Yellow::processRequest status:$statusCode location:$location<br>\n";
|
||||
if($statusCode == 0) $statusCode = $this->processRequestFile($baseLocation, $location, $fileName, $statusCode, true);
|
||||
if(is_object($this->page) && $this->page->isError())
|
||||
{
|
||||
ob_clean();
|
||||
$statusCode = $this->processRequestError($baseLocation, $location, $fileName);
|
||||
}
|
||||
ob_end_flush();
|
||||
if(defined("DEBUG") && DEBUG>=1) echo "Yellow::processRequest status:$statusCode location:$location<br>\n";
|
||||
return $statusCode;
|
||||
}
|
||||
|
||||
// Process request for a file
|
||||
function processRequestFile($baseLocation, $location, $fileName, $statusCode, $cache = true)
|
||||
function processRequestFile($baseLocation, $location, $fileName, $statusCode, $cacheable)
|
||||
{
|
||||
if($statusCode == 0)
|
||||
{
|
||||
if(is_readable($fileName))
|
||||
{
|
||||
$statusCode = 200;
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode);
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode, $cacheable);
|
||||
} else {
|
||||
if($this->toolbox->isFileLocation($location) && is_dir($this->getContentDirectory("$location/")))
|
||||
{
|
||||
$statusCode = 301;
|
||||
$this->sendStatus($statusCode, "Location: http://".$this->config->get("serverName")."$baseLocation$location/");
|
||||
$serverName = $this->config->get("serverName");
|
||||
$this->sendStatus($statusCode, "Location: http://$serverName$baseLocation$location/");
|
||||
} else {
|
||||
$statusCode = 404;
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode);
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode, $cacheable);
|
||||
}
|
||||
}
|
||||
} else if($statusCode >= 400) {
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode);
|
||||
}
|
||||
if(is_object($this->page))
|
||||
{
|
||||
$statusCode = $this->sendPage($statusCode, $cache);
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $statusCode, $cacheable);
|
||||
}
|
||||
if(is_object($this->page)) $statusCode = $this->sendPage();
|
||||
if(defined("DEBUG") && DEBUG>=1) echo "Yellow::processRequestFile base:$baseLocation file:$fileName<br>\n";
|
||||
return $statusCode;
|
||||
}
|
||||
|
||||
// Read page
|
||||
function readPage($baseLocation, $location, $fileName, $statusCode)
|
||||
// Process request with error
|
||||
function processRequestError($baseLocation, $location, $fileName)
|
||||
{
|
||||
if($statusCode >= 400) $fileName = strreplaceu("(.*)", $statusCode, $this->config->get("configDir").$this->config->get("errorPageFile"));
|
||||
$fileName = $this->readPage($baseLocation, $location, $fileName, $this->page->statusCode, false);
|
||||
$statusCode = $this->sendPage();
|
||||
if(defined("DEBUG") && DEBUG>=1) echo "Yellow::processRequestError base:$baseLocation file:$fileName<br>\n";
|
||||
return $statusCode;
|
||||
}
|
||||
|
||||
// Read page for response
|
||||
function readPage($baseLocation, $location, $fileName, $statusCode, $cacheable)
|
||||
{
|
||||
if($statusCode >= 400)
|
||||
{
|
||||
$fileName = $this->config->get("configDir").$this->config->get("errorPageFile");
|
||||
$fileName = strreplaceu("(.*)", $statusCode, $fileName);
|
||||
$cacheable = false;
|
||||
}
|
||||
$fileHandle = @fopen($fileName, "r");
|
||||
if($fileHandle)
|
||||
{
|
||||
$fileData = fread($fileHandle, filesize($fileName));
|
||||
fclose($fileHandle);
|
||||
} else {
|
||||
die("Server problem: Can't read file '$fileName'!");
|
||||
}
|
||||
$this->pages = new Yellow_Pages($baseLocation, $this->toolbox, $this->config, $this->plugins);
|
||||
$this->page = new Yellow_Page($baseLocation, $location, $fileName, $fileData, $this->pages, true);
|
||||
if(is_object($this->page) && $this->page->isError())
|
||||
{
|
||||
$text = $this->page->get("pageError");
|
||||
$this->page = new Yellow_Page($baseLocation, $location, $this, $fileName, $fileData, $statusCode, $cacheable);
|
||||
$this->page->error($statusCode, $text);
|
||||
} else {
|
||||
$this->pages = new Yellow_Pages($baseLocation, $this);
|
||||
$this->page = new Yellow_Page($baseLocation, $location, $this, $fileName, $fileData, $statusCode, $cacheable);
|
||||
}
|
||||
$this->page->parseContent();
|
||||
$this->text->setLanguage($this->page->get("language"));
|
||||
return $fileName;
|
||||
}
|
||||
|
||||
// Send page response
|
||||
function sendPage($statusCode, $cache)
|
||||
function sendPage()
|
||||
{
|
||||
$fileNameStyle = $this->config->get("styleDir").$this->page->get("style").".css";
|
||||
if(!is_file($fileNameStyle)) die("Style '".$this->page->get("style")."' does not exist!");
|
||||
$this->template($this->page->get("template"));
|
||||
$fileNameTemplate = $this->config->get("templateDir").$this->page->get("template").".php";
|
||||
if(!is_file($fileNameTemplate)) die("Template '".$this->page->get("template")."' does not exist!");
|
||||
global $yellow;
|
||||
require($fileNameTemplate);
|
||||
$fileNameStyle = $this->config->get("styleDir").$this->page->get("style").".css";
|
||||
if(!is_file($fileNameStyle))
|
||||
{
|
||||
$this->page->error(500, "Style '".$this->page->get("style")."' does not exist!");
|
||||
}
|
||||
if(!$this->plugins->isExisting($this->page->get("parser")))
|
||||
{
|
||||
$this->page->error(500, "Parser '".$this->page->get("parser")."' does not exist!");
|
||||
}
|
||||
|
||||
$pageHeaders["last-modified"] = $this->page->getModified(true);
|
||||
$pageHeaders["content-type"] = "text/html; charset=UTF-8";
|
||||
$pageHeader["content-type"] = "text/html; charset=UTF-8";
|
||||
$pageHeader["last-modified"] = $this->page->getModified(true);
|
||||
foreach(headers_list() as $header)
|
||||
{
|
||||
$tokens = explode(':', $header, 2);
|
||||
$key = strtoloweru($tokens[0]);
|
||||
if(!is_null($pageHeaders[$key]))
|
||||
{
|
||||
$pageHeaders[$key] = trim($tokens[1]);
|
||||
header_remove($tokens[0]);
|
||||
}
|
||||
if(!is_null($pageHeader[$key])) $pageHeader[$key] = trim($tokens[1]);
|
||||
}
|
||||
if($statusCode==200 && $cache && isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) &&
|
||||
$_SERVER["HTTP_IF_MODIFIED_SINCE"]==$pageHeaders["last-modified"])
|
||||
$statusCode = $this->page->statusCode;
|
||||
if($statusCode==200 && $this->page->IsCacheable() && $this->toolbox->IsFileNotModified($pageHeader["last-modified"]))
|
||||
{
|
||||
$statusCode = 304;
|
||||
$this->sendStatus($statusCode);
|
||||
header_remove();
|
||||
header($this->toolbox->getHttpStatusFormatted($statusCode));
|
||||
} else {
|
||||
header("Content-Type: ".$pageHeaders["content-type"]);
|
||||
if($cache)
|
||||
{
|
||||
header("Last-Modified:". $pageHeaders["last-modified"]);
|
||||
} else {
|
||||
header("Cache-Control: no-cache");
|
||||
header("Pragma: no-cache");
|
||||
header("Expires: 0");
|
||||
}
|
||||
header($this->toolbox->getHttpStatusFormatted($statusCode));
|
||||
header("Content-Type: ".$pageHeader["content-type"]);
|
||||
header("Last-Modified: ".$pageHeader["last-modified"]);
|
||||
if(!$this->page->IsCacheable()) header("Cache-Control: no-cache, must-revalidate");
|
||||
}
|
||||
if(defined("DEBUG") && DEBUG>=1)
|
||||
{
|
||||
$cacheable = intval($this->page->IsCacheable());
|
||||
echo "Yellow::sendPage template:$fileNameTemplate style:$fileNameStyle cacheable:$cacheable<br>\n";
|
||||
}
|
||||
if(defined("DEBUG") && DEBUG>=1) echo "Yellow::sendFile template:$fileNameTemplate style:$fileNameStyle<br>\n";
|
||||
return $statusCode;
|
||||
}
|
||||
|
||||
|
@ -176,15 +201,32 @@ class Yellow
|
|||
header($this->toolbox->getHttpStatusFormatted($statusCode));
|
||||
if(!empty($text)) header($text);
|
||||
}
|
||||
|
||||
|
||||
// Execute a template
|
||||
function template($name)
|
||||
{
|
||||
$fileNameTemplate = $this->config->get("templateDir")."$name.php";
|
||||
if(is_file($fileNameTemplate))
|
||||
{
|
||||
global $yellow;
|
||||
require($fileNameTemplate);
|
||||
} else {
|
||||
$this->page->error(500, "Template '$name' does not exist!");
|
||||
}
|
||||
}
|
||||
|
||||
// Execute a template snippet
|
||||
function snippet($name, $args = NULL)
|
||||
{
|
||||
$this->page->args = func_get_args();
|
||||
$fileNameSnippet = $this->config->get("snippetDir")."$name.php";
|
||||
if(!is_file($fileNameSnippet)) die("Snippet '$name' does not exist!");
|
||||
global $yellow;
|
||||
require($fileNameSnippet);
|
||||
if(is_file($fileNameSnippet))
|
||||
{
|
||||
global $yellow;
|
||||
require($fileNameSnippet);
|
||||
} else {
|
||||
$this->page->error(500, "Snippet '$name' does not exist!");
|
||||
}
|
||||
}
|
||||
|
||||
// Return template snippet arguments
|
||||
|
@ -193,7 +235,7 @@ class Yellow
|
|||
return $this->page->args;
|
||||
}
|
||||
|
||||
// Return extra HTML header lines generated from plugins
|
||||
// Return extra HTML header lines
|
||||
function getHeaderExtra()
|
||||
{
|
||||
$header = "";
|
||||
|
@ -231,9 +273,13 @@ class Yellow
|
|||
function plugin($name, $args = NULL)
|
||||
{
|
||||
$statusCode = 0;
|
||||
if(!$this->plugins->isExisting($name)) die("Pluggin '$name' does not exist!");
|
||||
$plugin = $this->plugins->plugins[$name];
|
||||
if(method_exists($plugin["obj"], "onCommand")) $statusCode = $plugin["obj"]->onCommand(func_get_args());
|
||||
if($this->plugins->isExisting($name))
|
||||
{
|
||||
$plugin = $this->plugins->plugins[$name];
|
||||
if(method_exists($plugin["obj"], "onCommand")) $statusCode = $plugin["obj"]->onCommand(func_get_args());
|
||||
} else {
|
||||
$this->page->error(500, "Pluggin '$name' does not exist!");
|
||||
}
|
||||
return $statusCode;
|
||||
}
|
||||
|
||||
|
@ -249,83 +295,94 @@ class Yellow_Page
|
|||
{
|
||||
var $baseLocation; //base location
|
||||
var $location; //page location
|
||||
var $yellow; //access to API
|
||||
var $fileName; //content file name
|
||||
var $parser; //content parser
|
||||
var $metaData; //meta data of page
|
||||
var $rawData; //raw data of page
|
||||
var $rawTextOffsetBytes; //raw text of page
|
||||
var $metaData; //meta data of page
|
||||
var $metaDataOffsetBytes; //meta data offset
|
||||
var $parser; //parser for page content
|
||||
var $args; //arguments for template snippet
|
||||
var $pages; //access to file system
|
||||
var $active; //page is active? (boolean)
|
||||
var $hidden; //page is hidden in navigation? (boolean)
|
||||
var $statusCode; //status code of page
|
||||
var $error; //page error happened? (boolean)
|
||||
var $active; //page is active location? (boolean)
|
||||
var $visible; //page is visible location? (boolean)
|
||||
var $cacheable; //page is cacheable? (boolean)
|
||||
|
||||
function __construct($baseLocation, $location, $fileName, $rawData, $pages, $parseContent = false)
|
||||
function __construct($baseLocation, $location, $yellow, $fileName, $rawData, $statusCode, $cacheable)
|
||||
{
|
||||
$this->baseLocation = $baseLocation;
|
||||
$this->location = $location;
|
||||
$this->yellow = $yellow;
|
||||
$this->fileName = $fileName;
|
||||
$this->setRawData($rawData, $pages->toolbox, $pages->config);
|
||||
$this->pages = $pages;
|
||||
$this->active = $pages->toolbox->isActiveLocation($baseLocation, $location);
|
||||
$this->hidden = $pages->toolbox->isHiddenLocation($baseLocation, $location, $fileName, $pages->config->get("contentDir"));
|
||||
if($parseContent) $this->parseContent();
|
||||
$this->rawData = $rawData;
|
||||
$this->parseMeta();
|
||||
$this->statusCode = $statusCode;
|
||||
$this->active = $yellow->toolbox->isActiveLocation($baseLocation, $location);
|
||||
$this->visible = $yellow->toolbox->isVisibleLocation($baseLocation, $location, $fileName, $yellow->config->get("contentDir"));
|
||||
$this->cacheable = $cacheable;
|
||||
}
|
||||
|
||||
// Set page raw data
|
||||
function setRawData($rawData, $toolbox, $config)
|
||||
// Parse page meta data
|
||||
function parseMeta()
|
||||
{
|
||||
$this->metaData = array();
|
||||
$this->rawData = $rawData;
|
||||
$this->rawTextOffsetBytes = 0;
|
||||
$this->set("title", $toolbox->createTextTitle($this->location));
|
||||
$this->set("author", $config->get("author"));
|
||||
$this->set("language", $config->get("language"));
|
||||
$this->set("parser", $config->get("parser"));
|
||||
$this->set("template", $config->get("template"));
|
||||
$this->set("style", $config->get("style"));
|
||||
$this->set("title", $this->yellow->toolbox->createTextTitle($this->location));
|
||||
$this->set("author", $this->yellow->config->get("author"));
|
||||
$this->set("language", $this->yellow->config->get("language"));
|
||||
$this->set("template", $this->yellow->config->get("template"));
|
||||
$this->set("style", $this->yellow->config->get("style"));
|
||||
$this->set("parser", $this->yellow->config->get("parser"));
|
||||
|
||||
if(preg_match("/^(\-\-\-[\r\n]+)(.+?)([\r\n]+\-\-\-[\r\n]+)/s", $rawData, $parsed))
|
||||
if(preg_match("/^(\-\-\-[\r\n]+)(.+?)([\r\n]+\-\-\-[\r\n]+)/s", $this->rawData, $parsed))
|
||||
{
|
||||
$this->rawTextOffsetBytes = strlenb($parsed[0]);
|
||||
$this->metaDataOffsetBytes = strlenb($parsed[0]);
|
||||
preg_match_all("/([^\:\r\n]+)\s*\:\s*([^\r\n]+)/s", $parsed[2], $matches, PREG_SET_ORDER);
|
||||
foreach($matches as $match) $this->set(strtoloweru($match[1]), $match[2]);
|
||||
} else if(preg_match("/^([^\r\n]+)([\r\n]+=+[\r\n]+)/", $rawData, $parsed)) {
|
||||
$this->rawTextOffsetBytes = strlenb($parsed[0]);
|
||||
} else if(preg_match("/^([^\r\n]+)([\r\n]+=+[\r\n]+)/", $this->rawData, $parsed)) {
|
||||
$this->metaDataOffsetBytes = strlenb($parsed[0]);
|
||||
$this->set("title", $parsed[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse page content on demand
|
||||
// Parse page content
|
||||
function parseContent()
|
||||
{
|
||||
if(empty($this->parser->html))
|
||||
if(!is_object($this->parser))
|
||||
{
|
||||
if(defined("DEBUG") && DEBUG>=2) echo "Yellow_Page::parseContent location:".$this->location."<br/>\n";
|
||||
$text = $this->getContentRawText();
|
||||
foreach($this->pages->plugins->plugins as $key=>$value)
|
||||
$text = substrb($this->rawData, $this->metaDataOffsetBytes);
|
||||
if($this->yellow->plugins->isExisting($this->get("parser")))
|
||||
{
|
||||
if(method_exists($value["obj"], "onParseBefore")) $text = $value["obj"]->onParseBefore($text, $statusCode);
|
||||
$this->parser = $this->yellow->plugins->plugins[$this->get("parser")]["obj"];
|
||||
$text = $this->parser->parse($text);
|
||||
}
|
||||
if(!$this->pages->plugins->isExisting($this->get("parser"))) die("Parser '".$this->get("parser")."' does not exist!");
|
||||
$this->parser = $this->pages->plugins->plugins[$this->get("parser")]["obj"];
|
||||
$text = $this->parser->parse($text);
|
||||
foreach($this->pages->plugins->plugins as $key=>$value)
|
||||
foreach($this->yellow->plugins->plugins as $key=>$value)
|
||||
{
|
||||
if(method_exists($value["obj"], "onParseAfter")) $text = $value["obj"]->onParseAfter($text, $statusCode);
|
||||
if(method_exists($value["obj"], "onParseContent")) $text = $value["obj"]->onParseContent($text, $this->statusCode);
|
||||
}
|
||||
$this->setContent($text);
|
||||
|
||||
if(!$this->isExisting("description"))
|
||||
{
|
||||
$this->set("description", $this->pages->toolbox->createTextDescription($this->getContent(), 150));
|
||||
$this->set("description", $this->yellow->toolbox->createTextDescription($this->getContent(), 150));
|
||||
}
|
||||
if(!$this->isExisting("keywords"))
|
||||
{
|
||||
$this->set("keywords", $this->pages->toolbox->createTextKeywords($this->get("title"), 10));
|
||||
$this->set("keywords", $this->yellow->toolbox->createTextKeywords($this->get("title"), 10));
|
||||
}
|
||||
if(defined("DEBUG") && DEBUG>=2) echo "Yellow_Page::parseContent location:".$this->location."<br/>\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Respond with error page
|
||||
function error($statusCode, $text = "")
|
||||
{
|
||||
if(!$this->isError())
|
||||
{
|
||||
$this->error = true;
|
||||
$this->statusCode = $statusCode;
|
||||
if(!empty($text)) $this->set("pageError", $text);
|
||||
}
|
||||
}
|
||||
|
||||
// Set page meta data
|
||||
function set($key, $value)
|
||||
{
|
||||
|
@ -363,12 +420,6 @@ class Yellow_Page
|
|||
return $this->parser->html;
|
||||
}
|
||||
|
||||
// Return page content, raw text
|
||||
function getContentRawText()
|
||||
{
|
||||
return substrb($this->rawData, $this->rawTextOffsetBytes);
|
||||
}
|
||||
|
||||
// Return absolute page location
|
||||
function getLocation()
|
||||
{
|
||||
|
@ -380,34 +431,40 @@ class Yellow_Page
|
|||
{
|
||||
$modified = is_readable($this->fileName) ? filemtime($this->fileName) : "";
|
||||
if($this->IsExisting("modified")) $modified = strtotime($this->get("modified"));
|
||||
return $httpFormat ? $this->pages->toolbox->getHttpTimeFormatted($modified) : $modified;
|
||||
return $httpFormat ? $this->yellow->toolbox->getHttpTimeFormatted($modified) : $modified;
|
||||
}
|
||||
|
||||
// Return child pages relative to current page
|
||||
function getChildren($hidden = false)
|
||||
function getChildren($showHidden = false)
|
||||
{
|
||||
return $this->pages->findChildren($this->location, $hidden);
|
||||
return $this->yellow->pages->findChildren($this->location, $showHidden);
|
||||
}
|
||||
|
||||
// Return pages on the same level as current page
|
||||
function getSiblings($hidden = false)
|
||||
function getSiblings($showHidden = false)
|
||||
{
|
||||
$parentLocation = $this->pages->getParentLocation($this->location);
|
||||
return $this->pages->findChildren($parentLocation, $hidden);
|
||||
$parentLocation = $this->yellow->pages->getParentLocation($this->location);
|
||||
return $this->yellow->pages->findChildren($parentLocation, $showHidden);
|
||||
}
|
||||
|
||||
// Return parent page relative to current page
|
||||
function getParent()
|
||||
{
|
||||
$parentLocation = $this->pages->getParentLocation($this->location);
|
||||
return $this->pages->findPage($parentLocation);
|
||||
$parentLocation = $this->yellow->pages->getParentLocation($this->location);
|
||||
return $this->yellow->pages->findPage($parentLocation);
|
||||
}
|
||||
|
||||
|
||||
// Check if meta data exists
|
||||
function isExisting($key)
|
||||
{
|
||||
return !is_null($this->metaData[$key]);
|
||||
}
|
||||
|
||||
// Check if page error happened
|
||||
function isError()
|
||||
{
|
||||
return $this->error;
|
||||
}
|
||||
|
||||
// Check if page is within current HTTP request
|
||||
function isActive()
|
||||
|
@ -415,10 +472,16 @@ class Yellow_Page
|
|||
return $this->active;
|
||||
}
|
||||
|
||||
// Check if page is hidden in navigation
|
||||
function isHidden()
|
||||
// Check if page is visible in navigation
|
||||
function isVisible()
|
||||
{
|
||||
return $this->hidden;
|
||||
return $this->visible;
|
||||
}
|
||||
|
||||
// Check if page is cacheable
|
||||
function isCacheable()
|
||||
{
|
||||
return $this->cacheable;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -485,7 +548,7 @@ class Yellow_PageCollection extends ArrayObject
|
|||
// Return current page number in pagination
|
||||
function getPaginationPage()
|
||||
{
|
||||
return $this->$paginationPage;
|
||||
return $this->paginationPage;
|
||||
}
|
||||
|
||||
// Return highest page number in pagination
|
||||
|
@ -541,34 +604,27 @@ class Yellow_Pages
|
|||
{
|
||||
var $baseLocation; //base location
|
||||
var $pages; //scanned pages
|
||||
var $toolbox; //access to toolbox
|
||||
var $config; //access to configuration
|
||||
var $plugins; //access to plugins
|
||||
var $yellow; //access to API
|
||||
|
||||
function __construct($baseLocation, $toolbox, $config, $plugins)
|
||||
function __construct($baseLocation, $yellow)
|
||||
{
|
||||
$this->baseLocation = $baseLocation;
|
||||
$this->pages = array();
|
||||
$this->toolbox = $toolbox;
|
||||
$this->config = $config;
|
||||
$this->plugins = $plugins;
|
||||
$this->yellow = $yellow;
|
||||
}
|
||||
|
||||
// Return top-level navigation pages
|
||||
function root($hidden = false)
|
||||
function root($showHidden = false)
|
||||
{
|
||||
return $this->findChildren("", $hidden);
|
||||
return $this->findChildren("", $showHidden);
|
||||
}
|
||||
|
||||
// Return child pages for a location
|
||||
function findChildren($location, $hidden = false)
|
||||
function findChildren($location, $showHidden = false)
|
||||
{
|
||||
$pages = new Yellow_PageCollection(array(), $this->baseLocation, $location, $this->toolbox);
|
||||
$pages = new Yellow_PageCollection(array(), $this->baseLocation, $location, $this->yellow->toolbox);
|
||||
$this->scanChildren($location);
|
||||
foreach($this->pages[$location] as $page)
|
||||
{
|
||||
if($hidden || !$page->isHidden()) $pages->append($page);
|
||||
}
|
||||
foreach($this->pages[$location] as $page) if($page->isVisible() || $showHidden) $pages->append($page);
|
||||
return $pages;
|
||||
}
|
||||
|
||||
|
@ -577,10 +633,7 @@ class Yellow_Pages
|
|||
{
|
||||
$parentLocation = $this->getParentLocation($location);
|
||||
$this->scanChildren($parentLocation);
|
||||
foreach($this->pages[$parentLocation] as $page)
|
||||
{
|
||||
if($this->baseLocation.$location == $page->getLocation()) return $page;
|
||||
}
|
||||
foreach($this->pages[$parentLocation] as $page) if($page->getLocation() == $this->baseLocation.$location) return $page;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -591,28 +644,28 @@ class Yellow_Pages
|
|||
{
|
||||
if(defined("DEBUG") && DEBUG>=2) echo "Yellow_Pages::scanChildren location:$location<br/>\n";
|
||||
$this->pages[$location] = array();
|
||||
$path = $this->config->get("contentDir");
|
||||
$path = $this->yellow->config->get("contentDir");
|
||||
if(!empty($location))
|
||||
{
|
||||
$path = $this->toolbox->findFileFromLocation($location,
|
||||
$this->config->get("contentDir"), $this->config->get("contentHomeDir"), "", "");
|
||||
$path = $this->yellow->toolbox->findFileFromLocation($location,
|
||||
$this->yellow->config->get("contentDir"), $this->yellow->config->get("contentHomeDir"), "", "");
|
||||
}
|
||||
$fileNames = array();
|
||||
foreach($this->toolbox->getDirectoryEntries($path, "/.*/", true) as $entry)
|
||||
foreach($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true) as $entry)
|
||||
{
|
||||
array_push($fileNames, $path.$entry."/".$this->config->get("contentDefaultFile"));
|
||||
array_push($fileNames, $path.$entry."/".$this->yellow->config->get("contentDefaultFile"));
|
||||
}
|
||||
$fileRegex = "/.*\\".$this->config->get("contentExtension")."/";
|
||||
foreach($this->toolbox->getDirectoryEntries($path, $fileRegex, true, false) as $entry)
|
||||
$fileRegex = "/.*\\".$this->yellow->config->get("contentExtension")."/";
|
||||
foreach($this->yellow->toolbox->getDirectoryEntries($path, $fileRegex, true, false) as $entry)
|
||||
{
|
||||
if($entry == $this->config->get("contentDefaultFile")) continue;
|
||||
if($entry == $this->yellow->config->get("contentDefaultFile")) continue;
|
||||
array_push($fileNames, $path.$entry);
|
||||
}
|
||||
foreach($fileNames as $fileName)
|
||||
{
|
||||
$childLocation = $this->toolbox->findLocationFromFile($fileName,
|
||||
$this->config->get("contentDir"), $this->config->get("contentHomeDir"),
|
||||
$this->config->get("contentDefaultFile"), $this->config->get("contentExtension"));
|
||||
$childLocation = $this->yellow->toolbox->findLocationFromFile($fileName,
|
||||
$this->yellow->config->get("contentDir"), $this->yellow->config->get("contentHomeDir"),
|
||||
$this->yellow->config->get("contentDefaultFile"), $this->yellow->config->get("contentExtension"));
|
||||
$fileHandle = @fopen($fileName, "r");
|
||||
if($fileHandle)
|
||||
{
|
||||
|
@ -621,7 +674,7 @@ class Yellow_Pages
|
|||
} else {
|
||||
$fileData = "";
|
||||
}
|
||||
$page = new Yellow_Page($this->baseLocation, $childLocation, $fileName, $fileData, $this);
|
||||
$page = new Yellow_Page($this->baseLocation, $childLocation, $this->yellow, $fileName, $fileData, 0, false);
|
||||
array_push($this->pages[$location], $page);
|
||||
}
|
||||
}
|
||||
|
@ -631,10 +684,7 @@ class Yellow_Pages
|
|||
function getParentLocation($location)
|
||||
{
|
||||
$parentLocation = "";
|
||||
if(preg_match("/^(.*\/)(.+?)$/", $location, $matches))
|
||||
{
|
||||
$parentLocation = $matches[1]!="/" ? $matches[1] : "";
|
||||
}
|
||||
if(preg_match("/^(.*\/)(.+?)$/", $location, $matches)) $parentLocation = $matches[1]!="/" ? $matches[1] : "";
|
||||
return $parentLocation;
|
||||
}
|
||||
}
|
||||
|
@ -733,6 +783,12 @@ class Yellow_Toolbox
|
|||
return substru($location, -1, 1) != "/";
|
||||
}
|
||||
|
||||
// Check if file has been unmodified since last HTTP request
|
||||
static function IsFileNotModified($lastModified)
|
||||
{
|
||||
return isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && $_SERVER["HTTP_IF_MODIFIED_SINCE"]==$lastModified;
|
||||
}
|
||||
|
||||
// Check if location is within current HTTP request
|
||||
static function isActiveLocation($baseLocation, $location)
|
||||
{
|
||||
|
@ -746,23 +802,23 @@ class Yellow_Toolbox
|
|||
return $active;
|
||||
}
|
||||
|
||||
// Check if location is hidden in navigation
|
||||
static function isHiddenLocation($baseLocation, $location, $fileName, $pathBase)
|
||||
// Check if location is visible in navigation
|
||||
static function isVisibleLocation($baseLocation, $location, $fileName, $pathBase)
|
||||
{
|
||||
$hidden = false;
|
||||
$visible = true;
|
||||
if(substru($fileName, 0, strlenu($pathBase)) == $pathBase) $fileName = substru($fileName, strlenu($pathBase));
|
||||
$tokens = explode('/', $fileName);
|
||||
for($i=0; $i<count($tokens)-1; ++$i)
|
||||
{
|
||||
if(!preg_match("/^[\d\-\.]+(.*)$/", $tokens[$i]))
|
||||
{
|
||||
$hidden = true;
|
||||
$visible = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $hidden;
|
||||
return $visible;
|
||||
}
|
||||
|
||||
|
||||
// Find file path from location
|
||||
static function findFileFromLocation($location, $pathBase, $pathHome, $fileDefault, $fileExtension)
|
||||
{
|
||||
|
@ -777,7 +833,6 @@ class Yellow_Toolbox
|
|||
$path .= empty($entries) ? "$tokens[$i]/" : "$entries[0]/";
|
||||
}
|
||||
if($path == $pathBase.$pathHome) $duplicate = true;
|
||||
|
||||
} else {
|
||||
$i = 1;
|
||||
$path .= $pathHome;
|
||||
|
@ -826,7 +881,7 @@ class Yellow_Toolbox
|
|||
case 404: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Not found"; break;
|
||||
case 424: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Does not exist"; break;
|
||||
case 500: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Server error"; break;
|
||||
default: die("Unknown HTTP status $statusCode!");
|
||||
default: $text = "$_SERVER[SERVER_PROTOCOL] $statusCode Unknown status";
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
@ -1124,13 +1179,19 @@ class Yellow_Text
|
|||
$this->language = $language;
|
||||
}
|
||||
|
||||
// Set text string
|
||||
// Set text string for specific language
|
||||
function setLanguageText($language, $key, $value)
|
||||
{
|
||||
if(is_null($this->text[$language])) $this->text[$language] = array();
|
||||
$this->text[$language][$key] = $value;
|
||||
}
|
||||
|
||||
// Return text string for specific language
|
||||
function getLanguageText($language, $key)
|
||||
{
|
||||
return ($this->isLanguageText($language, $key)) ? $this->text[$language][$key] : "[$key]";
|
||||
}
|
||||
|
||||
// Return text string
|
||||
function get($key)
|
||||
{
|
||||
|
@ -1163,6 +1224,12 @@ class Yellow_Text
|
|||
return $text;
|
||||
}
|
||||
|
||||
// Check if text string for specific language exists
|
||||
function isLanguageText($language, $key)
|
||||
{
|
||||
return !is_null($this->text[$language]) && !is_null($this->text[$language][$key]);
|
||||
}
|
||||
|
||||
// Check if text string exists
|
||||
function isExisting($key)
|
||||
{
|
||||
|
@ -1197,10 +1264,7 @@ class Yellow_Plugins
|
|||
{
|
||||
$this->plugins[$key]["obj"] = new $value["class"];
|
||||
if(defined("DEBUG") && DEBUG>=2) echo "Yellow_Plugins::load class:$value[class] $value[version]<br/>\n";
|
||||
if(method_exists($this->plugins[$key]["obj"], "initPlugin"))
|
||||
{
|
||||
$this->plugins[$key]["obj"]->initPlugin($yellow);
|
||||
}
|
||||
if(method_exists($this->plugins[$key]["obj"], "initPlugin")) $this->plugins[$key]["obj"]->initPlugin($yellow);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
// Markdown parser core plugin
|
||||
class Yellow_Markdown
|
||||
{
|
||||
const Version = "0.1.3";
|
||||
const Version = "0.1.4";
|
||||
var $markdown; //markdown parser
|
||||
var $html; //generated HTML
|
||||
|
||||
|
@ -36,8 +36,8 @@ class Yellow_MarkdownExtraParser extends MarkdownExtra_Parser
|
|||
// Transform text
|
||||
function transform($text)
|
||||
{
|
||||
$baseLocation = $this->yellow->config->get("baseLocation");
|
||||
$text = preg_replace("/@baseLocation/i", $baseLocation, $text);
|
||||
$text = preg_replace("/@pageEdit/i", $this->yellow->config->get("baseLocation").$this->yellow->config->get("webinterfaceLocation"), $text);
|
||||
$text = preg_replace("/@pageError/i", $this->yellow->page->get("pageError"), $text);
|
||||
return parent::transform($text);
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,6 @@ class Yellow_MarkdownExtraParser extends MarkdownExtra_Parser
|
|||
if(!empty($title)) $result .= " title=\"".$this->encodeAttribute($title)."\"";
|
||||
$result .= $attr;
|
||||
$result .= $this->empty_element_suffix;
|
||||
|
||||
return $this->hashPart($result);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,12 +5,13 @@
|
|||
// Web interface core plugin
|
||||
class Yellow_Webinterface
|
||||
{
|
||||
const Version = "0.1.2";
|
||||
var $yellow; //access to API
|
||||
var $users; //web interface users
|
||||
var $activeLocation; //web interface location? (boolean)
|
||||
var $activeUserFail; //web interface login failed? (boolean)
|
||||
var $activeUserEmail; //web interface user currently logged in
|
||||
const Version = "0.1.3";
|
||||
var $yellow; //access to API
|
||||
var $users; //web interface users
|
||||
var $activeLocation; //web interface location? (boolean)
|
||||
var $activeUserFail; //web interface login failed? (boolean)
|
||||
var $activeUserEmail; //web interface user currently logged in
|
||||
var $rawDataOriginal; //raw data of page in case of errors
|
||||
|
||||
// Initialise plugin
|
||||
function initPlugin($yellow)
|
||||
|
@ -45,6 +46,31 @@ class Yellow_Webinterface
|
|||
return $statusCode;
|
||||
}
|
||||
|
||||
// Handle web content parsing
|
||||
function onParseContent($text, $statusCode)
|
||||
{
|
||||
if($this->isWebinterfaceLocation() && $this->isUser())
|
||||
{
|
||||
$baseLocation = $this->yellow->config->get("baseLocation");
|
||||
$webinterfaceLocation = trim($this->yellow->config->get("webinterfaceLocation"), '/');
|
||||
$text = preg_replace("#<a(.*?)href=\"$baseLocation/(?!$webinterfaceLocation)(.*?)\"(.*?)>#",
|
||||
"<a$1href=\"$baseLocation/$webinterfaceLocation/$2\"$3>", $text);
|
||||
switch($statusCode)
|
||||
{
|
||||
case 200: $this->rawDataOriginal = $this->yellow->page->rawData; break;
|
||||
case 424: $language = $this->isUser() ? $this->users->getLanguage($this->activeUserEmail) : $this->yellow->page->get("language");
|
||||
$this->yellow->page->rawData = "---\r\n";
|
||||
$this->yellow->page->rawData .= "Title: ".$this->yellow->text->getLanguageText($language, "webinterface424Title")."\r\n";
|
||||
$this->yellow->page->rawData .= "Author: ".$this->users->getName($this->activeUserEmail)."\r\n";
|
||||
$this->yellow->page->rawData .= "---\r\n";
|
||||
$this->yellow->page->rawData .= $this->yellow->text->getLanguageText($language, "webinterface424Text");
|
||||
break;
|
||||
case 500: $this->yellow->page->rawData = $this->rawDataOriginal; break;
|
||||
}
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Handle extra HTML header lines
|
||||
function onHeaderExtra()
|
||||
{
|
||||
|
@ -71,36 +97,6 @@ class Yellow_Webinterface
|
|||
return $header;
|
||||
}
|
||||
|
||||
// Handle page before parser
|
||||
function onParseBefore($text, $statusCode)
|
||||
{
|
||||
if($this->isWebinterfaceLocation() && $this->isUser())
|
||||
{
|
||||
if($statusCode == 424)
|
||||
{
|
||||
$this->yellow->page->rawData = "---\r\n";
|
||||
$this->yellow->page->rawData .= "Title: ".$this->yellow->text->get("webinterface424Title")."\r\n";
|
||||
$this->yellow->page->rawData .= "Author: ".$this->users->getName($this->activeUserEmail)."\r\n";
|
||||
$this->yellow->page->rawData .= "---\r\n";
|
||||
$this->yellow->page->rawData .= $this->yellow->text->get("webinterface424Text");
|
||||
}
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Handle page after parser
|
||||
function onParseAfter($text, $statusCode)
|
||||
{
|
||||
if($this->isWebinterfaceLocation() && $this->isUser())
|
||||
{
|
||||
$baseLocation = $this->yellow->config->get("baseLocation");
|
||||
$webinterfaceLocation = trim($this->yellow->config->get("webinterfaceLocation"), '/');
|
||||
$text = preg_replace("#<a(.*?)href=\"$baseLocation/(?!$webinterfaceLocation)(.*?)\"(.*?)>#",
|
||||
"<a$1href=\"$baseLocation/$webinterfaceLocation/$2\"$3>", $text);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Process request for an action
|
||||
function processRequestAction($baseLocation, $location, $fileName)
|
||||
{
|
||||
|
@ -116,7 +112,7 @@ class Yellow_Webinterface
|
|||
fwrite($fileHandle, $_POST["rawdata"]);
|
||||
fclose($fileHandle);
|
||||
} else {
|
||||
die("Configuration problem: Can't write page '$fileName'!");
|
||||
die("Server error: Can't save page '$fileName'!");
|
||||
}
|
||||
$statusCode = 303;
|
||||
$this->yellow->sendStatus($statusCode, "Location: http://$serverName$baseLocation$location");
|
||||
|
@ -284,7 +280,7 @@ class Yellow_WebinterfaceUsers
|
|||
{
|
||||
$salt = hash("sha256", uniqid(mt_rand(), true));
|
||||
$text = $email.";".$salt.";".hash("sha256", $salt.$this->users[$email]["session"]);
|
||||
setcookie($cookieName, $text, time()+60*60*24*30*365*10, "/") || die("Server problem: Can't create '$cookieName' cookie!");
|
||||
setcookie($cookieName, $text, time()+60*60*24*30*365*10, "/");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue