Merge remote-tracking branch 'dignajar/master'

This commit is contained in:
Frédéric K 2015-11-19 20:29:32 +01:00
commit 3ce094e118
81 changed files with 973 additions and 43 deletions

View File

@ -16,6 +16,7 @@ Social
- [Twitter](https://twitter.com/bludit)
- [Facebook](https://www.facebook.com/bluditcms)
- [Google+](https://plus.google.com/+Bluditcms)
- [Freenode IRC](https://webchat.freenode.net) channel #bludit
[![Join the chat at https://gitter.im/dignajar/bludit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dignajar/bludit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
@ -30,6 +31,7 @@ You only need a web server with PHP support.
* Apache with [mod_rewrite](http://httpd.apache.org/docs/current/mod/mod_rewrite.html) module.
* Lighttpd with [mod_rewrite](http://redmine.lighttpd.net/projects/1/wiki/docs_modrewrite) module.
* Nginx with [ngx_http_rewrite_module](http://nginx.org/en/docs/http/ngx_http_rewrite_module.html) module.
* PHP Built-in web server
Installation guide
------------------

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_POSTS', PATH_CONTENT.'posts'.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_DATABASES', PATH_CONTENT.'databases'.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_LANGUAGES', PATH_ROOT.'languages'.DS);
define('PATH_ABSTRACT', PATH_KERNEL.'abstract'.DS);
define('DOMAIN', getenv('HTTP_HOST'));
define('DOMAIN', $_SERVER['HTTP_HOST']);
// 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);
// Log separator
@ -220,6 +231,12 @@ function install($adminPassword, $email, $timezoneOffset)
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))
{
$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);
}
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);
}
@ -259,6 +282,14 @@ function install($adminPassword, $email, $timezoneOffset)
'status'=>'published',
'date'=>$currentDate,
'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
$data = array(
$firstPostSlug=>array(
'description'=>'Welcome to Bludit',
'description'=>$Language->get('Welcome to Bludit'),
'username'=>'admin',
'status'=>'published',
'tags'=>array('bludit'=>'Bludit','cms'=>'CMS','flat-files'=>'Flat files'),
@ -279,10 +310,10 @@ function install($adminPassword, $email, $timezoneOffset)
// File site.php
$data = array(
'title'=>'Bludit',
'slogan'=>'cms',
'title'=>'BLUDIT',
'slogan'=>'CMS',
'description'=>'',
'footer'=>Date::current('Y'),
'footer'=>'Copyright © '.Date::current('Y'),
'language'=>$Language->getCurrentLocale(),
'locale'=>$Language->getCurrentLocale(),
'timezone'=>$timezone,
@ -306,7 +337,7 @@ function install($adminPassword, $email, $timezoneOffset)
$data = array(
'admin'=>array(
'firstName'=>'',
'firstName'=>$Language->get('Administrator'),
'lastName'=>'',
'twitter'=>'',
'role'=>'admin',
@ -364,6 +395,19 @@ function install($adminPassword, $email, $timezoneOffset)
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_put_contents(
PATH_PLUGINS_DATABASES.'simplemde'.DS.'db.php',
@ -395,15 +439,23 @@ function install($adminPassword, $email, $timezoneOffset)
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
$data = 'Title: '.$Language->get('First post').'
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('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('Read the documentation for more information').'
- '.$Language->get('Share with your friends and enjoy');
@ -469,7 +521,7 @@ if( $_SERVER['REQUEST_METHOD'] == 'POST' )
<!DOCTYPE HTML>
<html class="uk-height-1-1 uk-notouch">
<head>
<base href="admin/themes/default/">
<base href="kernel/admin/themes/default/">
<meta charset="<?php echo CHARSET ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

View File

@ -26,6 +26,10 @@
background: #1F5FC4;
}
.uk-form legend {
width: 70% !important;
}
.uk-navbar-nav > li > a {
border: none;
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">
<ul class="uk-navbar-nav">
<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">
<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>

View File

@ -207,4 +207,64 @@ class 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'));
echo '<div class="uk-grid">';
echo '<div class="uk-width-7-10">';
HTML::formOpen(array('id'=>'edit-user-profile-form','class'=>'uk-form-horizontal'));
// Security token
@ -92,6 +95,13 @@ if( ($Login->role()==='admin') && ($_user['username']!='admin') ) {
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>

View File

@ -1,6 +1,6 @@
<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() ?>">

View File

@ -1,6 +1,6 @@
<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() ?>">

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 = $_FILES['files']['tmp_name'][0];
@ -24,12 +32,26 @@ if(empty($tmpName)) {
$tmpName = $filename.'.'.$fileExtension;
}
// --- 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(
'status'=>0,
'filename'=>$tmpName,
'date'=>date("F d Y H:i:s.", filemtime(PATH_UPLOADS.$tmpName))
'filename'=>$tmpName
)));
?>

View File

@ -35,7 +35,8 @@ define('PATH_PAGES', PATH_CONTENT.'pages'.DS);
define('PATH_DATABASES', PATH_CONTENT.'databases'.DS);
define('PATH_PLUGINS_DATABASES', PATH_CONTENT.'databases'.DS.'plugins'.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_CONTROLLERS', PATH_ADMIN.'controllers'.DS);
define('PATH_ADMIN_VIEWS', PATH_ADMIN.'views'.DS);
@ -113,6 +114,7 @@ include(PATH_KERNEL.'page.class.php');
include(PATH_KERNEL.'url.class.php');
include(PATH_KERNEL.'login.class.php');
include(PATH_KERNEL.'parsedown.class.php');
include(PATH_KERNEL.'parsedownextra.class.php');
include(PATH_KERNEL.'security.class.php');
// Include Helpers Classes
@ -144,7 +146,7 @@ $dbUsers = new dbUsers();
$dbTags = new dbTags();
$Site = new dbSite();
$Url = new Url();
$Parsedown = new Parsedown();
$Parsedown = new ParsedownExtra();
$Security = new Security();
// HTML PATHs
@ -168,10 +170,14 @@ define('HTML_PATH_THEME_CSS', HTML_PATH_THEME.'css/');
define('HTML_PATH_THEME_JS', HTML_PATH_THEME.'js/');
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_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_PROFILES', HTML_PATH_UPLOADS.'profiles/');
define('HTML_PATH_PLUGINS', HTML_PATH_ROOT.'plugins/');
define('JQUERY', HTML_PATH_ADMIN_THEME_JS.'jquery.min.js');

View File

@ -19,7 +19,7 @@ class Image {
$this->resizeImage($newWidth, $newHeight, $option);
}
public function saveImage($savePath, $imageQuality="100", $force_jpg=false)
public function saveImage($savePath, $imageQuality="100", $forceJPG=false)
{
$extension = strtolower(pathinfo($savePath, PATHINFO_EXTENSION));
@ -28,8 +28,7 @@ class Image {
$path_complete = $filename.'.'.$extension;
if($force_jpg)
{
if($forceJPG) {
imagejpeg($this->imageResized, $filename.'.jpg', $imageQuality);
}
else

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');
}
public function profilePicture()
{
return HTML_PATH_UPLOADS_PROFILES.$this->username().'.jpg';
}
public function authorFirstName()
{
return $this->getField('authorFirstName');

View File

@ -1,9 +1,10 @@
{
"language-data":
{
"native": "Български (България)",
"english-name": "Bulgarian",
"last-update": "2015-11-09",
"last-update": "2015-11-18",
"author": "Христо Дипчиков",
"email": "",
"website": "www.hristodipchikov.tk"
@ -36,7 +37,7 @@
"save": "Запази",
"draft": "Чернова",
"delete": "Изтриване",
"registered": "Препоръчано",
"registered": "Добавен",
"Notifications": "Известия",
"profile": "Профил",
"email": "Имейл адрес",
@ -202,5 +203,16 @@
"images": "Снимки",
"upload-image": "Прикачи снимка",
"drag-and-drop-or-click-here": "Влачите и пускате или натиснете тук",
"insert-image": "Вмъкни снимка"
"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-site":"Това е кратко описание на вашия сайт, за да се промени този текст отидете в админ панела, настройки плъгини, конфигуриране на плъгин About.",
"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": "Промяна на съдържанието на страницата се извършва от админ панела, управление, страници и кликнете върху страницата.",
"about-your-site-or-yourself": "За твоя сайт или за теб",
"welcome-to-bludit": "Добре дошли в Bludit"
}

View File

@ -3,7 +3,7 @@
{
"native": "Deutsch (Deutschland)",
"english-name": "German",
"last-update": "2015-11-13",
"last-update": "2015-11-18",
"author": "Edi Goetschel",
"email": "egoetschel@clickwork.ch",
"website": "http://www.clickwork.ch"
@ -201,5 +201,15 @@
"images": "Bilder",
"upload-image": "Bild hochladen",
"drag-and-drop-or-click-here": "Drag and Drop oder klicke hier",
"insert-image": "Bild einfügen"
"insert-image": "Bild einfügen",
"supported-image-file-types": "Unterstützte Datei-Formate",
"date-format": "Datumsformat",
"time-format": "Zeitformat",
"chat-with-developers-and-users-on-gitter":"Chatte mit Entwicklern und Benutzern bei [Gitter](https://gitter.im/dignajar/bludit)",
"this-is-a-brief-description-of-yourself-our-your-site":"Dies ist eine kurze Beschreibung, wer du bist, oder Deiner Website. Um diesen Text zu ändern, gehe im Admin-Panel zu den Einstellunge und konfiguriere unter \"Plugins\" das Plugin \"Über\".",
"profile-picture": "Profil-Bild",
"the-about-page-is-very-important": "Die Seite \"Über mich\" ist ein wichtig und wirkungsvoll beispielsweise für zukünfige Kunden und Partner. Für alle, die wissen möchten, wer hinter der Website steht, ist die \"Über mich\"-Seite die erste Informationsquelle.",
"change-this-pages-content-on-the-admin-panel": "Den Inhalt dieser Seite kann im Admin-Panel unter \"Verwaltung\" > \"Seiten\" geändert werden.",
"about-your-site-or-yourself": "Über dich oder deine Website",
"welcome-to-bludit": "Willkommen bei Bludit"
}

View File

@ -206,5 +206,12 @@
"insert-image": "Insert image",
"supported-image-file-types": "Supported image file types",
"date-format": "Date format",
"time-format": "Time 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"
}

0
languages/fr_FR.json Executable file → Normal file
View File

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

@ -22,7 +22,7 @@
<?php
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();
}
else {

View File

@ -20,7 +20,7 @@
<?php
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();
}
else {