Updated API, removed some directory settings

This commit is contained in:
markseu 2022-04-19 01:14:42 +02:00
parent dabdf94a3d
commit 74dfcfe7a0
8 changed files with 217 additions and 197 deletions

View file

@ -2,7 +2,7 @@
// Bundle extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/bundle
class YellowBundle {
const VERSION = "0.8.25";
const VERSION = "0.8.26";
public $yellow; // access to API
// Handle initialisation
@ -76,7 +76,7 @@ class YellowBundle {
if (preg_match("/data-bundle=\"exclude\"/i", $value)) continue;
if (substru($key, 0, strlenu($base))!=$base) continue;
$location = substru($key, strlenu($base));
$fileName = $this->yellow->lookup->findFileFromSystem($location);
$fileName = $this->yellow->lookup->findFileFromMediaLocation($location);
$modified = max($modified, $this->yellow->toolbox->getFileModified($fileName));
if (is_readable($fileName)) {
array_push($fileNames, $fileName);

View file

@ -2,7 +2,7 @@
// Command extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/command
class YellowCommand {
const VERSION = "0.8.37";
const VERSION = "0.8.38";
public $yellow; // access to API
public $files; // number of files
public $links; // number of links
@ -123,9 +123,6 @@ class YellowCommand {
foreach ($this->getMediaLocations() as $location) {
$statusCode = max($statusCode, $this->buildStaticFile($path, $location));
}
foreach ($this->getSystemLocations() as $location) {
$statusCode = max($statusCode, $this->buildStaticFile($path, $location));
}
foreach ($this->getExtraLocations($path) as $location) {
$statusCode = max($statusCode, $this->buildStaticFile($path, $location));
}
@ -557,17 +554,13 @@ class YellowCommand {
// Return media locations
public function getMediaLocations() {
$locations = array();
$path = $this->yellow->system->get("coreMediaDirectory");
$fileNames = $this->yellow->toolbox->getDirectoryEntriesRecursive($path, "/.*/", false, false);
$mediaPath = $this->yellow->system->get("coreMediaDirectory");
$mediaDirectoryLength = strlenu($this->yellow->system->get("coreMediaDirectory"));
$fileNames = $this->yellow->toolbox->getDirectoryEntriesRecursive($mediaPath, "/.*/", false, false);
foreach ($fileNames as $fileName) {
array_push($locations, "/".$fileName);
$location = $this->yellow->system->get("coreMediaLocation").substru($fileName, $mediaDirectoryLength);
array_push($locations, $location);
}
return $locations;
}
// Return system locations
public function getSystemLocations() {
$locations = array();
$extensionPath = $this->yellow->system->get("coreExtensionDirectory");
$extensionDirectoryLength = strlenu($this->yellow->system->get("coreExtensionDirectory"));
$regex = "/\.(css|gif|ico|js|jpg|png|svg|woff|woff2)$/";
@ -583,11 +576,11 @@ class YellowCommand {
$location = $this->yellow->system->get("coreThemeLocation").substru($fileName, $themeDirectoryLength);
array_push($locations, $location);
}
return array_diff($locations, $this->getSystemLocationsIgnore());
return array_diff($locations, $this->getMediaLocationsIgnore());
}
// Return system locations to ignore
public function getSystemLocationsIgnore() {
// Return media locations to ignore
public function getMediaLocationsIgnore() {
$locations = array();
$extensionPath = $this->yellow->system->get("coreExtensionDirectory");
$extensionDirectoryLength = strlenu($this->yellow->system->get("coreExtensionDirectory"));
@ -635,6 +628,7 @@ class YellowCommand {
curl_exec($curlHandle);
$statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
curl_close($curlHandle);
if ($statusCode<200) $statusCode = 404;
if ($this->yellow->system->get("coreDebugMode")>=2) {
echo "YellowCommand::getLinkStatus status:$statusCode url:$url<br/>\n";
}

View file

@ -2,7 +2,7 @@
// Core extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/core
class YellowCore {
const VERSION = "0.8.68";
const VERSION = "0.8.69";
const RELEASE = "0.8.19";
public $page; // current page
public $content; // content files
@ -39,30 +39,17 @@ class YellowCore {
$this->system->setDefault("coreContentExtension", ".md");
$this->system->setDefault("coreContentDefaultFile", "page.md");
$this->system->setDefault("coreContentErrorFile", "page-error-(.*).md");
$this->system->setDefault("coreSystemFile", "yellow-system.ini");
$this->system->setDefault("coreUserFile", "yellow-user.ini");
$this->system->setDefault("coreLanguageFile", "yellow-language.ini");
$this->system->setDefault("coreWebsiteFile", "yellow-website.log");
$this->system->setDefault("coreMediaLocation", "/media/");
$this->system->setDefault("coreDownloadLocation", "/media/downloads/");
$this->system->setDefault("coreImageLocation", "/media/images/");
$this->system->setDefault("coreThumbnailLocation", "/media/thumbnails/");
$this->system->setDefault("coreExtensionLocation", "/media/extensions/");
$this->system->setDefault("coreThemeLocation", "/media/themes/");
$this->system->setDefault("coreMultiLanguageMode", "0");
$this->system->setDefault("coreDebugMode", "0");
$this->system->setDefault("coreMediaDirectory", "media/");
$this->system->setDefault("coreDownloadDirectory", "media/downloads/");
$this->system->setDefault("coreImageDirectory", "media/images/");
$this->system->setDefault("coreSystemDirectory", "system/");
$this->system->setDefault("coreCacheDirectory", "system/cache/");
$this->system->setDefault("coreExtensionDirectory", "system/extensions/");
$this->system->setDefault("coreLayoutDirectory", "system/layouts/");
$this->system->setDefault("coreThemeDirectory", "system/themes/");
$this->system->setDefault("coreTrashDirectory", "system/trash/");
$this->system->setDefault("coreContentDirectory", "content/");
$this->system->setDefault("coreContentRootDirectory", "default/");
$this->system->setDefault("coreContentHomeDirectory", "home/");
$this->system->setDefault("coreContentSharedDirectory", "shared/");
$this->language->setDefault("coreDateFormatShort");
$this->language->setDefault("coreDateFormatMedium");
$this->language->setDefault("coreDateFormatLong");
@ -86,12 +73,26 @@ class YellowCore {
// Handle initialisation
public function load() {
$this->system->load($this->system->get("coreExtensionDirectory").$this->system->get("coreSystemFile"));
$this->system->load("system/extensions/yellow-system.ini");
$this->system->set("coreSystemFile", "yellow-system.ini");
$this->system->set("coreContentDirectory", "content/");
$this->system->set("coreMediaDirectory", "media/");
$this->system->set("coreSystemDirectory", "system/");
$this->system->set("coreCacheDirectory", "system/cache/");
$this->system->set("coreExtensionDirectory", "system/extensions/");
$this->system->set("coreLayoutDirectory", "system/layouts/");
$this->system->set("coreThemeDirectory", "system/themes/");
$this->system->set("coreTrashDirectory", "system/trash/");
list($pathInstall, $pathRoot, $pathHome) = $this->lookup->findFileSystemInformation();
$this->system->set("coreServerInstallDirectory", $pathInstall);
$this->system->set("coreServerRootDirectory", $pathRoot);
$this->system->set("coreServerHomeDirectory", $pathHome);
register_shutdown_function(array($this, "processFatalError"));
if ($this->system->get("coreDebugMode")>=1) {
ini_set("display_errors", 1);
error_reporting(E_ALL);
}
date_default_timezone_set($this->system->get("coreTimezone"));
$this->user->load($this->system->get("coreExtensionDirectory").$this->system->get("coreUserFile"));
$this->language->load($this->system->get("coreExtensionDirectory"));
$this->language->load($this->system->get("coreExtensionDirectory").$this->system->get("coreLanguageFile"));
@ -185,10 +186,10 @@ class YellowCore {
// Read page
public function readPage($scheme, $address, $base, $location, $fileName, $cacheable, $statusCode, $pageError) {
if ($statusCode>=400) {
$locationError = $this->content->getHomeLocation($this->page->location).$this->system->get("coreContentSharedDirectory");
$fileNameError = $this->lookup->findFileFromLocation($locationError, true).$this->system->get("coreContentErrorFile");
$locationError = $this->content->getHomeLocation($this->page->location)."shared/";
$fileNameError = $this->lookup->findFileFromContentLocation($locationError, true).$this->system->get("coreContentErrorFile");
$fileNameError = str_replace("(.*)", $statusCode, $fileNameError);
$languageError = $this->lookup->findLanguageFromFile($fileName, $this->system->get("language"));
$languageError = $this->lookup->findContentLanguage($fileName, $this->system->get("language"));
if (is_file($fileNameError)) {
$rawData = $this->toolbox->readFile($fileNameError);
} elseif ($this->language->isText("coreError${statusCode}Title", $languageError)) {
@ -375,9 +376,8 @@ class YellowCore {
}
}
$location = substru($this->toolbox->detectServerLocation(), strlenu($base));
if (empty($fileName)) $fileName = $this->lookup->findFileFromSystem($location);
if (empty($fileName)) $fileName = $this->lookup->findFileFromMedia($location);
if (empty($fileName)) $fileName = $this->lookup->findFileFromLocation($location);
if (empty($fileName)) $fileName = $this->lookup->findFileFromMediaLocation($location);
if (empty($fileName)) $fileName = $this->lookup->findFileFromContentLocation($location);
return array($scheme, $address, $base, $location, $fileName);
}
@ -496,7 +496,7 @@ class YellowPage {
$this->metaData = new YellowArray();
if (!is_null($this->rawData)) {
$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->findContentLanguage($this->fileName, $this->yellow->system->get("language")));
$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"));
$titleHeader = ($this->location==$this->yellow->content->getHomeLocation($this->location)) ?
@ -1005,11 +1005,11 @@ class YellowPageCollection extends ArrayObject {
return $this;
}
// Filter page collection by file name
// Filter page collection by location
public function match($regex = "/.*/") {
$array = array();
foreach ($this->getArrayCopy() as $page) {
if (preg_match($regex, $page->fileName)) array_push($array, $page);
if (preg_match($regex, $page->location)) array_push($array, $page);
}
$this->exchangeArray($array);
return $this;
@ -1227,26 +1227,25 @@ class YellowContent {
// Scan file system on demand
public function scanLocation($location) {
if (!isset($this->pages[$location])) {
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowContent::scanLocation location:$location<br/>\n";
$this->pages[$location] = array();
$scheme = $this->yellow->page->scheme;
$address = $this->yellow->page->address;
$base = $this->yellow->page->base;
if (empty($location)) {
$rootLocations = $this->yellow->lookup->findRootLocations();
foreach ($rootLocations as $rootLocation) {
list($rootLocation, $fileName) = $this->yellow->toolbox->getTextList($rootLocation, " ", 2);
$rootLocations = $this->yellow->lookup->findContentRootLocations();
foreach ($rootLocations as $rootLocation=>$rootFileName) {
$page = new YellowPage($this->yellow);
$page->setRequestInformation($scheme, $address, $base, $rootLocation, $fileName);
$page->setRequestInformation($scheme, $address, $base, $rootLocation, $rootFileName);
$page->parseData("", false, 0);
array_push($this->pages[$location], $page);
}
} else {
$fileNames = $this->yellow->lookup->findChildrenFromLocation($location);
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowContent::scanLocation location:$location<br/>\n";
$fileNames = $this->yellow->lookup->findChildrenFromContentLocation($location);
foreach ($fileNames as $fileName) {
$page = new YellowPage($this->yellow);
$page->setRequestInformation($scheme, $address, $base,
$this->yellow->lookup->findLocationFromFile($fileName), $fileName);
$this->yellow->lookup->findContentLocationFromFile($fileName), $fileName);
$page->parseData($this->yellow->toolbox->readFile($fileName, 4096), false, 0);
if (strlenb($page->rawData)<4096) $page->statusCode = 200;
array_push($this->pages[$location], $page);
@ -1337,8 +1336,10 @@ class YellowContent {
// Return languages in multi language mode
public function getLanguages($showInvisible = false) {
$languages = array();
foreach ($this->scanLocation("") as $page) {
if ($page->isAvailable() && ($page->isVisible() || $showInvisible)) array_push($languages, $page->get("language"));
if ($this->yellow->system->get("coreMultiLanguageMode")) {
foreach ($this->scanLocation("") as $page) {
if ($page->isAvailable() && ($page->isVisible() || $showInvisible)) array_push($languages, $page->get("language"));
}
}
return $languages;
}
@ -1372,7 +1373,7 @@ class YellowContent {
// Return shared pages
public function getShared($location) {
$pages = new YellowPageCollection($this->yellow);
$location = $this->getHomeLocation($location).$this->yellow->system->get("coreContentSharedDirectory");
$location = $this->getHomeLocation($location)."shared/";
foreach ($this->scanLocation($location) as $page) {
if ($page->get("status")=="shared") $pages->append($page);
}
@ -1430,7 +1431,6 @@ class YellowMedia {
// Scan file system on demand
public function scanLocation($location) {
if (!isset($this->files[$location])) {
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowMedia::scanLocation location:$location<br/>\n";
$this->files[$location] = array();
$scheme = $this->yellow->page->scheme;
$address = $this->yellow->page->address;
@ -1438,18 +1438,13 @@ class YellowMedia {
if (empty($location)) {
$fileNames = array($this->yellow->system->get("coreMediaDirectory"));
} else {
$fileNames = array();
$path = substru($location, 1);
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, true, true) as $entry) {
array_push($fileNames, $entry."/");
}
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, false, true) as $entry) {
array_push($fileNames, $entry);
}
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowMedia::scanLocation location:$location<br/>\n";
$fileNames = $this->yellow->lookup->findChildrenFromMediaLocation($location);
}
foreach ($fileNames as $fileName) {
$file = new YellowPage($this->yellow);
$file->setRequestInformation($scheme, $address, $base, "/".$fileName, $fileName);
$file->setRequestInformation($scheme, $address, $base,
$this->yellow->lookup->findMediaLocationFromFile($fileName), $fileName);
$file->parseData(null, false, 0);
array_push($this->files[$location], $file);
}
@ -1547,20 +1542,15 @@ class YellowSystem {
// Load system settings from file
public function load($fileName) {
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowSystem::load file:$fileName<br/>\n";
$this->modified = $this->yellow->toolbox->getFileModified($fileName);
$fileData = $this->yellow->toolbox->readFile($fileName);
$this->settings = $this->yellow->toolbox->getTextSettings($fileData, "");
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowSystem::load file:$fileName<br/>\n";
if ($this->yellow->system->get("coreDebugMode")>=3) {
foreach ($this->settings as $key=>$value) {
echo "YellowSystem::load ".ucfirst($key).":$value<br/>\n";
}
}
list($pathInstall, $pathRoot, $pathHome) = $this->yellow->lookup->findFileSystemInformation();
$this->yellow->system->set("coreServerInstallDirectory", $pathInstall);
$this->yellow->system->set("coreContentRootDirectory", $pathRoot);
$this->yellow->system->set("coreContentHomeDirectory", $pathHome);
date_default_timezone_set($this->yellow->system->get("coreTimezone"));
}
// Save system settings to file
@ -1668,10 +1658,10 @@ class YellowUser {
// Load user settings from file
public function load($fileName) {
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowUser::load file:$fileName<br/>\n";
$this->modified = $this->yellow->toolbox->getFileModified($fileName);
$fileData = $this->yellow->toolbox->readFile($fileName);
$this->settings = $this->yellow->toolbox->getTextSettings($fileData, "email");
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowUser::load file:$fileName<br/>\n";
}
// Save user settings to file
@ -1771,7 +1761,6 @@ class YellowLanguage {
$regex = "/^.*\.txt$/";
}
foreach ($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false) as $entry) {
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowLanguage::load file:$entry<br/>\n";
$this->modified = max($this->modified, filemtime($entry));
$fileData = $this->yellow->toolbox->readFile($entry);
$settings = $this->yellow->toolbox->getTextSettings($fileData, "language");
@ -1784,6 +1773,7 @@ class YellowLanguage {
}
}
}
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowLanguage::load file:$entry<br/>\n";
}
foreach ($this->settings->getArrayCopy() as $key=>$value) {
if (!isset($this->settings[$key]["languageDescription"])) {
@ -1938,11 +1928,11 @@ class YellowExtension {
// Load extensions
public function load($path) {
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/^.*\.php$/", true, false) as $entry) {
if ($this->yellow->system->get("coreDebugMode")>=3) echo "YellowExtension::load file:$entry<br/>\n";
$this->modified = max($this->modified, filemtime($entry));
require_once($entry);
$name = $this->yellow->lookup->normaliseName(basename($entry), true, true);
$this->register(lcfirst($name), "Yellow".ucfirst($name));
if ($this->yellow->system->get("coreDebugMode")>=3) echo "YellowExtension::load file:$entry<br/>\n";
}
$callback = function ($a, $b) {
return $a["priority"] - $b["priority"];
@ -1994,10 +1984,10 @@ class YellowLookup {
public function findFileSystemInformation() {
$pathInstall = substru(__DIR__, 0, 1-strlenu($this->yellow->system->get("coreExtensionDirectory")));
$pathBase = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreContentRootDirectory");
$pathHome = $this->yellow->system->get("coreContentHomeDirectory");
if (!$this->yellow->system->get("coreMultiLanguageMode")) $pathRoot = "";
$pathRoot = $this->yellow->system->get("coreMultiLanguageMode") ? "default/" : "";
$pathHome = "home/";
if (!empty($pathRoot)) {
$firstRoot = "";
$token = $root = rtrim($pathRoot, "/");
foreach ($this->yellow->toolbox->getDirectoryEntries($pathBase, "/.*/", true, true, false) as $entry) {
if (empty($firstRoot)) $firstRoot = $token = $entry;
@ -2010,6 +2000,7 @@ class YellowLookup {
$pathBase .= "$firstRoot/";
}
if (!empty($pathHome)) {
$firstHome = "";
$token = $home = rtrim($pathHome, "/");
foreach ($this->yellow->toolbox->getDirectoryEntries($pathBase, "/.*/", true, true, false) as $entry) {
if (empty($firstHome)) $firstHome = $token = $entry;
@ -2022,32 +2013,51 @@ class YellowLookup {
}
return array($pathInstall, $pathRoot, $pathHome);
}
// Return root locations
public function findRootLocations($includePath = true) {
$locations = array();
// Return content language
public function findContentLanguage($fileName, $languageDefault) {
$language = $languageDefault;
$pathBase = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreContentRootDirectory");
$pathRoot = $this->yellow->system->get("coreServerRootDirectory");
if (!empty($pathRoot)) {
$fileName = substru($fileName, strlenu($pathBase));
if (preg_match("/^(.+?)\//", $fileName, $matches)) {
$name = $this->normaliseToken($matches[1]);
if (strlenu($name)==2) $language = $name;
}
}
return $language;
}
// Return content root locations
public function findContentRootLocations() {
$rootLocations = array();
$pathBase = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreServerRootDirectory");
if (!empty($pathRoot)) {
foreach ($this->yellow->toolbox->getDirectoryEntries($pathBase, "/.*/", true, true, false) as $entry) {
$token = $this->normaliseToken($entry)."/";
if ($token==$pathRoot) $token = "";
array_push($locations, $includePath ? "root/$token $pathBase$entry/" : "root/$token");
if ($this->yellow->system->get("coreDebugMode")>=2) echo "YellowLookup::findRootLocations root/$token<br/>\n";
$rootLocations["root/$token"] = "$pathBase$entry/";
}
} else {
array_push($locations, $includePath ? "root/ $pathBase" : "root/");
$rootLocations["root/"] = "$pathBase";
}
return $locations;
if ($this->yellow->system->get("coreDebugMode")>=3) {
foreach ($rootLocations as $key=>$key) {
echo "YellowLookup::findContentRootLocations $key -> $value<br/>\n";
}
}
return $rootLocations;
}
// Return location from file path
public function findLocationFromFile($fileName) {
// Return content location from file path
public function findContentLocationFromFile($fileName) {
$invalid = false;
$location = "/";
$pathBase = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreContentRootDirectory");
$pathHome = $this->yellow->system->get("coreContentHomeDirectory");
$pathRoot = $this->yellow->system->get("coreServerRootDirectory");
$pathHome = $this->yellow->system->get("coreServerHomeDirectory");
$fileDefault = $this->yellow->system->get("coreContentDefaultFile");
$fileExtension = $this->yellow->system->get("coreContentExtension");
if (substru($fileName, 0, strlenu($pathBase))==$pathBase && mb_check_encoding($fileName, "UTF-8")) {
@ -2073,17 +2083,17 @@ class YellowLookup {
}
if ($this->yellow->system->get("coreDebugMode")>=2) {
$debug = ($invalid ? "INVALID" : $location)." <- $pathBase$fileName";
echo "YellowLookup::findLocationFromFile $debug<br/>\n";
echo "YellowLookup::findContentLocationFromFile $debug<br/>\n";
}
return $invalid ? "" : $location;
}
// Return file path from location
public function findFileFromLocation($location, $directory = false) {
// Return file path from content location
public function findFileFromContentLocation($location, $directory = false) {
$found = $invalid = false;
$path = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreContentRootDirectory");
$pathHome = $this->yellow->system->get("coreContentHomeDirectory");
$pathRoot = $this->yellow->system->get("coreServerRootDirectory");
$pathHome = $this->yellow->system->get("coreServerHomeDirectory");
$fileDefault = $this->yellow->system->get("coreContentDefaultFile");
$fileExtension = $this->yellow->system->get("coreContentExtension");
$tokens = explode("/", $location);
@ -2123,13 +2133,88 @@ class YellowLookup {
}
if ($this->yellow->system->get("coreDebugMode")>=2) {
$debug = "$location -> ".($invalid ? "INVALID" : $path);
echo "YellowLookup::findFileFromLocation $debug<br/>\n";
echo "YellowLookup::findFileFromContentLocation $debug<br/>\n";
}
}
}
return $invalid ? "" : $path;
}
// Return children from content location
public function findChildrenFromContentLocation($location) {
$fileNames = array();
if (!$this->isFileLocation($location)) {
$path = $this->findFileFromContentLocation($location, true);
$fileDefault = $this->yellow->system->get("coreContentDefaultFile");
$fileExtension = $this->yellow->system->get("coreContentExtension");
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, true, false) as $entry) {
$token = $this->findFileDefault($path.$entry, $fileDefault, $fileExtension, false);
array_push($fileNames, $path.$entry."/".$token);
}
if (!$this->isRootLocation($location)) {
$regex = "/^.*\\".$fileExtension."$/";
foreach ($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false, false) as $entry) {
if ($this->normaliseToken($entry, $fileExtension)==$fileDefault) continue;
array_push($fileNames, $path.$entry);
}
}
}
return $fileNames;
}
// Return media location from file path
public function findMediaLocationFromFile($fileName) {
$location = "";
$mediaDirectoryLength = strlenu($this->yellow->system->get("coreMediaDirectory"));
if (substru($fileName, 0, $mediaDirectoryLength)==$this->yellow->system->get("coreMediaDirectory")) {
$location = $this->yellow->system->get("coreMediaLocation").substru($fileName, $mediaDirectoryLength);
}
return $location;
}
// Return file path from media location
public function findFileFromMediaLocation($location) {
$fileName = "";
if ($this->isFileLocation($location)) {
$regex = "/\.(css|gif|ico|js|jpg|png|svg|woff|woff2)$/";
$extensionLocationLength = strlenu($this->yellow->system->get("coreExtensionLocation"));
$themeLocationLength = strlenu($this->yellow->system->get("coreThemeLocation"));
$mediaLocationLength = strlenu($this->yellow->system->get("coreMediaLocation"));
if (substru($location, 0, $extensionLocationLength)==$this->yellow->system->get("coreExtensionLocation")) {
if (preg_match($regex, $location)) {
$fileName = $this->yellow->system->get("coreExtensionDirectory").substru($location, $extensionLocationLength);
}
} elseif (substru($location, 0, $themeLocationLength)==$this->yellow->system->get("coreThemeLocation")) {
if (preg_match($regex, $location)) {
$fileName = $this->yellow->system->get("coreThemeDirectory").substru($location, $themeLocationLength);
}
} elseif (substru($location, 0, $mediaLocationLength)==$this->yellow->system->get("coreMediaLocation")) {
$fileName = $this->yellow->system->get("coreMediaDirectory").substru($location, $mediaLocationLength);
}
} else {
$mediaLocationLength = strlenu($this->yellow->system->get("coreMediaLocation"));
if (substru($location, 0, $mediaLocationLength)==$this->yellow->system->get("coreMediaLocation")) {
$fileName = $this->yellow->system->get("coreMediaDirectory").substru($location, $mediaLocationLength);
}
}
return $fileName;
}
// Return children from media location
public function findChildrenFromMediaLocation($location) {
$fileNames = array();
if (!$this->isFileLocation($location)) {
$path = $this->findFileFromMediaLocation($location);
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, true, true) as $entry) {
array_push($fileNames, $entry."/");
}
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, false, true) as $entry) {
array_push($fileNames, $entry);
}
}
return $fileNames;
}
// Return file or directory that matches token
public function findFileDirectory($path, $token, $fileExtension, $directory, $default, &$found, &$invalid) {
if ($this->normaliseToken($token, $fileExtension)!=$token) $invalid = true;
@ -2162,70 +2247,6 @@ class YellowLookup {
return $includePath ? "$path/$token" : $token;
}
// Return children from location
public function findChildrenFromLocation($location) {
$fileNames = array();
$fileDefault = $this->yellow->system->get("coreContentDefaultFile");
$fileExtension = $this->yellow->system->get("coreContentExtension");
if (!$this->isFileLocation($location)) {
$path = $this->findFileFromLocation($location, true);
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", true, true, false) as $entry) {
$token = $this->findFileDefault($path.$entry, $fileDefault, $fileExtension, false);
array_push($fileNames, $path.$entry."/".$token);
}
if (!$this->isRootLocation($location)) {
$regex = "/^.*\\".$fileExtension."$/";
foreach ($this->yellow->toolbox->getDirectoryEntries($path, $regex, true, false, false) as $entry) {
if ($this->normaliseToken($entry, $fileExtension)==$fileDefault) continue;
array_push($fileNames, $path.$entry);
}
}
}
return $fileNames;
}
// Return language from file path
public function findLanguageFromFile($fileName, $languageDefault) {
$language = $languageDefault;
$pathBase = $this->yellow->system->get("coreContentDirectory");
$pathRoot = $this->yellow->system->get("coreContentRootDirectory");
if (!empty($pathRoot)) {
$fileName = substru($fileName, strlenu($pathBase));
if (preg_match("/^(.+?)\//", $fileName, $matches)) {
$name = $this->normaliseToken($matches[1]);
if (strlenu($name)==2) $language = $name;
}
}
return $language;
}
// Return file path from media location
public function findFileFromMedia($location) {
$fileName = null;
if ($this->isFileLocation($location)) {
$mediaLocationLength = strlenu($this->yellow->system->get("coreMediaLocation"));
if (substru($location, 0, $mediaLocationLength)==$this->yellow->system->get("coreMediaLocation")) {
$fileName = $this->yellow->system->get("coreMediaDirectory").substru($location, 7);
}
}
return $fileName;
}
// Return file path from system location
public function findFileFromSystem($location) {
$fileName = null;
if (preg_match("/\.(css|gif|ico|js|jpg|png|svg|woff|woff2)$/", $location)) {
$extensionLocationLength = strlenu($this->yellow->system->get("coreExtensionLocation"));
$themeLocationLength = strlenu($this->yellow->system->get("coreThemeLocation"));
if (substru($location, 0, $extensionLocationLength)==$this->yellow->system->get("coreExtensionLocation")) {
$fileName = $this->yellow->system->get("coreExtensionDirectory").substru($location, $extensionLocationLength);
} elseif (substru($location, 0, $themeLocationLength)==$this->yellow->system->get("coreThemeLocation")) {
$fileName = $this->yellow->system->get("coreThemeDirectory").substru($location, $themeLocationLength);
}
}
return $fileName;
}
// Normalise file/directory token
public function normaliseToken($text, $fileExtension = "", $removeExtension = false) {
if (!empty($fileExtension)) $text = ($pos = strrposu($text, ".")) ? substru($text, 0, $pos) : $text;
@ -2345,7 +2366,7 @@ class YellowLookup {
public function isRedirectLocation($location) {
$redirect = false;
if ($this->isFileLocation($location)) {
$redirect = is_dir($this->findFileFromLocation("$location/", true));
$redirect = is_dir($this->findFileFromContentLocation("$location/", true));
} elseif ($location=="/") {
$redirect = $this->yellow->system->get("coreMultiLanguageMode");
}
@ -2367,7 +2388,7 @@ class YellowLookup {
$available = true;
$pathBase = $this->yellow->system->get("coreContentDirectory");
if (substru($fileName, 0, strlenu($pathBase))==$pathBase) {
$sharedLocation = $this->yellow->content->getHomeLocation($location).$this->yellow->system->get("coreContentSharedDirectory");
$sharedLocation = $this->yellow->content->getHomeLocation($location)."shared/";
if (substru($location, 0, strlenu($sharedLocation))==$sharedLocation) $available = false;
}
return $available;
@ -3257,7 +3278,7 @@ class YellowToolbox {
return $languageFound;
}
// Detect image width, height, orientation and type for gif/jpg/png/svg
// Detect image width, height, orientation and type for GIF/JPG/PNG/SVG
public function detectImageInformation($fileName, $fileType = "") {
$width = $height = $orientation = 0;
$type = "";

View file

@ -2,7 +2,7 @@
// Edit extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/edit
class YellowEdit {
const VERSION = "0.8.56";
const VERSION = "0.8.57";
public $yellow; // access to API
public $response; // web response
public $merge; // text merge
@ -351,7 +351,7 @@ class YellowEdit {
$fileNameUser = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreUserFile");
$settings = array(
"name" => $name,
"language" => $this->yellow->lookup->findLanguageFromFile($fileName, $this->yellow->system->get("language")),
"language" => $this->yellow->lookup->findContentLanguage($fileName, $this->yellow->system->get("language")),
"home" => $this->yellow->system->get("editUserHome"),
"access" => $this->yellow->system->get("editUserAccess"),
"hash" => $this->response->createHash($password),
@ -1356,16 +1356,16 @@ class YellowEditResponse {
foreach ($this->yellow->content->path($page->location)->reverse() as $ancestor) {
if ($ancestor->isExisting("layoutNew")) {
$name = $this->yellow->lookup->normaliseName($ancestor->get("layoutNew"));
$location = $this->yellow->content->getHomeLocation($page->location).$this->yellow->system->get("coreContentSharedDirectory");
$fileName = $this->yellow->lookup->findFileFromLocation($location, true).$this->yellow->system->get("editNewFile");
$location = $this->yellow->content->getHomeLocation($page->location)."shared/";
$fileName = $this->yellow->lookup->findFileFromContentLocation($location, true).$this->yellow->system->get("editNewFile");
$fileName = str_replace("(.*)", $name, $fileName);
if (is_file($fileName)) break;
}
}
if (!is_file($fileName)) {
$name = $this->yellow->lookup->normaliseName($this->yellow->system->get("layout"));
$location = $this->yellow->content->getHomeLocation($page->location).$this->yellow->system->get("coreContentSharedDirectory");
$fileName = $this->yellow->lookup->findFileFromLocation($location, true).$this->yellow->system->get("editNewFile");
$location = $this->yellow->content->getHomeLocation($page->location)."shared/";
$fileName = $this->yellow->lookup->findFileFromContentLocation($location, true).$this->yellow->system->get("editNewFile");
$fileName = str_replace("(.*)", $name, $fileName);
}
if (is_file($fileName)) {
@ -1431,7 +1431,7 @@ class YellowEditResponse {
// Return file name for new/modified page
public function getPageNewFile($location, $pageFileName = "", $pagePrefix = "") {
$fileName = $this->yellow->lookup->findFileFromLocation($location);
$fileName = $this->yellow->lookup->findFileFromContentLocation($location);
if (!empty($fileName)) {
if (!is_dir(dirname($fileName))) {
$path = "";
@ -1503,10 +1503,15 @@ class YellowEditResponse {
// Return group for new file
public function getFileNewGroup($fileNameShort) {
$group = "none";
$path = $this->yellow->system->get("coreMediaDirectory");
$fileType = $this->yellow->toolbox->getFileType($fileNameShort);
$fileName = $this->yellow->system->get(preg_match("/(gif|jpg|png|svg)$/", $fileType) ? "coreImageDirectory" : "coreDownloadDirectory").$fileNameShort;
if (preg_match("#^$path(.+?)\/#", $fileName, $matches)) $group = strtoloweru($matches[1]);
$locationMedia = $this->yellow->system->get("coreMediaLocation");
$locationGroup = $this->yellow->system->get("coreDownloadLocation");
if (preg_match("/(gif|jpg|png|svg)$/", $fileType)) {
$locationGroup = $this->yellow->system->get("coreImageLocation");
}
if (preg_match("#^$locationMedia(.+?)\/#", $locationGroup, $matches)) {
$group = strtoloweru($matches[1]);
}
return $group;
}

View file

@ -2,7 +2,7 @@
// Image extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/image
class YellowImage {
const VERSION = "0.8.14";
const VERSION = "0.8.15";
public $yellow; // access to API
// Handle initialisation
@ -11,8 +11,6 @@ class YellowImage {
$this->yellow->system->setDefault("imageUploadWidthMax", "1280");
$this->yellow->system->setDefault("imageUploadHeightMax", "1280");
$this->yellow->system->setDefault("imageUploadJpgQuality", "80");
$this->yellow->system->setDefault("imageThumbnailLocation", "/media/thumbnails/");
$this->yellow->system->setDefault("imageThumbnailDirectory", "media/thumbnails/");
$this->yellow->system->setDefault("imageThumbnailJpgQuality", "80");
$this->yellow->language->setDefault("imageDefaultAlt");
}
@ -21,7 +19,7 @@ class YellowImage {
public function onUpdate($action) {
if ($action=="clean") {
$statusCode = 200;
$path = $this->yellow->system->get("imageThumbnailDirectory");
$path = $this->yellow->lookup->findFileFromMediaLocation($this->yellow->system->get("coreThumbnailLocation"));
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/.*/", false, false) as $entry) {
if (!$this->yellow->toolbox->deleteFile($entry)) $statusCode = 500;
}
@ -38,7 +36,8 @@ class YellowImage {
if (empty($alt)) $alt = $this->yellow->language->getText("imageDefaultAlt");
if (empty($width)) $width = "100%";
if (empty($height)) $height = $width;
list($src, $width, $height) = $this->getImageInformation($this->yellow->system->get("coreImageDirectory").$name, $width, $height);
$path = $this->yellow->lookup->findFileFromMediaLocation($this->yellow->system->get("coreImageLocation"));
list($src, $width, $height) = $this->getImageInformation($path.$name, $width, $height);
} else {
if (empty($alt)) $alt = $this->yellow->language->getText("imageDefaultAlt");
$src = $this->yellow->lookup->normaliseUrl("", "", "", $name);
@ -83,7 +82,8 @@ class YellowImage {
// Return image information, create thumbnail on demand
public function getImageInformation($fileName, $widthOutput, $heightOutput) {
$fileNameShort = substru($fileName, strlenu($this->yellow->system->get("coreImageDirectory")));
$pathImage = $this->yellow->lookup->findFileFromMediaLocation($this->yellow->system->get("coreImageLocation"));
$fileNameShort = substru($fileName, strlenu($pathImage));
list($widthInput, $heightInput, $orientation, $type) = $this->yellow->toolbox->detectImageInformation($fileName);
$widthOutput = $this->convertValueAndUnit($widthOutput, $widthInput);
$heightOutput = $this->convertValueAndUnit($heightOutput, $heightInput);
@ -92,10 +92,11 @@ class YellowImage {
$width = $widthOutput;
$height = $heightOutput;
} else {
$pathThumb = $this->yellow->lookup->findFileFromMediaLocation($this->yellow->system->get("coreThumbnailLocation"));
$fileNameThumb = ltrim(str_replace(array("/", "\\", "."), "-", dirname($fileNameShort)."/".pathinfo($fileName, PATHINFO_FILENAME)), "-");
$fileNameThumb .= "-".$widthOutput."x".$heightOutput;
$fileNameThumb .= ".".pathinfo($fileName, PATHINFO_EXTENSION);
$fileNameOutput = $this->yellow->system->get("imageThumbnailDirectory").$fileNameThumb;
$fileNameOutput = $pathThumb.$fileNameThumb;
if ($this->isFileNotUpdated($fileName, $fileNameOutput)) {
$image = $this->loadImage($fileName, $type);
$image = $this->resizeImage($image, $widthInput, $heightInput, $widthOutput, $heightOutput);
@ -106,7 +107,7 @@ class YellowImage {
$this->yellow->page->error(500, "Can't write file '$fileNameOutput'!");
}
}
$src = $this->yellow->system->get("coreServerBase").$this->yellow->system->get("imageThumbnailLocation").$fileNameThumb;
$src = $this->yellow->system->get("coreServerBase").$this->yellow->system->get("coreThumbnailLocation").$fileNameThumb;
list($width, $height) = $this->yellow->toolbox->detectImageInformation($fileNameOutput);
}
return array($src, $width, $height);

View file

@ -2,7 +2,7 @@
// Install extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/install
class YellowInstall {
const VERSION = "0.8.68";
const VERSION = "0.8.69";
const PRIORITY = "1";
public $yellow; // access to API
@ -216,7 +216,7 @@ class YellowInstall {
// Update content
public function updateContent($language, $name, $location) {
$statusCode = 200;
$fileName = $this->yellow->lookup->findFileFromLocation($location);
$fileName = $this->yellow->lookup->findFileFromContentLocation($location);
$fileData = str_replace("\r\n", "\n", $this->yellow->toolbox->readFile($fileName));
if (!empty($fileData) && $language!="en") {
$titleOld = "Title: ".$this->yellow->language->getText("{$name}Title", "en")."\n";

View file

@ -1,31 +1,31 @@
# Datenstrom Yellow update settings
Extension: Bundle
Version: 0.8.25
Version: 0.8.26
Description: Bundle website files.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/bundle
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/bundle.zip
Published: 2022-04-13 18:41:53
Published: 2022-04-18 17:44:11
Developer: Datenstrom
Tag: feature
system/extensions/bundle.php: bundle.php, create, update
Extension: Command
Version: 0.8.37
Version: 0.8.38
Description: Command line of the website.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/command
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/command.zip
Published: 2022-04-17 02:25:54
Published: 2022-04-18 22:37:50
Developer: Datenstrom
Tag: feature
system/extensions/command.php: command.php, create, update
Extension: Core
Version: 0.8.68
Version: 0.8.69
Description: Core functionality of the website.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/core
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/core.zip
Published: 2022-04-17 02:00:23
Published: 2022-04-18 23:13:06
Developer: Datenstrom
Tag: feature
system/extensions/core.php: core.php, create, update
@ -37,11 +37,11 @@ system/layouts/navigation.html: navigation.html, create, update, careful
system/layouts/pagination.html: pagination.html, create, update, careful
Extension: Edit
Version: 0.8.56
Version: 0.8.57
Description: Edit your website in a web browser.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/edit
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/edit.zip
Published: 2022-03-11 00:51:13
Published: 2022-04-18 23:11:04
Developer: Datenstrom
Tag: feature
system/extensions/edit.php: edit.php, create, update
@ -52,11 +52,11 @@ system/extensions/edit.woff: edit.woff, delete
content/shared/page-new-default.md: page-new-default.md, create, optional
Extension: Image
Version: 0.8.14
Version: 0.8.15
Description: Images and thumbnails.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/image
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/image.zip
Published: 2022-04-13 18:42:22
Published: 2022-04-18 22:15:10
Developer: Datenstrom
Tag: feature
system/extensions/image.php: image.php, create, update
@ -64,11 +64,11 @@ media/images/photo.jpg: photo.jpg, create, optional
media/thumbnails/photo-100x40.jpg: photo-100x40.jpg, create, optional
Extension: Install
Version: 0.8.68
Version: 0.8.69
Description: Install a brand new, shiny website.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/install
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/install.zip
Published: 2022-04-17 01:09:22
Published: 2022-04-18 23:25:29
Developer: Datenstrom
Status: unlisted
system/extensions/install.php: install.php, create
@ -131,11 +131,11 @@ system/themes/stockholm-opensans-light.woff: stockholm-opensans-light.woff, crea
system/themes/stockholm-opensans-regular.woff: stockholm-opensans-regular.woff, create, update, careful
Extension: Update
Version: 0.8.70
Version: 0.8.71
Description: Keep your website up to date.
DocumentationUrl: https://github.com/datenstrom/yellow-extensions/tree/master/source/update
DownloadUrl: https://github.com/datenstrom/yellow-extensions/raw/master/zip/update.zip
Published: 2022-04-17 02:29:57
Published: 2022-04-18 17:44:30
Developer: Datenstrom
Tag: feature
system/extensions/update.php: update.php, create, update

View file

@ -2,7 +2,7 @@
// Update extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/update
class YellowUpdate {
const VERSION = "0.8.70";
const VERSION = "0.8.71";
const PRIORITY = "2";
public $yellow; // access to API
public $extensions; // number of extensions
@ -496,7 +496,6 @@ class YellowUpdate {
$fileDataComments .= $line;
}
}
unset($settings["coreSystemFile"]);
foreach ($settings as $key=>$value) {
$fileDataSettings .= ucfirst($key).(strempty($value) ? ":\n" : ": $value\n");
}