diff --git a/composer.json b/composer.json index 5f574aa6..56624b27 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "leftypol imageboard", "type": "project", "require": { - "twig/twig": "^1.44.2", + "twig/twig": "^2.9", "lifo/ip": "^1.0", "gettext/gettext": "^1.0", "mrclay/minify": "^2.1.6" diff --git a/composer.lock b/composer.lock index 46f82a2a..5c8f851a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "346d80deda89b0298a414b565213f312", + "content-hash": "b3695c356f94b9226e689a31f8dc1463", "packages": [ { "name": "gettext/gettext", @@ -25,12 +25,12 @@ }, "type": "library", "autoload": { - "psr-0": { - "Gettext": "" - }, "files": [ "Gettext/translator_functions.php" - ] + ], + "psr-0": { + "Gettext": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -191,12 +191,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -239,32 +239,114 @@ ], "time": "2021-10-20T20:35:02+00:00" }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, { "name": "twig/twig", - "version": "v1.44.6", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3" + "reference": "82a1c055c8ed4c4705023bfd0405f3c74db6e3ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae39480f010ef88adc7938503c9b02d3baf2f3b3", - "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/82a1c055c8ed4c4705023bfd0405f3c74db6e3ae", + "reference": "82a1c055c8ed4c4705023bfd0405f3c74db6e3ae", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8" + "php": "^7.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + "symfony/debug": "^2.7", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.44-dev" + "dev-master": "2.9-dev" } }, "autoload": { @@ -286,14 +368,15 @@ "homepage": "http://fabien.potencier.org", "role": "Lead Developer" }, - { - "name": "Twig Team", - "role": "Contributors" - }, { "name": "Armin Ronacher", "email": "armin.ronacher@active-4.com", "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "https://twig.symfony.com/contributors", + "role": "Contributors" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", @@ -303,19 +386,9 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v1.44.6" + "source": "https://github.com/twigphp/Twig/tree/v2.9.0" }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2021-11-25T13:31:46+00:00" + "time": "2019-04-28T06:57:38+00:00" } ], "packages-dev": [], diff --git a/inc/cache.php b/inc/cache.php index e8148cbf..fe5577db 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -175,3 +175,30 @@ class Cache { } } +class Twig_Cache_TinyboardFilesystem extends Twig\Cache\FilesystemCache +{ + private $directory; + private $options; + + /** + * {@inheritdoc} + */ + public function __construct($directory, $options = 0) + { + parent::__construct($directory, $options); + + $this->directory = $directory; + } + + /** + * This function was removed in Twig 2.x due to developer views on the Twig library. Who says we can't keep it for ourselves though? + */ + public function clear() + { + foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->directory), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if ($file->isFile()) { + @unlink($file->getPathname()); + } + } + } +} \ No newline at end of file diff --git a/inc/config.php b/inc/config.php index 0f17bc5b..8575cba3 100644 --- a/inc/config.php +++ b/inc/config.php @@ -43,6 +43,8 @@ $config['check_updates'] = false; // How often to check for updates $config['check_updates_time'] = 43200; // 12 hours + // Skip cache in twig. this is already enabled with debug + $config['twig_auto_reload'] = true; // Shows some extra information at the bottom of pages. Good for development/debugging. $config['debug'] = false; diff --git a/inc/lib/twig/extensions/Extension/I18n.php b/inc/lib/twig/extensions/Extension/I18n.php deleted file mode 100644 index d6865d01..00000000 --- a/inc/lib/twig/extensions/Extension/I18n.php +++ /dev/null @@ -1,44 +0,0 @@ - $length) { - if ($preserve) { - if (false !== ($breakpoint = mb_strpos($value, ' ', $length))) { - $length = $breakpoint; - } - } - return mb_substr($value, 0, $length) . $separator; - } - return $value; -} - -function twig_filename_truncate_filter($value, $length = 30, $separator = '…') { - if (mb_strlen($value) > $length) { - $value = strrev($value); - $array = array_reverse(explode(".", $value, 2)); - $array = array_map("strrev", $array); - - $filename = &$array[0]; - $extension = isset($array[1]) ? $array[1] : false; - - $filename = mb_substr($filename, 0, $length - ($extension ? mb_strlen($extension) + 1 : 0)) . $separator; - - return implode(".", $array); - } - return $value; -} - -function twig_ratio_function($w, $h) { - return fraction($w, $h, ':'); -} -function twig_secure_link_confirm($text, $title, $confirm_message, $href) { - global $config; - - return '' . $text . ''; -} -function twig_secure_link($href) { - return $href . '/' . make_secure_link_token($href); -} diff --git a/inc/lib/twig/extensions/Node/Trans.php b/inc/lib/twig/extensions/Node/Trans.php deleted file mode 100644 index d12564a7..00000000 --- a/inc/lib/twig/extensions/Node/Trans.php +++ /dev/null @@ -1,133 +0,0 @@ - - */ -class Twig_Extensions_Node_Trans extends Twig_Node -{ - public function __construct(Twig_NodeInterface $body, Twig_NodeInterface $plural = null, Twig_Node_Expression $count = null, $lineno, $tag = null) - { - parent::__construct(array('count' => $count, 'body' => $body, 'plural' => $plural), array(), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler->addDebugInfo($this); - - list($msg, $vars) = $this->compileString($this->getNode('body')); - - if (null !== $this->getNode('plural')) { - list($msg1, $vars1) = $this->compileString($this->getNode('plural')); - - $vars = array_merge($vars, $vars1); - } - - $function = null === $this->getNode('plural') ? 'gettext' : 'ngettext'; - - if ($vars) { - $compiler - ->write('echo strtr('.$function.'(') - ->subcompile($msg) - ; - - if (null !== $this->getNode('plural')) { - $compiler - ->raw(', ') - ->subcompile($msg1) - ->raw(', abs(') - ->subcompile($this->getNode('count')) - ->raw(')') - ; - } - - $compiler->raw('), array('); - - foreach ($vars as $var) { - if ('count' === $var->getAttribute('name')) { - $compiler - ->string('%count%') - ->raw(' => abs(') - ->subcompile($this->getNode('count')) - ->raw('), ') - ; - } else { - $compiler - ->string('%'.$var->getAttribute('name').'%') - ->raw(' => ') - ->subcompile($var) - ->raw(', ') - ; - } - } - - $compiler->raw("));\n"); - } else { - $compiler - ->write('echo '.$function.'(') - ->subcompile($msg) - ; - - if (null !== $this->getNode('plural')) { - $compiler - ->raw(', ') - ->subcompile($msg1) - ->raw(', abs(') - ->subcompile($this->getNode('count')) - ->raw(')') - ; - } - - $compiler->raw(");\n"); - } - } - - protected function compileString(Twig_NodeInterface $body) - { - if ($body instanceof Twig_Node_Expression_Name || $body instanceof Twig_Node_Expression_Constant || $body instanceof Twig_Node_Expression_TempName) { - return array($body, array()); - } - - $vars = array(); - if (count($body)) { - $msg = ''; - - foreach ($body as $node) { - if (get_class($node) === 'Twig_Node' && $node->getNode(0) instanceof Twig_Node_SetTemp) { - $node = $node->getNode(1); - } - - if ($node instanceof Twig_Node_Print) { - $n = $node->getNode('expr'); - while ($n instanceof Twig_Node_Expression_Filter) { - $n = $n->getNode('node'); - } - $msg .= sprintf('%%%s%%', $n->getAttribute('name')); - $vars[] = new Twig_Node_Expression_Name($n->getAttribute('name'), $n->getLine()); - } else { - $msg .= $node->getAttribute('data'); - } - } - } else { - $msg = $body->getAttribute('data'); - } - - return array(new Twig_Node(array(new Twig_Node_Expression_Constant(trim($msg), $body->getLine()))), $vars); - } -} diff --git a/inc/lib/twig/extensions/TokenParser/Trans.php b/inc/lib/twig/extensions/TokenParser/Trans.php deleted file mode 100644 index 5e2dc464..00000000 --- a/inc/lib/twig/extensions/TokenParser/Trans.php +++ /dev/null @@ -1,80 +0,0 @@ -getLine(); - $stream = $this->parser->getStream(); - $count = null; - $plural = null; - - if (!$stream->test(Twig_Token::BLOCK_END_TYPE)) { - $body = $this->parser->getExpressionParser()->parseExpression(); - } else { - $stream->expect(Twig_Token::BLOCK_END_TYPE); - $body = $this->parser->subparse(array($this, 'decideForFork')); - if ('plural' === $stream->next()->getValue()) { - $count = $this->parser->getExpressionParser()->parseExpression(); - $stream->expect(Twig_Token::BLOCK_END_TYPE); - $plural = $this->parser->subparse(array($this, 'decideForEnd'), true); - } - } - - $stream->expect(Twig_Token::BLOCK_END_TYPE); - - $this->checkTransString($body, $lineno); - - return new Twig_Extensions_Node_Trans($body, $plural, $count, $lineno, $this->getTag()); - } - - public function decideForFork(Twig_Token $token) - { - return $token->test(array('plural', 'endtrans')); - } - - public function decideForEnd(Twig_Token $token) - { - return $token->test('endtrans'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @param string The tag name - */ - public function getTag() - { - return 'trans'; - } - - protected function checkTransString(Twig_NodeInterface $body, $lineno) - { - foreach ($body as $i => $node) { - if ( - $node instanceof Twig_Node_Text - || - ($node instanceof Twig_Node_Print && $node->getNode('expr') instanceof Twig_Node_Expression_Name) - ) { - continue; - } - - throw new Twig_Error_Syntax(sprintf('The text to be translated with "trans" can only contain references to simple variables'), $lineno); - } - } -} diff --git a/inc/mod/pages.php b/inc/mod/pages.php index b4d3b544..db22255b 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -2698,75 +2698,75 @@ function mod_new_pm($username) { } function mod_rebuild() { - global $config, $twig; - - if (!hasPermission($config['mod']['rebuild'])) - error($config['error']['noaccess']); - - if (isset($_POST['rebuild'])) { - @set_time_limit($config['mod']['rebuild_timelimit']); - - $log = array(); - $boards = listBoards(); - $rebuilt_scripts = array(); - - if (isset($_POST['rebuild_cache'])) { - if ($config['cache']['enabled']) { - $log[] = 'Flushing cache'; - Cache::flush(); - } - - $log[] = 'Clearing template cache'; - load_twig(); - $twig->clearCacheFiles(); - } - - if (isset($_POST['rebuild_themes'])) { - $log[] = 'Regenerating theme files'; - rebuildThemes('all'); - } - - if (isset($_POST['rebuild_javascript'])) { - $log[] = 'Rebuilding ' . $config['file_script'] . ''; - buildJavascript(); - $rebuilt_scripts[] = $config['file_script']; - } - - foreach ($boards as $board) { - if (!(isset($_POST['boards_all']) || isset($_POST['board_' . $board['uri']]))) - continue; - - openBoard($board['uri']); - $config['try_smarter'] = false; - - if (isset($_POST['rebuild_index'])) { - buildIndex(); - $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Creating index pages'; - } - - if (isset($_POST['rebuild_javascript']) && !in_array($config['file_script'], $rebuilt_scripts)) { - $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Rebuilding ' . $config['file_script'] . ''; - buildJavascript(); - $rebuilt_scripts[] = $config['file_script']; - } - - if (isset($_POST['rebuild_thread'])) { - $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); - while ($post = $query->fetch(PDO::FETCH_ASSOC)) { - $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Rebuilding thread #' . $post['id']; - buildThread($post['id']); - } - } - } - - mod_page(_('Rebuild'), 'mod/rebuilt.html', array('logs' => $log)); - return; - } - - mod_page(_('Rebuild'), 'mod/rebuild.html', array( - 'boards' => listBoards(), - 'token' => make_secure_link_token('rebuild') - )); + global $config, $twig; + + if (!hasPermission($config['mod']['rebuild'])) + error($config['error']['noaccess']); + + if (isset($_POST['rebuild'])) { + @set_time_limit($config['mod']['rebuild_timelimit']); + + $log = array(); + $boards = listBoards(); + $rebuilt_scripts = array(); + + if (isset($_POST['rebuild_cache'])) { + if ($config['cache']['enabled']) { + $log[] = 'Flushing cache'; + Cache::flush(); + } + + $log[] = 'Clearing template cache'; + load_twig(); + $twig->getCache()->clear(); + } + + if (isset($_POST['rebuild_themes'])) { + $log[] = 'Regenerating theme files'; + rebuildThemes('all'); + } + + if (isset($_POST['rebuild_javascript'])) { + $log[] = 'Rebuilding ' . $config['file_script'] . ''; + buildJavascript(); + $rebuilt_scripts[] = $config['file_script']; + } + + foreach ($boards as $board) { + if (!(isset($_POST['boards_all']) || isset($_POST['board_' . $board['uri']]))) + continue; + + openBoard($board['uri']); + $config['try_smarter'] = false; + + if (isset($_POST['rebuild_index'])) { + buildIndex(); + $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Creating index pages'; + } + + if (isset($_POST['rebuild_javascript']) && !in_array($config['file_script'], $rebuilt_scripts)) { + $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Rebuilding ' . $config['file_script'] . ''; + buildJavascript(); + $rebuilt_scripts[] = $config['file_script']; + } + + if (isset($_POST['rebuild_thread'])) { + $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); + while ($post = $query->fetch(PDO::FETCH_ASSOC)) { + $log[] = '' . sprintf($config['board_abbreviation'], $board['uri']) . ': Rebuilding thread #' . $post['id']; + buildThread($post['id']); + } + } + } + + mod_page(_('Rebuild'), $config['file_mod_rebuilt'], array('logs' => $log)); + return; + } + + mod_page(_('Rebuild'), $config['file_mod_rebuild'], array( + 'boards' => listBoards(), + 'token' => make_secure_link_token('rebuild') + )); } function mod_reports() { diff --git a/inc/template.php b/inc/template.php index 648adae8..09ffdf23 100644 --- a/inc/template.php +++ b/inc/template.php @@ -13,16 +13,20 @@ $twig = false; function load_twig() { global $twig, $config; - $loader = new Twig_Loader_Filesystem($config['dir']['template']); + + $loader = new Twig\Loader\FilesystemLoader($config['dir']['template']); $loader->setPaths($config['dir']['template']); - $twig = new Twig_Environment($loader, array( + $twig = new Twig\Environment($loader, array( 'autoescape' => false, 'cache' => is_writable('templates') || (is_dir('templates/cache') && is_writable('templates/cache')) ? - "{$config['dir']['template']}/cache" : false, - 'debug' => $config['debug'] + new Twig_Cache_TinyboardFilesystem("{$config['dir']['template']}/cache") : false, + 'debug' => $config['debug'], + 'auto_reload' => $config['twig_auto_reload'] )); - $twig->addExtension(new Twig_Extensions_Extension_Tinyboard()); - $twig->addExtension(new Twig_Extensions_Extension_I18n()); + if ($config['debug']) + $twig->addExtension(new \Twig\Extension\DebugExtension()); + $twig->addExtension(new Tinyboard()); + $twig->addExtension(new PhpMyAdmin\Twig\Extensions\I18nExtension()); } function Element($templateFile, array $options) { @@ -70,3 +74,138 @@ function Element($templateFile, array $options) { } } +class Tinyboard extends Twig\Extension\AbstractExtension +{ + /** + * Returns a list of filters to add to the existing list. + * + * @return array An array of filters + */ + public function getFilters() + { + return array( + new Twig\TwigFilter('filesize', 'format_bytes'), + new Twig\TwigFilter('truncate', 'twig_truncate_filter'), + new Twig\TwigFilter('truncate_body', 'truncate'), + new Twig\TwigFilter('truncate_filename', 'twig_filename_truncate_filter'), + new Twig\TwigFilter('extension', 'twig_extension_filter'), + new Twig\TwigFilter('sprintf', 'sprintf'), + new Twig\TwigFilter('capcode', 'capcode'), + new Twig\TwigFilter('remove_modifiers', 'remove_modifiers'), + new Twig\TwigFilter('hasPermission', 'twig_hasPermission_filter'), + new Twig\TwigFilter('date', 'twig_date_filter'), + new Twig\TwigFilter('poster_id', 'poster_id'), + new Twig\TwigFilter('remove_whitespace', 'twig_remove_whitespace_filter'), + new Twig\TwigFilter('count', 'count'), + new Twig\TwigFilter('ago', 'ago'), + new Twig\TwigFilter('until', 'until'), + new Twig\TwigFilter('push', 'twig_push_filter'), + new Twig\TwigFilter('bidi_cleanup', 'bidi_cleanup'), + new Twig\TwigFilter('addslashes', 'addslashes'), + new Twig\TwigFilter('cloak_ip', 'cloak_ip'), + new Twig\TwigFilter('cloak_mask', 'cloak_mask'), + ); + } + + /** + * Returns a list of functions to add to the existing list. + * + * @return array An array of filters + */ + public function getFunctions() + { + return array( + new Twig\TwigFunction('time', 'time'), + new Twig\TwigFunction('floor', 'floor'), + new Twig\TwigFunction('timezone', 'twig_timezone_function'), + new Twig\TwigFunction('hiddenInputs', 'hiddenInputs'), + new Twig\TwigFunction('hiddenInputsHash', 'hiddenInputsHash'), + new Twig\TwigFunction('ratio', 'twig_ratio_function'), + new Twig\TwigFunction('secure_link_confirm', 'twig_secure_link_confirm'), + new Twig\TwigFunction('secure_link', 'twig_secure_link'), + new Twig\TwigFunction('link_for', 'link_for') + ); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'tinyboard'; + } +} + +function twig_timezone_function() { + return 'Z'; +} + +function twig_push_filter($array, $value) { + array_push($array, $value); + return $array; +} + +function twig_remove_whitespace_filter($data) { + return preg_replace('/[\t\r\n]/', '', $data); +} + +function twig_date_filter($date, $format) { + return gmstrftime($format, $date); +} + +function twig_hasPermission_filter($mod, $permission, $board = null) { + return hasPermission($permission, $board, $mod); +} + +function twig_extension_filter($value, $case_insensitive = true) { + $ext = mb_substr($value, mb_strrpos($value, '.') + 1); + if($case_insensitive) + $ext = mb_strtolower($ext); + return $ext; +} + +function twig_sprintf_filter( $value, $var) { + return sprintf($value, $var); +} + +function twig_truncate_filter($value, $length = 30, $preserve = false, $separator = '…') { + if (mb_strlen($value) > $length) { + if ($preserve) { + if (false !== ($breakpoint = mb_strpos($value, ' ', $length))) { + $length = $breakpoint; + } + } + return mb_substr($value, 0, $length) . $separator; + } + return $value; +} + +function twig_filename_truncate_filter($value, $length = 30, $separator = '…') { + if (mb_strlen($value) > $length) { + $value = strrev($value); + $array = array_reverse(explode(".", $value, 2)); + $array = array_map("strrev", $array); + + $filename = &$array[0]; + $extension = isset($array[1]) ? $array[1] : false; + + $filename = mb_substr($filename, 0, $length - ($extension ? mb_strlen($extension) + 1 : 0)) . $separator; + + return implode(".", $array); + } + return $value; +} + +function twig_ratio_function($w, $h) { + return fraction($w, $h, ':'); +} +function twig_secure_link_confirm($text, $title, $confirm_message, $href) { + global $config; + + return '' . $text . ''; +} +function twig_secure_link($href) { + return $href . '/' . make_secure_link_token($href); +} diff --git a/templates/banned.html b/templates/banned.html index 973daf9c..22803c00 100644 --- a/templates/banned.html +++ b/templates/banned.html @@ -1,4 +1,4 @@ -{% filter remove_whitespace %} +{% apply spaceless %} {# Automatically removes unnecessary whitespace #}
@@ -143,4 +143,4 @@ {% endif %} {% endif %}
-{% endfilter %} +{% endapply %} diff --git a/templates/installer/check-requirements.html b/templates/installer/check-requirements.html index 3ae46dd5..f8ea6410 100644 --- a/templates/installer/check-requirements.html +++ b/templates/installer/check-requirements.html @@ -31,15 +31,17 @@ {% if errors or warnings %}

There were {{ errors }} error(s) and {{ warnings }} warning(s).

{% if errors %} diff --git a/templates/mod/config-editor-php.html b/templates/mod/config-editor-php.html index 8610316b..5263c492 100644 --- a/templates/mod/config-editor-php.html +++ b/templates/mod/config-editor-php.html @@ -2,15 +2,17 @@

Any changes you make here will simply be appended to {{ file }}. If you wish to make the most of Tinyboard's customizability, you can instead edit the file directly. This page is intended for making quick changes and for those who don't have a basic understanding of PHP code.

- {% if boards|count %} + {% if boards|length %} {% endif %} diff --git a/templates/mod/config-editor.html b/templates/mod/config-editor.html index ebf4202b..2c5cdd3b 100644 --- a/templates/mod/config-editor.html +++ b/templates/mod/config-editor.html @@ -6,10 +6,12 @@ {% if board %}
  • Edit site-wide config
  • {% endif %} - {% for _board in boards if _board.uri != board %} -
  • - Edit config for {{ config.board_abbreviation|sprintf(_board.uri) }} -
  • + {% for _board in boards %} + {% if _board.uri != board %} +
  • + Edit config for {{ config.board_abbreviation|sprintf(_board.uri) }} +
  • + {% endif %} {% endfor %} {% endif %} @@ -38,38 +40,48 @@ {% endif %} - - {% if var.type == 'string' %} - - {% elseif var.permissions %} - - {% elseif var.type == 'integer' %} - - {% elseif var.type == 'boolean' %} - - {% else %} - ? - {% endif %} + + + {% if var.name|length == 1 %} + {{ var.name }} + {% else %} + {{ var.name|join(' → ') }} + {% endif %} + - {% if var.type == 'integer' or var.type == 'boolean' %} - Default: {{ var.default }} - {% endif %} - - - - {{ var.type|e }} - - - - {{ var.comment|join(' ') }} - - + + {% if var.type == 'string' %} + + {% elseif var.permissions %} + + {% elseif var.type == 'integer' %} + + {% elseif var.type == 'boolean' %} + + {% else %} + ? + {% endif %} + + {% if var.type == 'integer' or var.type == 'boolean' %} + Default: {{ var.default }} + {% endif %} + + + + {{ var.type|e }} + + + + {{ var.comment|join(' ') }} + + + {% endif %} {% endfor %} diff --git a/templates/mod/dashboard.html b/templates/mod/dashboard.html index e36e3c66..18a8b8fe 100644 --- a/templates/mod/dashboard.html +++ b/templates/mod/dashboard.html @@ -68,7 +68,7 @@ {% endif %} -{% if config.mod.dashboard_links|length %} +{% if config.mod.dashboard_links and config.mod.dashboard_links|length %} {% for label,link in config.mod.dashboard_links %}
  • {{ label }}
  • diff --git a/templates/mod/debug/apc.html b/templates/mod/debug/apc.html index e8733af8..bf86b349 100644 --- a/templates/mod/debug/apc.html +++ b/templates/mod/debug/apc.html @@ -6,13 +6,15 @@ Expires Size - {% for var in cached_vars if (var.ctime is defined ? var.ctime : var.creation_time) + var.ttl > time() %} - - {{ var.key is defined ? var.key : var.info }} - {{ var.nhits is defined ? var.nhits : var.num_hits }} - {{ (var.ctime is defined ? var.ctime : var.creation_time)|ago }} ago - {{ ((var.ctime is defined ? var.ctime : var.creation_time) + var.ttl)|until }} (ttl: {{ (time() + var.ttl)|until }}) - {{ var.mem_size }} bytes - + {% for var in cached_vars %} + {% if (var.ctime is defined ? var.ctime : var.creation_time) + var.ttl > time() %} + + {{ var.key is defined ? var.key : var.info }} + {{ var.nhits is defined ? var.nhits : var.num_hits }} + {{ (var.ctime is defined ? var.ctime : var.creation_time)|ago }} ago + {{ ((var.ctime is defined ? var.ctime : var.creation_time) + var.ttl)|until }} (ttl: {{ (time() + var.ttl)|until }}) + {{ var.mem_size }} bytes + + {% endif %} {% endfor %} \ No newline at end of file diff --git a/templates/mod/debug/recent_posts.html b/templates/mod/debug/recent_posts.html index ce4cffc4..406d8812 100644 --- a/templates/mod/debug/recent_posts.html +++ b/templates/mod/debug/recent_posts.html @@ -33,7 +33,7 @@

    - Most recent {{ posts|count }} posts: + Most recent {{ posts|length }} posts:

    diff --git a/templates/mod/inbox.html b/templates/mod/inbox.html index 63f4de5c..db0641e4 100644 --- a/templates/mod/inbox.html +++ b/templates/mod/inbox.html @@ -1,4 +1,4 @@ -{% if not messages %} +{% if messages|length == 0 %}

    ({% trans 'No private messages for you.' %})

    {% else %}
    diff --git a/templates/mod/log.html b/templates/mod/log.html index a38b4af5..bb1be89e 100644 --- a/templates/mod/log.html +++ b/templates/mod/log.html @@ -49,7 +49,7 @@ {% endfor %}
    -{% if count > logs|count %} +{% if count > logs|length %}

    {% for i in range(0, (count - 1) / config.mod.modlog_page) %} {% if public %} diff --git a/templates/mod/move.html b/templates/mod/move.html index 59bd60f6..a4f35b3a 100644 --- a/templates/mod/move.html +++ b/templates/mod/move.html @@ -22,13 +22,15 @@ {% trans 'Target board' %}

    diff --git a/templates/mod/move_reply.html b/templates/mod/move_reply.html index bf7c2f75..4f878234 100644 --- a/templates/mod/move_reply.html +++ b/templates/mod/move_reply.html @@ -15,7 +15,7 @@