Merge pull request #4 from dignajar/master

New pull request
This commit is contained in:
Edi 2015-11-18 00:24:31 +01:00
commit 1a3e00a7be
84 changed files with 1283 additions and 89 deletions

View File

@ -1,7 +0,0 @@
# Bludit
If you are reading this, you must enable rewrite module.
Documentation:
- http://docs.bludit.com/en/getting-started/requirements
- http://docs.bludit.com/en/troubleshooting/browser-returns-not-found

View File

@ -23,6 +23,7 @@ define('PATH_ROOT', __DIR__.DS);
define('PATH_CONTENT', PATH_ROOT.'content'.DS); define('PATH_CONTENT', PATH_ROOT.'content'.DS);
define('PATH_POSTS', PATH_CONTENT.'posts'.DS); define('PATH_POSTS', PATH_CONTENT.'posts'.DS);
define('PATH_UPLOADS', PATH_CONTENT.'uploads'.DS); define('PATH_UPLOADS', PATH_CONTENT.'uploads'.DS);
define('PATH_UPLOADS_PROFILES', PATH_UPLOADS.'profiles'.DS);
define('PATH_PAGES', PATH_CONTENT.'pages'.DS); define('PATH_PAGES', PATH_CONTENT.'pages'.DS);
define('PATH_DATABASES', PATH_CONTENT.'databases'.DS); define('PATH_DATABASES', PATH_CONTENT.'databases'.DS);
define('PATH_PLUGINS_DATABASES',PATH_CONTENT.'databases'.DS.'plugins'.DS); define('PATH_PLUGINS_DATABASES',PATH_CONTENT.'databases'.DS.'plugins'.DS);
@ -30,10 +31,20 @@ define('PATH_KERNEL', PATH_ROOT.'kernel'.DS);
define('PATH_HELPERS', PATH_KERNEL.'helpers'.DS); define('PATH_HELPERS', PATH_KERNEL.'helpers'.DS);
define('PATH_LANGUAGES', PATH_ROOT.'languages'.DS); define('PATH_LANGUAGES', PATH_ROOT.'languages'.DS);
define('PATH_ABSTRACT', PATH_KERNEL.'abstract'.DS); define('PATH_ABSTRACT', PATH_KERNEL.'abstract'.DS);
define('DOMAIN', getenv('HTTP_HOST')); define('DOMAIN', $_SERVER['HTTP_HOST']);
// HTML PATHs // HTML PATHs
$base = (dirname(getenv('SCRIPT_NAME'))==DS)?'/':dirname(getenv('SCRIPT_NAME')).'/'; $base = empty( $_SERVER['SCRIPT_NAME'] ) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$base = dirname($base);
if($base!=DS) {
$base = $base.'/';
}
else {
// Workaround for Windows Web Servers
$base = '/';
}
define('HTML_PATH_ROOT', $base); define('HTML_PATH_ROOT', $base);
// Log separator // Log separator
@ -220,6 +231,12 @@ function install($adminPassword, $email, $timezoneOffset)
error_log($errorText, 0); error_log($errorText, 0);
} }
if(!mkdir(PATH_PAGES.'about', $dirpermissions, true))
{
$errorText = 'Error when trying to created the directory=>'.PATH_PAGES.'about';
error_log($errorText, 0);
}
if(!mkdir(PATH_PLUGINS_DATABASES.'pages', $dirpermissions, true)) if(!mkdir(PATH_PLUGINS_DATABASES.'pages', $dirpermissions, true))
{ {
$errorText = 'Error when trying to created the directory=>'.PATH_PLUGINS_DATABASES.'pages'; $errorText = 'Error when trying to created the directory=>'.PATH_PLUGINS_DATABASES.'pages';
@ -238,9 +255,15 @@ function install($adminPassword, $email, $timezoneOffset)
error_log($errorText, 0); error_log($errorText, 0);
} }
if(!mkdir(PATH_UPLOADS, $dirpermissions, true)) if(!mkdir(PATH_PLUGINS_DATABASES.'about', $dirpermissions, true))
{ {
$errorText = 'Error when trying to created the directory=>'.PATH_UPLOADS; $errorText = 'Error when trying to created the directory=>'.PATH_PLUGINS_DATABASES.'about';
error_log($errorText, 0);
}
if(!mkdir(PATH_UPLOADS_PROFILES, $dirpermissions, true))
{
$errorText = 'Error when trying to created the directory=>'.PATH_UPLOADS_PROFILES;
error_log($errorText, 0); error_log($errorText, 0);
} }
@ -259,6 +282,14 @@ function install($adminPassword, $email, $timezoneOffset)
'status'=>'published', 'status'=>'published',
'date'=>$currentDate, 'date'=>$currentDate,
'position'=>0 'position'=>0
),
'about'=>array(
'description'=>$Language->get('About your site or yourself'),
'username'=>'admin',
'tags'=>array(),
'status'=>'published',
'date'=>$currentDate,
'position'=>1
) )
); );
@ -267,7 +298,7 @@ function install($adminPassword, $email, $timezoneOffset)
// File posts.php // File posts.php
$data = array( $data = array(
$firstPostSlug=>array( $firstPostSlug=>array(
'description'=>'Welcome to Bludit', 'description'=>$Language->get('Welcome to Bludit'),
'username'=>'admin', 'username'=>'admin',
'status'=>'published', 'status'=>'published',
'tags'=>array('bludit'=>'Bludit','cms'=>'CMS','flat-files'=>'Flat files'), 'tags'=>array('bludit'=>'Bludit','cms'=>'CMS','flat-files'=>'Flat files'),
@ -279,10 +310,10 @@ function install($adminPassword, $email, $timezoneOffset)
// File site.php // File site.php
$data = array( $data = array(
'title'=>'Bludit', 'title'=>'BLUDIT',
'slogan'=>'cms', 'slogan'=>'CMS',
'description'=>'', 'description'=>'',
'footer'=>Date::current('Y'), 'footer'=>'Copyright © '.Date::current('Y'),
'language'=>$Language->getCurrentLocale(), 'language'=>$Language->getCurrentLocale(),
'locale'=>$Language->getCurrentLocale(), 'locale'=>$Language->getCurrentLocale(),
'timezone'=>$timezone, 'timezone'=>$timezone,
@ -306,7 +337,7 @@ function install($adminPassword, $email, $timezoneOffset)
$data = array( $data = array(
'admin'=>array( 'admin'=>array(
'firstName'=>'', 'firstName'=>$Language->get('Administrator'),
'lastName'=>'', 'lastName'=>'',
'twitter'=>'', 'twitter'=>'',
'role'=>'admin', 'role'=>'admin',
@ -364,6 +395,19 @@ function install($adminPassword, $email, $timezoneOffset)
LOCK_EX LOCK_EX
); );
// File plugins/about/db.php
file_put_contents(
PATH_PLUGINS_DATABASES.'about'.DS.'db.php',
$dataHead.json_encode(
array(
'position'=>0,
'label'=>$Language->get('About'),
'text'=>$Language->get('this-is-a-brief-description-of-yourself-our-your-site')
),
JSON_PRETTY_PRINT),
LOCK_EX
);
// File plugins/simplemde/db.php // File plugins/simplemde/db.php
file_put_contents( file_put_contents(
PATH_PLUGINS_DATABASES.'simplemde'.DS.'db.php', PATH_PLUGINS_DATABASES.'simplemde'.DS.'db.php',
@ -391,19 +435,27 @@ function install($adminPassword, $email, $timezoneOffset)
// File index.txt for error page // File index.txt for error page
$data = 'Title: '.$Language->get('Error').' $data = 'Title: '.$Language->get('Error').'
Content: '.$Language->get('The page has not been found'); Content: '.$Language->get('The page has not been found');
file_put_contents(PATH_PAGES.'error'.DS.'index.txt', $data, LOCK_EX); file_put_contents(PATH_PAGES.'error'.DS.'index.txt', $data, LOCK_EX);
// File index.txt for about page
$data = 'Title: '.$Language->get('About').'
Content:
'.$Language->get('the-about-page-is-very-important').'
'.$Language->get('change-this-pages-content-on-the-admin-panel');
file_put_contents(PATH_PAGES.'about'.DS.'index.txt', $data, LOCK_EX);
// File index.txt for welcome post // File index.txt for welcome post
$data = 'Title: '.$Language->get('First post').' $data = 'Title: '.$Language->get('First post').'
Content: Content:
## '.$Language->get('Congratulations you have successfully installed your Bludit').' ## '.$Language->get('Whats next').'
### '.$Language->get('Whats next').'
- '.$Language->get('Manage your Bludit from the admin panel').' - '.$Language->get('Manage your Bludit from the admin panel').'
- '.$Language->get('Follow Bludit on').' [Twitter](https://twitter.com/bludit) / [Facebook](https://www.facebook.com/bluditcms) / [Google+](https://plus.google.com/+Bluditcms) - '.$Language->get('Follow Bludit on').' [Twitter](https://twitter.com/bludit) / [Facebook](https://www.facebook.com/bluditcms) / [Google+](https://plus.google.com/+Bluditcms)
- '.$Language->get('Chat with developers and users on Gitter').'
- '.$Language->get('Visit the support forum').' - '.$Language->get('Visit the support forum').'
- '.$Language->get('Read the documentation for more information').' - '.$Language->get('Read the documentation for more information').'
- '.$Language->get('Share with your friends and enjoy'); - '.$Language->get('Share with your friends and enjoy');
@ -469,7 +521,7 @@ if( $_SERVER['REQUEST_METHOD'] == 'POST' )
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html class="uk-height-1-1 uk-notouch"> <html class="uk-height-1-1 uk-notouch">
<head> <head>
<base href="admin/themes/default/"> <base href="kernel/admin/themes/default/">
<meta charset="<?php echo CHARSET ?>"> <meta charset="<?php echo CHARSET ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@ -58,6 +58,15 @@ class dbJSON
return count($this->db); return count($this->db);
} }
public function getField($field)
{
if(isset($this->db[$field])) {
return $this->db[$field];
}
return $this->dbFields[$field]['value'];
}
// Save the JSON file. // Save the JSON file.
public function save() public function save()
{ {

View File

@ -26,6 +26,10 @@
background: #1F5FC4; background: #1F5FC4;
} }
.uk-form legend {
width: 70% !important;
}
.uk-navbar-nav > li > a { .uk-navbar-nav > li > a {
border: none; border: none;
height: 70px; height: 70px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1005 B

After

Width:  |  Height:  |  Size: 1005 B

View File

@ -98,7 +98,15 @@ $(document).ready(function() {
<div class="uk-navbar-flip uk-hidden-small"> <div class="uk-navbar-flip uk-hidden-small">
<ul class="uk-navbar-nav"> <ul class="uk-navbar-nav">
<li class="uk-parent" data-uk-dropdown> <li class="uk-parent" data-uk-dropdown>
<a href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$Login->username() ?>"><i class="uk-icon-user"></i> <?php echo $Login->username() ?> ▾</a> <?php
$profilePictureSrc = HTML_PATH_UPLOADS_PROFILES.$Login->username().'.jpg';
if(!file_exists($profilePictureSrc)) {
$profilePictureSrc = HTML_PATH_ADMIN_THEME_IMG.'default.jpg';
}
?>
<a href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$Login->username() ?>">
<img class="uk-border-circle" width="28px" src="<?php echo $profilePictureSrc ?>" alt=""> <?php echo $Login->username() ?>
</a>
<div class="uk-dropdown uk-dropdown-navbar"> <div class="uk-dropdown uk-dropdown-navbar">
<ul class="uk-nav uk-nav-navbar"> <ul class="uk-nav uk-nav-navbar">
<li><a href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$Login->username() ?>"><?php $L->p('Profile') ?></a></li> <li><a href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$Login->username() ?>"><?php $L->p('Profile') ?></a></li>

View File

@ -207,4 +207,64 @@ class HTML {
echo $html; echo $html;
} }
public static function profileUploader($username)
{
global $L;
$html = '
<div id="jsprogressBar" class="uk-progress uk-hidden">
<div class="uk-progress-bar" style="width: 0%;">0%</div>
</div>
<div id="upload-drop" class="uk-placeholder uk-text-center">
<i class="uk-icon-cloud-upload uk-margin-small-right"></i>'.$L->g('Upload Image').'<br><a class="uk-form-file">'.$L->g('Drag and drop or click here').'<input id="upload-select" type="file"></a>
</div>
';
$html .= '
<script>
$(document).ready(function() {
$(function()
{
var progressbar = $("#jsprogressBar");
var bar = progressbar.find(".uk-progress-bar");
var settings =
{
type: "json",
action: "'.HTML_PATH_ADMIN_ROOT.'ajax/uploader",
allow : "*.(jpg|jpeg|gif|png)",
params: {"type":"profilePicture", "username":"'.$username.'"},
loadstart: function() {
bar.css("width", "0%").text("0%");
progressbar.removeClass("uk-hidden");
},
progress: function(percent) {
percent = Math.ceil(percent);
bar.css("width", percent+"%").text(percent+"%");
},
allcomplete: function(response) {
bar.css("width", "100%").text("100%");
progressbar.addClass("uk-hidden");
$("#jsprofilePicture").attr("src", "'.HTML_PATH_UPLOADS_PROFILES.$username.'.jpg?"+new Date().getTime());
},
notallowed: function(file, settings) {
alert("'.$L->g('Supported image file types').' "+settings.allow);
}
};
var select = UIkit.uploadSelect($("#upload-select"), settings);
var drop = UIkit.uploadDrop($("#upload-drop"), settings);
});
});
</script>';
echo $html;
}
} }

View File

@ -2,6 +2,9 @@
HTML::title(array('title'=>$L->g('Edit user'), 'icon'=>'user')); HTML::title(array('title'=>$L->g('Edit user'), 'icon'=>'user'));
echo '<div class="uk-grid">';
echo '<div class="uk-width-7-10">';
HTML::formOpen(array('id'=>'edit-user-profile-form','class'=>'uk-form-horizontal')); HTML::formOpen(array('id'=>'edit-user-profile-form','class'=>'uk-form-horizontal'));
// Security token // Security token
@ -92,6 +95,13 @@ if( ($Login->role()==='admin') && ($_user['username']!='admin') ) {
HTML::formClose(); HTML::formClose();
echo '</div>';
echo '<div class="uk-width-3-10" style="margin-top: 50px; text-align: center;">';
echo '<img id="jsprofilePicture" class="uk-border-rounded" src="'.HTML_PATH_UPLOADS_PROFILES.$_user['username'].'.jpg" alt="'.$L->g('Profile picture').'">';
HTML::profileUploader($_user['username']);
echo '</div>';
echo '</div>';
?> ?>
<script> <script>

View File

@ -1,6 +1,6 @@
<div class="login-form"> <div class="login-form">
<form method="post" action="<?php echo HTML_PATH_ADMIN_ROOT.'login-email' ?>" class="uk-form" autocomplete="off"> <form method="post" action="" class="uk-form" autocomplete="off">
<input type="hidden" id="jstoken" name="tokenCSRF" value="<?php $Security->printToken() ?>"> <input type="hidden" id="jstoken" name="tokenCSRF" value="<?php $Security->printToken() ?>">

View File

@ -1,6 +1,6 @@
<div class="login-form"> <div class="login-form">
<form method="post" action="<?php echo HTML_PATH_ADMIN_ROOT.'login' ?>" class="uk-form" autocomplete="off"> <form method="post" action="" class="uk-form" autocomplete="off">
<input type="hidden" id="jstoken" name="tokenCSRF" value="<?php $Security->printToken() ?>"> <input type="hidden" id="jstoken" name="tokenCSRF" value="<?php $Security->printToken() ?>">

View File

@ -26,7 +26,7 @@ echo '
echo '<tr>'; echo '<tr>';
echo '<td><a href="'.HTML_PATH_ADMIN_ROOT.'edit-post/'.$Post->key().'">'.($status?'<span class="label-draft">'.$status.'</span>':'').($Post->title()?$Post->title():'<span class="label-empty-title">'.$Language->g('Empty title').'</span> ').'</a></td>'; echo '<td><a href="'.HTML_PATH_ADMIN_ROOT.'edit-post/'.$Post->key().'">'.($status?'<span class="label-draft">'.$status.'</span>':'').($Post->title()?$Post->title():'<span class="label-empty-title">'.$Language->g('Empty title').'</span> ').'</a></td>';
echo '<td class="uk-text-center">'.$Post->date().'</td>'; echo '<td class="uk-text-center">'.$Post->dateRaw().'</td>';
echo '<td><a target="_blank" href="'.$Post->permalink().'">'.$Url->filters('post').'/'.$Post->key().'</a></td>'; echo '<td><a target="_blank" href="'.$Post->permalink().'">'.$Url->filters('post').'/'.$Post->key().'</a></td>';
echo '</tr>'; echo '</tr>';
} }

View File

@ -35,6 +35,13 @@ HTML::formOpen(array('class'=>'uk-form-horizontal'));
'tip'=>$L->g('you-can-use-this-field-to-define-a-set-off') 'tip'=>$L->g('you-can-use-this-field-to-define-a-set-off')
)); ));
HTML::formInputText(array(
'name'=>'dateFormat',
'label'=>$L->g('Date format'),
'value'=>$Site->dateFormat(),
'class'=>'uk-width-1-2 uk-form-medium'
));
echo '<div class="uk-form-row"> echo '<div class="uk-form-row">
<div class="uk-form-controls"> <div class="uk-form-controls">
<button type="submit" class="uk-button uk-button-primary">'.$L->g('Save').'</button> <button type="submit" class="uk-button uk-button-primary">'.$L->g('Save').'</button>

View File

@ -1,4 +1,12 @@
<?php header('Content-Type: application/json'); <?php defined('BLUDIT') or die('Bludit CMS.');
header('Content-Type: application/json');
// Type
$type = 'other';
if(!empty($_POST['type'])) {
$type = Sanitize::html($_POST['type']);
}
// Source // Source
$source = $_FILES['files']['tmp_name'][0]; $source = $_FILES['files']['tmp_name'][0];
@ -24,12 +32,26 @@ if(empty($tmpName)) {
$tmpName = $filename.'.'.$fileExtension; $tmpName = $filename.'.'.$fileExtension;
} }
move_uploaded_file($source, PATH_UPLOADS.$tmpName); // --- PROFILE PICTURE ---
if($type=='profilePicture') {
$username = Sanitize::html($_POST['username']);
$tmpName = $username.'.jpg';
move_uploaded_file($source, PATH_UPLOADS_PROFILES.$tmpName);
// Resize and crop profile image.
$Image = new Image();
$Image->setImage(PATH_UPLOADS_PROFILES.$tmpName, '200', '200', 'crop');
$Image->saveImage(PATH_UPLOADS_PROFILES.$tmpName, 100, true);
}
// --- OTHERS ---
else {
move_uploaded_file($source, PATH_UPLOADS.$tmpName);
}
exit(json_encode(array( exit(json_encode(array(
'status'=>0, 'status'=>0,
'filename'=>$tmpName, 'filename'=>$tmpName
'date'=>date("F d Y H:i:s.", filemtime(PATH_UPLOADS.$tmpName))
))); )));
?> ?>

View File

@ -35,7 +35,8 @@ define('PATH_PAGES', PATH_CONTENT.'pages'.DS);
define('PATH_DATABASES', PATH_CONTENT.'databases'.DS); define('PATH_DATABASES', PATH_CONTENT.'databases'.DS);
define('PATH_PLUGINS_DATABASES', PATH_CONTENT.'databases'.DS.'plugins'.DS); define('PATH_PLUGINS_DATABASES', PATH_CONTENT.'databases'.DS.'plugins'.DS);
define('PATH_UPLOADS', PATH_CONTENT.'uploads'.DS); define('PATH_UPLOADS', PATH_CONTENT.'uploads'.DS);
define('PATH_ADMIN', PATH_ROOT.'admin'.DS); define('PATH_UPLOADS_PROFILES', PATH_UPLOADS.'profiles'.DS);
define('PATH_ADMIN', PATH_KERNEL.'admin'.DS);
define('PATH_ADMIN_THEMES', PATH_ADMIN.'themes'.DS); define('PATH_ADMIN_THEMES', PATH_ADMIN.'themes'.DS);
define('PATH_ADMIN_CONTROLLERS', PATH_ADMIN.'controllers'.DS); define('PATH_ADMIN_CONTROLLERS', PATH_ADMIN.'controllers'.DS);
define('PATH_ADMIN_VIEWS', PATH_ADMIN.'views'.DS); define('PATH_ADMIN_VIEWS', PATH_ADMIN.'views'.DS);
@ -75,7 +76,7 @@ define('CLI_STATUS', 'published');
// Database format date // Database format date
define('DB_DATE_FORMAT', 'Y-m-d H:i'); define('DB_DATE_FORMAT', 'Y-m-d H:i');
// Database format date // Date format for Dashboard schedule posts
define('SCHEDULED_DATE_FORMAT', 'd M - h:i a'); define('SCHEDULED_DATE_FORMAT', 'd M - h:i a');
// Token time to live for login via email. The offset is defined by http://php.net/manual/en/datetime.modify.php // Token time to live for login via email. The offset is defined by http://php.net/manual/en/datetime.modify.php
@ -113,6 +114,7 @@ include(PATH_KERNEL.'page.class.php');
include(PATH_KERNEL.'url.class.php'); include(PATH_KERNEL.'url.class.php');
include(PATH_KERNEL.'login.class.php'); include(PATH_KERNEL.'login.class.php');
include(PATH_KERNEL.'parsedown.class.php'); include(PATH_KERNEL.'parsedown.class.php');
include(PATH_KERNEL.'parsedownextra.class.php');
include(PATH_KERNEL.'security.class.php'); include(PATH_KERNEL.'security.class.php');
// Include Helpers Classes // Include Helpers Classes
@ -128,6 +130,7 @@ include(PATH_HELPERS.'email.class.php');
include(PATH_HELPERS.'filesystem.class.php'); include(PATH_HELPERS.'filesystem.class.php');
include(PATH_HELPERS.'alert.class.php'); include(PATH_HELPERS.'alert.class.php');
include(PATH_HELPERS.'paginator.class.php'); include(PATH_HELPERS.'paginator.class.php');
include(PATH_HELPERS.'image.class.php');
// Session // Session
Session::start(); Session::start();
@ -143,17 +146,20 @@ $dbUsers = new dbUsers();
$dbTags = new dbTags(); $dbTags = new dbTags();
$Site = new dbSite(); $Site = new dbSite();
$Url = new Url(); $Url = new Url();
$Parsedown = new Parsedown(); $Parsedown = new ParsedownExtra();
$Security = new Security(); $Security = new Security();
// HTML PATHs // HTML PATHs
//$base = (dirname(getenv('SCRIPT_NAME'))==DS)?'/':dirname(getenv('SCRIPT_NAME')).'/';
$base = empty( $_SERVER['SCRIPT_NAME'] ) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; $base = empty( $_SERVER['SCRIPT_NAME'] ) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$base = dirname($base); $base = dirname($base);
if($base!=DS) { if($base!=DS) {
$base = $base.'/'; $base = $base.'/';
} }
else {
// Workaround for Windows Web Servers
$base = '/';
}
define('HTML_PATH_ROOT', $base); define('HTML_PATH_ROOT', $base);
@ -164,16 +170,20 @@ define('HTML_PATH_THEME_CSS', HTML_PATH_THEME.'css/');
define('HTML_PATH_THEME_JS', HTML_PATH_THEME.'js/'); define('HTML_PATH_THEME_JS', HTML_PATH_THEME.'js/');
define('HTML_PATH_THEME_IMG', HTML_PATH_THEME.'img/'); define('HTML_PATH_THEME_IMG', HTML_PATH_THEME.'img/');
define('HTML_PATH_ADMIN_THEME', HTML_PATH_ROOT.'admin/themes/'.$Site->adminTheme().'/');
define('HTML_PATH_ADMIN_THEME_JS', HTML_PATH_ADMIN_THEME.'js/');
define('HTML_PATH_ADMIN_ROOT', HTML_PATH_ROOT.'admin/'); define('HTML_PATH_ADMIN_ROOT', HTML_PATH_ROOT.'admin/');
define('HTML_PATH_ADMIN_THEME', HTML_PATH_ROOT.'kernel/admin/themes/'.$Site->adminTheme().'/');
define('HTML_PATH_ADMIN_THEME_JS', HTML_PATH_ADMIN_THEME.'js/');
define('HTML_PATH_ADMIN_THEME_CSS', HTML_PATH_ADMIN_THEME.'css/');
define('HTML_PATH_ADMIN_THEME_IMG', HTML_PATH_ADMIN_THEME.'img/');
define('HTML_PATH_UPLOADS', HTML_PATH_ROOT.'content/uploads/'); define('HTML_PATH_UPLOADS', HTML_PATH_ROOT.'content/uploads/');
define('HTML_PATH_UPLOADS_PROFILES', HTML_PATH_UPLOADS.'profiles/');
define('HTML_PATH_PLUGINS', HTML_PATH_ROOT.'plugins/'); define('HTML_PATH_PLUGINS', HTML_PATH_ROOT.'plugins/');
define('JQUERY', HTML_PATH_ADMIN_THEME_JS.'jquery.min.js'); define('JQUERY', HTML_PATH_ADMIN_THEME_JS.'jquery.min.js');
// PHP paths with dependency // PHP paths with dependency
define('PATH_THEME', PATH_ROOT.'themes/'.$Site->theme().'/'); define('PATH_THEME', PATH_ROOT.'themes'.DS.$Site->theme().DS);
define('PATH_THEME_PHP', PATH_THEME.'php'.DS); define('PATH_THEME_PHP', PATH_THEME.'php'.DS);
define('PATH_THEME_CSS', PATH_THEME.'css'.DS); define('PATH_THEME_CSS', PATH_THEME.'css'.DS);
define('PATH_THEME_JS', PATH_THEME.'js'.DS); define('PATH_THEME_JS', PATH_THEME.'js'.DS);

View File

@ -68,6 +68,13 @@ function buildPost($key)
$Post->setField('breakContent', $explode[0], true); $Post->setField('breakContent', $explode[0], true);
$Post->setField('readMore', !empty($explode[1]), true); $Post->setField('readMore', !empty($explode[1]), true);
// Date format
$postDate = $Post->date();
$Post->setField('dateRaw', $postDate, true);
$postDateFormated = $Post->dateRaw( $Site->dateFormat() );
$Post->setField('date', $postDateFormated, true);
// Parse username for the post. // Parse username for the post.
if( $dbUsers->userExists( $Post->username() ) ) if( $dbUsers->userExists( $Post->username() ) )
{ {

View File

@ -2,7 +2,7 @@
class dbSite extends dbJSON class dbSite extends dbJSON
{ {
private $dbFields = array( public $dbFields = array(
'title'=> array('inFile'=>false, 'value'=>'I am Guybrush Threepwood, mighty developer'), 'title'=> array('inFile'=>false, 'value'=>'I am Guybrush Threepwood, mighty developer'),
'slogan'=> array('inFile'=>false, 'value'=>''), 'slogan'=> array('inFile'=>false, 'value'=>''),
'description'=> array('inFile'=>false, 'value'=>''), 'description'=> array('inFile'=>false, 'value'=>''),
@ -19,7 +19,9 @@ class dbSite extends dbJSON
'uriTag'=> array('inFile'=>false, 'value'=>'/tag/'), 'uriTag'=> array('inFile'=>false, 'value'=>'/tag/'),
'url'=> array('inFile'=>false, 'value'=>''), 'url'=> array('inFile'=>false, 'value'=>''),
'cliMode'=> array('inFile'=>false, 'value'=>true), 'cliMode'=> array('inFile'=>false, 'value'=>true),
'emailFrom'=> array('inFile'=>false, 'value'=>'') 'emailFrom'=> array('inFile'=>false, 'value'=>''),
'dateFormat'=> array('inFile'=>false, 'value'=>'F j, Y'),
'timeFormat'=> array('inFile'=>false, 'value'=>'g:i a')
); );
function __construct() function __construct()
@ -61,9 +63,9 @@ class dbSite extends dbJSON
public function uriFilters($filter='') public function uriFilters($filter='')
{ {
$filters['admin'] = '/admin/'; $filters['admin'] = '/admin/';
$filters['post'] = $this->db['uriPost']; $filters['post'] = $this->getField('uriPost');
$filters['page'] = $this->db['uriPage']; $filters['page'] = $this->getField('uriPage');
$filters['tag'] = $this->db['uriTag']; $filters['tag'] = $this->getField('uriTag');
if(empty($filter)) { if(empty($filter)) {
return $filters; return $filters;
@ -74,70 +76,83 @@ class dbSite extends dbJSON
public function urlPost() public function urlPost()
{ {
return $this->url().ltrim($this->db['uriPost'], '/'); $filter = $this->getField('uriPost');
return $this->url().ltrim($filter, '/');
} }
public function urlPage() public function urlPage()
{ {
return $this->url().ltrim($this->db['uriPage'], '/'); $filter = $this->getField('uriPage');
return $this->url().ltrim($filter, '/');
} }
public function urlTag() public function urlTag()
{ {
return $this->url().ltrim($this->db['uriTag'], '/'); $filter = $this->getField('uriTag');
return $this->url().ltrim($filter, '/');
} }
// Returns the site title. // Returns the site title.
public function title() public function title()
{ {
return $this->db['title']; return $this->getField('title');
} }
public function emailFrom() public function emailFrom()
{ {
return $this->db['emailFrom']; return $this->getField('emailFrom');
}
public function dateFormat()
{
return $this->getField('dateFormat');
}
public function timeFormat()
{
return $this->getField('timeFormat');
} }
// Returns the site slogan. // Returns the site slogan.
public function slogan() public function slogan()
{ {
return $this->db['slogan']; return $this->getField('slogan');
} }
// Returns the site description. // Returns the site description.
public function description() public function description()
{ {
return $this->db['description']; return $this->getField('description');
} }
// Returns the site theme name. // Returns the site theme name.
public function theme() public function theme()
{ {
return $this->db['theme']; return $this->getField('theme');
} }
// Returns the admin theme name. // Returns the admin theme name.
public function adminTheme() public function adminTheme()
{ {
return $this->db['adminTheme']; return $this->getField('adminTheme');
} }
// Returns the footer text. // Returns the footer text.
public function footer() public function footer()
{ {
return $this->db['footer']; return $this->getField('footer');
} }
// Returns the url site. // Returns the url site.
public function url() public function url()
{ {
return $this->db['url']; return $this->getField('url');
} }
// Returns TRUE if the cli mode is enabled, otherwise FALSE. // Returns TRUE if the cli mode is enabled, otherwise FALSE.
public function cliMode() public function cliMode()
{ {
return $this->db['cliMode']; return $this->getField('cliMode');
} }
// Returns the relative home link // Returns the relative home link
@ -149,25 +164,25 @@ class dbSite extends dbJSON
// Returns the timezone. // Returns the timezone.
public function timezone() public function timezone()
{ {
return $this->db['timezone']; return $this->getField('timezone');
} }
// Returns posts per page. // Returns posts per page.
public function postsPerPage() public function postsPerPage()
{ {
return $this->db['postsperpage']; return $this->getField('postsperpage');
} }
// Returns the current language. // Returns the current language.
public function language() public function language()
{ {
return $this->db['language']; return $this->getField('language');
} }
// Returns the current locale. // Returns the current locale.
public function locale() public function locale()
{ {
return $this->db['locale']; return $this->getField('locale');
} }
// Returns the current language in short format. // Returns the current language in short format.
@ -183,7 +198,7 @@ class dbSite extends dbJSON
// Returns the current homepage. // Returns the current homepage.
public function homepage() public function homepage()
{ {
return $this->db['homepage']; return $this->getField('homepage');
} }
// Set the locale. // Set the locale.

View File

@ -0,0 +1,231 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
class Image {
private $image;
private $width;
private $height;
private $imageResized;
public function setImage($fileName, $newWidth, $newHeight, $option="auto")
{
// *** Open up the file
$this->image = $this->openImage($fileName);
// *** Get width and height
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
$this->resizeImage($newWidth, $newHeight, $option);
}
public function saveImage($savePath, $imageQuality="100", $forceJPG=false)
{
$extension = strtolower(pathinfo($savePath, PATHINFO_EXTENSION));
// Remove the extension
$filename = substr($savePath, 0,strrpos($savePath,'.'));
$path_complete = $filename.'.'.$extension;
if($forceJPG) {
imagejpeg($this->imageResized, $filename.'.jpg', $imageQuality);
}
else
{
switch($extension)
{
case 'jpg':
case 'jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $path_complete, $imageQuality);
}
break;
case 'gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $path_complete);
}
break;
case 'png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $path_complete, $invertScaleQuality);
}
break;
default:
// *** No extension - No save.
break;
}
}
imagedestroy($this->imageResized);
}
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = imagecreatefromjpeg($file);
break;
case '.gif':
$img = imagecreatefromgif($file);
break;
case '.png':
$img = imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}
private function resizeImage($newWidth, $newHeight, $option)
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
private function getDimensions($newWidth, $newHeight, $option)
{
if( ($this->width < $newWidth) and ($this->height < $newHeight) )
{
return array('optimalWidth' => $this->width, 'optimalHeight' => $this->height);
}
switch ($option)
{
case 'exact':
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
break;
case 'portrait':
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
break;
case 'landscape':
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
break;
case 'auto':
$optionArray = $this->getSizeByAuto($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
case 'crop':
$optionArray = $this->getOptimalCrop($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
private function getSizeByFixedHeight($newHeight)
{
$ratio = $this->width / $this->height;
$newWidth = $newHeight * $ratio;
return $newWidth;
}
private function getSizeByFixedWidth($newWidth)
{
$ratio = $this->height / $this->width;
$newHeight = $newWidth * $ratio;
return $newHeight;
}
private function getSizeByAuto($newWidth, $newHeight)
{
if ($this->height < $this->width)
// *** Image to be resized is wider (landscape)
{
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
}
elseif ($this->height > $this->width)
// *** Image to be resized is taller (portrait)
{
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
}
else
// *** Image to be resizerd is a square
{
if ($newHeight < $newWidth) {
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
} else if ($newHeight > $newWidth) {
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
} else {
// *** Sqaure being resized to a square
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
}
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
private function getOptimalCrop($newWidth, $newHeight)
{
$heightRatio = $this->height / $newHeight;
$widthRatio = $this->width / $newWidth;
if ($heightRatio < $widthRatio) {
$optimalRatio = $heightRatio;
} else {
$optimalRatio = $widthRatio;
}
$optimalHeight = $this->height / $optimalRatio;
$optimalWidth = $this->width / $optimalRatio;
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
{
// *** Find center - this will be used for the crop
$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
$cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
$crop = $this->imageResized;
//imagedestroy($this->imageResized);
// *** Now crop from center to exact requested size
$this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}
}

View File

@ -0,0 +1,526 @@
<?php
#
#
# Parsedown Extra
# https://github.com/erusev/parsedown-extra
#
# (c) Emanuil Rusev
# http://erusev.com
#
# For the full license information, view the LICENSE file that was distributed
# with this source code.
#
#
class ParsedownExtra extends Parsedown
{
# ~
const version = '0.7.0';
# ~
function __construct()
{
if (parent::version < '1.5.0')
{
throw new Exception('ParsedownExtra requires a later version of Parsedown');
}
$this->BlockTypes[':'] []= 'DefinitionList';
$this->BlockTypes['*'] []= 'Abbreviation';
# identify footnote definitions before reference definitions
array_unshift($this->BlockTypes['['], 'Footnote');
# identify footnote markers before before links
array_unshift($this->InlineTypes['['], 'FootnoteMarker');
}
#
# ~
function text($text)
{
$markup = parent::text($text);
# merge consecutive dl elements
$markup = preg_replace('/<\/dl>\s+<dl>\s+/', '', $markup);
# add footnotes
if (isset($this->DefinitionData['Footnote']))
{
$Element = $this->buildFootnoteElement();
$markup .= "\n" . $this->element($Element);
}
return $markup;
}
#
# Blocks
#
#
# Abbreviation
protected function blockAbbreviation($Line)
{
if (preg_match('/^\*\[(.+?)\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches))
{
$this->DefinitionData['Abbreviation'][$matches[1]] = $matches[2];
$Block = array(
'hidden' => true,
);
return $Block;
}
}
#
# Footnote
protected function blockFootnote($Line)
{
if (preg_match('/^\[\^(.+?)\]:[ ]?(.*)$/', $Line['text'], $matches))
{
$Block = array(
'label' => $matches[1],
'text' => $matches[2],
'hidden' => true,
);
return $Block;
}
}
protected function blockFootnoteContinue($Line, $Block)
{
if ($Line['text'][0] === '[' and preg_match('/^\[\^(.+?)\]:/', $Line['text']))
{
return;
}
if (isset($Block['interrupted']))
{
if ($Line['indent'] >= 4)
{
$Block['text'] .= "\n\n" . $Line['text'];
return $Block;
}
}
else
{
$Block['text'] .= "\n" . $Line['text'];
return $Block;
}
}
protected function blockFootnoteComplete($Block)
{
$this->DefinitionData['Footnote'][$Block['label']] = array(
'text' => $Block['text'],
'count' => null,
'number' => null,
);
return $Block;
}
#
# Definition List
protected function blockDefinitionList($Line, $Block)
{
if ( ! isset($Block) or isset($Block['type']))
{
return;
}
$Element = array(
'name' => 'dl',
'handler' => 'elements',
'text' => array(),
);
$terms = explode("\n", $Block['element']['text']);
foreach ($terms as $term)
{
$Element['text'] []= array(
'name' => 'dt',
'handler' => 'line',
'text' => $term,
);
}
$Block['element'] = $Element;
$Block = $this->addDdElement($Line, $Block);
return $Block;
}
protected function blockDefinitionListContinue($Line, array $Block)
{
if ($Line['text'][0] === ':')
{
$Block = $this->addDdElement($Line, $Block);
return $Block;
}
else
{
if (isset($Block['interrupted']) and $Line['indent'] === 0)
{
return;
}
if (isset($Block['interrupted']))
{
$Block['dd']['handler'] = 'text';
$Block['dd']['text'] .= "\n\n";
unset($Block['interrupted']);
}
$text = substr($Line['body'], min($Line['indent'], 4));
$Block['dd']['text'] .= "\n" . $text;
return $Block;
}
}
#
# Header
protected function blockHeader($Line)
{
$Block = parent::blockHeader($Line);
if (preg_match('/[ #]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE))
{
$attributeString = $matches[1][0];
$Block['element']['attributes'] = $this->parseAttributeData($attributeString);
$Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]);
}
return $Block;
}
#
# Markup
protected function blockMarkupComplete($Block)
{
if ( ! isset($Block['void']))
{
$Block['markup'] = $this->processTag($Block['markup']);
}
return $Block;
}
#
# Setext
protected function blockSetextHeader($Line, array $Block = null)
{
$Block = parent::blockSetextHeader($Line, $Block);
if (preg_match('/[ ]*{('.$this->regexAttribute.'+)}[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE))
{
$attributeString = $matches[1][0];
$Block['element']['attributes'] = $this->parseAttributeData($attributeString);
$Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]);
}
return $Block;
}
#
# Inline Elements
#
#
# Footnote Marker
protected function inlineFootnoteMarker($Excerpt)
{
if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches))
{
$name = $matches[1];
if ( ! isset($this->DefinitionData['Footnote'][$name]))
{
return;
}
$this->DefinitionData['Footnote'][$name]['count'] ++;
if ( ! isset($this->DefinitionData['Footnote'][$name]['number']))
{
$this->DefinitionData['Footnote'][$name]['number'] = ++ $this->footnoteCount; # » &
}
$Element = array(
'name' => 'sup',
'attributes' => array('id' => 'fnref'.$this->DefinitionData['Footnote'][$name]['count'].':'.$name),
'handler' => 'element',
'text' => array(
'name' => 'a',
'attributes' => array('href' => '#fn:'.$name, 'class' => 'footnote-ref'),
'text' => $this->DefinitionData['Footnote'][$name]['number'],
),
);
return array(
'extent' => strlen($matches[0]),
'element' => $Element,
);
}
}
private $footnoteCount = 0;
#
# Link
protected function inlineLink($Excerpt)
{
$Link = parent::inlineLink($Excerpt);
$remainder = substr($Excerpt['text'], $Link['extent']);
if (preg_match('/^[ ]*{('.$this->regexAttribute.'+)}/', $remainder, $matches))
{
$Link['element']['attributes'] += $this->parseAttributeData($matches[1]);
$Link['extent'] += strlen($matches[0]);
}
return $Link;
}
#
# ~
#
protected function unmarkedText($text)
{
$text = parent::unmarkedText($text);
if (isset($this->DefinitionData['Abbreviation']))
{
foreach ($this->DefinitionData['Abbreviation'] as $abbreviation => $meaning)
{
$pattern = '/\b'.preg_quote($abbreviation, '/').'\b/';
$text = preg_replace($pattern, '<abbr title="'.$meaning.'">'.$abbreviation.'</abbr>', $text);
}
}
return $text;
}
#
# Util Methods
#
protected function addDdElement(array $Line, array $Block)
{
$text = substr($Line['text'], 1);
$text = trim($text);
unset($Block['dd']);
$Block['dd'] = array(
'name' => 'dd',
'handler' => 'line',
'text' => $text,
);
if (isset($Block['interrupted']))
{
$Block['dd']['handler'] = 'text';
unset($Block['interrupted']);
}
$Block['element']['text'] []= & $Block['dd'];
return $Block;
}
protected function buildFootnoteElement()
{
$Element = array(
'name' => 'div',
'attributes' => array('class' => 'footnotes'),
'handler' => 'elements',
'text' => array(
array(
'name' => 'hr',
),
array(
'name' => 'ol',
'handler' => 'elements',
'text' => array(),
),
),
);
uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');
foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData)
{
if ( ! isset($DefinitionData['number']))
{
continue;
}
$text = $DefinitionData['text'];
$text = parent::text($text);
$numbers = range(1, $DefinitionData['count']);
$backLinksMarkup = '';
foreach ($numbers as $number)
{
$backLinksMarkup .= ' <a href="#fnref'.$number.':'.$definitionId.'" rev="footnote" class="footnote-backref">&#8617;</a>';
}
$backLinksMarkup = substr($backLinksMarkup, 1);
if (substr($text, - 4) === '</p>')
{
$backLinksMarkup = '&#160;'.$backLinksMarkup;
$text = substr_replace($text, $backLinksMarkup.'</p>', - 4);
}
else
{
$text .= "\n".'<p>'.$backLinksMarkup.'</p>';
}
$Element['text'][1]['text'] []= array(
'name' => 'li',
'attributes' => array('id' => 'fn:'.$definitionId),
'text' => "\n".$text."\n",
);
}
return $Element;
}
# ~
protected function parseAttributeData($attributeString)
{
$Data = array();
$attributes = preg_split('/[ ]+/', $attributeString, - 1, PREG_SPLIT_NO_EMPTY);
foreach ($attributes as $attribute)
{
if ($attribute[0] === '#')
{
$Data['id'] = substr($attribute, 1);
}
else # "."
{
$classes []= substr($attribute, 1);
}
}
if (isset($classes))
{
$Data['class'] = implode(' ', $classes);
}
return $Data;
}
# ~
protected function processTag($elementMarkup) # recursive
{
# http://stackoverflow.com/q/1148928/200145
libxml_use_internal_errors(true);
$DOMDocument = new DOMDocument;
# http://stackoverflow.com/q/11309194/200145
$elementMarkup = mb_convert_encoding($elementMarkup, 'HTML-ENTITIES', 'UTF-8');
# http://stackoverflow.com/q/4879946/200145
$DOMDocument->loadHTML($elementMarkup);
$DOMDocument->removeChild($DOMDocument->doctype);
$DOMDocument->replaceChild($DOMDocument->firstChild->firstChild->firstChild, $DOMDocument->firstChild);
$elementText = '';
if ($DOMDocument->documentElement->getAttribute('markdown') === '1')
{
foreach ($DOMDocument->documentElement->childNodes as $Node)
{
$elementText .= $DOMDocument->saveHTML($Node);
}
$DOMDocument->documentElement->removeAttribute('markdown');
$elementText = "\n".$this->text($elementText)."\n";
}
else
{
foreach ($DOMDocument->documentElement->childNodes as $Node)
{
$nodeMarkup = $DOMDocument->saveHTML($Node);
if ($Node instanceof DOMElement and ! in_array($Node->nodeName, $this->textLevelElements))
{
$elementText .= $this->processTag($nodeMarkup);
}
else
{
$elementText .= $nodeMarkup;
}
}
}
# because we don't want for markup to get encoded
$DOMDocument->documentElement->nodeValue = 'placeholder\x1A';
$markup = $DOMDocument->saveHTML($DOMDocument->documentElement);
$markup = str_replace('placeholder\x1A', $elementText, $markup);
return $markup;
}
# ~
protected function sortFootnotes($A, $B) # callback
{
return $A['number'] - $B['number'];
}
#
# Fields
#
protected $regexAttribute = '(?:[#.][-\w]+[ ]*)';
}

View File

@ -83,6 +83,11 @@ class Post extends fileContent
return $this->getField('username'); return $this->getField('username');
} }
public function profilePicture()
{
return HTML_PATH_UPLOADS_PROFILES.$this->username().'.jpg';
}
public function authorFirstName() public function authorFirstName()
{ {
return $this->getField('authorFirstName'); return $this->getField('authorFirstName');
@ -101,7 +106,13 @@ class Post extends fileContent
// Returns the post date according to locale settings and format settings. // Returns the post date according to locale settings and format settings.
public function date($format=false) public function date($format=false)
{ {
$date = $this->getField('date'); return $this->getField('date');
}
// Returns the post date according to locale settings and format as database stored.
public function dateRaw($format=false)
{
$date = $this->getField('dateRaw');
if($format) { if($format) {
return Date::format($date, DB_DATE_FORMAT, $format); return Date::format($date, DB_DATE_FORMAT, $format);

View File

@ -204,5 +204,14 @@
"upload-image": "Upload image", "upload-image": "Upload image",
"drag-and-drop-or-click-here": "Drag and drop or click here", "drag-and-drop-or-click-here": "Drag and drop or click here",
"insert-image": "Insert image", "insert-image": "Insert image",
"supported-image-file-types": "Supported image file types" "supported-image-file-types": "Supported image file types",
"date-format": "Date format",
"time-format": "Time format",
"chat-with-developers-and-users-on-gitter":"Chat with developers and users on [Gitter](https://gitter.im/dignajar/bludit)",
"this-is-a-brief-description-of-yourself-our-your-site":"This is a brief description of yourself or your site, to change this text go to the admin panel, settings, plugins, and configure the plugin about.",
"profile-picture": "Profile picture",
"the-about-page-is-very-important": "The about page is an important and powerful tool for potential clients and partners. For those who wonder who is behind the website, your About page is the first source of information.",
"change-this-pages-content-on-the-admin-panel": "Change this page's content on the admin panel, manage, pages and click on the about page.",
"about-your-site-or-yourself": "About your site or yourself",
"welcome-to-bludit": "Welcome to Bludit"
} }

View File

@ -3,7 +3,7 @@
{ {
"native": "Français (France)", "native": "Français (France)",
"english-name": "French", "english-name": "French",
"last-update": "2015-11-08", "last-update": "2015-11-15",
"author": "Frédéric K.", "author": "Frédéric K.",
"email": "stradfred@gmail.com", "email": "stradfred@gmail.com",
"website": "" "website": ""
@ -169,6 +169,7 @@
"cli-mode": "Mode Cli", "cli-mode": "Mode Cli",
"command-line-mode": "Mode ligne de commande", "command-line-mode": "Mode ligne de commande",
"enable-the-command-line-mode-if-you-add-edit": "Activer le mode ligne de commande si vous créez, modifiez ou supprimez des articles ou des pages du système de fichiers.", "enable-the-command-line-mode-if-you-add-edit": "Activer le mode ligne de commande si vous créez, modifiez ou supprimez des articles ou des pages du système de fichiers.",
"configure": "Configuration", "configure": "Configuration",
"uninstall": "Désinstaller", "uninstall": "Désinstaller",
"change-password": "Modifier le mot de passe", "change-password": "Modifier le mot de passe",
@ -202,6 +203,8 @@
"images": "Images", "images": "Images",
"upload-image": "Envoyer une image", "upload-image": "Envoyer une image",
"drag-and-drop-or-click-here": "Glissez et déposez ou cliquez ici", "drag-and-drop-or-click-here": "Glissez et déposez ou cliquez ici",
"insert-image": "Insérer limage sélectionnée" "insert-image": "Insérer limage sélectionnée",
"supported-image-file-types": "Extensions des images prises en charge",
"date-format": "Format de la Date",
"time-format": "Format de lheure"
} }

214
languages/he_IL.json Normal file
View File

@ -0,0 +1,214 @@
{
"language-data":
{
"native": "עברית",
"english-name": "Hebrew",
"last-update": "2015-11-16",
"author": "hxii",
"email": "paul@paulglushak.com",
"website": "http://paulglushak.com"
},
"username": "שם משתמש",
"password": "סיסמא",
"confirm-password": "אימות סיסמא",
"editor": "עורך",
"dashboard": "לוח מחוונים",
"role": "תפקיד",
"post": "הודעה",
"posts": "הודעות",
"users": "משתמשים",
"administrator": "מנהל",
"add": "הוסף",
"cancel": "ביטול",
"content": "תוכן",
"title": "כותרת",
"no-parent": "אין הורה",
"edit-page": "ערוך דף",
"edit-post": "ערוך הודעה",
"add-a-new-user": "הוספת משתמש חדש",
"parent": "הורה",
"friendly-url": "כתובת URL",
"description": "תאור",
"posted-by": "נכתב על ידי",
"tags": "תגיות",
"position": "מיקום",
"save": "שמור",
"draft": "טיוטה",
"delete": "מחק",
"registered": "רשום",
"Notifications": "התראות",
"profile": "פרופיל",
"email": "דואל",
"settings": "הגדרות",
"general": "כללי",
"advanced": "מתקדם",
"regional": "אזורי",
"about": "אודות",
"login": "כניסה",
"logout": "יציאה",
"manage": "ניהול",
"themes": "ערכות נושא",
"prev-page": "דף קודם",
"next-page": "דף הבא",
"configure-plugin": "הגדרת תוסף",
"confirm-delete-this-action-cannot-be-undone": "אתה בטוח שברצונך למחוק? לא ניתן לבטל פעולה זו.",
"site-title": "כותרת האתר",
"site-slogan": "סלוגן האתר",
"site-description": "תאור האתר",
"footer-text": "טקסט תחתון",
"posts-per-page": "הודעות לדף",
"site-url": "כתובת האתר",
"writting-settings": "הגדרות כתיבה",
"url-filters": "URL filters",
"page": "דף",
"pages": "דפים",
"home": "בית",
"welcome-back": "ברוכ\\ה השב\\ה",
"language": "שפה",
"website": "אתר",
"timezone": "אזור זמן",
"locale": "שפה",
"new-post": "הודעה חדשה",
"new-page": "דף חדש",
"html-and-markdown-code-supported": "HTML ו-Markdown נתמך",
"manage-posts": "ניהול הודעות",
"published-date": "תאריך פרסום",
"modified-date": "תאריך שינוי",
"empty-title": "כותרת ריקה",
"plugins": "תוספים",
"install-plugin": "התקנת תוסף",
"uninstall-plugin": "מחיקת תוסף",
"new-password": "סיסמא חדשה",
"edit-user": "עריכת משתמש",
"publish-now": "פרסם עכשיו",
"first-name": "שם פרטי",
"last-name": "שם משפחה",
"bludit-version": "גרסת Bludit",
"powered-by": "מופעל על ידי",
"recent-posts": "הודעות אחרונות",
"manage-pages": "ניהול דפים",
"advanced-options": "הגדרות מתקדמות",
"user-deleted": "המשתמש נמחק",
"page-added-successfully": "הדף הוסף בהצלחה",
"post-added-successfully": "ההודעה הוספה בהצלחה",
"the-post-has-been-deleted-successfully": "ההודעה נמחקה",
"the-page-has-been-deleted-successfully": "הדף נמחק",
"username-or-password-incorrect": "שם משתמש או סיסמא אינם נכונים",
"database-regenerated": "מסד הנתונים חודש",
"the-changes-have-been-saved": "ההגדרות נשמרו",
"enable-more-features-at": "אפשר יותר תכונות ב",
"username-already-exists": "שם משתמש כבר קיים",
"username-field-is-empty": "שדה שם המשתמש ריק",
"the-password-and-confirmation-password-do-not-match":"הסיסמאות אינן זהות",
"user-has-been-added-successfully": "המשתמש הוסף בהצלחה",
"you-do-not-have-sufficient-permissions": "אין לך הרשאות מתאימות לצפייה בדף זה. אנא צור קשר עם המנהל.",
"settings-advanced-writting-settings": "הגדרות->מתקדם->הגדרות כתיבה",
"new-posts-and-pages-synchronized": "הודעות ודפים חדשים סונכרנו.",
"you-can-choose-the-users-privilege": "באפשרותך להגדיר את הרשאות המשתמש. רק העורך יכול לכתוב הודעות וליצור דפים.",
"email-will-not-be-publicly-displayed": "כתובת הדואל לא תוצג. נדרשת עבור איפוס הסיסמא ועבור התראות.",
"use-this-field-to-name-your-site": "השתמש בשדה זה בכדי לתת שם לאתר שלך. השם יופיע בראשו של כל דף.",
"use-this-field-to-add-a-catchy-phrase": "השתמש בשדה זה בכדי לתת לאתרך סלוגן.",
"you-can-add-a-site-description-to-provide": "השתמש בשדה זה בכדי לספר בקצרה על אתרך.",
"you-can-add-a-small-text-on-the-bottom": "באפשרותך להוסיף טקסט קצר בתחתית העמוד.",
"number-of-posts-to-show-per-page": "מספר ההודעות שיש להראות בכל עמוד",
"the-url-of-your-site": "כתובת ה-URL של האתר",
"add-or-edit-description-tags-or": "הוסף או שנה את התאור, תגיות ואת כתובת ה-URL.",
"select-your-sites-language": "בחר את שפת האתר",
"select-a-timezone-for-a-correct": "בחר את אזור הזמן בו אתה נמצא",
"you-can-use-this-field-to-define-a-set-of": "באפשרותך להתמש בשדה זה בכדי להגדיר פרמטרים הקשורים לשפה, מדינה והגדרות נוספות.",
"you-can-modify-the-url-which-identifies":"באפשרותך לשנות את כתובת ה-URL של הודעה או דף בכדי שיהיו קריאים. עד 150 תוים.",
"this-field-can-help-describe-the-content": "בשדה זה ניתן לרשום תאור קצר של התוכן. עד 150 תוים.",
"delete-the-user-and-all-its-posts":"מחק את המשתמש ואת כל הודעותיו",
"delete-the-user-and-associate-its-posts-to-admin-user": "מחק את המשתמש והעבר את כל הודעותיו למנהל",
"read-more": "המשך לקרוא",
"show-blog": "הראה בלוג",
"default-home-page": "דף בית ברירת מחדל",
"version": "גרסא",
"there-are-no-drafts": "לא נמצא טיוטות.",
"create-a-new-article-for-your-blog":"צור הודעה חדשה לבלוג שלך.",
"create-a-new-page-for-your-website":"צור דף חדש לאתר שלך.",
"invite-a-friend-to-collaborate-on-your-website":"הזמן חבר להשתתף באתרך.",
"change-your-language-and-region-settings":"שינוי הגדרות שפה ומיקום.",
"language-and-timezone":"שפה ואזור זמן",
"author": "כותב",
"start-here": "התחל כאן",
"install-theme": "התקנת ערכת נושא",
"first-post": "הודעה ראשונה",
"congratulations-you-have-successfully-installed-your-bludit": "**Bludit** הותקן בהצלחה!",
"whats-next": "מה הלאה?",
"manage-your-bludit-from-the-admin-panel": "נהל את Bludit מ[דף הניהול](./admin/)",
"follow-bludit-on": "עקוב אחר Bludit",
"visit-the-support-forum": "בקר ב[פורום](http://forum.bludit.com) לתמיכה",
"read-the-documentation-for-more-information": "קרא את ה[מסמכים](http://docs.bludit.com) למידע נוסף",
"share-with-your-friends-and-enjoy": "שתף עם חבריך",
"the-page-has-not-been-found": "הדף לא נמצא.",
"error": "שגיאה",
"bludit-installer": "התקנת Bludit",
"welcome-to-the-bludit-installer": "ברוכים הבאים להתקנת Bludit",
"complete-the-form-choose-a-password-for-the-username-admin": "מלא את הפרטים ובחר סיסמא למשתמש « admin »",
"password-visible-field": "סיסמא, שדה גלוי",
"install": "התקנה",
"choose-your-language": "בחר שאת שפתך",
"next": "הבא",
"the-password-field-is-empty": "שדה הסיסמא ריק",
"your-email-address-is-invalid":"כתובת הדואל אינה נכונה",
"proceed-anyway": "המשך בכל זאת",
"drafts":"טיוטות",
"ip-address-has-been-blocked": "כתובת IP נחסמה",
"try-again-in-a-few-minutes": "אנא נסה בעוד מספר דקות",
"date": "תאריך",
"scheduled": "מתוכנן",
"publish": "פרסם",
"please-check-your-theme-configuration": "אנא בדוק את הגדרות ערכת הנושא.",
"plugin-label": "תווית תוסף",
"enabled": "מאופשר",
"disabled": "מבוטל",
"cli-mode": "מצב CLI",
"command-line-mode": "Command Line Mode",
"enable-the-command-line-mode-if-you-add-edit": "אפשר את מצב CLI אם ברצונך ליצור, לשנות ולמחוק הודעות ודפים דרך המערכת",
"configure": "הגדרה",
"uninstall": "ביטול התקנה",
"change-password": "שינוי סיסמא",
"to-schedule-the-post-just-select-the-date-and-time": "בכדי לתכנן הודעה, הגדר את הזמן והתאריך.",
"write-the-tags-separated-by-commas": "רשום תוויות מופרדות בפסיק",
"status": "סטטוס",
"published": "מפורסם",
"scheduled-posts": "הודעות מתוכננות",
"statistics": "סטטיסטיקה",
"name": "שם",
"email-account-settings":"הגדרות חשבון דואל",
"sender-email": "דואל שולח",
"emails-will-be-sent-from-this-address":"הודעות דואל ישלחו מכתובת זו",
"bludit-login-access-code": "BLUDIT - קוד גישת כניסה",
"check-your-inbox-for-your-login-access-code":"אנא בדוק בתיבת הדואל שלך לקוד גישה",
"there-was-a-problem-sending-the-email":"הייתה בעיה בשליחת המייל",
"back-to-login-form": "חזרה לדף כניסה",
"send-me-a-login-access-code": "שלח לי קוד גישה",
"get-login-access-code": "קבל קוד גישה",
"email-notification-login-access-code": "<p>זוהי התראה מאתרך {{WEBSITE_NAME}}</p><p>לקבלת קוד גישה, אנא לחץ על הקישור:</p><p>{{LINK}}</p>",
"there-are-no-scheduled-posts": "אין הודעות מתוכננות.",
"show-password": "הראה סיסמא",
"edit-or-remove-your=pages": "ערוך או מחק דפים",
"edit-or-remove-your-blogs-posts": "ערוך או מחק הודעות.",
"general-settings": "הגדרות כלליות",
"advanced-settings": "הגדרות מתקדמות",
"manage-users": "ניהול משתמשים",
"view-and-edit-your-profile": "ראה וערוך פרופיל אישי",
"password-must-be-at-least-6-characters-long": "הסיסמא חייבת להיות בעלת 5 תויים לפחות",
"images": "תמונות",
"upload-image": "העלה תמונה",
"drag-and-drop-or-click-here": "גרור תמונה או לחץ כאן",
"insert-image": "הכנס תמונה",
"supported-image-file-types": "סוגי קבצי תמונה נתמכים",
"date-format": "פורמט תאריך",
"time-format": "פורמט שעה",
"chat-with-developers-and-users-on-gitter":"שוחח עם מפתחים ומשתמשים ב[Gitter](https://gitter.im/dignajar/bludit)",
"this-is-a-brief-description-of-yourself-our-your-blog":"זהו תאור קצר עליך או על אתרך. בכדי לשנות אותו נווט לדף הניהול->הגדרות->תוספים והגדר את תוסף about",
"profile-picture": "תמונת פרופיל"
}

View File

@ -54,24 +54,32 @@ class pluginPages extends Plugin {
$parents = $pagesParents[NO_PARENT_CHAR]; $parents = $pagesParents[NO_PARENT_CHAR];
foreach($parents as $parent) foreach($parents as $parent)
{ {
// Print the parent // Check if the parent is published
$html .= '<li>'; if( $parent->published() )
$html .= '<a class="parent '.( ($parent->key()==$Url->slug())?' active':'').'" href="'.$parent->permalink().'">'.$parent->title().'</a>';
// Check if the parent has children
if(isset($pagesParents[$parent->key()]))
{ {
$children = $pagesParents[$parent->key()]; // Print the parent
$html .= '<li>';
$html .= '<a class="parent '.( ($parent->key()==$Url->slug())?' active':'').'" href="'.$parent->permalink().'">'.$parent->title().'</a>';
// Print children // Check if the parent has children
$html .= '<ul>'; if(isset($pagesParents[$parent->key()]))
foreach($children as $child)
{ {
$html .= '<li>'; $children = $pagesParents[$parent->key()];
$html .= '<a class="children '.( ($child->key()==$Url->slug())?' active':'').'" href="'.$child->permalink().'">'.$child->title().'</a>';
$html .= '</li>'; // Print children
$html .= '<ul class="children">';
foreach($children as $child)
{
// Check if the child is published
if( $child->published() )
{
$html .= '<li class="child">';
$html .= '<a class="'.( ($child->key()==$Url->slug())?' active':'').'" href="'.$child->permalink().'">'.$child->title().'</a>';
$html .= '</li>';
}
}
$html .= '</ul>';
} }
$html .= '</ul>';
} }
} }

View File

@ -2,11 +2,6 @@
"theme-data": "theme-data":
{ {
"name": "Pure", "name": "Pure",
"description": "Einfaches und übersichtliches Theme unter Verwendung des Frameworks Pure.css. Website: http://purecss.io.", "description": "Einfaches und übersichtliches Theme unter Verwendung des Frameworks Pure.css."
"author": "Bludit",
"email": "",
"website": "https://github.com/dignajar/bludit-themes",
"version": "0.3",
"releaseDate": "2015-10-02"
} }
} }

View File

@ -2,11 +2,11 @@
"theme-data": "theme-data":
{ {
"name": "Pure", "name": "Pure",
"description": "Simple and clean theme, based on the framework Pure.css. Website: http://purecss.io", "description": "Simple and clean theme, based on the framework Pure.css.",
"author": "Bludit", "author": "Bludit",
"email": "", "email": "",
"website": "https://github.com/dignajar/bludit-themes", "website": "https://github.com/dignajar/bludit-themes",
"version": "0.3", "version": "0.6",
"releaseDate": "2015-10-02" "releaseDate": "2015-11-13"
} }
} }

View File

@ -22,7 +22,7 @@
<?php <?php
echo $Language->get('Posted By').' '; echo $Language->get('Posted By').' ';
if( Text::isNotEmpty($Post->authorFirstName()) && Text::isNotEmpty($Post->authorLastName()) ) { if( Text::isNotEmpty($Post->authorFirstName()) || Text::isNotEmpty($Post->authorLastName()) ) {
echo $Post->authorFirstName().' '.$Post->authorLastName(); echo $Post->authorFirstName().' '.$Post->authorLastName();
} }
else { else {

View File

@ -20,7 +20,7 @@
<?php <?php
echo $Language->get('Posted By').' '; echo $Language->get('Posted By').' ';
if( Text::isNotEmpty($Post->authorFirstName()) && Text::isNotEmpty($Post->authorLastName()) ) { if( Text::isNotEmpty($Post->authorFirstName()) || Text::isNotEmpty($Post->authorLastName()) ) {
echo $Post->authorFirstName().' '.$Post->authorLastName(); echo $Post->authorFirstName().' '.$Post->authorLastName();
} }
else { else {