r20151031
This commit is contained in:
parent
f7433beba6
commit
2c120186f7
7 changed files with 243 additions and 66 deletions
14
_sakura/components/BBcode.php
Normal file
14
_sakura/components/BBcode.php
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
/*
|
||||
* BBcode parser
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
/**
|
||||
* Class BBcode
|
||||
* @package Sakura
|
||||
*/
|
||||
class BBcode
|
||||
{
|
||||
}
|
|
@ -1,14 +1,145 @@
|
|||
<?php
|
||||
/*
|
||||
* Template engine wrapper (new)
|
||||
* Template engine wrapper
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
use Twig_Environment;
|
||||
use Twig_Extension_StringLoader;
|
||||
use Twig_Loader_Filesystem;
|
||||
|
||||
/**
|
||||
* Class Template
|
||||
* @package Sakura
|
||||
*/
|
||||
class Template
|
||||
{
|
||||
// Engine container, template folder name, options and template variables
|
||||
private $vars = [];
|
||||
private $template;
|
||||
private $templateName;
|
||||
private $templateOptions;
|
||||
private $fallback;
|
||||
private $fallbackName;
|
||||
private $fallbackOptions;
|
||||
|
||||
// Initialise templating engine and data
|
||||
function __construct()
|
||||
{
|
||||
// Set template to default
|
||||
$this->setTemplate(Configuration::getConfig('site_style'));
|
||||
|
||||
// Set a fallback
|
||||
$this->setFallback(Configuration::getConfig('site_style'));
|
||||
}
|
||||
|
||||
// Set a template name
|
||||
public function setTemplate($name) {
|
||||
// Assign config path to a variable so we don't have to type it out twice
|
||||
$confPath = ROOT . '_sakura/templates/' . $name . '/template.ini';
|
||||
|
||||
// Check if the configuration file exists
|
||||
if (!file_exists($confPath)) {
|
||||
trigger_error('Template configuration does not exist', E_USER_ERROR);
|
||||
}
|
||||
|
||||
// Parse and store the configuration
|
||||
$this->templateOptions = parse_ini_file($confPath, true);
|
||||
|
||||
// Make sure we're not using a manage template for the main site or the other way around
|
||||
if (defined('SAKURA_MANAGE') && (bool) $this->templateOptions['manage']['mode'] != (bool) SAKURA_MANAGE) {
|
||||
trigger_error('Incorrect template type', E_USER_ERROR);
|
||||
}
|
||||
|
||||
// Set variables
|
||||
$this->templateName = $name;
|
||||
|
||||
// Reinitialise
|
||||
$this->initTemplate();
|
||||
}
|
||||
|
||||
// Initialise main template engine
|
||||
public function initTemplate() {
|
||||
// Initialise Twig Filesystem Loader
|
||||
$twigLoader = new Twig_Loader_Filesystem(ROOT . '_sakura/templates/' . $this->templateName);
|
||||
|
||||
// Environment variable
|
||||
$twigEnv = [];
|
||||
|
||||
// Enable caching
|
||||
if (Configuration::getConfig('enable_tpl_cache')) {
|
||||
$twigEnv['cache'] = ROOT . 'cache';
|
||||
}
|
||||
|
||||
// And now actually initialise the templating engine
|
||||
$this->template = new Twig_Environment($twigLoader, $twigEnv);
|
||||
|
||||
// Load String template loader
|
||||
$this->template->addExtension(new Twig_Extension_StringLoader());
|
||||
}
|
||||
|
||||
// Set a fallback
|
||||
private function setFallback($name) {
|
||||
// Assign config path to a variable so we don't have to type it out twice
|
||||
$confPath = ROOT . '_sakura/templates/' . $name . '/template.ini';
|
||||
|
||||
// Check if the configuration file exists
|
||||
if (!file_exists($confPath)) {
|
||||
trigger_error('Template configuration does not exist', E_USER_ERROR);
|
||||
}
|
||||
|
||||
// Parse and store the configuration
|
||||
$this->fallbackOptions = parse_ini_file($confPath, true);
|
||||
|
||||
// Make sure we're not using a manage template for the main site or the other way around
|
||||
if (defined('SAKURA_MANAGE') && (bool) $this->fallbackOptions['manage']['mode'] != (bool) SAKURA_MANAGE) {
|
||||
trigger_error('Incorrect template type', E_USER_ERROR);
|
||||
}
|
||||
|
||||
// Set variables
|
||||
$this->fallbackName = $name;
|
||||
|
||||
// Reinitialise
|
||||
$this->initFallback();
|
||||
}
|
||||
|
||||
// Initialise main fallback engine
|
||||
public function initFallback() {
|
||||
// Initialise Twig Filesystem Loader
|
||||
$twigLoader = new Twig_Loader_Filesystem(ROOT . '_sakura/templates/' . $this->fallbackName);
|
||||
|
||||
// Environment variable
|
||||
$twigEnv = [];
|
||||
|
||||
// Enable caching
|
||||
if (Configuration::getConfig('enable_tpl_cache')) {
|
||||
$twigEnv['cache'] = ROOT . 'cache';
|
||||
}
|
||||
|
||||
// And now actually initialise the templating engine
|
||||
$this->fallback = new Twig_Environment($twigLoader, $twigEnv);
|
||||
|
||||
// Load String template loader
|
||||
$this->fallback->addExtension(new Twig_Extension_StringLoader());
|
||||
}
|
||||
|
||||
// Set variables
|
||||
public function setVariables($vars) {
|
||||
$this->vars = array_merge($this->vars, $vars);
|
||||
}
|
||||
|
||||
// Render a template
|
||||
public function render($file)
|
||||
{
|
||||
try {
|
||||
return $this->template->render($file, $this->vars);
|
||||
} catch (\Exception $e) {
|
||||
try {
|
||||
return $this->fallback->render($file, $this->vars);
|
||||
} catch (\Exception $e) {
|
||||
trigger_error($e->getMessage(), E_USER_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
namespace Sakura;
|
||||
|
||||
// Define Sakura version
|
||||
define('SAKURA_VERSION', '20151024');
|
||||
define('SAKURA_VERSION', '20151031');
|
||||
define('SAKURA_VLABEL', 'Eminence');
|
||||
define('SAKURA_COLOUR', '#6C3082');
|
||||
define('SAKURA_STABLE', false);
|
||||
|
@ -34,6 +34,7 @@ require_once ROOT . '_sakura/components/Hashing.php';
|
|||
require_once ROOT . '_sakura/components/Configuration.php';
|
||||
require_once ROOT . '_sakura/components/Database.php';
|
||||
require_once ROOT . '_sakura/components/Urls.php';
|
||||
require_once ROOT . '_sakura/components/Template.php';
|
||||
require_once ROOT . '_sakura/components/Templates.php';
|
||||
require_once ROOT . '_sakura/components/Permissions.php';
|
||||
require_once ROOT . '_sakura/components/Session.php';
|
||||
|
|
|
@ -14,44 +14,34 @@
|
|||
background-image: linear-gradient(0deg, transparent 0%, transparent 12%, rgba(0, 0, 0, .7) 30%,
|
||||
transparent 76%, transparent 100%), url('{{ urls.format('IMAGE_HEADER', [profile.data.user_id]) }}');
|
||||
}
|
||||
|
||||
#profileHeader.floating {
|
||||
background-image: linear-gradient(90deg, transparent 0%, transparent 40%, #3A2E44 45%), url('{{ urls.format('IMAGE_HEADER', [profile.data.user_id]) }}');
|
||||
background-size: auto 130px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: left top;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{# block js %}
|
||||
{% block js %}
|
||||
<script type="text/javascript">
|
||||
// Header
|
||||
window.addEventListener("scroll", function(e) {
|
||||
if(e.pageY > 244) {
|
||||
if(e.pageY > 250) {
|
||||
var profileHeader = document.getElementById('profileHeader');
|
||||
var profileContent = document.getElementById('profileContent');
|
||||
var userAvatar = document.getElementById('userAvatar');
|
||||
profileHeader.style.position = 'fixed';
|
||||
profileHeader.style.paddingTop = '30px';
|
||||
profileHeader.style.top = '0';
|
||||
profileHeader.style.maxWidth = '1018px';
|
||||
profileHeader.style.height = '100px';
|
||||
profileContent.style.marginTop = '264px';
|
||||
userAvatar.style.height = '80px';
|
||||
userAvatar.style.width = '80px';
|
||||
userAvatar.style.margin = '10px';
|
||||
userAvatar.style.transition = '.2s';
|
||||
profileHeader.className = 'profileHeaderContent floating';
|
||||
profileContent.className = 'profileContainer headerFloating';
|
||||
} else {
|
||||
var profileHeader = document.getElementById('profileHeader');
|
||||
var profileContent = document.getElementById('profileContent');
|
||||
var userAvatar = document.getElementById('userAvatar');
|
||||
profileHeader.style.position = null;
|
||||
profileHeader.style.paddingTop = null;
|
||||
profileHeader.style.top = null;
|
||||
profileHeader.style.maxWidth = null;
|
||||
profileHeader.style.height = null;
|
||||
profileContent.style.marginTop = null;
|
||||
userAvatar.style.height = null;
|
||||
userAvatar.style.width = null;
|
||||
userAvatar.style.margin = null;
|
||||
profileHeader.className = 'profileHeaderContent';
|
||||
profileContent.className = 'profileContainer';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock #}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="profile" id="u{{ profile.data.user_id }}">
|
||||
|
|
|
@ -265,7 +265,7 @@ a:active {
|
|||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
#wrapper > #content {
|
||||
#content {
|
||||
position: relative;
|
||||
max-width: 1018px;
|
||||
margin: 0 auto;
|
||||
|
@ -276,16 +276,20 @@ a:active {
|
|||
border: 1px solid rgba(148, 117, 178, .6);
|
||||
}
|
||||
|
||||
#content.floatingNavigation {
|
||||
padding-top: 37px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Header navigation
|
||||
*/
|
||||
#content > #navigation {
|
||||
#navigation {
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
height: 25px;
|
||||
background: linear-gradient(0deg, transparent, #453851 50%, #342740) transparent;
|
||||
font-family: "Exo2-0-LightItalic", sans-serif;
|
||||
font-size: 2em;
|
||||
line-height: 30px;
|
||||
font-size: 1.5em;
|
||||
line-height: 25px;
|
||||
letter-spacing: 0;
|
||||
text-shadow: 1px 1px 3px #111;
|
||||
margin-bottom: 5px;
|
||||
|
@ -294,14 +298,19 @@ a:active {
|
|||
max-width: 1018px;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li {
|
||||
#content.floatingNavigation #navigation {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
#navigation > ul > li {
|
||||
list-style: none;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > a:not(.ignore) {
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
#navigation > ul > li > a:not(.ignore) {
|
||||
height: 25px;
|
||||
line-height: 25px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
color: inherit;
|
||||
|
@ -310,56 +319,57 @@ a:active {
|
|||
transition: .2s;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > a {
|
||||
#navigation > ul > li > a {
|
||||
z-index: 901;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#content > #navigation > .nav-left > li > a:not(.ignore):hover {
|
||||
#navigation > .nav-left > li > a:not(.ignore):hover {
|
||||
background: rgba(0, 0, 0, .2);
|
||||
}
|
||||
|
||||
#content > #navigation > .nav-left > li > a:not(.ignore):active {
|
||||
#navigation > .nav-left > li > a:not(.ignore):active {
|
||||
background: rgba(0, 0, 0, .3);
|
||||
}
|
||||
|
||||
#content > #navigation .nav-usermenu > a {
|
||||
#navigation .nav-usermenu > a {
|
||||
display: block !important;
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
#content > #navigation .nav-usermenu > a:after {
|
||||
#navigation .nav-usermenu > a:after {
|
||||
font-family: FontAwesome;
|
||||
content: " \f0d7";
|
||||
}
|
||||
|
||||
#content > #navigation .nav-usermenu:hover > a:after {
|
||||
#navigation .nav-usermenu:hover > a:after {
|
||||
font-family: FontAwesome;
|
||||
content: " \f0d8";
|
||||
}
|
||||
|
||||
#content > #navigation .nav-avatar {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
#navigation .nav-avatar {
|
||||
height: 25px;
|
||||
width: 25px;
|
||||
background: url('/pixel.png') no-repeat scroll left center / cover transparent;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > ul {
|
||||
#navigation > ul > li > ul {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li:hover > ul {
|
||||
#navigation > ul > li:hover > ul {
|
||||
display: block;
|
||||
z-index: 900;
|
||||
background: rgba(69, 56, 81, .5);
|
||||
background: rgba(69, 56, 81, .8);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
list-style: none;
|
||||
padding: 35px 4px 5px;
|
||||
padding: 30px 4px 5px;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, .75);
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > ul > li > a {
|
||||
#navigation > ul > li > ul > li > a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
|
@ -367,15 +377,15 @@ a:active {
|
|||
padding: 2px 7px;
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > ul > li > a:hover {
|
||||
background: rgba(0, 0, 0, .1);
|
||||
}
|
||||
|
||||
#content > #navigation > ul > li > ul > li > a:active {
|
||||
#navigation > ul > li > ul > li > a:hover {
|
||||
background: rgba(0, 0, 0, .2);
|
||||
}
|
||||
|
||||
#content > #navigation .nav-usermenu ul {
|
||||
#navigation > ul > li > ul > li > a:active {
|
||||
background: rgba(0, 0, 0, .3);
|
||||
}
|
||||
|
||||
#navigation .nav-usermenu ul {
|
||||
right: -30px;
|
||||
text-align: right;
|
||||
min-width: 150px;
|
||||
|
@ -404,8 +414,8 @@ a:active {
|
|||
align-content: stretch;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
top: -35px;
|
||||
margin-bottom: -35px;
|
||||
top: -31px;
|
||||
margin-bottom: -31px;
|
||||
}
|
||||
|
||||
.profile .profileContainer {
|
||||
|
@ -436,6 +446,15 @@ a:active {
|
|||
align-items: flex-end;
|
||||
}
|
||||
|
||||
#profileHeader.floating {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
padding-top: 30px;
|
||||
max-width: 1018px;
|
||||
height: 95px;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, .75);
|
||||
}
|
||||
|
||||
#userAvatar {
|
||||
font-size: 0;
|
||||
background: transparent no-repeat scroll left center / cover;
|
||||
|
@ -446,6 +465,13 @@ a:active {
|
|||
margin: 10px;
|
||||
margin-bottom: -10px;
|
||||
flex-shrink: 0;
|
||||
transition: .2s;
|
||||
}
|
||||
|
||||
#profileHeader.floating #userAvatar {
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
margin: 5px 5px -5px;
|
||||
}
|
||||
|
||||
#profileHeader > .userData {
|
||||
|
@ -456,6 +482,14 @@ a:active {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
#profileHeader.floating > .userData {
|
||||
position: initial;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
font-size: .8em;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
#profileHeader > .userData > .headerLeft {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
@ -478,6 +512,10 @@ a:active {
|
|||
margin: 10px 10px 0 0;
|
||||
}
|
||||
|
||||
#profileContent.headerFloating {
|
||||
margin-top: 264px;
|
||||
}
|
||||
|
||||
#profileContent > .userDataBar {
|
||||
width: 210px;
|
||||
margin-top: 10px;
|
||||
|
|
|
@ -84,15 +84,9 @@ function convertParallaxPositionValue(pos, dir, neg) {
|
|||
window.addEventListener("scroll", function(e) {
|
||||
if(e.pageY > 123) {
|
||||
var content = document.getElementById('content');
|
||||
var navigation = document.getElementById('navigation');
|
||||
navigation.style.position = 'fixed';
|
||||
navigation.style.top = '0';
|
||||
content.style.paddingTop = '37px';
|
||||
content.className = 'floatingNavigation';
|
||||
} else {
|
||||
var content = document.getElementById('content');
|
||||
var navigation = document.getElementById('navigation');
|
||||
navigation.style.position = null;
|
||||
navigation.style.top = null;
|
||||
content.style.paddingTop = null;
|
||||
content.className = null;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -74,5 +74,14 @@ $renderData['stats'] = [
|
|||
'onlineUsers' => Users::checkAllOnline(),
|
||||
];
|
||||
|
||||
// Initialise templating engine
|
||||
$template = new Template();
|
||||
|
||||
// Change templating engine
|
||||
$template->setTemplate($templateName);
|
||||
|
||||
// Set parse variables
|
||||
$template->setVariables($renderData);
|
||||
|
||||
// Print page contents
|
||||
print Templates::render(($forumMode ? 'forum' : 'main') . '/index.tpl', $renderData);
|
||||
echo $template->render(($forumMode ? 'forum' : 'main') . '/index.tpl');
|
||||
|
|
Reference in a new issue