mikuli.cz

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

commit 39c04c43fa57b6b3a1dd753464bb6c00312394f6
parent db831239afe8d2687cce567ba05f0cc87b5b0265
Author: markseu <mark2011@mayberg.se>
Date:   Tue, 17 Sep 2013 11:18:01 +0200

Core update (dynamic content handling)

Diffstat:
MREADME.md | 2+-
Msystem/config/config.ini | 4++--
Msystem/core/core.php | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Msystem/core/core_webinterface.php | 31+++++++++++++++++--------------
Msystem/plugins/example.php | 4++--
Msystem/snippets/content.php | 5++---
Msystem/snippets/header.php | 2+-
Msystem/snippets/navigation.php | 2+-
Msystem/templates/default.php | 2+-
9 files changed, 102 insertions(+), 62 deletions(-)

diff --git a/README.md b/README.md @@ -10,7 +10,7 @@ How do I install this? 3. Open your website in a browser, that's it! Installation requirements are Apache, mod_rewrite, PHP 5.3 and multibyte support. -With Yellow you don't get a lot of extra stuff, there are [Yellow extensions on Github](https://github.com/markseu/yellowcms-extensions). +With Yellow you don't get a lot of extra stuff, there are [Yellow extensions on Github](https://github.com/markseu/yellowcms-extensions/blob/master/README.md). How to make a website? ---------------------- diff --git a/system/config/config.ini b/system/config/config.ini @@ -1,8 +1,8 @@ // Yellow site configuration // All locations and directories have to end with a slash -sitename = Website -author = Website +sitename = Yellow +author = Yellow language = en template = default style = default diff --git a/system/core/core.php b/system/core/core.php @@ -5,7 +5,7 @@ // Yellow main class class Yellow { - const Version = "0.1.16"; + const Version = "0.1.17"; var $page; //current page data var $pages; //current page tree from file system var $toolbox; //toolbox with helpers @@ -375,13 +375,27 @@ class Yellow_Page if(preg_match("/^(\-\-\-[\r\n]+)(.+?)([\r\n]+\-\-\-[\r\n]+)/s", $this->rawData, $parsed)) { $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]); + foreach(preg_split("/[\r\n]+/", $parsed[2]) as $line) + { + preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches); + if(!empty($matches[1]) && !empty($matches[2])) $this->set(lcfirst($matches[1]), $matches[2]); + } } else if(preg_match("/^([^\r\n]+)([\r\n]+=+[\r\n]+)/", $this->rawData, $parsed)) { $this->metaDataOffsetBytes = strlenb($parsed[0]); $this->set("title", $parsed[1]); } - + $titleHeader = $this->location!="/" ? $this->get("title")." - ".$this->get("sitename") : $this->get("sitename"); + if(!$this->isExisting("titleHeader")) $this->set("titleHeader", $titleHeader); + if(!$this->isExisting("titleNavigation")) $this->set("titleNavigation", $this->get("title")); + foreach($this->yellow->plugins->plugins as $key=>$value) + { + if(method_exists($value["obj"], "onParseMeta")) + { + $output = $value["obj"]->onParseMeta($this, $this->rawData); + if(!is_null($output)) { $this->rawData = $output; break; } + } + } + if($this == $this->yellow->page) { $this->setHeader("Content-Type", "text/html; charset=UTF-8"); @@ -393,20 +407,20 @@ class Yellow_Page // Parse page content function parseContent() { - if(!is_object($this->parser) && $this->yellow->plugins->isExisting($this->get("parser"))) + if(!is_object($this->parser)) { - $this->parser = $this->yellow->plugins->plugins[$this->get("parser")]["obj"]; - $this->parser->parse(substrb($this->rawData, $this->metaDataOffsetBytes)); + $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(substrb($this->rawData, $this->metaDataOffsetBytes)); + } foreach($this->yellow->plugins->plugins as $key=>$value) { if(method_exists($value["obj"], "onParseContent")) { - $output = $value["obj"]->onParseContent($this->parser->textHtml); - if(!is_null($output)) - { - $this->parser->textHtml = $output; - break; - } + $output = $value["obj"]->onParseContent($this, $this->parser->textHtml); + if(!is_null($output)) { $this->parser->textHtml = $output; break; } } } if(!$this->isExisting("description")) @@ -476,12 +490,6 @@ class Yellow_Page return htmlspecialchars($this->get($key)); } - // Return page title, HTML encoded - function getTitle() - { - return $this->getHtml("title"); - } - // Return page content, HTML encoded function getContent() { @@ -633,6 +641,22 @@ class Yellow_PageCollection extends ArrayObject return $this; } + // Append to end of page collection + function append($page) + { + parent::append($page); + return $this; + } + + // Prepend to start of page collection + function prepend($page) + { + $array = $this->getArrayCopy(); + array_unshift($array, $page); + $this->exchangeArray($array); + return $this; + } + // Limit the number of pages in page collection function limit($pagesMax) { @@ -739,7 +763,13 @@ class Yellow_Pages $this->pages = array(); $this->yellow = $yellow; } - + + // Return empty page collection + function create() + { + return new Yellow_PageCollection($this->yellow, ""); + } + // Return pages from file system function index($showHidden = false, $levelMax = 0) { @@ -752,6 +782,19 @@ class Yellow_Pages return $this->findChildren("", $showHidden); } + // Return page collection with path ancestry + function path($location, $absoluteLocation = false) + { + if($absoluteLocation) $location = substru($location, strlenu($this->serverBase)); + $pages = $this->find($location, false); + for($page=$pages->first(); $page; $page=$parent) + { + if($parent = $page->getParent()) $pages->prepend($parent); + else if($page->location!="/" && $home = $this->find("/", false)->first()) $pages->prepend($home); + } + return $pages; + } + // Return page collection with a specific page function find($location, $absoluteLocation = false) { @@ -759,7 +802,7 @@ class Yellow_Pages $parentLocation = $this->getParentLocation($location); $this->scanChildren($parentLocation); $pages = new Yellow_PageCollection($this->yellow, $parentLocation); - foreach($this->pages[$parentLocation] as $page) if($page->location == $location) $pages->append($page); + foreach($this->pages[$parentLocation] as $page) if($page->location == $location) { $pages->append($page); break; } return $pages; } @@ -990,11 +1033,7 @@ class Yellow_Toolbox $tokens = explode('/', $fileName); for($i=0; $i<count($tokens)-1; ++$i) { - if(!preg_match("/^[\d\-\_\.]+(.*)$/", $tokens[$i])) - { - $visible = false; - break; - } + if(!preg_match("/^[\d\-\_\.]+(.*)$/", $tokens[$i])) { $visible = false; break; } } return $visible; } @@ -1183,16 +1222,17 @@ class Yellow_Toolbox } // Create description from text string - static function createTextDescription($text, $lengthMax, $removeHtml = true) + static function createTextDescription($text, $lengthMax, $removeHtml = true, $endMarker = "", $endMarkerText = "") { if(preg_match("/<h1>.*<\/h1>(.*)/si", $text, $matches)) $text = $matches[1]; if($removeHtml) { while(true) { - $elementFound = preg_match("/<\s*?(\/?\w*).*?\>/s", $text, $matches, PREG_OFFSET_CAPTURE, $offsetBytes); + $elementFound = preg_match("/<\s*?([\/!]?\w*)(.*?)\s*?\>/s", $text, $matches, PREG_OFFSET_CAPTURE, $offsetBytes); $element = $matches[0][0]; $elementName = $matches[1][0]; + $elementText = $matches[2][0]; $elementOffsetBytes = $elementFound ? $matches[0][1] : strlenb($text); $string = html_entity_decode(substrb($text, $offsetBytes, $elementOffsetBytes - $offsetBytes), ENT_QUOTES, "UTF-8"); if(preg_match("/^(blockquote|br|div|h\d|hr|li|ol|p|pre|ul)/i", $elementName)) $string .= ' '; @@ -1201,16 +1241,17 @@ class Yellow_Toolbox $length = strlenu($string); $output .= substru($string, 0, $length < $lengthMax ? $length : $lengthMax-1); $lengthMax -= $length; + if(!empty($element) && $element==$endMarker) { $lengthMax = 0; $endMarkerFound = true; } if($lengthMax<=0 || !$elementFound) break; $offsetBytes = $elementOffsetBytes + strlenb($element); } $output = rtrim($output); - if($lengthMax <= 0) $output .= '…'; + if($lengthMax <= 0) $output .= $endMarkerFound ? $endMarkerText : "…"; } else { $elementsOpen = array(); while(true) { - $elementFound = preg_match("/&.*?\;|<\s*?(\/?\w*)\s*?(.*?)\s*?\>/s", $text, $matches, PREG_OFFSET_CAPTURE, $offsetBytes); + $elementFound = preg_match("/&.*?\;|<\s*?([\/!]?\w*)(.*?)\s*?\>/s", $text, $matches, PREG_OFFSET_CAPTURE, $offsetBytes); $element = $matches[0][0]; $elementName = $matches[1][0]; $elementText = $matches[2][0]; @@ -1219,9 +1260,10 @@ class Yellow_Toolbox $length = strlenu($string); $output .= substru($string, 0, $length < $lengthMax ? $length : $lengthMax-1); $lengthMax -= $length + ($element[0]=='&' ? 1 : 0); + if(!empty($element) && $element==$endMarker) { $lengthMax = 0; $endMarkerFound = true; } if($lengthMax<=0 || !$elementFound) break; if(!empty($elementName) && substru($elementText, -1)!='/' && - !preg_match("/^(area|br|col|hr|img|input|col|param)/i", $elementName)) + !preg_match("/^(area|br|col|hr|img|input|col|param|!)/i", $elementName)) { if($elementName[0] != '/') { @@ -1234,7 +1276,7 @@ class Yellow_Toolbox $offsetBytes = $elementOffsetBytes + strlenb($element); } $output = rtrim($output); - if($lengthMax <= 0) $output .= '…'; + if($lengthMax <= 0) $output .= $endMarkerFound ? $endMarkerText : "…"; for($t=count($elementsOpen)-1; $t>=0; --$t) $output .= "</".$elementsOpen[$t].">"; } return $output; @@ -1264,11 +1306,7 @@ class Yellow_Toolbox foreach(preg_split("/,\s*/", $_SERVER["HTTP_ACCEPT_LANGUAGE"]) as $string) { $tokens = explode(';', $string, 2); - if(in_array($tokens[0], $languagesAllowed)) - { - $language = $tokens[0]; - break; - } + if(in_array($tokens[0], $languagesAllowed)) { $language = $tokens[0]; break; } } } return $language; diff --git a/system/core/core_webinterface.php b/system/core/core_webinterface.php @@ -5,7 +5,7 @@ // Web interface core plugin class Yellow_Webinterface { - const Version = "0.1.8"; + const Version = "0.1.9"; var $yellow; //access to API var $users; //web interface users var $activeLocation; //web interface location? (boolean) @@ -46,8 +46,8 @@ class Yellow_Webinterface return $statusCode; } - // Handle web content parsing - function onParseContent($text) + // Handle page content parsing + function onParseContent($page, $text) { $output = NULL; if($this->isWebinterfaceLocation() && $this->isUser()) @@ -56,17 +56,20 @@ class Yellow_Webinterface $webinterfaceLocation = trim($this->yellow->config->get("webinterfaceLocation"), '/'); $output = preg_replace("#<a(.*?)href=\"$serverBase/(?!$webinterfaceLocation)(.*?)\"(.*?)>#", "<a$1href=\"$serverBase/$webinterfaceLocation/$2\"$3>", $text); - switch($this->yellow->page->statusCode) + if($page == $this->yellow->page) { - 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; + switch($page->statusCode) + { + case 200: $this->rawDataOriginal = $page->rawData; break; + case 424: $language = $this->isUser() ? $this->users->getLanguage($this->activeUserEmail) : $page->get("language"); + $page->rawData = "---\r\n"; + $page->rawData .= "Title: ".$this->yellow->text->getLanguageText($language, "webinterface424Title")."\r\n"; + $page->rawData .= "Author: ".$this->users->getName($this->activeUserEmail)."\r\n"; + $page->rawData .= "---\r\n"; + $page->rawData .= $this->yellow->text->getLanguageText($language, "webinterface424Text"); + break; + case 500: $page->rawData = $this->rawDataOriginal; break; + } } } return $output; @@ -207,7 +210,7 @@ class Yellow_Webinterface $data[$page->fileName] = array(); $data[$page->fileName]["location"] = $page->getLocation(); $data[$page->fileName]["modified"] = $page->getModified(); - $data[$page->fileName]["title"] = $page->getTitle(); + $data[$page->fileName]["title"] = $page->getHtml("title"); } return $data; } diff --git a/system/plugins/example.php b/system/plugins/example.php @@ -3,12 +3,12 @@ // This file may be used and distributed under the terms of the public license. // Example plugin -class Yellow_ExamplePlugin +class Yellow_Example { //You can download plugins and extensions from Github. //See https://github.com/markseu/yellowcms-extensions const Version = "0.0.0"; } -$yellow->registerPlugin("example", "Yellow_ExamplePlugin", Yellow_ExamplePlugin::Version); +$yellow->registerPlugin("example", "Yellow_Example", Yellow_Example::Version); ?> \ No newline at end of file diff --git a/system/snippets/content.php b/system/snippets/content.php @@ -1,5 +1,4 @@ -<?php list($name, $title, $text) = $yellow->getSnippetArgs() ?> <div class="content"> -<h1><?php echo $title ?></h1> -<?php echo $text ?> +<h1><?php echo $yellow->page->getHtml("title") ?></h1> +<?php echo $yellow->page->getContent() ?> </div> diff --git a/system/snippets/header.php b/system/snippets/header.php @@ -5,7 +5,7 @@ <meta name="keywords" content="<?php echo $yellow->page->getHtml("keywords") ?>" /> <meta name="author" content="<?php echo $yellow->page->getHtml("author") ?>" /> <meta name="viewport" content="width=device-width, initial-scale=1"> -<title><?php echo $yellow->page->getHtml("sitename")." - ".$yellow->page->getHtml("title") ?></title> +<title><?php echo $yellow->page->getHtml("titleHeader") ?></title> <link rel="shortcut icon" href="<?php echo $yellow->config->get("serverBase").$yellow->config->get("imageLocation")."default_icon.png" ?>" /> <link rel="stylesheet" type="text/css" media="all" href="<?php echo $yellow->config->get("serverBase").$yellow->config->get("styleLocation").$yellow->page->get("style").".css" ?>" /> <?php echo $yellow->getHeaderExtra() ?> diff --git a/system/snippets/navigation.php b/system/snippets/navigation.php @@ -1,7 +1,7 @@ <div class="navigation"> <ul> <?php foreach($yellow->pages->top() as $page): ?> -<li><a<?php echo $page->isActive() ? " class=\"active\"" : "" ?> href="<?php echo $page->getLocation() ?>"><?php echo $page->getTitle() ?></a></li> +<li><a<?php echo $page->isActive() ? " class=\"active\"" : "" ?> href="<?php echo $page->getLocation() ?>"><?php echo $page->getHtml("titleNavigation") ?></a></li> <?php endforeach ?> </ul> </div> diff --git a/system/templates/default.php b/system/templates/default.php @@ -1,4 +1,4 @@ <?php $yellow->snippet("header") ?> <?php $yellow->snippet("navigation") ?> -<?php $yellow->snippet("content", $yellow->page->getTitle(), $yellow->page->getContent()) ?> +<?php $yellow->snippet("content") ?> <?php $yellow->snippet("footer") ?> \ No newline at end of file