add comments, and styling

This commit is contained in:
Diego Najar 2021-09-12 22:06:29 +02:00
parent f9ec67ad27
commit 8439abbe97
6 changed files with 759 additions and 666 deletions

View file

@ -229,16 +229,14 @@ define('DOMAIN_THEME_CSS', DOMAIN.HTML_PATH_THEME_CSS);
define('DOMAIN_THEME_JS', DOMAIN.HTML_PATH_THEME_JS); define('DOMAIN_THEME_JS', DOMAIN.HTML_PATH_THEME_JS);
define('DOMAIN_THEME_IMG', DOMAIN.HTML_PATH_THEME_IMG); define('DOMAIN_THEME_IMG', DOMAIN.HTML_PATH_THEME_IMG);
define('DOMAIN_ADMIN_THEME', DOMAIN.HTML_PATH_ADMIN_THEME); define('DOMAIN_ADMIN_THEME', DOMAIN.HTML_PATH_ADMIN_THEME);
define('DOMAIN_ADMIN_THEME_CSS', DOMAIN.HTML_PATH_ADMIN_THEME_CSS); define('DOMAIN_ADMIN_THEME_CSS',DOMAIN.HTML_PATH_ADMIN_THEME_CSS);
define('DOMAIN_ADMIN_THEME_JS', DOMAIN.HTML_PATH_ADMIN_THEME_JS); define('DOMAIN_ADMIN_THEME_JS', DOMAIN.HTML_PATH_ADMIN_THEME_JS);
define('DOMAIN_UPLOADS', DOMAIN.HTML_PATH_UPLOADS); define('DOMAIN_UPLOADS', DOMAIN.HTML_PATH_UPLOADS);
define('DOMAIN_UPLOADS_PAGES', DOMAIN.HTML_PATH_UPLOADS_PAGES); define('DOMAIN_UPLOADS_PAGES', DOMAIN.HTML_PATH_UPLOADS_PAGES);
define('DOMAIN_UPLOADS_PROFILES', DOMAIN.HTML_PATH_UPLOADS_PROFILES); define('DOMAIN_UPLOADS_PROFILES',DOMAIN.HTML_PATH_UPLOADS_PROFILES);
define('DOMAIN_PLUGINS', DOMAIN.HTML_PATH_PLUGINS); define('DOMAIN_PLUGINS', DOMAIN.HTML_PATH_PLUGINS);
define('DOMAIN_CONTENT', DOMAIN.HTML_PATH_CONTENT); define('DOMAIN_CONTENT', DOMAIN.HTML_PATH_CONTENT);
define('DOMAIN_ADMIN', DOMAIN_BASE.ADMIN_URI_FILTER.'/'); define('DOMAIN_ADMIN', DOMAIN_BASE.ADMIN_URI_FILTER.'/');
define('DOMAIN_TAGS', Text::addSlashes(DOMAIN_BASE.TAG_URI_FILTER, false, true)); define('DOMAIN_TAGS', Text::addSlashes(DOMAIN_BASE.TAG_URI_FILTER, false, true));
define('DOMAIN_CATEGORIES', Text::addSlashes(DOMAIN_BASE.CATEGORY_URI_FILTER, false, true)); define('DOMAIN_CATEGORIES', Text::addSlashes(DOMAIN_BASE.CATEGORY_URI_FILTER, false, true));
define('DOMAIN_PAGES', Text::addSlashes(DOMAIN_BASE.PAGE_URI_FILTER, false, true)); define('DOMAIN_PAGES', Text::addSlashes(DOMAIN_BASE.PAGE_URI_FILTER, false, true));

View file

@ -6,8 +6,15 @@ class Sanitize {
return strip_tags($text); return strip_tags($text);
} }
// Convert special characters to HTML entities /**
public static function html($text) * Convert special characters to HTML entities.
* For example, & => &
* For example, " => "
*
* @param string $text
* @return string
*/
public static function html(string $text): string
{ {
$flags = ENT_COMPAT; $flags = ENT_COMPAT;

View file

@ -18,6 +18,7 @@ echo 'var DOMAIN_PAGES = "'.DOMAIN_PAGES.'";'.PHP_EOL;
echo 'var DOMAIN_ADMIN = "'.DOMAIN_ADMIN.'";'.PHP_EOL; echo 'var DOMAIN_ADMIN = "'.DOMAIN_ADMIN.'";'.PHP_EOL;
echo 'var DOMAIN_CONTENT = "'.DOMAIN_CONTENT.'";'.PHP_EOL; echo 'var DOMAIN_CONTENT = "'.DOMAIN_CONTENT.'";'.PHP_EOL;
echo 'var DOMAIN_UPLOADS = "'.DOMAIN_UPLOADS.'";'.PHP_EOL; echo 'var DOMAIN_UPLOADS = "'.DOMAIN_UPLOADS.'";'.PHP_EOL;
echo 'var DOMAIN_UPLOADS_PAGES = "'.DOMAIN_UPLOADS_PAGES.'";'.PHP_EOL;
echo 'var DB_DATE_FORMAT = "'.DB_DATE_FORMAT.'";'.PHP_EOL; echo 'var DB_DATE_FORMAT = "'.DB_DATE_FORMAT.'";'.PHP_EOL;
echo 'var AUTOSAVE_INTERVAL = "'.AUTOSAVE_INTERVAL.'";'.PHP_EOL; echo 'var AUTOSAVE_INTERVAL = "'.AUTOSAVE_INTERVAL.'";'.PHP_EOL;
echo 'var PAGE_BREAK = "'.PAGE_BREAK.'";'.PHP_EOL; echo 'var PAGE_BREAK = "'.PAGE_BREAK.'";'.PHP_EOL;

View file

@ -19,19 +19,26 @@ class Page {
Log::set(__METHOD__.LOG_SEP.$errorMessage); Log::set(__METHOD__.LOG_SEP.$errorMessage);
throw new Exception($errorMessage); throw new Exception($errorMessage);
} }
// The database doesn't have the page's content.
$row = $pages->getPageDB($key); $row = $pages->getPageDB($key);
} }
foreach ($row as $field=>$value) { foreach ($row as $field=>$value) {
if ($field=='date') { if ($field=='date') {
$this->setField('dateRaw', $value); $this->vars['dateRaw'] = $value;
} else { } else {
$this->setField($field, $value); $this->vars[$field] = $value;
} }
} }
} }
public function getValue($field) /**
* Returns the value associated to a field, if the field doesn't exists returns FALSE.
*
* @param string $field
* @return bool|string|int|array
*/
public function getValue(string $field): bool|string|int|array
{ {
if (isset($this->vars[$field])) { if (isset($this->vars[$field])) {
return $this->vars[$field]; return $this->vars[$field];
@ -39,16 +46,26 @@ class Page {
return false; return false;
} }
public function setField($field, $value) /**
* Set the value associated to a field.
*
* @param string $field
* @param string $value
* @return boolean
*/
public function setField(string $field, string $value): bool
{ {
$this->vars[$field] = $value; $this->vars[$field] = $value;
return true; return true;
} }
// Returns the raw content /**
// This content is not markdown parser * Returns the full raw page's content. This content is not markdown parser.
// (boolean) $sanitize, TRUE returns the content sanitized *
public function contentRaw($sanitize=false) * @param boolean $sanitize TRUE returns the content sanitized
* @return string
*/
public function contentRaw(bool $sanitize=false): string
{ {
$key = $this->key(); $key = $this->key();
$filePath = PATH_PAGES.$key.DS.FILENAME; $filePath = PATH_PAGES.$key.DS.FILENAME;
@ -60,10 +77,13 @@ class Page {
return $contentRaw; return $contentRaw;
} }
// Returns the full content /**
// This content is markdown parser * Returns the full page's content.
// (boolean) $sanitize, TRUE returns the content sanitized *
public function content($sanitize=false) * @param boolean $sanitize TRUE returns the content sanitized
* @return string
*/
public function content(bool $sanitize=false): string
{ {
// If already set the content, return it // If already set the content, return it
$content = $this->getValue('content'); $content = $this->getValue('content');
@ -72,7 +92,7 @@ class Page {
} }
// Get the raw content // Get the raw content
$content = $this->contentRaw(); $content = $this->contentRaw(false);
// Parse Markdown // Parse Markdown
if (MARKDOWN_PARSER) { if (MARKDOWN_PARSER) {
@ -82,7 +102,7 @@ class Page {
// Parse img src relative to absolute (with domain) // Parse img src relative to absolute (with domain)
if (IMAGE_RELATIVE_TO_ABSOLUTE) { if (IMAGE_RELATIVE_TO_ABSOLUTE) {
$domain = IMAGE_RESTRICT?DOMAIN_UPLOADS_PAGES.$this->uuid().'/':DOMAIN_UPLOADS; $domain = IMAGE_RESTRICT?DOMAIN_UPLOADS_PAGES.$this->key().'/':DOMAIN_UPLOADS;
$content = Text::imgRel2Abs($content, $domain); $content = Text::imgRel2Abs($content, $domain);
} }
@ -92,10 +112,13 @@ class Page {
return $content; return $content;
} }
// Returns the first part of the content if the content is splited, otherwise is returned the full content /**
// This content is markdown parser * Returns the first part of the content if the content is splited, otherwise is returned the full content.
// (boolean) $sanitize, TRUE returns the content sanitized *
public function contentBreak($sanitize=false) * @param boolean $sanitize TRUE returns the content sanitized
* @return string
*/
public function contentBreak(bool $sanitize=false): string
{ {
$content = $this->content($sanitize); $content = $this->content($sanitize);
$explode = explode(PAGE_BREAK, $content); $explode = explode(PAGE_BREAK, $content);
@ -238,11 +261,12 @@ class Page {
} }
} }
/* Returns the template for the page === Bludit v4 /**
* Returns the template for the page or FALSE if the page haven't a template assigned.
@return string/boolean Returns the template for the page or FALSE if the page haven't a template assigned *
* @return boolean|string
*/ */
public function template() public function template(): bool|string
{ {
$template = $this->getValue('template'); $template = $this->getValue('template');
if (empty($template)) { if (empty($template)) {
@ -306,24 +330,27 @@ class Page {
return json_encode($tmp); return json_encode($tmp);
} }
// Returns the endpoint of the coverimage, FALSE if the page doesn't have a cover image /**
// (boolean) $absolute, TRUE returns the complete URL, FALSE returns the filename * Returns the cover image endpoint, FALSE if the page doesn't have a cover image
// If the user defined an external cover image the function returns it *
public function coverImage($absolute=true) * @param boolean $absolute TRUE returns the complete URL, FALSE returns the filename
* @return string
*/
public function coverImage(bool $absolute=true): string
{ {
$filename = $this->getValue('coverImage'); $filename = $this->getValue('coverImage');
if (empty($filename)) { if (empty($filename)) {
return false; return false;
} }
// Check is external cover image // Check if it is an external cover image
if (filter_var($filename, FILTER_VALIDATE_URL)) { if (filter_var($filename, FILTER_VALIDATE_URL)) {
return $filename; return $filename;
} }
if ($absolute) { if ($absolute) {
if (IMAGE_RESTRICT) { if (IMAGE_RESTRICT) {
return DOMAIN_UPLOADS_PAGES.$this->uuid().'/'.$filename; return DOMAIN_UPLOADS_PAGES.$this->key().'/'.$filename;
} }
return DOMAIN_UPLOADS.$filename; return DOMAIN_UPLOADS.$filename;
} }
@ -349,48 +376,72 @@ class Page {
return $this->getValue('key'); return $this->getValue('key');
} }
// (boolean) Returns TRUE if the page is published, FALSE otherwise /**
public function published() * Returns TRUE if the page is type "published", FALSE otherwise
*
* @return boolean
*/
public function published(): bool
{ {
return ($this->getValue('type')==='published'); return ($this->getValue('type')==='published');
} }
// (boolean) Returns TRUE if the page is scheduled, FALSE otherwise /**
public function scheduled() * Returns TRUE if the page is type "scheduled", FALSE otherwise
*
* @return boolean
*/
public function scheduled(): bool
{ {
return ($this->getValue('type')==='scheduled'); return ($this->getValue('type')==='scheduled');
} }
// (boolean) Returns TRUE if the page is draft, FALSE otherwise /**
public function draft() * Returns TRUE if the page is type "draft", FALSE otherwise
*
* @return boolean
*/
public function draft(): bool
{ {
return ($this->getValue('type')=='draft'); return ($this->getValue('type')=='draft');
} }
/**
* Returns TRUE if the page is type "sticky", FALSE otherwise
*
* @return boolean
*/
public function sticky(): bool
{
return ($this->getValue('type')=='sticky');
}
/**
* Returns TRUE if the page is type "static", FALSE otherwise
*
* @return boolean
*/
public function isStatic(): bool
{
return ($this->getValue('type')=='static');
}
/**
* Returns TRUE if the page is type "unlisted", FALSE otherwise
*
* @return boolean
*/
public function unlisted(): bool
{
return ($this->getValue('type')=='unlisted');
}
// (boolean) Returns TRUE if the page is autosave, FALSE otherwise // (boolean) Returns TRUE if the page is autosave, FALSE otherwise
public function autosave() public function autosave()
{ {
return ($this->getValue('type')=='autosave'); return ($this->getValue('type')=='autosave');
} }
// (boolean) Returns TRUE if the page is sticky, FALSE otherwise
public function sticky()
{
return ($this->getValue('type')=='sticky');
}
// (boolean) Returns TRUE if the page is static, FALSE otherwise
public function isStatic()
{
return ($this->getValue('type')=='static');
}
// (boolean) Returns TRUE if the page is unlisted, FALSE otherwise
public function unlisted()
{
return ($this->getValue('type')=='unlisted');
}
// (string) Returns type of the page // (string) Returns type of the page
public function type() public function type()
{ {
@ -517,11 +568,13 @@ class Page {
return $list; return $list;
} }
/* Returns the amount of minutes takes to read the page === Bludit v4 /**
* Returns the amount of minutes takes to read the page
@return string Returns the minutes as string *
* @return string
*/ */
public function readingTime() { public function readingTime(): string
{
$words = $this->content(true); $words = $this->content(true);
$words = strip_tags($words); $words = strip_tags($words);
$words = str_word_count($words); $words = str_word_count($words);
@ -547,14 +600,15 @@ class Page {
return false; return false;
} }
/* Returns an array with all pages key related to the page === Bludit v4 /**
The relation is based on the tags. * Returns an array with all pages' keys related to the page. The relation is based on the tags.
*
@sortByDate boolean TRUE if you want to get sort by date the pages, FALSE random order * @param boolean $sortByDate TRUE if you want to get sort by date the pages, FALSE random order
@getFirst int Amount of related pages, -1 indicates all related pages * @param integer $getFirst Amount of related pages, -1 indicates all related pages
@return array Returns an array with the page keys related to page * @return array
*/ */
public function related($sortByDate=false, $getFirst=-1) { public function related(bool $sortByDate=false, int $getFirst=-1): array
{
global $tags; global $tags;
$pageTags = $this->tags(true); $pageTags = $this->tags(true);
$list = array(); $list = array();
@ -590,13 +644,14 @@ class Page {
} }
} }
/* Returns relative time (e.g. "1 minute ago") === Bludit v4 /**
Based on http://stackoverflow.com/a/18602474 * Returns the date as relative time.
*
@complete boolean TRUE full version, FALSE short version * @param boolean $complete TRUE full version, FALSE short version
@return string Relative time, for example: 1 minute ago * @return string Relative time, for example: 1 minute ago
*/ */
public function relativeTime($complete=false) { public function relativeTime(bool $complete=false): string
{
$current = new DateTime; $current = new DateTime;
$past = new DateTime($this->getValue('dateRaw')); $past = new DateTime($this->getValue('dateRaw'));
$elapsed = $current->diff($past); $elapsed = $current->diff($past);

View file

@ -34,17 +34,18 @@ class Pages extends dbJSON {
return $this->dbFields; return $this->dbFields;
} }
/* Get the database row associated to a page /**
* Returns the table row associated to a particular page. The page's content is not included.
@key string The key of the page to be fetch * For example in SQL, SELECT * FROM pages WHERE key = $key
@return array/boolean Return an array with the database for a page, FALSE otherwise *
* @param string $key The key of the page to be fetch
* @return array Return an array with the database for a page, FALSE otherwise
*/ */
public function getPageDB($key) public function getPageDB(string $key): array
{ {
if ($this->exists($key)) { if ($this->exists($key)) {
return $this->db[$key]; return $this->db[$key];
} }
return false; return false;
} }
@ -57,12 +58,13 @@ class Pages extends dbJSON {
return isset ($this->db[$key]); return isset ($this->db[$key]);
} }
/* Create a new page === Bludit v4 /**
* Creates a new page.
@args array The array $args supports all the keys from the variable $dbFields. If you don't pass all the keys, the default values are used. *
@return string/boolean Returns the page key if the page is successfully created, FALSE otherwise * @param array $args The array $args supports all the keys from the variable $dbFields. If you don't pass all the keys, the default values are used.
* @return boolean|string Returns the page key if the page is successfully created, FALSE otherwise
*/ */
public function add($args) public function add(array $args): bool|string
{ {
$row = array(); $row = array();
@ -175,12 +177,13 @@ class Pages extends dbJSON {
return $key; return $key;
} }
/* Edit a page === Bludit v4 /**
* Edit a page.
@args array The array $args supports all the keys from the variable $dbFields. If you don't pass all the keys, the default values are used. *
@return string/boolean Returns the page key if the page is successfully edited, FALSE otherwise * @param array $args The array $args supports all the keys from the variable $dbFields. If you don't pass all the keys, the default values are used.
* @return boolean|string Returns the page key if the page is successfully edited, FALSE otherwise
*/ */
public function edit($args) public function edit(array $args): bool|string
{ {
// This is the new row for the table and is going to replace the old row // This is the new row for the table and is going to replace the old row
$row = array(); $row = array();
@ -300,12 +303,13 @@ class Pages extends dbJSON {
return $newKey; return $newKey;
} }
/* Delete a page === Bludit v4 /**
* Delete a page.
@key string The key of the page to be deleted *
@return boolean Returns TRUE if the page was deleted successfully, FALSE otherwise * @param string $key The key of the page to be deleted
* @return boolean Returns TRUE if the page was deleted successfully, FALSE otherwise
*/ */
public function delete($key) public function delete(string $key): bool
{ {
// This is need it, because if the key is empty the Filesystem::deleteRecursive is going to delete PATH_PAGES // This is need it, because if the key is empty the Filesystem::deleteRecursive is going to delete PATH_PAGES
if (empty($key)) { if (empty($key)) {
@ -485,6 +489,26 @@ class Pages extends dbJSON {
return $tmp; return $tmp;
} }
/**
* Returns an array with all unlisted pages
*
* @param boolean $onlyKeys If TRUE returns only the pages' keys
* @return array
*/
public function getUnlistedDB(bool $onlyKeys=true): array
{
$tmp = $this->db;
foreach ($tmp as $key=>$fields) {
if($fields['type']!='unlisted') {
unset($tmp[$key]);
}
}
if ($onlyKeys) {
return array_keys($tmp);
}
return $tmp;
}
// Returns the next number of the bigger position // Returns the next number of the bigger position
public function nextPositionNumber() public function nextPositionNumber()
{ {
@ -530,12 +554,18 @@ class Pages extends dbJSON {
} }
/** /**
* Get a list of pages' keys. === Bludit v4 * Get a list of pages' keys.
* @param int $pageNumber Page number for the paginator *
* @param int $numberOfItems Amount of items to return, if -1 returns all the items * @param integer $pageNumber Page number for the paginator
* @return array|bool Returns an array with the pages' keys or FALSE if it out of range * @param integer $numberOfItems Amount of items to return, if -1 returns all the items
* @param boolean $published
* @param boolean $static
* @param boolean $sticky
* @param boolean $draft
* @param boolean $scheduled
* @return boolean|array Returns an array with the pages' keys or FALSE if it out of range
*/ */
public function getList(int $pageNumber, int $numberOfItems, bool $published=true, bool $static=false, bool $sticky=false, bool $draft=false, bool $scheduled=false) public function getList(int $pageNumber, int $numberOfItems, bool $published=true, bool $static=false, bool $sticky=false, bool $draft=false, bool $scheduled=false): bool|array
{ {
$list = array(); $list = array();
foreach ($this->db as $key=>$fields) { foreach ($this->db as $key=>$fields) {

View file

@ -58,10 +58,12 @@
"thanks-for-supporting-bludit": "Thanks for supporting Bludit", "thanks-for-supporting-bludit": "Thanks for supporting Bludit",
"upgrade-to-bludit-pro": "Upgrade to Bludit PRO", "upgrade-to-bludit-pro": "Upgrade to Bludit PRO",
"language": "Language", "language": "Language",
"unlisted": "Unlisted",
"plugin": "Plugin", "plugin": "Plugin",
"plugins": "Plugins", "plugins": "Plugins",
"developers": "Developers", "developers": "Developers",
"themes": "Themes", "themes": "Themes",
"theme": "Theme",
"about": "About", "about": "About",
"url": "URL", "url": "URL",
"welcome": "Welcome", "welcome": "Welcome",