Better location handling (snowman remix)

This commit is contained in:
markseu 2014-01-29 23:35:44 +01:00
parent cbb2e8ce60
commit aa395003ac
3 changed files with 101 additions and 112 deletions

View file

@ -1,20 +1,21 @@
<?php
// Copyright (c) 2013 Datenstrom, http://datenstrom.se
// Copyright (c) 2013-2014 Datenstrom, http://datenstrom.se
// This file may be used and distributed under the terms of the public license.
// Command line core plugin
class YellowCommandline
{
const Version = "0.2.2";
const Version = "0.2.3";
var $yellow; //access to API
// Initialise plugin
function onLoad($yellow)
{
$this->yellow = $yellow;
$this->yellow->config->setDefault("commandBuildDefaultFile", "index.html");
$this->yellow->config->setDefault("commandBuildCustomMediaExtension", ".txt");
$this->yellow->config->setDefault("commandBuildCustomErrorFile", "error404.html");
$this->yellow->config->setDefault("commandlineDefaultFile", "index.html");
$this->yellow->config->setDefault("commandlineMediaFile", "(.*).txt");
$this->yellow->config->setDefault("commandlineSystemErrorFile", "error404.html");
$this->yellow->config->setDefault("commandlineSystemServerFile", ".htaccess");
}
// Handle command help
@ -55,22 +56,20 @@ class YellowCommandline
return 200;
}
// Build website
// Build static pages
function buildCommand($args)
{
$statusCode = 0;
list($dummy, $command, $path, $location) = $args;
if(!empty($path) && $path!="/")
if(!empty($path) && $path!="/" && (empty($location) || $location[0]=='/'))
{
if($this->yellow->config->isExisting("serverName"))
{
$serverName = $this->yellow->config->get("serverName");
$serverBase = $this->yellow->config->get("serverBase");
list($statusCode, $content, $media, $system, $error) = $this->buildStatic($serverName, $serverBase, $location, $path);
list($statusCode, $content, $media, $system, $error) = $this->buildStatic($location, $path);
} else {
list($statusCode, $content, $media, $system, $error) = array(500, 0, 0, 0, 1);
$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 "ERROR bulding pages: Please configure serverName and serverBase in file '$fileName'!\n";
}
echo "Yellow $command: $content content, $media media, $system system";
echo ", $error error".($error!=1 ? 's' : '');
@ -83,71 +82,53 @@ class YellowCommandline
}
// Build static files
function buildStatic($serverName, $serverBase, $location, $path)
function buildStatic($location, $path)
{
$this->yellow->toolbox->timerStart($time);
$statusCodeMax = $error = 0;
if(empty($location))
{
$pages = $this->yellow->pages->index(true);
$fileNamesMedia = $this->yellow->toolbox->getDirectoryEntriesrecursive(
$fileNamesMedia = $this->yellow->toolbox->getDirectoryEntriesRecursive(
$this->yellow->config->get("mediaDir"), "/.*/", false, false);
$fileNamesMedia = array_merge($fileNamesMedia, $this->yellow->toolbox->getDirectoryEntries(
".", "/.*\\".$this->yellow->config->get("commandBuildCustomMediaExtension")."/", false, false));
$fileNamesSystem = array($this->yellow->config->get("commandBuildCustomErrorFile"));
".", "/".$this->yellow->config->get("commandlineMediaFile")."/", false, false, false));
$fileNamesSystem = array($this->yellow->config->get("commandlineSystemErrorFile"),
$this->yellow->config->get("commandlineSystemServerFile"));
} else {
if($location[0] != '/') $location = '/'.$location;
$pages = new YellowPageCollection($this->yellow);
$pages->append(new YellowPage($this->yellow, $location));
$fileNamesMedia = array();
$fileNamesSystem = array();
$fileNamesMedia = $fileNamesSystem = array();
}
foreach($pages as $page)
{
$statusCode = $this->buildStaticLocation($serverName, $serverBase, $page->location, $path);
$statusCodeMax = max($statusCodeMax, $statusCode);
if($statusCode >= 400)
{
++$error;
echo "ERROR building location '".$page->location."', ".$this->yellow->page->getStatusCode(true)."\n";
}
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic status:$statusCode location:".$page->location."\n";
$statusCode = $this->buildStaticLocation($page->location, $path);
$statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error;
}
foreach($fileNamesMedia as $fileName)
{
$statusCode = $this->copyStaticFile($fileName, "$path/$fileName") ? 200 : 500;
$statusCodeMax = max($statusCodeMax, $statusCode);
if($statusCode >= 400)
{
++$error;
echo "ERROR building media file '$path/$fileName', ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode)."\n";
}
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic status:$statusCode file:$fileName\n";
$statusCode = $this->buildStaticFile($fileName, "$path/$fileName", "media file");
$statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error;
}
foreach($fileNamesSystem as $fileName)
{
$statusCode = $this->buildStaticError($serverName, $serverBase, "$path/$fileName", 404) ? 200 : 500;
$statusCodeMax = max($statusCodeMax, $statusCode);
if($statusCode >= 400)
{
++$error;
echo "ERROR building system file '$path/$fileName', ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode)."\n";
}
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic status:$statusCode file:$fileName\n";
$statusCode = $this->buildStaticFile($fileName, "$path/$fileName", "system file");
$statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error;
}
$this->yellow->toolbox->timerStop($time);
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic time:$time ms\n";
return array($statusCodeMax, count($pages), count($fileNamesMedia), count($fileNamesSystem), $error);
}
// Build static location as file
function buildStaticLocation($serverName, $serverBase, $location, $path)
// Build static location
function buildStaticLocation($location, $path)
{
ob_start();
$_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1";
$_SERVER["SERVER_NAME"] = $serverName;
$_SERVER["REQUEST_URI"] = $serverBase.$location;
$_SERVER["SCRIPT_NAME"] = $serverBase."yellow.php";
$_SERVER["SERVER_NAME"] = $this->yellow->config->get("serverName");
$_SERVER["REQUEST_URI"] = $this->yellow->config->get("serverBase").$location;
$_SERVER["SCRIPT_NAME"] = $this->yellow->config->get("serverBase")."yellow.php";
$_REQUEST = array();
$statusCode = $this->yellow->request();
if($statusCode != 404)
{
@ -160,18 +141,21 @@ 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->createStaticFile($fileName, $fileData, $modified);
$fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) &&
$this->yellow->toolbox->modifyFile($fileName, $modified);
} else {
if(!$this->yellow->toolbox->isFileLocation($location))
{
$fileName = $this->getStaticFileName($location, $path);
$fileData = $this->getStaticRedirect("http://$serverName$serverBase$staticLocation");
$fileOk = $this->createStaticFile($fileName, $fileData, $modified);
$fileData = $this->getStaticRedirect($staticLocation);
$fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) &&
$this->yellow->toolbox->modifyFile($fileName, $modified);
if($fileOk)
{
$fileName = $this->getStaticFileName($staticLocation, $path);
$fileData = ob_get_contents();
$fileOk = $this->createStaticFile($fileName, $fileData, $modified);
$fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) &&
$this->yellow->toolbox->modifyFile($fileName, $modified);
}
} else {
$statusCode = 409;
@ -185,43 +169,46 @@ class YellowCommandline
}
}
ob_end_clean();
if($statusCode>=400) echo "ERROR building location '$location', ".$this->yellow->page->getStatusCode(true)."\n";
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticLocation status:$statusCode location:$location\n";
return $statusCode;
}
// Build static error as file
function buildStaticError($serverName, $serverBase, $fileName, $statusCodeRequest)
// Build static file
function buildStaticFile($fileNameSource, $fileNameDest, $fileType)
{
ob_start();
$_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1";
$_SERVER["SERVER_NAME"] = $serverName;
$_SERVER["REQUEST_URI"] = $serverBase."/";
$_SERVER["SCRIPT_NAME"] = $serverBase."yellow.php";
$statusCode = $this->yellow->request($statusCodeRequest);
if($statusCode == $statusCodeRequest)
if($fileNameSource != $this->yellow->config->get("commandlineSystemErrorFile"))
{
$modified = strtotime($this->yellow->page->getHeader("Last-Modified"));
if(!$this->createStaticFile($fileName, ob_get_contents(), $modified))
$statusCode = $this->yellow->toolbox->copyFile($fileNameSource, $fileNameDest, true) &&
$this->yellow->toolbox->modifyFile($fileNameDest, filemtime($fileNameSource)) ? 200 : 500;
} else {
ob_start();
$_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1";
$_SERVER["SERVER_NAME"] = $this->yellow->config->get("serverName");
$_SERVER["REQUEST_URI"] = $this->yellow->config->get("serverBase")."/";
$_SERVER["SCRIPT_NAME"] = $this->yellow->config->get("serverBase")."yellow.php";
$_REQUEST = array();
$statusCodeRequest = 404;
$statusCode = $this->yellow->request($statusCodeRequest);
if($statusCode == $statusCodeRequest)
{
$statusCode = 200;
$modified = strtotime($this->yellow->page->getHeader("Last-Modified"));
if(!$this->yellow->toolbox->createFile($fileNameDest, ob_get_contents(), true) ||
!$this->yellow->toolbox->modifyFile($fileNameDest, $modified))
{
$statusCode = 500;
$this->yellow->page->error($statusCode, "Can't write file '$fileNameDest'!");
}
} else {
$statusCode = 500;
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
$this->yellow->page->error($statusCode, "Error $statusCodeRequest does not exist!");
}
ob_end_clean();
}
ob_end_clean();
return $statusCode == $statusCodeRequest;
}
// Create static file
function createStaticFile($fileName, $fileData, $modified)
{
return $this->yellow->toolbox->createFile($fileName, $fileData, true) &&
$this->yellow->toolbox->modifyFile($fileName, $modified);
}
// Copy static file
function copyStaticFile($fileNameSource, $fileNameDest)
{
return $this->yellow->toolbox->copyFile($fileNameSource, $fileNameDest, true) &&
$this->yellow->toolbox->modifyFile($fileNameDest, filemtime($fileNameSource));
if($statusCode>=400) echo "ERROR building $fileType '$fileNameSource', ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode)."\n";
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticFile status:$statusCode file:$fileNameSource\n";
return $statusCode;
}
// Return static location corresponding to content type
@ -255,14 +242,16 @@ class YellowCommandline
$fileName = $path.$location;
if(!$this->yellow->toolbox->isFileLocation($location))
{
$fileName .= $this->yellow->config->get("commandBuildDefaultFile");
$fileName .= $this->yellow->config->get("commandlineDefaultFile");
}
return $fileName;
}
// Return static redirect data
function getStaticRedirect($url)
function getStaticRedirect($location)
{
$url = $this->yellow->toolbox->getHttpUrl($this->yellow->config->get("serverName"),
$this->yellow->config->get("serverBase"), $location);
$text = "<!DOCTYPE html><html>\n";
$text .= "<head>\n";
$text .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";

View file

@ -5,9 +5,8 @@
// Markdown extra core plugin
class YellowMarkdownExtra
{
const Version = "0.2.7";
const Version = "0.2.8";
var $yellow; //access to API
var $textHtml; //generated text (HTML format)
// Initialise plugin
function onLoad($yellow)
@ -19,7 +18,7 @@ class YellowMarkdownExtra
function onParse($page, $text)
{
$markdown = new YellowMarkdownExtraParser($this->yellow);
$this->textHtml = $markdown->transformPage($page, $text);
return $markdown->transformPage($page, $text);
}
}

View file

@ -5,7 +5,7 @@
// Yellow main class
class Yellow
{
const Version = "0.2.7";
const Version = "0.2.8";
var $page; //current page data
var $pages; //current page tree from file system
var $config; //configuration
@ -341,6 +341,7 @@ class YellowPage
var $metaDataOffsetBytes; //meta data offset
var $metaData; //meta data
var $headerData; //response header
var $parserData; //content data of page
var $parser; //content parser
var $active; //page is active location? (boolean)
var $visible; //page is visible location? (boolean)
@ -445,18 +446,18 @@ class YellowPage
if(method_exists($plugin["obj"], "onParse"))
{
$this->parser = $plugin["obj"];
$this->parser->onParse($this, $this->getContent(true));
$this->parserData = $this->parser->onParse($this, $this->getContent(true));
foreach($this->yellow->plugins->plugins as $key=>$value)
{
if(method_exists($value["obj"], "onParseContent"))
{
$output = $value["obj"]->onParseContent($this, $this->parser->textHtml);
if(!is_null($output)) { $this->parser->textHtml = $output; break; }
$output = $value["obj"]->onParseContent($this, $this->parserData);
if(!is_null($output)) { $this->parserData = $output; break; }
}
}
if(!$this->isExisting("description"))
{
$this->set("description", $this->yellow->toolbox->createTextDescription($this->parser->textHtml, 150));
$this->set("description", $this->yellow->toolbox->createTextDescription($this->parserData, 150));
}
if(!$this->isExisting("keywords"))
{
@ -552,7 +553,7 @@ class YellowPage
$text = substrb($this->rawData, $this->metaDataOffsetBytes);
} else {
$this->parseContent();
$text = is_object($this->parser) ? $this->parser->textHtml : "";
$text = $this->parserData;
}
return $text;
}
@ -914,24 +915,24 @@ class YellowPages
$this->yellow->config->get("contentDir"), $this->yellow->config->get("contentHomeDir"), "", "");
}
$fileNames = array();
foreach($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true) as $entry)
foreach($this->yellow->toolbox->getDirectoryEntries($path, "/.*/") as $entry)
{
$fileDefault = $this->yellow->config->get("contentDefaultFile");
if(!is_file($path.$entry."/".$fileDefault))
if(!is_file($entry."/".$fileDefault))
{
$regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $fileDefault)."$/";
foreach($this->yellow->toolbox->getDirectoryEntries($path.$entry, $regex, false, false) as $entry2)
foreach($this->yellow->toolbox->getDirectoryEntries($entry, $regex, false, false, false) as $entry2)
{
if($this->yellow->toolbox->normaliseName($entry2) == $fileDefault) { $fileDefault = $entry2; break; }
}
}
array_push($fileNames, $path.$entry."/".$fileDefault);
array_push($fileNames, $entry."/".$fileDefault);
}
$fileDefault = $this->yellow->config->get("contentDefaultFile");
$regex = "/.*\\".$this->yellow->config->get("contentExtension")."/";
foreach($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false) as $entry)
foreach($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false, false) as $entry)
{
$token = $this->yellow->toolbox->normaliseName($entry);
if($token != $this->yellow->config->get("contentDefaultFile")) array_push($fileNames, $path.$entry);
if($this->yellow->toolbox->normaliseName($entry) != $fileDefault) array_push($fileNames, $path.$entry);
}
foreach($fileNames as $fileName)
{
@ -1086,11 +1087,11 @@ class YellowText
$regex = "/".basename($fileName)."/";
foreach($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false) as $entry)
{
$fileData = @file("$path/$entry");
$fileData = @file($entry);
if($fileData)
{
if(defined("DEBUG") && DEBUG>=2) echo "YellowText::load file:$path/$entry<br/>\n";
$this->modified = max($this->modified, filemtime("$path/$entry"));
if(defined("DEBUG") && DEBUG>=2) echo "YellowText::load file:$entry<br/>\n";
$this->modified = max($this->modified, filemtime($entry));
$language = "";
foreach($fileData as $line)
{
@ -1362,7 +1363,7 @@ class YellowToolbox
$token = $tokens[$i];
if($this->normaliseName($token) != $token) $invalid = true;
$regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/";
foreach($this->getDirectoryEntries($path, $regex) as $entry)
foreach($this->getDirectoryEntries($path, $regex, false, true, false) as $entry)
{
if($this->normaliseName($entry) == $token) { $token = $entry; break; }
}
@ -1373,7 +1374,7 @@ class YellowToolbox
$token = rtrim($pathHome, '/');
if($this->normaliseName($token) != $token) $invalid = true;
$regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/";
foreach($this->getDirectoryEntries($path, $regex) as $entry)
foreach($this->getDirectoryEntries($path, $regex, false, true, false) as $entry)
{
if($this->normaliseName($entry) == $token) { $token = $entry; break; }
}
@ -1383,7 +1384,7 @@ class YellowToolbox
if(!empty($tokens[$i]) && $tokens[$i].$fileExtension==$fileDefault) $invalid = true;
if($this->normaliseName($token) != $token) $invalid = true;
$regex = "/^[\d\-\_\.]*".strreplaceu('-', '.', $token)."$/";
foreach($this->getDirectoryEntries($path, $regex, false, false) as $entry)
foreach($this->getDirectoryEntries($path, $regex, false, false, false) as $entry)
{
if($this->normaliseName($entry) == $token) { $token = $entry; break; }
}
@ -1469,12 +1470,13 @@ class YellowToolbox
}
// Return files and directories
function getDirectoryEntries($path, $regex = "/.*/", $sort = false, $directories = true)
function getDirectoryEntries($path, $regex = "/.*/", $sort = true, $directories = true, $includePath = true)
{
$entries = array();
$dirHandle = @opendir($path);
if($dirHandle)
{
$path = rtrim($path, '/');
while(($entry = readdir($dirHandle)) !== false)
{
if(substru($entry, 0, 1) == ".") continue;
@ -1482,9 +1484,9 @@ class YellowToolbox
{
if($directories)
{
if(is_dir("$path/$entry")) array_push($entries, $entry);
if(is_dir("$path/$entry")) array_push($entries, $includePath ? "$path/$entry" : $entry);
} else {
if(is_file("$path/$entry")) array_push($entries, $entry);
if(is_file("$path/$entry")) array_push($entries, $includePath ? "$path/$entry" : $entry);
}
}
}
@ -1495,16 +1497,15 @@ class YellowToolbox
}
// Return files and directories recursively
function getDirectoryEntriesRecursive($path, $regex = "/.*/", $sort = false, $directories = true, $levelMax = 0)
function getDirectoryEntriesRecursive($path, $regex = "/.*/", $sort = true, $directories = true, $levelMax = 0)
{
$entries = array();
foreach($this->getDirectoryEntries($path, $regex, $sort, $directories) as $entry) array_push($entries, "$path/$entry");
--$levelMax;
$entries = $this->getDirectoryEntries($path, $regex, $sort, $directories);
if($levelMax != 0)
{
foreach($this->getDirectoryEntries($path, "/.*/", $sort, true) as $entry)
{
$entries = array_merge($entries, $this->getDirectoryEntriesRecursive("$path/$entry", $regex, $sort, $directories, $levelMax));
$entries = array_merge($entries, $this->getDirectoryEntriesRecursive($entry, $regex, $sort, $directories, $levelMax));
}
}
return $entries;
@ -1711,9 +1712,9 @@ class YellowPlugins
{
global $yellow;
$path = dirname(__FILE__);
foreach($yellow->toolbox->getDirectoryEntries($path, "/core-.*\.php/", true, false) as $entry) require_once("$path/$entry");
foreach($yellow->toolbox->getDirectoryEntries($path, "/core-.*\.php/", true, false) as $entry) require_once($entry);
$path = $yellow->config->get("pluginDir");
foreach($yellow->toolbox->getDirectoryEntries($path, "/.*\.php/", true, false) as $entry) require_once("$path/$entry");
foreach($yellow->toolbox->getDirectoryEntries($path, "/.*\.php/", true, false) as $entry) require_once($entry);
foreach($this->plugins as $key=>$value)
{
$this->plugins[$key]["obj"] = new $value["class"];