Updated layout files, switched to self contained themes

This commit is contained in:
markseu 2020-01-15 19:30:45 +01:00
parent b8f2ea60c5
commit 42b00f555e
15 changed files with 126 additions and 140 deletions

View file

@ -0,0 +1,5 @@
---
Title: File not found
Layout: error
---
The requested file was not found. Oh no...

View file

@ -4,7 +4,7 @@
// This file may be used and distributed under the terms of the public license. // This file may be used and distributed under the terms of the public license.
class YellowCore { class YellowCore {
const VERSION = "0.8.9"; const VERSION = "0.8.10";
const TYPE = "feature"; const TYPE = "feature";
public $page; //current page public $page; //current page
public $content; //content files from file system public $content; //content files from file system
@ -32,10 +32,6 @@ class YellowCore {
$this->system->setDefault("theme", "default"); $this->system->setDefault("theme", "default");
$this->system->setDefault("parser", "markdown"); $this->system->setDefault("parser", "markdown");
$this->system->setDefault("status", "public"); $this->system->setDefault("status", "public");
$this->system->setDefault("navigation", "navigation");
$this->system->setDefault("header", "header");
$this->system->setDefault("footer", "footer");
$this->system->setDefault("sidebar", "sidebar");
$this->system->setDefault("coreStaticUrl", ""); $this->system->setDefault("coreStaticUrl", "");
$this->system->setDefault("coreStaticDefaultFile", "index.html"); $this->system->setDefault("coreStaticDefaultFile", "index.html");
$this->system->setDefault("coreStaticErrorFile", "404.html"); $this->system->setDefault("coreStaticErrorFile", "404.html");
@ -64,6 +60,7 @@ class YellowCore {
$this->system->setDefault("coreContentHomeDir", "home/"); $this->system->setDefault("coreContentHomeDir", "home/");
$this->system->setDefault("coreContentSharedDir", "shared/"); $this->system->setDefault("coreContentSharedDir", "shared/");
$this->system->setDefault("coreContentDefaultFile", "page.md"); $this->system->setDefault("coreContentDefaultFile", "page.md");
$this->system->setDefault("coreContentErrorFile", "page-error-(.*).md");
$this->system->setDefault("coreContentExtension", ".md"); $this->system->setDefault("coreContentExtension", ".md");
$this->system->setDefault("coreDownloadExtension", ".download"); $this->system->setDefault("coreDownloadExtension", ".download");
$this->system->setDefault("coreSystemFile", "system.ini"); $this->system->setDefault("coreSystemFile", "system.ini");
@ -169,13 +166,15 @@ class YellowCore {
// Read page // Read page
public function readPage($scheme, $address, $base, $location, $fileName, $cacheable, $statusCode, $pageError) { public function readPage($scheme, $address, $base, $location, $fileName, $cacheable, $statusCode, $pageError) {
if ($statusCode>=400) { if ($statusCode>=400) {
$language = $this->lookup->findLanguageFromFile($fileName, $this->system->get("language")); $locationError = $this->content->getHomeLocation($page->location).$this->system->get("coreContentSharedDir");
if ($this->text->isExisting("error${statusCode}Title", $language)) { $fileNameError = $this->lookup->findFileFromLocation($locationError, true).$this->system->get("coreContentErrorFile");
$rawData = "---\nTitle:".$this->text->getText("error${statusCode}Title", $language)."\n"; $fileNameError = strreplaceu("(.*)", $statusCode, $fileNameError);
$rawData .= "Layout:error\nSidebar:none\nLanguage:$language\n---\n".$this->text->getText("error${statusCode}Text", $language); if (is_file($fileNameError)) {
$rawData = $this->toolbox->readFile($fileNameError);
} else { } else {
$rawData = "---\nTitle:".$this->toolbox->getHttpStatusFormatted($statusCode, true)."\n"; $language = $this->lookup->findLanguageFromFile($fileName, $this->system->get("language"));
$rawData .= "Layout:error\nSidebar:none\nLanguage:en\n---\n[yellow error]"; $rawData = "---\nTitle:".$this->text->getText("coreError${statusCode}Title", $language)."\n";
$rawData .= "Layout:error\n---\n".$this->text->getText("coreError${statusCode}Text", $language);
} }
$cacheable = false; $cacheable = false;
} else { } else {
@ -444,7 +443,7 @@ class YellowPage {
$this->set("title", $this->yellow->toolbox->createTextTitle($this->location)); $this->set("title", $this->yellow->toolbox->createTextTitle($this->location));
$this->set("language", $this->yellow->lookup->findLanguageFromFile($this->fileName, $this->yellow->system->get("language"))); $this->set("language", $this->yellow->lookup->findLanguageFromFile($this->fileName, $this->yellow->system->get("language")));
$this->set("modified", date("Y-m-d H:i:s", $this->yellow->toolbox->getFileModified($this->fileName))); $this->set("modified", date("Y-m-d H:i:s", $this->yellow->toolbox->getFileModified($this->fileName)));
$this->parseMetaRaw(array("sitename", "author", "layout", "theme", "parser", "status", "navigation", "header", "footer", "sidebar")); $this->parseMetaRaw(array("sitename", "author", "layout", "theme", "parser", "status"));
$titleHeader = ($this->location==$this->yellow->content->getHomeLocation($this->location)) ? $titleHeader = ($this->location==$this->yellow->content->getHomeLocation($this->location)) ?
$this->get("sitename") : $this->get("title")." - ".$this->get("sitename"); $this->get("sitename") : $this->get("title")." - ".$this->get("sitename");
if (!$this->isExisting("titleContent")) $this->set("titleContent", $this->get("title")); if (!$this->isExisting("titleContent")) $this->set("titleContent", $this->get("title"));
@ -479,6 +478,10 @@ class YellowPage {
$value = $this->yellow->system->get($key); $value = $this->yellow->system->get($key);
if (!empty($key) && !strempty($value)) $this->set($key, $value); if (!empty($key) && !strempty($value)) $this->set($key, $value);
} }
$this->set("navigation", "navigation"); //TODO: remove later, for backwards compatibility
$this->set("header", "header");
$this->set("sidebar", "sidebar");
$this->set("footer", "footer");
if (preg_match("/^(\xEF\xBB\xBF)?\-\-\-[\r\n]+(.+?)\-\-\-[\r\n]+/s", $this->rawData, $parts)) { if (preg_match("/^(\xEF\xBB\xBF)?\-\-\-[\r\n]+(.+?)\-\-\-[\r\n]+/s", $this->rawData, $parts)) {
$this->metaDataOffsetBytes = strlenb($parts[0]); $this->metaDataOffsetBytes = strlenb($parts[0]);
foreach (preg_split("/[\r\n]+/", $parts[2]) as $line) { foreach (preg_split("/[\r\n]+/", $parts[2]) as $line) {
@ -514,7 +517,8 @@ class YellowPage {
$this->parserData = preg_replace("/\[yellow error\]/i", $this->get("pageError"), $this->parserData); $this->parserData = preg_replace("/\[yellow error\]/i", $this->get("pageError"), $this->parserData);
} }
if (!$this->isExisting("description")) { if (!$this->isExisting("description")) {
$this->set("description", $this->yellow->toolbox->createTextDescription($this->parserData, 150)); $description = $this->yellow->toolbox->createTextDescription($this->parserData, 150);
$this->set("description", !empty($description) ? $description : $this->get("title"));
} }
if (defined("DEBUG") && DEBUG>=3) echo "YellowPage::parseContent location:".$this->location."<br/>\n"; if (defined("DEBUG") && DEBUG>=3) echo "YellowPage::parseContent location:".$this->location."<br/>\n";
} }
@ -651,7 +655,7 @@ class YellowPage {
if (!empty($format)) { if (!empty($format)) {
$format = $this->yellow->text->get($format); $format = $this->yellow->text->get($format);
} else { } else {
$format = $this->yellow->text->get("dateFormatMedium"); $format = $this->yellow->text->get("coreDateFormatMedium");
} }
return $this->yellow->text->getDateFormatted(strtotime($this->get($key)), $format); return $this->yellow->text->getDateFormatted(strtotime($this->get($key)), $format);
} }
@ -666,7 +670,7 @@ class YellowPage {
if (!empty($format)) { if (!empty($format)) {
$format = $this->yellow->text->get($format); $format = $this->yellow->text->get($format);
} else { } else {
$format = $this->yellow->text->get("dateFormatMedium"); $format = $this->yellow->text->get("coreDateFormatMedium");
} }
return $this->yellow->text->getDateRelative(strtotime($this->get($key)), $format, $daysLimit); return $this->yellow->text->getDateRelative(strtotime($this->get($key)), $format, $daysLimit);
} }
@ -1269,6 +1273,7 @@ class YellowContent {
$location = $this->getHomeLocation($this->yellow->page->location).$this->yellow->system->get("coreContentSharedDir").$name; $location = $this->getHomeLocation($this->yellow->page->location).$this->yellow->system->get("coreContentSharedDir").$name;
$page = $this->find($location); $page = $this->find($location);
} }
if ($page) $page->setPage("main", $this->yellow->page);
return $page; return $page;
} }
@ -1649,8 +1654,8 @@ class YellowText {
// Return human readable date, custom date format // Return human readable date, custom date format
public function getDateFormatted($timestamp, $format) { public function getDateFormatted($timestamp, $format) {
$dateMonths = preg_split("/\s*,\s*/", $this->get("dateMonths")); $dateMonths = preg_split("/\s*,\s*/", $this->get("coreDateMonths"));
$dateWeekdays = preg_split("/\s*,\s*/", $this->get("dateWeekdays")); $dateWeekdays = preg_split("/\s*,\s*/", $this->get("coreDateWeekdays"));
$month = $dateMonths[date("n", $timestamp) - 1]; $month = $dateMonths[date("n", $timestamp) - 1];
$weekday = $dateWeekdays[date("N", $timestamp) - 1]; $weekday = $dateWeekdays[date("N", $timestamp) - 1];
$timeZone = $this->yellow->system->get("coreServerTimezone"); $timeZone = $this->yellow->system->get("coreServerTimezone");
@ -1669,7 +1674,7 @@ class YellowText {
public function getDateRelative($timestamp, $format, $daysLimit) { public function getDateRelative($timestamp, $format, $daysLimit) {
$timeDifference = time() - $timestamp; $timeDifference = time() - $timestamp;
$days = abs(intval($timeDifference / 86400)); $days = abs(intval($timeDifference / 86400));
$tokens = preg_split("/\s*,\s*/", $this->get($timeDifference>=0 ? "datePast" : "dateFuture")); $tokens = preg_split("/\s*,\s*/", $this->get($timeDifference>=0 ? "coreDatePast" : "coreDateFuture"));
if ($days<=$daysLimit || $daysLimit==0) { if ($days<=$daysLimit || $daysLimit==0) {
if ($days==0) { if ($days==0) {
$output = $tokens[0]; $output = $tokens[0];
@ -1709,11 +1714,11 @@ class YellowText {
// Normalise date into known format // Normalise date into known format
public function normaliseDate($text) { public function normaliseDate($text) {
if (preg_match("/^\d+\-\d+$/", $text)) { if (preg_match("/^\d+\-\d+$/", $text)) {
$output = $this->getDateFormatted(strtotime($text), $this->get("dateFormatShort")); $output = $this->getDateFormatted(strtotime($text), $this->get("coreDateFormatShort"));
} elseif (preg_match("/^\d+\-\d+\-\d+$/", $text)) { } elseif (preg_match("/^\d+\-\d+\-\d+$/", $text)) {
$output = $this->getDateFormatted(strtotime($text), $this->get("dateFormatMedium")); $output = $this->getDateFormatted(strtotime($text), $this->get("coreDateFormatMedium"));
} elseif (preg_match("/^\d+\-\d+\-\d+ \d+\:\d+$/", $text)) { } elseif (preg_match("/^\d+\-\d+\-\d+ \d+\:\d+$/", $text)) {
$output = $this->getDateFormatted(strtotime($text), $this->get("dateFormatLong")); $output = $this->getDateFormatted(strtotime($text), $this->get("coreDateFormatLong"));
} else { } else {
$output = $text; $output = $text;
} }

View file

@ -595,8 +595,7 @@ yellow.edit = {
} }
if (status=="preview" && !elementText.readOnly) this.showPreview(elementText, elementPreview); if (status=="preview" && !elementText.readOnly) this.showPreview(elementText, elementPreview);
if (status=="save" && !elementText.readOnly && this.paneAction!="delete") this.processSubmit("action:"+this.paneAction); if (status=="save" && !elementText.readOnly && this.paneAction!="delete") this.processSubmit("action:"+this.paneAction);
if (status=="help") window.open(this.getText("HelpUrl", "yellow"), "_blank"); if (status=="help") window.open(this.getText("YellowHelpUrl"), "_blank");
if (status=="markdown") window.open(this.getText("MarkdownUrl", "yellow"), "_blank");
if (this.isExpandable(status)) { if (this.isExpandable(status)) {
this.showPopup("yellow-popup-"+status, status); this.showPopup("yellow-popup-"+status, status);
} else { } else {
@ -664,7 +663,7 @@ yellow.edit = {
// Process help // Process help
processHelp: function() { processHelp: function() {
this.hidePane(this.paneId); this.hidePane(this.paneId);
window.open(this.getText("HelpUrl", "yellow"), "_self"); window.open(this.getText("YellowHelpUrl"), "_self");
}, },
// Create popup // Create popup

View file

@ -4,7 +4,7 @@
// This file may be used and distributed under the terms of the public license. // This file may be used and distributed under the terms of the public license.
class YellowEdit { class YellowEdit {
const VERSION = "0.8.17"; const VERSION = "0.8.18";
const TYPE = "feature"; const TYPE = "feature";
public $yellow; //access to API public $yellow; //access to API
public $response; //web response public $response; //web response
@ -108,7 +108,7 @@ class YellowEdit {
list($hash, $name, $language, $status, $pending, $stamp, $timestamp, $failed, $group, $home) = explode(",", $matches[2]); list($hash, $name, $language, $status, $pending, $stamp, $timestamp, $failed, $group, $home) = explode(",", $matches[2]);
$access = "create, edit, delete, upload".($group=="administrator" ? ", system, update" : ""); $access = "create, edit, delete, upload".($group=="administrator" ? ", system, update" : "");
$modified = date("Y-m-d H:i:s", $timestamp); $modified = date("Y-m-d H:i:s", $timestamp);
$fileDataNew .= "Email: $matches[1]\nName: $name\nLanguage: $language\nHome: $home\nAccess: $access\nStatus: $status\nPending: $pending\nHash: $hash\nStamp: $stamp\nFailed: $failed\nModified: $modified\n\n"; $fileDataNew .= "Email: $matches[1]\nName: $name\nLanguage: $language\nHome: $home\nAccess: $access\nHash: $hash\nStamp: $stamp\nPending: $pending\nFailed: $failed\nModified: $modified\nStatus: $status\n\n";
} else { } else {
$fileDataNew .= $line; $fileDataNew .= $line;
} }
@ -182,12 +182,12 @@ class YellowEdit {
"language" => $this->yellow->system->get("language"), "language" => $this->yellow->system->get("language"),
"home" => $this->yellow->system->get("editUserHome"), "home" => $this->yellow->system->get("editUserHome"),
"access" => $this->yellow->system->get("editUserAccess"), "access" => $this->yellow->system->get("editUserAccess"),
"status" => "active",
"pending" => "none",
"hash" => $this->users->createHash($password), "hash" => $this->users->createHash($password),
"stamp" => $this->users->createStamp(), "stamp" => $this->users->createStamp(),
"pending" => "none",
"failed" => "0", "failed" => "0",
"modified" => date("Y-m-d H:i:s", time())); "modified" => date("Y-m-d H:i:s", time()),
"status" => "active");
$status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($status=="error") echo "ERROR updating settings: Can't write file '$fileNameUser'!\n"; if ($status=="error") echo "ERROR updating settings: Can't write file '$fileNameUser'!\n";
$this->yellow->log($status=="ok" ? "info" : "error", "Add user '".strtok($name, " ")."'"); $this->yellow->log($status=="ok" ? "info" : "error", "Add user '".strtok($name, " ")."'");
@ -362,12 +362,12 @@ class YellowEdit {
"language" => $this->yellow->lookup->findLanguageFromFile($fileName, $this->yellow->system->get("language")), "language" => $this->yellow->lookup->findLanguageFromFile($fileName, $this->yellow->system->get("language")),
"home" => $this->yellow->system->get("editUserHome"), "home" => $this->yellow->system->get("editUserHome"),
"access" => $this->yellow->system->get("editUserAccess"), "access" => $this->yellow->system->get("editUserAccess"),
"status" => "unconfirmed",
"pending" => "none",
"hash" => $this->users->createHash($password), "hash" => $this->users->createHash($password),
"stamp" => $this->users->createStamp(), "stamp" => $this->users->createStamp(),
"pending" => "none",
"failed" => "0", "failed" => "0",
"modified" => date("Y-m-d H:i:s", time())); "modified" => date("Y-m-d H:i:s", time()),
"status" => "unconfirmed");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -392,7 +392,7 @@ class YellowEdit {
$this->response->status = $this->getUserStatus($email, $_REQUEST["action"]); $this->response->status = $this->getUserStatus($email, $_REQUEST["action"]);
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array("status" => "unapproved", "failed" => "0", "modified" => date("Y-m-d H:i:s", time())); $settings = array("failed" => "0", "modified" => date("Y-m-d H:i:s", time()), "status" => "unapproved");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -412,7 +412,7 @@ class YellowEdit {
$this->response->status = $this->getUserStatus($email, $_REQUEST["action"]); $this->response->status = $this->getUserStatus($email, $_REQUEST["action"]);
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array("status" => "active", "failed" => "0", "modified" => date("Y-m-d H:i:s", time())); $settings = array("failed" => "0", "modified" => date("Y-m-d H:i:s", time()), "status" => "active");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->yellow->log($this->response->status=="ok" ? "info" : "error", "Add user '".strtok($this->users->getUser($email, "name"), " ")."'"); $this->yellow->log($this->response->status=="ok" ? "info" : "error", "Add user '".strtok($this->users->getUser($email, "name"), " ")."'");
@ -473,7 +473,7 @@ class YellowEdit {
$this->response->status = $this->getUserStatus($email, $_REQUEST["action"]); $this->response->status = $this->getUserStatus($email, $_REQUEST["action"]);
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array("status" => "active", "failed" => "0", "modified" => date("Y-m-d H:i:s", time())); $settings = array("failed" => "0", "modified" => date("Y-m-d H:i:s", time()), "status" => "active");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "done" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "done" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -493,7 +493,7 @@ class YellowEdit {
} }
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array("status" => "unchanged", "failed" => "0", "modified" => date("Y-m-d H:i:s", time())); $settings = array("failed" => "0", "modified" => date("Y-m-d H:i:s", time()), "status" => "unchanged");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -518,11 +518,11 @@ class YellowEdit {
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array( $settings = array(
"status" => "active",
"pending" => "none",
"hash" => $hash, "hash" => $hash,
"pending" => "none",
"failed" => "0", "failed" => "0",
"modified" => date("Y-m-d H:i:s", time())); "modified" => date("Y-m-d H:i:s", time()),
"status" => "active");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -564,7 +564,7 @@ class YellowEdit {
$this->response->status = $this->getUserStatus($email, $_REQUEST["action"]); $this->response->status = $this->getUserStatus($email, $_REQUEST["action"]);
if ($this->response->status=="ok") { if ($this->response->status=="ok") {
$fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile"); $fileNameUser = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("editUserFile");
$settings = array("status" => "removed", "failed" => "0", "modified" => date("Y-m-d H:i:s", time())); $settings = array("failed" => "0", "modified" => date("Y-m-d H:i:s", time()), "status" => "removed");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
$this->yellow->log($this->response->status=="ok" ? "info" : "error", "Remove user '".strtok($this->users->getUser($email, "name"), " ")."'"); $this->yellow->log($this->response->status=="ok" ? "info" : "error", "Remove user '".strtok($this->users->getUser($email, "name"), " ")."'");
@ -606,12 +606,12 @@ class YellowEdit {
"language" => $language, "language" => $language,
"home" => $this->users->getUser($emailSource, "home"), "home" => $this->users->getUser($emailSource, "home"),
"access" => $this->users->getUser($emailSource, "access"), "access" => $this->users->getUser($emailSource, "access"),
"status" => "unverified",
"pending" => $emailSource,
"hash" => $this->users->createHash("none"), "hash" => $this->users->createHash("none"),
"stamp" => $this->users->createStamp(), "stamp" => $this->users->createStamp(),
"pending" => $emailSource,
"failed" => "0", "failed" => "0",
"modified" => date("Y-m-d H:i:s", time())); "modified" => date("Y-m-d H:i:s", time()),
"status" => "unverified");
$this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error"; $this->response->status = $this->users->save($fileNameUser, $email, $settings) ? "ok" : "error";
if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); if ($this->response->status=="error") $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
} }
@ -1214,8 +1214,7 @@ class YellowEditResponse {
public function getTextData() { public function getTextData() {
$textLanguage = $this->yellow->text->getData("language", $this->language); $textLanguage = $this->yellow->text->getData("language", $this->language);
$textEdit = $this->yellow->text->getData("edit", $this->language); $textEdit = $this->yellow->text->getData("edit", $this->language);
$textYellow = $this->yellow->text->getData("yellow", $this->language); return array_merge($textLanguage, $textEdit);
return array_merge($textLanguage, $textEdit, $textYellow);
} }
// Return settings actions // Return settings actions
@ -1236,7 +1235,7 @@ class YellowEditResponse {
if ($this->yellow->extensions->isExisting("emojiawesome")) $toolbarButtons .= ", emojiawesome"; if ($this->yellow->extensions->isExisting("emojiawesome")) $toolbarButtons .= ", emojiawesome";
if ($this->yellow->extensions->isExisting("fontawesome")) $toolbarButtons .= ", fontawesome"; if ($this->yellow->extensions->isExisting("fontawesome")) $toolbarButtons .= ", fontawesome";
if ($this->yellow->extensions->isExisting("draft")) $toolbarButtons .= ", draft"; if ($this->yellow->extensions->isExisting("draft")) $toolbarButtons .= ", draft";
if ($this->yellow->extensions->isExisting("markdown")) $toolbarButtons .= ", preview, markdown"; $toolbarButtons .= ", preview";
} }
} else { } else {
$toolbarButtons = $this->yellow->system->get("{$name}ToolbarButtons"); $toolbarButtons = $this->yellow->system->get("{$name}ToolbarButtons");

View file

@ -1,10 +1,10 @@
<?php <?php
// Install extension, https://github.com/datenstrom/yellow // Install extension, https://github.com/datenstrom/yellow
// Copyright (c) 2013-2019 Datenstrom, https://datenstrom.se // Copyright (c) 2013-2020 Datenstrom, https://datenstrom.se
// This file may be used and distributed under the terms of the public license. // This file may be used and distributed under the terms of the public license.
class YellowInstall { class YellowInstall {
const VERSION = "0.8.13"; const VERSION = "0.8.14";
const TYPE = "feature"; const TYPE = "feature";
const PRIORITY = "1"; const PRIORITY = "1";
public $yellow; //access to API public $yellow; //access to API
@ -35,7 +35,8 @@ class YellowInstall {
public function processCommandInstall() { public function processCommandInstall() {
$statusCode = $this->updateLog(); $statusCode = $this->updateLog();
if ($statusCode==200) $statusCode = $this->updateLanguage(); if ($statusCode==200) $statusCode = $this->updateLanguage();
if ($statusCode==200) $statusCode = $this->updateSettings($this->getSystemData()); if ($statusCode==200) $statusCode = $this->updateText("en");
if ($statusCode==200) $statusCode = $this->updateSystem($this->getSystemData());
if ($statusCode==200) $statusCode = $this->removeFiles(); if ($statusCode==200) $statusCode = $this->removeFiles();
if ($statusCode==200) { if ($statusCode==200) {
$statusCode = 0; $statusCode = 0;
@ -63,11 +64,13 @@ class YellowInstall {
$this->yellow->page->safeMode = false; $this->yellow->page->safeMode = false;
if ($status=="install") $status = $this->updateExtension($extension)==200 ? "ok" : "error"; if ($status=="install") $status = $this->updateExtension($extension)==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateUser($email, $password, $author, $language)==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateUser($email, $password, $author, $language)==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateContent($language, "Home", "/")==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateContent($language, "installHome", "/")==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateContent($language, "Default", "/shared/page-new-default")==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateContent($language, "installDefault", "/shared/page-new-default")==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateContent($language, "Blog", "/shared/page-new-blog")==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateContent($language, "installBlog", "/shared/page-new-blog")==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateContent($language, "Wiki", "/shared/page-new-wiki")==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateContent($language, "installWiki", "/shared/page-new-wiki")==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateSettings($this->getSystemData())==200 ? "ok" : "error"; if ($status=="ok") $status = $this->updateContent($language, "coreError404", "/shared/page-error-404")==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateText($language)==200 ? "ok" : "error";
if ($status=="ok") $status = $this->updateSystem($this->getSystemData())==200 ? "ok" : "error";
if ($status=="ok") $status = $this->removeFiles()==200 ? "done" : "error"; if ($status=="ok") $status = $this->removeFiles()==200 ? "done" : "error";
if ($status=="done") { if ($status=="done") {
$location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $location); $location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $location);
@ -179,12 +182,12 @@ class YellowInstall {
"language" => $language, "language" => $language,
"home" => "/", "home" => "/",
"access" => "create, edit, delete, upload, system, update", "access" => "create, edit, delete, upload, system, update",
"status" => "active",
"pending" => "none",
"hash" => $this->yellow->extensions->get("edit")->users->createHash($password), "hash" => $this->yellow->extensions->get("edit")->users->createHash($password),
"stamp" => $this->yellow->extensions->get("edit")->users->createStamp(), "stamp" => $this->yellow->extensions->get("edit")->users->createStamp(),
"pending" => "none",
"failed" => "0", "failed" => "0",
"modified" => time()); "modified" => time(),
"status" => "active");
if (!$this->yellow->extensions->get("edit")->users->save($fileNameUser, $email, $settings)) { if (!$this->yellow->extensions->get("edit")->users->save($fileNameUser, $email, $settings)) {
$statusCode = 500; $statusCode = 500;
$this->yellow->page->error(500, "Can't write file '$fileNameUser'!"); $this->yellow->page->error(500, "Can't write file '$fileNameUser'!");
@ -200,11 +203,11 @@ class YellowInstall {
$fileName = $this->yellow->lookup->findFileFromLocation($location); $fileName = $this->yellow->lookup->findFileFromLocation($location);
$fileData = strreplaceu("\r\n", "\n", $this->yellow->toolbox->readFile($fileName)); $fileData = strreplaceu("\r\n", "\n", $this->yellow->toolbox->readFile($fileName));
if (!empty($fileData) && $language!="en") { if (!empty($fileData) && $language!="en") {
$titleOld = "Title: ".$this->yellow->text->getText("install{$name}Title", "en"); $titleOld = "Title: ".$this->yellow->text->getText("{$name}Title", "en");
$titleNew = "Title: ".$this->yellow->text->getText("install{$name}Title", $language); $titleNew = "Title: ".$this->yellow->text->getText("{$name}Title", $language);
$textOld = strreplaceu("\\n", "\n", $this->yellow->text->getText("install{$name}Text", "en")); $textOld = strreplaceu("\\n", "\n", $this->yellow->text->getText("{$name}Text", "en"));
$textNew = strreplaceu("\\n", "\n", $this->yellow->text->getText("install{$name}Text", $language)); $textNew = strreplaceu("\\n", "\n", $this->yellow->text->getText("{$name}Text", $language));
if ($name!="Footer") $fileData = strreplaceu($titleOld, $titleNew, $fileData); $fileData = strreplaceu($titleOld, $titleNew, $fileData);
$fileData = strreplaceu($textOld, $textNew, $fileData); $fileData = strreplaceu($textOld, $textNew, $fileData);
if (!$this->yellow->toolbox->createFile($fileName, $fileData)) { if (!$this->yellow->toolbox->createFile($fileName, $fileData)) {
$statusCode = 500; $statusCode = 500;
@ -214,8 +217,26 @@ class YellowInstall {
return $statusCode; return $statusCode;
} }
// Update settings // Update text settings
public function updateSettings($settings) { public function updateText($language) {
$statusCode = 200;
$fileName = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("coreTextFile");
$fileData = $this->yellow->toolbox->readFile($fileName);
if (count($this->yellow->toolbox->getTextLines($fileData))<4) {
$fileData .= "Language: $language\n";
$fileData .= "CoreDateFormatMedium: ".$this->yellow->text->getText("coreDateFormatMedium", $language)."\n";
$fileData .= "EditLoginTitle: ".$this->yellow->text->getText("editLoginTitle", $language)."\n";
$fileData .= "picture.jpg: ".$this->yellow->text->getText("installExampleImage", $language)."\n";
if (!$this->yellow->toolbox->createFile($fileName, $fileData)) {
$statusCode = 500;
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
}
}
return $statusCode;
}
// Update system settings
public function updateSystem($settings) {
$statusCode = 200; $statusCode = 200;
$fileName = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("coreSystemFile"); $fileName = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("coreSystemFile");
if (!$this->yellow->system->save($fileName, $settings)) { if (!$this->yellow->system->save($fileName, $settings)) {

View file

@ -4,7 +4,7 @@
// This file may be used and distributed under the terms of the public license. // This file may be used and distributed under the terms of the public license.
class YellowUpdate { class YellowUpdate {
const VERSION = "0.8.14"; const VERSION = "0.8.15";
const TYPE = "feature"; const TYPE = "feature";
const PRIORITY = "2"; const PRIORITY = "2";
public $yellow; //access to API public $yellow; //access to API
@ -57,7 +57,7 @@ class YellowUpdate {
// Handle update // Handle update
public function onUpdate($action) { public function onUpdate($action) {
if ($action=="update") { //TODO: remove later, converts old server settings and layout files if ($action=="update") { //TODO: remove later, converts old server settings
if ($this->yellow->system->isExisting("staticUrl")) { if ($this->yellow->system->isExisting("staticUrl")) {
$coreStaticUrl = $this->yellow->system->get("staticUrl"); $coreStaticUrl = $this->yellow->system->get("staticUrl");
$coreServerUrl = empty($this->yellow->system->get("serverUrl")) ? "auto" : $this->yellow->system->get("serverUrl"); $coreServerUrl = empty($this->yellow->system->get("serverUrl")) ? "auto" : $this->yellow->system->get("serverUrl");
@ -65,22 +65,9 @@ class YellowUpdate {
$fileName = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("coreSystemFile"); $fileName = $this->yellow->system->get("coreSettingDir").$this->yellow->system->get("coreSystemFile");
$this->yellow->system->save($fileName, array("coreStaticUrl" => $coreStaticUrl, "coreServerUrl" => $coreServerUrl, $this->yellow->system->save($fileName, array("coreStaticUrl" => $coreStaticUrl, "coreServerUrl" => $coreServerUrl,
"coreServerTimezone" => $coreServerTimezone)); "coreServerTimezone" => $coreServerTimezone));
$path = $this->yellow->system->get("coreLayoutDir");
foreach ($this->yellow->toolbox->getDirectoryEntriesRecursive($path, "/^.*\.html$/", true, false) as $entry) {
$fileData = $fileDataNew = $this->yellow->toolbox->readFile($entry);
$fileDataNew = str_replace("system->get(\"serverScheme\")", "system->get(\"coreServerScheme\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"serverAddress\")", "system->get(\"coreServerAddress\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"serverBase\")", "system->get(\"coreServerBase\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"imageLocation\")", "system->get(\"coreImageLocation\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"extensionLocation\")", "system->get(\"coreExtensionLocation\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"resourceLocation\")", "system->get(\"coreResourceLocation\")", $fileDataNew);
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($entry, $fileDataNew)) {
$this->yellow->log("error", "Can't write file '$entry'!");
} }
} }
} if ($action=="update") { //TODO: remove later, converts old content settings
}
if ($action=="update") { //TODO: remove later, converts old core and status settings
if ($this->yellow->system->isExisting("safeMode")) { if ($this->yellow->system->isExisting("safeMode")) {
$coreSafeMode = $this->yellow->system->get("safeMode"); $coreSafeMode = $this->yellow->system->get("safeMode");
$coreMultiLanguageMode = $this->yellow->system->get("multiLanguageMode"); $coreMultiLanguageMode = $this->yellow->system->get("multiLanguageMode");
@ -112,6 +99,29 @@ class YellowUpdate {
} }
} }
} }
if ($action=="update") { //TODO: remove later, converts old layout files
if ($this->yellow->system->isExisting("navigation")) {
$navigation = $this->yellow->system->get("navigation");
$path = $this->yellow->system->get("coreLayoutDir");
foreach ($this->yellow->toolbox->getDirectoryEntriesRecursive($path, "/^.*\.html$/", true, false) as $entry) {
$fileData = $fileDataNew = $this->yellow->toolbox->readFile($entry);
$fileDataNew = str_replace("system->get(\"serverScheme\")", "system->get(\"coreServerScheme\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"serverAddress\")", "system->get(\"coreServerAddress\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"serverBase\")", "system->get(\"coreServerBase\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"imageLocation\")", "system->get(\"coreImageLocation\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"extensionLocation\")", "system->get(\"coreExtensionLocation\")", $fileDataNew);
$fileDataNew = str_replace("system->get(\"resourceLocation\")", "system->get(\"coreResourceLocation\")", $fileDataNew);
$fileDataNew = str_replace("text->getHtml(\"paginationNext\")", "text->getHtml(\"corePaginationNext\")", $fileDataNew);
$fileDataNew = str_replace("\$this->yellow->page->get(\"header\")", "\"header\"", $fileDataNew);
$fileDataNew = str_replace("\$this->yellow->page->get(\"sidebar\")", "\"sidebar\"", $fileDataNew);
$fileDataNew = str_replace("\$this->yellow->page->get(\"footer\")", "\"footer\"", $fileDataNew);
$fileDataNew = str_replace("\$this->yellow->page->get(\"navigation\")", "\"$navigation\"", $fileDataNew);
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($entry, $fileDataNew)) {
$this->yellow->log("error", "Can't write file '$entry'!");
}
}
}
}
if ($action=="startup") { if ($action=="startup") {
if ($this->yellow->system->get("updateNotification")!="none") { if ($this->yellow->system->get("updateNotification")!="none") {
foreach (explode(",", $this->yellow->system->get("updateNotification")) as $token) { foreach (explode(",", $this->yellow->system->get("updateNotification")) as $token) {

View file

@ -1,6 +1,5 @@
<?php $this->yellow->layout("header") ?> <?php $this->yellow->layout("header") ?>
<div class="content"> <div class="content">
<?php $this->yellow->layout("sidebar") ?>
<div class="main" role="main"> <div class="main" role="main">
<h1><?php echo $this->yellow->page->getHtml("titleContent") ?></h1> <h1><?php echo $this->yellow->page->getHtml("titleContent") ?></h1>
<?php echo $this->yellow->page->getContent() ?> <?php echo $this->yellow->page->getContent() ?>

View file

@ -1,5 +1,6 @@
<div class="footer" role="contentinfo"> <div class="footer" role="contentinfo">
<div class="siteinfo"> <div class="siteinfo">
<?php if ($page = $this->yellow->content->shared("footer")) $this->yellow->page->setPage("footer", $page) ?>
<?php if ($this->yellow->page->isPage("footer")) echo $this->yellow->page->getPage("footer")->getContent() ?> <?php if ($this->yellow->page->isPage("footer")) echo $this->yellow->page->getPage("footer")->getContent() ?>
<div class="siteinfo-banner"></div> <div class="siteinfo-banner"></div>
</div> </div>

View file

@ -12,17 +12,13 @@
<?php echo $this->yellow->page->getExtra("header") ?> <?php echo $this->yellow->page->getExtra("header") ?>
</head> </head>
<body> <body>
<?php if ($page = $this->yellow->content->shared($this->yellow->page->get("header"))) $this->yellow->page->setPage("header", $page) ?> <div class="<?php echo "page layout-".$this->yellow->page->getHtml("layout") ?>">
<?php if ($page = $this->yellow->content->shared($this->yellow->page->get("footer"))) $this->yellow->page->setPage("footer", $page) ?>
<?php if ($page = $this->yellow->content->shared($this->yellow->page->get("sidebar"))) $this->yellow->page->setPage("sidebar", $page) ?>
<?php if ($this->yellow->page->get("navigation")=="navigation-sidebar") $this->yellow->page->setPage("navigation-sidebar", $this->yellow->page) ?>
<?php $class = "page layout-".$this->yellow->page->get("layout").($this->yellow->page->isPage("sidebar") || $this->yellow->page->isPage("navigation-sidebar") ? " with-sidebar" : "") ?>
<div class="<?php echo htmlspecialchars($class) ?>">
<div class="header" role="banner"> <div class="header" role="banner">
<div class="sitename"> <div class="sitename">
<h1><a href="<?php echo $this->yellow->page->getBase(true)."/" ?>"><i class="sitename-logo"></i><?php echo $this->yellow->page->getHtml("sitename") ?></a></h1> <h1><a href="<?php echo $this->yellow->page->getBase(true)."/" ?>"><i class="sitename-logo"></i><?php echo $this->yellow->page->getHtml("sitename") ?></a></h1>
<?php if ($page = $this->yellow->content->shared("header")) $this->yellow->page->setPage("header", $page) ?>
<?php if ($this->yellow->page->isPage("header")) echo $this->yellow->page->getPage("header")->getContent() ?> <?php if ($this->yellow->page->isPage("header")) echo $this->yellow->page->getPage("header")->getContent() ?>
</div> </div>
<div class="sitename-banner"></div> <div class="sitename-banner"></div>
<?php $this->yellow->layout($this->yellow->page->get("navigation")) ?> <?php $this->yellow->layout("navigation") ?>
</div> </div>

View file

@ -1,10 +0,0 @@
<?php $pages = $this->yellow->content->top() ?>
<?php $this->yellow->page->setLastModified($pages->getModified()) ?>
<div class="navigation" role="navigation">
<ul>
<?php foreach ($pages as $page): ?>
<li><a<?php echo $page->isActive() ? " class=\"active\" aria-current=\"page\"" : "" ?> href="<?php echo $page->getLocation(true) ?>"><?php echo $page->getHtml("titleNavigation") ?></a></li>
<?php endforeach ?>
</ul>
</div>
<div class="navigation-banner"></div>

View file

@ -1,16 +0,0 @@
<?php list($name, $pages, $level) = $this->yellow->getLayoutArgs() ?>
<?php if (!$pages) $pages = $this->yellow->content->top() ?>
<?php $this->yellow->page->setLastModified($pages->getModified()) ?>
<?php if (!$level): ?>
<div class="navigation-tree" role="navigation">
<?php endif ?>
<ul>
<?php foreach ($pages as $page): ?>
<?php $children = $page->getChildren() ?>
<li><a<?php echo $page->isActive() ? " class=\"active\" aria-current=\"page\"" : "" ?> href="<?php echo $page->getLocation(true) ?>"><?php echo $page->getHtml("titleNavigation") ?></a><?php if ($children->count()) { echo "\n"; $this->yellow->layout($name, $children, $level+1); } ?></li>
<?php endforeach ?>
</ul>
<?php if (!$level): ?>
</div>
<div class="navigation-banner"></div>
<?php endif ?>

View file

@ -2,10 +2,10 @@
<?php if ($pages->isPagination()): ?> <?php if ($pages->isPagination()): ?>
<div class="pagination" role="navigation"> <div class="pagination" role="navigation">
<?php if ($pages->getPaginationPrevious()): ?> <?php if ($pages->getPaginationPrevious()): ?>
<a class="previous" href="<?php echo $pages->getPaginationPrevious() ?>"><?php echo $this->yellow->text->getHtml("paginationPrevious") ?></a> <a class="previous" href="<?php echo $pages->getPaginationPrevious() ?>"><?php echo $this->yellow->text->getHtml("corePaginationPrevious") ?></a>
<?php endif ?> <?php endif ?>
<?php if ($pages->getPaginationNext()): ?> <?php if ($pages->getPaginationNext()): ?>
<a class="next" href="<?php echo $pages->getPaginationNext() ?>"><?php echo $this->yellow->text->getHtml("paginationNext") ?></a> <a class="next" href="<?php echo $pages->getPaginationNext() ?>"><?php echo $this->yellow->text->getHtml("corePaginationNext") ?></a>
<?php endif ?> <?php endif ?>
</div> </div>
<?php endif ?> <?php endif ?>

View file

@ -1,20 +0,0 @@
<?php if ($this->yellow->page->isPage("sidebar")): ?>
<div class="sidebar" role="complementary">
<?php $page = $this->yellow->page->getPage("sidebar") ?>
<?php $page->setPage("main", $this->yellow->page) ?>
<?php echo $page->getContent() ?>
</div>
<?php elseif ($this->yellow->page->isPage("navigation-sidebar")): ?>
<div class="sidebar" role="complementary">
<div class="navigation-sidebar">
<?php $pages = $this->yellow->page->getParentTop(true)->getChildren() ?>
<?php $this->yellow->page->setLastModified($pages->getModified()) ?>
<p><?php echo $this->yellow->page->getHtml("titleNavigation") ?></p>
<ul>
<?php foreach ($pages as $page): ?>
<li><a<?php echo $page->isActive() ? " class=\"active\"" : "" ?> href="<?php echo $page->getLocation(true) ?>"><?php echo $page->getHtml("titleNavigation") ?></a></li>
<?php endforeach ?>
</ul>
</div>
</div>
<?php endif ?>

View file

@ -8,10 +8,6 @@ Layout: default
Theme: stockholm Theme: stockholm
Parser: markdown Parser: markdown
Status: public Status: public
Navigation: navigation
Header: header
Footer: footer
Sidebar: sidebar
CoreStaticUrl: CoreStaticUrl:
CoreStaticDefaultFile: index.html CoreStaticDefaultFile: index.html
@ -41,6 +37,7 @@ CoreContentRootDir: default/
CoreContentHomeDir: home/ CoreContentHomeDir: home/
CoreContentSharedDir: shared/ CoreContentSharedDir: shared/
CoreContentDefaultFile: page.md CoreContentDefaultFile: page.md
CoreContentErrorFile: page-error-(.*).md
CoreContentExtension: .md CoreContentExtension: .md
CoreDownloadExtension: .download CoreDownloadExtension: .download
CoreTextFile: text.ini CoreTextFile: text.ini