my local repository broke so all this shit happened, have a nice day
This commit is contained in:
parent
af2eefff5d
commit
9aaf4877d9
2476 changed files with 3696 additions and 36242 deletions
0
.gitattributes
vendored
Executable file → Normal file
0
.gitattributes
vendored
Executable file → Normal file
0
.gitignore
vendored
Executable file → Normal file
0
.gitignore
vendored
Executable file → Normal file
1
CONTRIBUTORS.md
Executable file → Normal file
1
CONTRIBUTORS.md
Executable file → Normal file
|
@ -17,3 +17,4 @@ This is a list of people who have contributed to Sakura and also a list of the l
|
|||
- [Parsedown](http://parsedown.org/)
|
||||
- [PHPMailer](https://github.com/PHPMailer/PHPMailer)
|
||||
- [PayPal API](https://paypal.com/)
|
||||
- [jBBCode](http://jbbcode.com/)
|
||||
|
|
0
LICENSE
Executable file → Normal file
0
LICENSE
Executable file → Normal file
0
README.md
Executable file → Normal file
0
README.md
Executable file → Normal file
107
_sakura/components/BBcode.php
Normal file
107
_sakura/components/BBcode.php
Normal file
|
@ -0,0 +1,107 @@
|
|||
<?php
|
||||
/*
|
||||
* BBcode Wrapper
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\DefaultCodeDefinitionSet;
|
||||
use JBBCode\CodeDefinitionBuilder;
|
||||
|
||||
/**
|
||||
* Class BBcode
|
||||
* @package Sakura
|
||||
*/
|
||||
class BBcode
|
||||
{
|
||||
// Parser container
|
||||
private $bbcode;
|
||||
|
||||
// Constructor
|
||||
public function __construct($text = null) {
|
||||
// Create new parser class
|
||||
$this->bbcode = new Parser();
|
||||
|
||||
// Add the standard definitions
|
||||
$this->loadStandardCodes();
|
||||
|
||||
// Immediately parse the text if set
|
||||
if ($text != null) {
|
||||
$this->bbcode->parse($text);
|
||||
}
|
||||
}
|
||||
|
||||
// Add basic bbcodes
|
||||
public function loadStandardCodes() {
|
||||
// Add the standard definitions
|
||||
$this->bbcode->addCodeDefinitionSet(new DefaultCodeDefinitionSet());
|
||||
|
||||
// Header tag
|
||||
$builder = new CodeDefinitionBuilder('header', '<h2>{param}</h2>');
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Strike tag
|
||||
$builder = new CodeDefinitionBuilder('s', '<del>{param}</del>');
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Spoiler tag
|
||||
$builder = new CodeDefinitionBuilder('spoiler', '<div class="spoiler">{param}</div>');
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Box tag
|
||||
$builder = new CodeDefinitionBuilder('box', '<div class="spoiler-box-container"><div class="spoiler-box-title">Click to open.</div><div class="spoiler-box-content">{param}</div></div>');
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Box tag
|
||||
$builder = new CodeDefinitionBuilder('box', '<div class="spoiler-box-container"><div class="spoiler-box-title">{option}</div><div class="spoiler-box-content">{param}</div></div>');
|
||||
$builder->setUseOption(true);
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Quote tag
|
||||
$builder = new CodeDefinitionBuilder('quote', '<blockquote>{param}</blockquote>');
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Quote tag
|
||||
$builder = new CodeDefinitionBuilder('quote', '<h4>{option} wrote:</h4><blockquote>{param}</blockquote>');
|
||||
$builder->setUseOption(true);
|
||||
$this->bbcode->addCodeDefinition($builder->build());
|
||||
|
||||
// Add special definitions (PHP files MUST have the same name as the definition class
|
||||
foreach (glob(ROOT . '_sakura/components/BBcodeDefinitions/*.php') as $ext) {
|
||||
// Include the class
|
||||
require_once $ext;
|
||||
|
||||
// Clean the file path
|
||||
$ext = str_replace(ROOT . '_sakura/components/', '', $ext);
|
||||
$ext = str_replace('.php', '', $ext);
|
||||
$ext = str_replace('/', '\\', $ext);
|
||||
|
||||
// Build the classname
|
||||
$className = __NAMESPACE__ . '\\' . $ext;
|
||||
|
||||
// Add the BBcode definition
|
||||
$this->bbcode->addCodeDefinition(new $className);
|
||||
}
|
||||
}
|
||||
|
||||
// Set text
|
||||
public function text($text) {
|
||||
$this->bbcode->parse($text);
|
||||
}
|
||||
|
||||
// Get as HTML
|
||||
public function toHTML() {
|
||||
return nl2br($this->bbcode->getAsHtml());
|
||||
}
|
||||
|
||||
// Get as BBmarkup
|
||||
public function toEditor() {
|
||||
return $this->bbcode->getAsBBCode();
|
||||
}
|
||||
|
||||
// Get as plaintext
|
||||
public function toPlain() {
|
||||
return $this->bbcode->getAsText();
|
||||
}
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* BBcode main
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcode;
|
||||
|
||||
class BBcode
|
||||
{
|
||||
// Text
|
||||
private $text;
|
||||
private $seed;
|
||||
|
||||
// Contructor
|
||||
public function __construct($text = "", $seed = '9001')
|
||||
{
|
||||
$this->setText($text);
|
||||
$this->seed = $seed;
|
||||
}
|
||||
|
||||
// Set text
|
||||
public function setText($text)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
// Convert to storage format
|
||||
public function toStore()
|
||||
{
|
||||
// Create new Store
|
||||
$store = new Store($this->text, $this->seed);
|
||||
|
||||
// Parse
|
||||
$store = $store->generate();
|
||||
|
||||
// And return
|
||||
return $store;
|
||||
}
|
||||
|
||||
// Convert to HTML
|
||||
public function toHTML()
|
||||
{
|
||||
// Create new Parse
|
||||
$parse = new Parse($this->text, $this->seed);
|
||||
|
||||
// Parse
|
||||
$parse = $parse->parse();
|
||||
|
||||
// And return
|
||||
return $parse;
|
||||
}
|
||||
|
||||
// Convert to plain text
|
||||
public function toEditor()
|
||||
{
|
||||
// Create new Parse
|
||||
$parse = new Parse($this->text, $this->seed);
|
||||
|
||||
// Parse
|
||||
$parse = $parse->toEditor();
|
||||
|
||||
// And return
|
||||
return $parse;
|
||||
}
|
||||
}
|
|
@ -1,178 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* BBcode parser
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcode;
|
||||
|
||||
use \HTMLPurifier;
|
||||
use \HTMLPurifier_Config;
|
||||
use Sakura\Main;
|
||||
|
||||
class Parse
|
||||
{
|
||||
// Text
|
||||
private $text;
|
||||
private $seed;
|
||||
|
||||
// Simple bbcodes
|
||||
private $simple = [
|
||||
'b' => 'strong',
|
||||
'i' => 'em',
|
||||
'u' => 'u',
|
||||
's' => 'del',
|
||||
'h' => 'h2',
|
||||
];
|
||||
|
||||
// Advanced bbcodes
|
||||
private $advanced = [
|
||||
'spoiler' => '<span class="spoiler">|</span>',
|
||||
];
|
||||
|
||||
public function __construct($text = "", $seed = '9001')
|
||||
{
|
||||
$this->setText($text);
|
||||
$this->seed = $seed;
|
||||
}
|
||||
|
||||
public function setText($text)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
public function parseImage($text)
|
||||
{
|
||||
return preg_replace_callback(
|
||||
"#\[img:{$this->seed}\](?<url>[^[]+)\[/img:{$this->seed}\]#",
|
||||
function ($i) {
|
||||
return "<img src=\"{$i['url']}\" alt=\"{$i['url']}\" />";
|
||||
},
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
public function parseList($text)
|
||||
{
|
||||
$text = preg_replace("#\[list=\d+:{$this->seed}\]#", '<ol>', $text);
|
||||
$text = preg_replace("#\[list(=.?)?:{$this->seed}\]#", "<ol class='unordered'>", $text);
|
||||
$text = preg_replace("#\[/\*(:m)?:{$this->seed}\]\n?#", '</li>', $text);
|
||||
$text = str_replace("[*:{$this->seed}]", '<li>', $text);
|
||||
$text = str_replace("[/list:o:{$this->seed}]", '</ol>', $text);
|
||||
$text = str_replace("[/list:u:{$this->seed}]", '</ol>', $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseCode($text)
|
||||
{
|
||||
return preg_replace_callback(
|
||||
"#[\r|\n]*\[code:{$this->seed}\][\r|\n]*(.*?)[\r|\n]*\[/code:{$this->seed}\][\r|\n]*#s",
|
||||
function ($c) {
|
||||
return '<pre class="prettyprint linenums">' . str_replace('<br />', '', $c[1]) . '</pre>';
|
||||
},
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
public function parseQuote($text)
|
||||
{
|
||||
$text = preg_replace("#\[quote="([^:]+)":{$this->seed}\]#", '<blockquote><h4>\\1 wrote:</h4>', $text);
|
||||
$text = str_replace("[quote:{$this->seed}]", '<blockquote>', $text);
|
||||
$text = str_replace("[/quote:{$this->seed}]", '</blockquote>', $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseSimple($text)
|
||||
{
|
||||
// Parse all simple tags
|
||||
foreach ($this->simple as $code => $tag) {
|
||||
$text = str_replace("[{$code}:{$this->seed}]", "<{$tag}>", $text);
|
||||
$text = str_replace("[/{$code}:{$this->seed}]", "</{$tag}>", $text);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseAdvanced($text)
|
||||
{
|
||||
// Parse all advanced tags
|
||||
foreach ($this->advanced as $code => $tags) {
|
||||
$tags = explode('|', $tags);
|
||||
|
||||
$text = str_replace("[{$code}:{$this->seed}]", $tags[0], $text);
|
||||
$text = str_replace("[/{$code}:{$this->seed}]", $tags[1], $text);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseColour($text)
|
||||
{
|
||||
$text = preg_replace("#\[color=([^:]+):{$this->seed}\]#", "<span style='color:\\1'>", $text);
|
||||
$text = str_replace("[/color:{$this->seed}]", '</span>', $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseUrl($text)
|
||||
{
|
||||
$text = preg_replace("#\[url:{$this->seed}\](.+?)\[/url:{$this->seed}\]#", "<a rel='nofollow' href='\\1'>\\1</a>", $text);
|
||||
$text = preg_replace("#\[url=(.+?):{$this->seed}\]#", "<a rel='nofollow' href='\\1'>", $text);
|
||||
$text = str_replace("[/url:{$this->seed}]", '</a>', $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function purify($text)
|
||||
{
|
||||
$config = HTMLPurifier_Config::createDefault();
|
||||
$config->set('Cache.SerializerPath', ROOT . 'cache/htmlpurifier');
|
||||
$config->set('Attr.AllowedRel', ['nofollow']);
|
||||
$config->set('HTML.Trusted', true);
|
||||
|
||||
$def = $config->getHTMLDefinition(true);
|
||||
|
||||
$def->addAttribute('img', 'src', 'Text');
|
||||
|
||||
$purifier = new HTMLPurifier($config);
|
||||
|
||||
return $purifier->purify($text);
|
||||
}
|
||||
|
||||
public function parse()
|
||||
{
|
||||
// Get text
|
||||
$text = $this->text;
|
||||
|
||||
$text = $this->parseCode($text);
|
||||
$text = $this->parseList($text);
|
||||
$text = $this->parseQuote($text);
|
||||
|
||||
$text = $this->parseAdvanced($text);
|
||||
$text = $this->parseColour($text);
|
||||
$text = $this->parseImage($text);
|
||||
$text = $this->parseSimple($text);
|
||||
$text = $this->parseUrl($text);
|
||||
|
||||
$text = Main::parseEmotes($text);
|
||||
|
||||
$text = str_replace("\n", '<br />', $text);
|
||||
//$text = $this->purify($text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function toEditor()
|
||||
{
|
||||
$text = $this->text;
|
||||
|
||||
$text = str_replace("[/*:m:{$this->seed}]", '', $text);
|
||||
|
||||
$text = preg_replace("#\[/list:[ou]:{$this->seed}\]#", '[/list]', $text);
|
||||
|
||||
$text = str_replace(":{$this->seed}]", ']', $text);
|
||||
|
||||
$text = preg_replace('#<!-- ([emw]) --><a.*?>(.*?)</a><!-- \\1 -->#', '\\2', $text);
|
||||
|
||||
return html_entity_decode($text);
|
||||
}
|
||||
}
|
|
@ -1,225 +0,0 @@
|
|||
<?php
|
||||
/*
|
||||
* BBcode storage format generator/converter
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcode;
|
||||
|
||||
use Sakura\Database;
|
||||
|
||||
class Store
|
||||
{
|
||||
// Text
|
||||
private $text;
|
||||
private $seed;
|
||||
|
||||
// Special escapes
|
||||
protected $escapes = [
|
||||
'[' => '[',
|
||||
']' => ']',
|
||||
'.' => '.',
|
||||
':' => ':',
|
||||
];
|
||||
|
||||
// Spaces
|
||||
protected $spaces = [
|
||||
"(^|\s)",
|
||||
"((?:\.|\))?(?:$|\s|\n|\r))",
|
||||
];
|
||||
|
||||
// Simple bbcodes
|
||||
protected $simple = [
|
||||
'b',
|
||||
'i',
|
||||
'u',
|
||||
's',
|
||||
'h',
|
||||
'img',
|
||||
'spoiler',
|
||||
];
|
||||
|
||||
// Constructor
|
||||
public function __construct($text = "", $seed = "")
|
||||
{
|
||||
$this->setText($text);
|
||||
$this->seed = $seed;
|
||||
}
|
||||
|
||||
// Set text
|
||||
public function setText($text)
|
||||
{
|
||||
$this->text = $text;
|
||||
}
|
||||
|
||||
// Colour tag
|
||||
public function parseColour($text)
|
||||
{
|
||||
return preg_replace(
|
||||
",\[(color=(?:#[[:xdigit:]]{6}|[[:alpha:]]+))\](.+?)\[(/color)\],",
|
||||
"[\\1:{$this->seed}]\\2[\\3:{$this->seed}]",
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
// Align tag
|
||||
public function parseAlign($text)
|
||||
{
|
||||
return preg_replace(
|
||||
",\[(align=(?:[[:alpha:]]+))\](.+?)\[(/align)\],",
|
||||
"[\\1:{$this->seed}]\\2[\\3:{$this->seed}]",
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
// Size tag
|
||||
public function parseSize($text)
|
||||
{
|
||||
return preg_replace(
|
||||
",\[(size=(?:[[:digit:]]+))\](.+?)\[(/size)\],",
|
||||
"[\\1:{$this->seed}]\\2[\\3:{$this->seed}]",
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
// Simple tags
|
||||
public function parseSimple($text)
|
||||
{
|
||||
// Parse all simple tags
|
||||
foreach ($this->simple as $code) {
|
||||
$text = preg_replace(
|
||||
"#\[{$code}](.*?)\[/{$code}\]#s",
|
||||
"[{$code}:{$this->seed}]\\1[/{$code}:{$this->seed}]",
|
||||
$text
|
||||
);
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Code tag
|
||||
public function parseCode($text)
|
||||
{
|
||||
$text = preg_replace_callback(
|
||||
"#\[code\](((?R)|.)*?)\[/code\]#s",
|
||||
function ($t) {
|
||||
$escaped = $this->escape($t[1]);
|
||||
|
||||
return "[code:{$this->seed}]{$escaped}[/code:{$this->seed}]";
|
||||
},
|
||||
$text
|
||||
);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Quote tag
|
||||
public function parseQuote($text)
|
||||
{
|
||||
$patterns = ["/\[(quote(?:=".+?")?)\]/", '[/quote]'];
|
||||
$counts = [preg_match_all($patterns[0], $text), substr_count($text, $patterns[1])];
|
||||
$limit = min($counts);
|
||||
|
||||
$text = preg_replace($patterns[0], "[\\1:{$this->seed}]", $text, $limit);
|
||||
$text = preg_replace('/' . preg_quote($patterns[1], '/') . '/', "[/quote:{$this->seed}]", $text, $limit);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseList($text)
|
||||
{
|
||||
$patterns = ["/\[(list(?:=.+?)?)\]/", '[/list]'];
|
||||
$counts = [preg_match_all($patterns[0], $text), substr_count($text, $patterns[1])];
|
||||
$limit = min($counts);
|
||||
|
||||
$text = str_replace('[*]', "[*:{$this->seed}]", $text);
|
||||
$text = str_replace('[/*]', '', $text);
|
||||
|
||||
$text = preg_replace($patterns[0], "[\\1:{$this->seed}]", $text, $limit);
|
||||
$text = preg_replace('/' . preg_quote($patterns[1], '/') . '/', "[/list:o:{$this->seed}]", $text, $limit);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseUrl($text)
|
||||
{
|
||||
$urlPattern = '(?:https?|ftp)://.+?';
|
||||
|
||||
$text = preg_replace_callback(
|
||||
"#\[url\]({$urlPattern})\[/url\]#",
|
||||
function ($m) {
|
||||
$url = $this->escape($m[1]);
|
||||
return "[url:{$this->seed}]{$url}[/url:{$this->seed}]";
|
||||
},
|
||||
$text
|
||||
);
|
||||
|
||||
$text = preg_replace_callback(
|
||||
"#\[url=({$urlPattern})\](.+?)\[/url\]#",
|
||||
function ($m) {
|
||||
$url = $this->escape($m[1]);
|
||||
return "[url={$url}:{$this->seed}]{$m[2]}[/url:{$this->seed}]";
|
||||
},
|
||||
$text
|
||||
);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
public function parseLinks($text)
|
||||
{
|
||||
// Spaces
|
||||
$spaces = ["(^|\s)", "((?:\.|\))?(?:$|\s|\n|\r))"];
|
||||
|
||||
// HTTP(s), FTP, IRC and osu
|
||||
$text = preg_replace(
|
||||
"#{$spaces[0]}((?:https?|ftp|irc|osu)://[^\s]+?){$spaces[1]}#",
|
||||
"\\1<!-- m --><a href='\\2' rel='nofollow'>\\2</a><!-- m -->\\3",
|
||||
$text
|
||||
);
|
||||
|
||||
// Prefixed with www.
|
||||
$text = preg_replace(
|
||||
"/{$spaces[0]}(www\.[^\s]+){$spaces[1]}/",
|
||||
"\\1<!-- w --><a href='http://\\2' rel='nofollow'>\\2</a><!-- w -->\\3",
|
||||
$text
|
||||
);
|
||||
|
||||
// E-mail addresses
|
||||
$text = preg_replace(
|
||||
"/{$spaces[0]}([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z-]+){$spaces[1]}/",
|
||||
"\\1<!-- e --><a href='mailto:\\2' rel='nofollow'>\\2</a><!-- m -->\\3",
|
||||
$text
|
||||
);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Escapes
|
||||
public function escape($text)
|
||||
{
|
||||
return str_replace(
|
||||
array_keys($this->escapes),
|
||||
$this->escapes,
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
// Generator
|
||||
public function generate()
|
||||
{
|
||||
$text = htmlentities($this->text);
|
||||
|
||||
$text = $this->parseCode($text);
|
||||
$text = $this->parseQuote($text);
|
||||
$text = $this->parseList($text);
|
||||
|
||||
$text = $this->parseSimple($text);
|
||||
$text = $this->parseAlign($text);
|
||||
$text = $this->parseUrl($text);
|
||||
$text = $this->parseSize($text);
|
||||
$text = $this->parseColour($text);
|
||||
|
||||
$text = $this->parseLinks($text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
}
|
42
_sakura/components/BBcodeDefinitions/Align.php
Normal file
42
_sakura/components/BBcodeDefinitions/Align.php
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/*
|
||||
* Text align bbcode
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcodeDefinitions;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\CodeDefinition;
|
||||
use JBBCode\ElementNode;
|
||||
|
||||
class Align extends CodeDefinition {
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setTagName("align");
|
||||
$this->setUseOption(true);
|
||||
}
|
||||
|
||||
public function asHtml(ElementNode $el)
|
||||
{
|
||||
$alignments = [
|
||||
'left',
|
||||
'center',
|
||||
'right'
|
||||
];
|
||||
|
||||
$content = "";
|
||||
|
||||
foreach($el->getChildren() as $child) {
|
||||
$content .= $child->getAsHTML();
|
||||
}
|
||||
|
||||
$alignment = $el->getAttribute()['align'];
|
||||
|
||||
if (!in_array($alignment, $alignments)) {
|
||||
return $el->getAsBBCode();
|
||||
}
|
||||
|
||||
return '<div style="text-align: ' . $alignment . ';">' . $content . '</div>';
|
||||
}
|
||||
}
|
23
_sakura/components/BBcodeDefinitions/Code.php
Normal file
23
_sakura/components/BBcodeDefinitions/Code.php
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/*
|
||||
* Code bbcode
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcodeDefinitions;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\CodeDefinition;
|
||||
use JBBCode\ElementNode;
|
||||
|
||||
class Code extends CodeDefinition {
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setTagName("code");
|
||||
}
|
||||
|
||||
public function asHtml(ElementNode $el)
|
||||
{
|
||||
return preg_replace("#\n*\[code\]\n*(.*?)\n*\[/code\]\n*#s", '<pre class="code prettyprint linenums">\\1</pre>', $el->getAsBBCode());
|
||||
}
|
||||
}
|
47
_sakura/components/BBcodeDefinitions/Lists.php
Normal file
47
_sakura/components/BBcodeDefinitions/Lists.php
Normal file
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/*
|
||||
* List BBcode
|
||||
* https://gist.github.com/jbowens/5646994
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcodeDefinitions;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\CodeDefinition;
|
||||
use JBBCode\ElementNode;
|
||||
|
||||
/**
|
||||
* Implements a [list] code definition that provides the following syntax:
|
||||
*
|
||||
* [list]
|
||||
* [*] first item
|
||||
* [*] second item
|
||||
* [*] third item
|
||||
* [/list]
|
||||
*
|
||||
*/
|
||||
class Lists extends CodeDefinition
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->parseContent = true;
|
||||
$this->useOption = false;
|
||||
$this->setTagName('list');
|
||||
$this->nestLimit = -1;
|
||||
}
|
||||
|
||||
public function asHtml(ElementNode $el)
|
||||
{
|
||||
$bodyHtml = '';
|
||||
foreach ($el->getChildren() as $child) {
|
||||
$bodyHtml .= $child->getAsHTML();
|
||||
}
|
||||
|
||||
$listPieces = explode('[*]', $bodyHtml);
|
||||
unset($listPieces[0]);
|
||||
$listPieces = array_map(function($li) {
|
||||
return '<li>'.$li.'</li>';
|
||||
}, $listPieces);
|
||||
return '<ul>'.implode('', $listPieces).'</ul>';
|
||||
}
|
||||
}
|
39
_sakura/components/BBcodeDefinitions/Size.php
Normal file
39
_sakura/components/BBcodeDefinitions/Size.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
/*
|
||||
* Font size BBcode
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcodeDefinitions;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\CodeDefinition;
|
||||
use JBBCode\ElementNode;
|
||||
|
||||
class Size extends CodeDefinition {
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setTagName("size");
|
||||
$this->setUseOption(true);
|
||||
}
|
||||
|
||||
public function asHtml(ElementNode $el)
|
||||
{
|
||||
$minSize = 0;
|
||||
$maxSize = 200;
|
||||
|
||||
$content = "";
|
||||
|
||||
foreach($el->getChildren() as $child) {
|
||||
$content .= $child->getAsHTML();
|
||||
}
|
||||
|
||||
$size = $el->getAttribute()['size'];
|
||||
|
||||
if ($size < $minSize || $size > $maxSize) {
|
||||
return $el->getAsBBCode();
|
||||
}
|
||||
|
||||
return '<span style="font-size: ' . ($size / 100) . 'em;">' . $content . '</span>';
|
||||
}
|
||||
}
|
36
_sakura/components/BBcodeDefinitions/YouTube.php
Normal file
36
_sakura/components/BBcodeDefinitions/YouTube.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/*
|
||||
* YouTube BBcode
|
||||
* As displayed on this page http://jbbcode.com/docs
|
||||
*/
|
||||
|
||||
namespace Sakura\BBcodeDefinitions;
|
||||
|
||||
use JBBCode\Parser;
|
||||
use JBBCode\CodeDefinition;
|
||||
use JBBCode\ElementNode;
|
||||
|
||||
class YouTube extends CodeDefinition {
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->setTagName("youtube");
|
||||
}
|
||||
|
||||
public function asHtml(ElementNode $el)
|
||||
{
|
||||
$content = "";
|
||||
|
||||
foreach($el->getChildren() as $child) {
|
||||
$content .= $child->getAsBBCode();
|
||||
}
|
||||
|
||||
$foundMatch = preg_match('/^([A-z0-9=\-]+?)$/i', $content, $matches);
|
||||
|
||||
if(!$foundMatch) {
|
||||
return $el->getAsBBCode();
|
||||
} else {
|
||||
return "<iframe width=\"640\" height=\"390\" src=\"https://www.youtube.com/embed/".$matches[1]."\" frameborder=\"0\" allowfullscreen></iframe>";
|
||||
}
|
||||
}
|
||||
}
|
0
_sakura/components/Bans.php
Executable file → Normal file
0
_sakura/components/Bans.php
Executable file → Normal file
0
_sakura/components/Comments.php
Executable file → Normal file
0
_sakura/components/Comments.php
Executable file → Normal file
0
_sakura/components/Database.php
Executable file → Normal file
0
_sakura/components/Database.php
Executable file → Normal file
|
@ -8,7 +8,7 @@ namespace Sakura\Forum;
|
|||
use Sakura\Main;
|
||||
use Sakura\Database;
|
||||
use Sakura\User;
|
||||
use Sakura\BBcode\BBcode;
|
||||
use Sakura\BBcode;
|
||||
|
||||
/**
|
||||
* Class Forums
|
||||
|
@ -209,7 +209,7 @@ class Forums
|
|||
'user' => (new User($post['poster_id'])),
|
||||
'elapsed' => Main::timeElapsed($post['post_time']),
|
||||
'is_op' => ($post['poster_id'] == $firstPost['poster_id'] ? '1' : '0'),
|
||||
'parsed_post' => self::parseMarkUp($post['post_text'], 1, 1),
|
||||
'parsed_post' => (new BBcode($post['post_text']))->toHTML(),
|
||||
]);
|
||||
|
||||
// Just in case
|
||||
|
@ -256,30 +256,6 @@ class Forums
|
|||
return $post['topic_id'];
|
||||
}
|
||||
|
||||
// Parse different markup flavours
|
||||
public static function parseMarkUp($text, $mode, $emotes = 1)
|
||||
{
|
||||
|
||||
// Clean string
|
||||
$text = Main::cleanString($text);
|
||||
|
||||
// Parse emotes
|
||||
if ($emotes) {
|
||||
$text = Main::parseEmotes($text);
|
||||
}
|
||||
|
||||
// Switch between modes
|
||||
switch ($mode) {
|
||||
case 1:
|
||||
case 2:
|
||||
return Main::bbParse($text);
|
||||
|
||||
case 0:
|
||||
default:
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
|
||||
// Get forum statistics of a user
|
||||
public static function getUserStats($uid)
|
||||
{
|
||||
|
@ -308,10 +284,6 @@ class Forums
|
|||
// Check if we're replying to a thread
|
||||
$getThread = Database::fetch('topics', false, ['topic_id' => [$topic, '=']]);
|
||||
|
||||
// Convert the text to storage format
|
||||
$bbcode = new BBcode($text);
|
||||
$text = $bbcode->toStore();
|
||||
|
||||
// If nothing was returned create a new thread
|
||||
if (!$getThread) {
|
||||
// Insert the required data
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace Sakura\Forum;
|
|||
use Sakura\Main;
|
||||
use Sakura\Database;
|
||||
use Sakura\User;
|
||||
use Sakura\BBcode\BBcode;
|
||||
use Sakura\BBcode;
|
||||
|
||||
/**
|
||||
* Class Post
|
||||
|
@ -56,9 +56,7 @@ class Post
|
|||
}
|
||||
|
||||
// Parse the markup
|
||||
$bbcode = new BBcode($this->text);
|
||||
|
||||
$this->parsed = $bbcode->toHTML();
|
||||
$this->parsed = (new BBcode(htmlentities($this->text)))->toHTML();
|
||||
}
|
||||
|
||||
// Time elapsed since creation
|
||||
|
|
0
_sakura/components/Hashing.php
Executable file → Normal file
0
_sakura/components/Hashing.php
Executable file → Normal file
32
_sakura/components/Main.php
Executable file → Normal file
32
_sakura/components/Main.php
Executable file → Normal file
|
@ -37,36 +37,6 @@ class Main
|
|||
$pd->text($text);
|
||||
}
|
||||
|
||||
// Get bbcodes
|
||||
public static function getBBcodes()
|
||||
{
|
||||
return Database::fetch('bbcodes');
|
||||
}
|
||||
|
||||
// Parse bbcodes
|
||||
public static function bbParse($text)
|
||||
{
|
||||
|
||||
// Get bbcode regex from the database
|
||||
$bbcodes = Database::fetch('bbcodes');
|
||||
|
||||
// Split the regex
|
||||
$regex = array_map(function ($arr) {
|
||||
return $arr['bbcode_regex'];
|
||||
}, $bbcodes);
|
||||
|
||||
// Split the replacement
|
||||
$replace = array_map(function ($arr) {
|
||||
return $arr['bbcode_replace'];
|
||||
}, $bbcodes);
|
||||
|
||||
// Do the replacement
|
||||
$text = preg_replace($regex, $replace, $text);
|
||||
|
||||
// Return the parsed text
|
||||
return $text;
|
||||
}
|
||||
|
||||
// Get emoticons
|
||||
public static function getEmotes()
|
||||
{
|
||||
|
@ -78,7 +48,7 @@ class Main
|
|||
{
|
||||
|
||||
// Get emoticons from the database
|
||||
$emotes = Database::fetch('emoticons');
|
||||
$emotes = self::getEmotes();
|
||||
|
||||
// Do the replacements
|
||||
foreach ($emotes as $emote) {
|
||||
|
|
0
_sakura/components/Manage.php
Executable file → Normal file
0
_sakura/components/Manage.php
Executable file → Normal file
0
_sakura/components/News.php
Executable file → Normal file
0
_sakura/components/News.php
Executable file → Normal file
0
_sakura/components/Payments.php
Executable file → Normal file
0
_sakura/components/Payments.php
Executable file → Normal file
0
_sakura/components/Permissions.php
Executable file → Normal file
0
_sakura/components/Permissions.php
Executable file → Normal file
0
_sakura/components/Rank.php
Executable file → Normal file
0
_sakura/components/Rank.php
Executable file → Normal file
0
_sakura/components/Session.php
Executable file → Normal file
0
_sakura/components/Session.php
Executable file → Normal file
0
_sakura/components/Urls.php
Executable file → Normal file
0
_sakura/components/Urls.php
Executable file → Normal file
10
_sakura/components/User.php
Executable file → Normal file
10
_sakura/components/User.php
Executable file → Normal file
|
@ -659,13 +659,11 @@ class User
|
|||
public function signature()
|
||||
{
|
||||
return isset($this->data['user_data']['signature']) ?
|
||||
Main::bbParse(
|
||||
Main::parseEmotes(
|
||||
base64_decode(
|
||||
$this->data['user_data']['signature']
|
||||
)
|
||||
(new BBcode(
|
||||
base64_decode(
|
||||
$this->data['user_data']['signature']
|
||||
)
|
||||
) :
|
||||
))->toHTML() :
|
||||
null;
|
||||
}
|
||||
|
||||
|
|
0
_sakura/components/Users.php
Executable file → Normal file
0
_sakura/components/Users.php
Executable file → Normal file
0
_sakura/components/Whois.php
Executable file → Normal file
0
_sakura/components/Whois.php
Executable file → Normal file
2
_sakura/composer.json
Executable file → Normal file
2
_sakura/composer.json
Executable file → Normal file
|
@ -7,6 +7,6 @@
|
|||
"phpmailer/phpmailer": "*",
|
||||
"erusev/parsedown": "*",
|
||||
"paypal/rest-api-sdk-php": "*",
|
||||
"ezyang/htmlpurifier": "^4.7"
|
||||
"jbbcode/jbbcode": "^1.3"
|
||||
}
|
||||
}
|
||||
|
|
46
_sakura/composer.lock
generated
Executable file → Normal file
46
_sakura/composer.lock
generated
Executable file → Normal file
|
@ -4,8 +4,8 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"hash": "29ea55613191818528056f73ac659e20",
|
||||
"content-hash": "ce72fbc116b66a47e04e66357ac173ce",
|
||||
"hash": "796d45b3f4f6323302ad5e3c26545cb3",
|
||||
"content-hash": "6fb7e8cc79bc78343a4854b1cafe547b",
|
||||
"packages": [
|
||||
{
|
||||
"name": "erusev/parsedown",
|
||||
|
@ -47,48 +47,50 @@
|
|||
"time": "2015-10-04 16:44:32"
|
||||
},
|
||||
{
|
||||
"name": "ezyang/htmlpurifier",
|
||||
"version": "v4.7.0",
|
||||
"name": "jbbcode/jbbcode",
|
||||
"version": "v1.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ezyang/htmlpurifier.git",
|
||||
"reference": "ae1828d955112356f7677c465f94f7deb7d27a40"
|
||||
"url": "https://github.com/jbowens/jBBCode.git",
|
||||
"reference": "645b6a1c0afa92b7d029d3417ebd8b60a5c578b3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40",
|
||||
"reference": "ae1828d955112356f7677c465f94f7deb7d27a40",
|
||||
"url": "https://api.github.com/repos/jbowens/jBBCode/zipball/645b6a1c0afa92b7d029d3417ebd8b60a5c578b3",
|
||||
"reference": "645b6a1c0afa92b7d029d3417ebd8b60a5c578b3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2"
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "3.7.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"HTMLPurifier": "library/"
|
||||
},
|
||||
"files": [
|
||||
"library/HTMLPurifier.composer.php"
|
||||
]
|
||||
"JBBCode": "."
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"LGPL"
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Edward Z. Yang",
|
||||
"email": "admin@htmlpurifier.org",
|
||||
"homepage": "http://ezyang.com"
|
||||
"name": "Jackson Owens",
|
||||
"email": "jackson_owens@alumni.brown.edu",
|
||||
"homepage": "http://jbowens.org/",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Standards compliant HTML filter written in PHP",
|
||||
"homepage": "http://htmlpurifier.org/",
|
||||
"description": "A lightweight but extensible BBCode parser written in PHP 5.3.",
|
||||
"homepage": "http://jbbcode.com/",
|
||||
"keywords": [
|
||||
"html"
|
||||
"BB",
|
||||
"bbcode"
|
||||
],
|
||||
"time": "2015-08-05 01:03:42"
|
||||
"time": "2014-07-06 05:48:20"
|
||||
},
|
||||
{
|
||||
"name": "paypal/rest-api-sdk-php",
|
||||
|
|
0
_sakura/config/cloudflare.ipv4
Executable file → Normal file
0
_sakura/config/cloudflare.ipv4
Executable file → Normal file
0
_sakura/config/cloudflare.ipv6
Executable file → Normal file
0
_sakura/config/cloudflare.ipv6
Executable file → Normal file
0
_sakura/config/config.example.ini
Executable file → Normal file
0
_sakura/config/config.example.ini
Executable file → Normal file
0
_sakura/config/iso3166.json
Executable file → Normal file
0
_sakura/config/iso3166.json
Executable file → Normal file
0
_sakura/config/whois.json
Executable file → Normal file
0
_sakura/config/whois.json
Executable file → Normal file
0
_sakura/cron.php
Executable file → Normal file
0
_sakura/cron.php
Executable file → Normal file
8
_sakura/sakura.php
Executable file → Normal file
8
_sakura/sakura.php
Executable file → Normal file
|
@ -8,7 +8,7 @@
|
|||
namespace Sakura;
|
||||
|
||||
// Define Sakura version
|
||||
define('SAKURA_VERSION', '20151125');
|
||||
define('SAKURA_VERSION', '20151202');
|
||||
define('SAKURA_VLABEL', 'Eminence');
|
||||
define('SAKURA_COLOUR', '#6C3082');
|
||||
define('SAKURA_STABLE', false);
|
||||
|
@ -32,6 +32,7 @@ require_once ROOT . '_sakura/vendor/autoload.php';
|
|||
|
||||
// Include components
|
||||
require_once ROOT . '_sakura/components/Bans.php';
|
||||
require_once ROOT . '_sakura/components/BBcode.php';
|
||||
require_once ROOT . '_sakura/components/Comments.php';
|
||||
require_once ROOT . '_sakura/components/Config.php';
|
||||
require_once ROOT . '_sakura/components/Database.php';
|
||||
|
@ -50,9 +51,6 @@ require_once ROOT . '_sakura/components/Urls.php';
|
|||
require_once ROOT . '_sakura/components/User.php';
|
||||
require_once ROOT . '_sakura/components/Users.php';
|
||||
require_once ROOT . '_sakura/components/Whois.php';
|
||||
require_once ROOT . '_sakura/components/BBcode/BBcode.php';
|
||||
require_once ROOT . '_sakura/components/BBcode/Parse.php';
|
||||
require_once ROOT . '_sakura/components/BBcode/Store.php';
|
||||
require_once ROOT . '_sakura/components/Forum/Forum.php';
|
||||
require_once ROOT . '_sakura/components/Forum/Forums.php';
|
||||
require_once ROOT . '_sakura/components/Forum/Post.php';
|
||||
|
@ -184,11 +182,9 @@ if (!defined('SAKURA_NO_TPL')) {
|
|||
if (Config::getConfig('site_closed')) {
|
||||
// Additional render data
|
||||
$renderData = array_merge($renderData, [
|
||||
|
||||
'page' => [
|
||||
'message' => Config::getConfig('site_closed_reason'),
|
||||
],
|
||||
|
||||
]);
|
||||
|
||||
// Initialise templating engine
|
||||
|
|
0
_sakura/templates/broomcloset/global/master.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/global/master.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/global/restricted.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/global/restricted.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/general.configuration.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/general.configuration.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/index.dashboard.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/index.dashboard.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/index.error.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/pages/index.error.tpl
Executable file → Normal file
0
_sakura/templates/broomcloset/template.ini
Executable file → Normal file
0
_sakura/templates/broomcloset/template.ini
Executable file → Normal file
0
_sakura/templates/htmlEmail.tpl
Executable file → Normal file
0
_sakura/templates/htmlEmail.tpl
Executable file → Normal file
0
_sakura/templates/mio/elements/newsPost.tpl
Executable file → Normal file
0
_sakura/templates/mio/elements/newsPost.tpl
Executable file → Normal file
0
_sakura/templates/mio/global/footer.tpl
Executable file → Normal file
0
_sakura/templates/mio/global/footer.tpl
Executable file → Normal file
0
_sakura/templates/mio/global/header.tpl
Executable file → Normal file
0
_sakura/templates/mio/global/header.tpl
Executable file → Normal file
0
_sakura/templates/mio/main/index.tpl
Executable file → Normal file
0
_sakura/templates/mio/main/index.tpl
Executable file → Normal file
0
_sakura/templates/mio/template.ini
Executable file → Normal file
0
_sakura/templates/mio/template.ini
Executable file → Normal file
0
_sakura/templates/misaki/elements/newsPost.tpl
Executable file → Normal file
0
_sakura/templates/misaki/elements/newsPost.tpl
Executable file → Normal file
0
_sakura/templates/misaki/elements/settingsNavigation.tpl
Executable file → Normal file
0
_sakura/templates/misaki/elements/settingsNavigation.tpl
Executable file → Normal file
0
_sakura/templates/misaki/elements/statsHeader.tpl
Executable file → Normal file
0
_sakura/templates/misaki/elements/statsHeader.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/information.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/information.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/master.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/master.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/notfound.tpl
Executable file → Normal file
0
_sakura/templates/misaki/global/notfound.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/index.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/index.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/infopage.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/infopage.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/profile.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/profile.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/search.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/search.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/settings.tpl
Executable file → Normal file
0
_sakura/templates/misaki/main/settings.tpl
Executable file → Normal file
0
_sakura/templates/misaki/profile/index.tpl
Executable file → Normal file
0
_sakura/templates/misaki/profile/index.tpl
Executable file → Normal file
0
_sakura/templates/misaki/settings/general.home.tpl
Executable file → Normal file
0
_sakura/templates/misaki/settings/general.home.tpl
Executable file → Normal file
0
_sakura/templates/misaki/settings/general.options.tpl
Executable file → Normal file
0
_sakura/templates/misaki/settings/general.options.tpl
Executable file → Normal file
0
_sakura/templates/misaki/template.ini
Executable file → Normal file
0
_sakura/templates/misaki/template.ini
Executable file → Normal file
0
_sakura/templates/yuuno/elements/captcha.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/captcha.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/comment.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/comment.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/comments.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/comments.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/indexPanel.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/indexPanel.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/newsPost.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/newsPost.tpl
Executable file → Normal file
2
_sakura/templates/yuuno/elements/pagination.tpl
Executable file → Normal file
2
_sakura/templates/yuuno/elements/pagination.tpl
Executable file → Normal file
|
@ -1,4 +1,4 @@
|
|||
{% set paginationSeparator %}{% if '?' in paginationUrl %}&{% else %}?{% endif %}{% endset %}
|
||||
{% set paginationSeparator %}{% if '%3F' in paginationUrl|url_encode %}&{% else %}?{% endif %}{% endset %}
|
||||
{% set paginationPage = get.page|default(1) %}
|
||||
|
||||
<div class="pagination{% if paginationClass %} {{ paginationClass }}{% endif %}">
|
||||
|
|
0
_sakura/templates/yuuno/elements/settingsNav.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/elements/settingsNav.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forum.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forum.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forumBtns.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forumBtns.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forumEntry.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/forumEntry.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/posting.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/posting.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/topicEntry.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/topicEntry.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/viewforum.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/viewforum.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/viewtopic.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/forum/viewtopic.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/chat.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/chat.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/information.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/information.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/master.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/master.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/notfound.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/notfound.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/restricted.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/global/restricted.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/group/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/group/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/authenticate.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/authenticate.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/banned.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/banned.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/faq.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/faq.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/forgotpassword.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/forgotpassword.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/index.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/infopage.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/infopage.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/memberlist.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/memberlist.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/news.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/news.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/premiumcomplete.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/premiumcomplete.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/profile.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/profile.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/report.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/report.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/search.tpl
Executable file → Normal file
0
_sakura/templates/yuuno/main/search.tpl
Executable file → Normal file
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue