mikuli.cz

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

commit 1f2b81f1d2f8bc5eb1525e954f9566772e29453b
parent aa395003ac3bdf756618e4f5cc2393dcafd8b6cf
Author: markseu <mark2011@mayberg.se>
Date:   Tue,  4 Feb 2014 15:06:48 +0100

Hello static pages

Diffstat:
Msystem/core/core-commandline.php | 112++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Msystem/core/core.php | 48+++++++++++++++++++++++++++++++++++++++---------
2 files changed, 118 insertions(+), 42 deletions(-)

diff --git a/system/core/core-commandline.php b/system/core/core-commandline.php @@ -5,9 +5,13 @@ // Command line core plugin class YellowCommandline { - const Version = "0.2.3"; + const Version = "0.2.4"; var $yellow; //access to API - + var $content; //number of content pages + var $error; //number of build errors + var $locationsArgs; //build locations with arguments + var $locationsPage; //build locations with pagination + // Initialise plugin function onLoad($yellow) { @@ -81,11 +85,12 @@ class YellowCommandline return $statusCode; } - // Build static files + // Build static locations and files function buildStatic($location, $path) { $this->yellow->toolbox->timerStart($time); - $statusCodeMax = $error = 0; + $this->content = $this->error = $statusCodeMax = 0; + $this->locationsArgs = $this->locationsPage = array(); if(empty($location)) { $pages = $this->yellow->pages->index(true); @@ -102,26 +107,36 @@ class YellowCommandline } foreach($pages as $page) { - $statusCode = $this->buildStaticLocation($page->location, $path); - $statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error; + $statusCodeMax = max($statusCodeMax, $this->buildStaticLocation($page->location, $path, empty($location))); + } + foreach($this->locationsArgs as $location) + { + $statusCodeMax = max($statusCodeMax, $this->buildStaticLocation($location, $path, true)); + } + foreach($this->locationsPage as $location) + { + for($pageNumber=2; $pageNumber<=999; ++$pageNumber) + { + $statusCode = $this->buildStaticLocation($location.$pageNumber, $path, false, true); + $statusCodeMax = max($statusCodeMax, $statusCode); + if($statusCode == 0) break; + } } foreach($fileNamesMedia as $fileName) { - $statusCode = $this->buildStaticFile($fileName, "$path/$fileName", "media file"); - $statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error; + $statusCodeMax = max($statusCodeMax, $this->buildStaticFile($fileName, "$path/$fileName", "media file")); } foreach($fileNamesSystem as $fileName) { - $statusCode = $this->buildStaticFile($fileName, "$path/$fileName", "system file"); - $statusCodeMax = max($statusCodeMax, $statusCode); if($statusCode >= 400) ++$error; + $statusCodeMax = max($statusCodeMax, $this->buildStaticFile($fileName, "$path/$fileName", "system file")); } $this->yellow->toolbox->timerStop($time); if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic time:$time ms\n"; - return array($statusCodeMax, count($pages), count($fileNamesMedia), count($fileNamesSystem), $error); + return array($statusCodeMax, $this->content, count($fileNamesMedia), count($fileNamesSystem), $this->error); } // Build static location - function buildStaticLocation($location, $path) + function buildStaticLocation($location, $path, $analyse = false, $probe = false) { ob_start(); $_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1"; @@ -144,23 +159,8 @@ class YellowCommandline $fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) && $this->yellow->toolbox->modifyFile($fileName, $modified); } else { - if(!$this->yellow->toolbox->isFileLocation($location)) - { - $fileName = $this->getStaticFileName($location, $path); - $fileData = $this->getStaticRedirect($staticLocation); - $fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) && - $this->yellow->toolbox->modifyFile($fileName, $modified); - if($fileOk) - { - $fileName = $this->getStaticFileName($staticLocation, $path); - $fileData = ob_get_contents(); - $fileOk = $this->yellow->toolbox->createFile($fileName, $fileData, true) && - $this->yellow->toolbox->modifyFile($fileName, $modified); - } - } else { - $statusCode = 409; - $this->yellow->page->error($statusCode, "Type '$contentType' does not match file name!"); - } + $statusCode = 409; + $this->yellow->page->error($statusCode, "Type '$contentType' does not match file name!"); } if(!$fileOk) { @@ -169,7 +169,14 @@ class YellowCommandline } } ob_end_clean(); - if($statusCode>=400) echo "ERROR building location '$location', ".$this->yellow->page->getStatusCode(true)."\n"; + if($statusCode==200 && $analyse) $this->analyseStaticLocation($fileData); + if($statusCode==404 && $probe) $statusCode = 0; + if($statusCode != 0) ++$this->content; + if($statusCode >= 400) + { + ++$this->error; + echo "ERROR building content location '$location', ".$this->yellow->page->getStatusCode(true)."\n"; + } if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticLocation status:$statusCode location:$location\n"; return $statusCode; } @@ -206,11 +213,50 @@ class YellowCommandline } ob_end_clean(); } - if($statusCode>=400) echo "ERROR building $fileType '$fileNameSource', ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode)."\n"; + if($statusCode >= 400) + { + ++$this->error; + echo "ERROR building $fileType '$fileNameSource', ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode)."\n"; + } if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticFile status:$statusCode file:$fileNameSource\n"; return $statusCode; } + // Analyse static location, detect links with arguments and pagination + function analyseStaticLocation($fileData) + { + $serverName = $this->yellow->config->get("serverName"); + $serverBase = $this->yellow->config->get("serverBase"); + preg_match_all("/<a(.*?)href=\"([^\"]+)\"(.*?)>/i", $fileData, $matches); + foreach($matches[2] as $match) + { + if(preg_match("/^\w+:\/+(.*?)(\/.*)$/", $match, $tokens)) + { + if($tokens[1] != $serverName) continue; + $match = $tokens[2]; + } + if(!$this->yellow->toolbox->isLocationArgs($match)) continue; + if(substru($match, 0, strlenu($serverBase)) != $serverBase) continue; + $match = rawurldecode(substru($match, strlenu($serverBase))); + if(!preg_match("/^(.*\/page:)\d*$/", $match, $tokens)) + { + $match = rtrim($match, '/').'/'; + if(is_null($this->locationsArgs[$match])) + { + $this->locationsArgs[$match] = $match; + if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticLocation type:args location:$match\n"; + } + } else { + $match = $tokens[1]; + if(is_null($this->locationsPage[$match])) + { + $this->locationsPage[$match] = $match; + if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticLocation type:page location:$match\n"; + } + } + } + } + // Return static location corresponding to content type function getStaticLocation($location, $contentType) { @@ -221,12 +267,12 @@ class YellowCommandline { if($this->yellow->toolbox->isFileLocation($location)) { - if(!empty($extension) && $extension!=".html") $location .= ".html"; + if(!empty($extension) && !preg_match("/^\.(html|md)$/", $extension)) $location .= ".html"; } } else { if($this->yellow->toolbox->isFileLocation($location)) { - if(empty($extension)) $location .= ".unknown"; + if(empty($extension)) $location .= ".invalid"; } else { if(preg_match("/^(\w+)\/(\w+)/", $contentType, $matches)) $extension = ".$matches[2]"; $location .= "index$extension"; diff --git a/system/core/core.php b/system/core/core.php @@ -5,7 +5,7 @@ // Yellow main class class Yellow { - const Version = "0.2.8"; + const Version = "0.2.9"; var $page; //current page data var $pages; //current page tree from file system var $config; //configuration @@ -652,6 +652,7 @@ class YellowPage class YellowPageCollection extends ArrayObject { var $yellow; //access to API + var $filterValue; //current page filter value var $paginationPage; //current page number in pagination var $paginationCount; //highest page number in pagination @@ -667,16 +668,20 @@ class YellowPageCollection extends ArrayObject if(!empty($key)) { $array = array(); - $value = strtoloweru($value); + $value = strreplaceu(' ', '-', strtoloweru($value)); $valueLength = strlenu($value); foreach($this->getArrayCopy() as $page) { if($page->isExisting($key)) { - foreach(preg_split("/,\s*/", strtoloweru($page->get($key))) as $valuePage) + foreach(preg_split("/,\s*/", $page->get($key)) as $pageValue) { - $length = $exactMatch ? strlenu($valuePage) : $valueLength; - if($value == substru($valuePage, 0, $length)) array_push($array, $page); + $pageValueLength = $exactMatch ? strlenu($pageValue) : $valueLength; + if($value == substru(strreplaceu(' ', '-', strtoloweru($pageValue)), 0, $pageValueLength)) + { + $this->filterValue = $pageValue; + array_push($array, $page); + } } } } @@ -788,6 +793,12 @@ class YellowPageCollection extends ArrayObject return $this->getLocationPage($pageNumber); } + // Return current page filter + function getFilter() + { + return $this->filterValue; + } + // Return last modification time for page collection, Unix time function getModified($httpFormat = false) { @@ -1272,7 +1283,7 @@ class YellowToolbox if(!empty($locationArgs)) { if($this->isFileLocation($location)) $locationArgs = '/'.$locationArgs; - $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), rawurlencode($locationArgs)); + $locationArgs = $this->normaliseLocationArgs($locationArgs, false); } return $locationArgs; } @@ -1293,7 +1304,7 @@ class YellowToolbox if(!empty($locationArgs)) { if($this->isFileLocation($location)) $locationArgs = '/'.$locationArgs; - $locationArgs = strreplaceu(array('%3A','%2F'), array(':','/'), rawurlencode($locationArgs)); + $locationArgs = $this->normaliseLocationArgs($locationArgs, false); } return $locationArgs; } @@ -1408,12 +1419,30 @@ class YellowToolbox return $location; } - // Normalise directory/file name and convert unwanted characters + // Normalise location arguments + function normaliseLocationArgs($text, $lowerCase = true) + { + if($lowerCase) $text = strreplaceu(' ', '-', strtoloweru($text)); + if(!preg_match("/^(.*\/)?page:\d*$/", $text)) $text .= '/'; + return strreplaceu(array('%3A','%2F'), array(':','/'), rawurlencode($text)); + } + + // Normalise directory/file name function normaliseName($text, $removeExtension = false) { if(preg_match("/^[\d\-\_\.]+(.*)$/", $text, $matches)) $text = $matches[1]; if($removeExtension) $text = ($pos = strrposu($text, '.')) ? substru($text, 0, $pos) : $text; - $text = preg_replace("/[^\pL\d\-\_\.]/u", "-", $text); + return preg_replace("/[^\pL\d\-\_\.]/u", "-", $text); + } + + // Normalise text into UTF-8 NFC + function normaliseUnicode($text) + { + if(PHP_OS=="Darwin" && !mb_check_encoding($text, "ASCII")) + { + $utf8nfc = preg_match("//u", $text) && !preg_match('/[^\x00-\x{2FF}]/u', $text); + if(!$utf8nfc) $text = iconv("UTF-8-MAC", "UTF-8", $text); + } return $text; } @@ -1480,6 +1509,7 @@ class YellowToolbox while(($entry = readdir($dirHandle)) !== false) { if(substru($entry, 0, 1) == ".") continue; + $entry = $this->normaliseUnicode($entry); if(preg_match($regex, $entry)) { if($directories)