From d2bb450b1ab780bacfff845a88599b5f0b1a2022 Mon Sep 17 00:00:00 2001 From: fowr <89118232+perdedora@users.noreply.github.com> Date: Wed, 29 Mar 2023 18:59:28 -0300 Subject: [PATCH 1/3] update twig to 2.9 --- composer.json | 5 +- composer.lock | 432 +++++++++++++++--- inc/cache.php | 27 ++ inc/config.php | 2 + inc/lib/twig/extensions/Extension/I18n.php | 45 -- .../twig/extensions/Extension/Tinyboard.php | 137 ------ inc/lib/twig/extensions/Node/Trans.php | 133 ------ inc/lib/twig/extensions/TokenParser/Trans.php | 80 ---- inc/mod/pages.php | 2 +- inc/template.php | 151 +++++- templates/banned.html | 4 +- templates/installer/check-requirements.html | 20 +- templates/mod/config-editor-php.html | 12 +- templates/mod/config-editor.html | 104 +++-- templates/mod/dashboard.html | 4 +- templates/mod/debug/apc.html | 18 +- templates/mod/debug/recent_posts.html | 2 +- templates/mod/inbox.html | 2 +- templates/mod/log.html | 2 +- templates/mod/move.html | 16 +- templates/mod/move_reply.html | 2 +- templates/mod/news.html | 2 +- templates/mod/noticeboard.html | 2 +- templates/mod/recent_posts.html | 2 +- templates/mod/search_results.html | 2 +- templates/mod/themes.html | 2 +- templates/mod/user.html | 14 +- templates/mod/view_ip.html | 20 +- templates/notbanned.html | 4 +- templates/post_reply.html | 6 +- templates/post_thread.html | 6 +- templates/post_thread_fileboard.html | 4 +- templates/themes/basic/index.html | 6 +- templates/themes/catalog/catalog.html | 4 +- templates/themes/categories/news.html | 6 +- templates/themes/categories/sidebar.html | 4 +- templates/themes/frameset/news.html | 6 +- templates/themes/frameset/sidebar.html | 4 +- templates/themes/index/index.html | 6 +- templates/themes/recent/recent.html | 4 +- templates/themes/rss/rss.xml | 4 +- templates/themes/sitemap/sitemap.xml | 4 +- tools/rebuild.php | 2 +- tools/rebuild2.php | 2 +- 44 files changed, 710 insertions(+), 606 deletions(-) delete mode 100644 inc/lib/twig/extensions/Extension/I18n.php delete mode 100644 inc/lib/twig/extensions/Extension/Tinyboard.php delete mode 100644 inc/lib/twig/extensions/Node/Trans.php delete mode 100644 inc/lib/twig/extensions/TokenParser/Trans.php diff --git a/composer.json b/composer.json index 0ba98be6..f48f7f55 100644 --- a/composer.json +++ b/composer.json @@ -6,9 +6,10 @@ "ext-mbstring": ">=5.4", "ext-gd": ">=5.4", "ext-pdo": ">=5.4", - "twig/twig": "^1.44.2", + "twig/twig": "^2.9", + "phpmyadmin/twig-i18n-extension": "^4.0", "lifo/ip": "^1.0", - "gettext/gettext": "^1.0", + "gettext/gettext": "^5.5", "mrclay/minify": "^2.1.6", "geoip/geoip": "^1.17", "dapphp/securimage": "^4.0" diff --git a/composer.lock b/composer.lock index 3012c9e0..742c3cfc 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": "1e3723687369c82eea457d2dded76b74", + "content-hash": "72e79f203581eea6e6b0455147b25878", "packages": [ { "name": "dapphp/securimage", @@ -31,12 +31,12 @@ }, "type": "library", "autoload": { - "classmap": [ - "securimage.php" - ], "psr-4": { "Securimage\\": "./" - } + }, + "classmap": [ + "securimage.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -114,37 +114,43 @@ "issues": "https://github.com/maxmind/geoip-api-php/issues", "source": "https://github.com/maxmind/geoip-api-php/tree/master" }, + "abandoned": "geoip2/geoip2", "time": "2016-05-16T19:06:50+00:00" }, { "name": "gettext/gettext", - "version": "v1.1.5", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/php-gettext/Gettext.git", - "reference": "1bdf755a1b49f0614d6fc29f446df567eb62cd5c" + "reference": "8657e580747bb3baacccdcebe69cac094661e404" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/1bdf755a1b49f0614d6fc29f446df567eb62cd5c", - "reference": "1bdf755a1b49f0614d6fc29f446df567eb62cd5c", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/8657e580747bb3baacccdcebe69cac094661e404", + "reference": "8657e580747bb3baacccdcebe69cac094661e404", "shasum": "" }, "require": { - "php": ">=5.3.0" + "gettext/languages": "^2.3", + "php": "^7.2|^8.0" + }, + "require-dev": { + "brick/varexporter": "^0.3.5", + "friendsofphp/php-cs-fixer": "^3.2", + "oscarotero/php-cs-fixer-config": "^2.0", + "phpunit/phpunit": "^8.0|^9.0", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", "autoload": { - "psr-0": { - "Gettext": "" - }, - "files": [ - "Gettext/translator_functions.php" - ] + "psr-4": { + "Gettext\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "AGPL-3.0" + "MIT" ], "authors": [ { @@ -154,33 +160,123 @@ "role": "Developer" } ], - "description": "PHP - JS gettext conversor", - "homepage": "https://github.com/oscarotero/Gettext", + "description": "PHP gettext manager", + "homepage": "https://github.com/php-gettext/Gettext", "keywords": [ "JS", "gettext", "i18n", + "mo", + "po", "translation" ], "support": { "email": "oom@oscarotero.com", - "issues": "https://github.com/oscarotero/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v1.1.5" + "issues": "https://github.com/php-gettext/Gettext/issues", + "source": "https://github.com/php-gettext/Gettext/tree/v5.7.0" }, - "time": "2014-10-22T15:53:45+00:00" + "funding": [ + { + "url": "https://paypal.me/oscarotero", + "type": "custom" + }, + { + "url": "https://github.com/oscarotero", + "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" + } + ], + "time": "2022-07-27T19:54:55+00:00" }, { - "name": "lifo/ip", - "version": "v1.1", + "name": "gettext/languages", + "version": "2.10.0", "source": { "type": "git", - "url": "https://github.com/lifo101/ip.git", - "reference": "b6a36dab288d7aea155698808bfc6649799fe413" + "url": "https://github.com/php-gettext/Languages.git", + "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lifo101/ip/zipball/b6a36dab288d7aea155698808bfc6649799fe413", - "reference": "b6a36dab288d7aea155698808bfc6649799fe413", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" + }, + "bin": [ + "bin/export-plural-rules" + ], + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\Languages\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michele Locati", + "email": "mlocati@gmail.com", + "role": "Developer" + } + ], + "description": "gettext languages with plural rules", + "homepage": "https://github.com/php-gettext/Languages", + "keywords": [ + "cldr", + "i18n", + "internationalization", + "l10n", + "language", + "languages", + "localization", + "php", + "plural", + "plural rules", + "plurals", + "translate", + "translations", + "unicode" + ], + "support": { + "issues": "https://github.com/php-gettext/Languages/issues", + "source": "https://github.com/php-gettext/Languages/tree/2.10.0" + }, + "funding": [ + { + "url": "https://paypal.me/mlocati", + "type": "custom" + }, + { + "url": "https://github.com/mlocati", + "type": "github" + } + ], + "time": "2022-10-18T15:00:10+00:00" + }, + { + "name": "lifo/ip", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/lifo101/ip.git", + "reference": "4c4cf5b554884be93f1d0422eaec8d6426993229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lifo101/ip/zipball/4c4cf5b554884be93f1d0422eaec8d6426993229", + "reference": "4c4cf5b554884be93f1d0422eaec8d6426993229", "shasum": "" }, "require": { @@ -212,9 +308,9 @@ ], "support": { "issues": "https://github.com/lifo101/ip/issues", - "source": "https://github.com/lifo101/ip/tree/master" + "source": "https://github.com/lifo101/ip/tree/v1.1.1" }, - "time": "2020-04-02T11:09:10+00:00" + "time": "2022-07-12T15:45:54+00:00" }, { "name": "mrclay/minify", @@ -268,29 +364,88 @@ "time": "2017-11-03T21:04:01+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "name": "phpmyadmin/twig-i18n-extension", + "version": "v4.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "url": "https://github.com/phpmyadmin/twig-i18n-extension.git", + "reference": "c0d0dd171cd1c7733bf152fd44b61055843df052" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/phpmyadmin/twig-i18n-extension/zipball/c0d0dd171cd1c7733bf152fd44b61055843df052", + "reference": "c0d0dd171cd1c7733bf152fd44b61055843df052", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "twig/twig": "^1.42.3|^2.0|^3.0" + }, + "require-dev": { + "phpmyadmin/coding-standard": "^3.0.0", + "phpmyadmin/motranslator": "^5.2", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7 || ^8 || ^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpMyAdmin\\Twig\\Extensions\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" + } + ], + "description": "Internationalization support for Twig via the gettext library", + "keywords": [ + "gettext", + "i18n" + ], + "support": { + "issues": "https://github.com/phpmyadmin/twig-i18n-extension/issues", + "source": "https://github.com/phpmyadmin/twig-i18n-extension" + }, + "time": "2021-06-10T15:53:38+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-ctype": "*" + }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -298,12 +453,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -328,7 +483,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -344,34 +499,195 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { - "name": "twig/twig", - "version": "v1.44.5", + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "dd4353357c5a116322e92a00d16043a31881a81e" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/dd4353357c5a116322e92a00d16043a31881a81e", - "reference": "dd4353357c5a116322e92a00d16043a31881a81e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8" + "php": ">=7.1" }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.44-dev" + "dev-main": "1.27-dev" + }, + "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.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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 backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.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": "2022-11-03T14:55:06+00:00" + }, + { + "name": "twig/twig", + "version": "v2.15.4", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3e059001d6d597dd50ea7c74dd2464b4adea48d3", + "reference": "3e059001d6d597dd50ea7c74dd2464b4adea48d3", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.8" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.15-dev" } }, "autoload": { @@ -410,7 +726,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v1.44.5" + "source": "https://github.com/twigphp/Twig/tree/v2.15.4" }, "funding": [ { @@ -422,7 +738,7 @@ "type": "tidelift" } ], - "time": "2021-09-17T08:35:19+00:00" + "time": "2022-12-27T12:26:20+00:00" } ], "packages-dev": [], @@ -437,5 +753,5 @@ "ext-pdo": ">=5.4" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.3.0" } diff --git a/inc/cache.php b/inc/cache.php index 85ef9d5a..1614326a 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -186,3 +186,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 85f5e82b..76aa9c3d 100644 --- a/inc/config.php +++ b/inc/config.php @@ -47,6 +47,8 @@ $config['verbose_errors'] = false; // Warn about deprecations? See vichan-devel/vichan#363 and https://www.youtube.com/watch?v=9crnlHLVdno $config['deprecation_errors'] = false; + // Skip cache in twig. this is already enabled with debug + $config['twig_auto_reload'] = true; // EXPLAIN all SQL queries (when in debug mode). $config['debug_explain'] = false; diff --git a/inc/lib/twig/extensions/Extension/I18n.php b/inc/lib/twig/extensions/Extension/I18n.php deleted file mode 100644 index bc6a05bd..00000000 --- a/inc/lib/twig/extensions/Extension/I18n.php +++ /dev/null @@ -1,45 +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 e7dc1ca8..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); - } -} \ No newline at end of file diff --git a/inc/lib/twig/extensions/TokenParser/Trans.php b/inc/lib/twig/extensions/TokenParser/Trans.php deleted file mode 100644 index 4a0fad41..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); - } - } -} \ No newline at end of file diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 0de0d663..49c7350a 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -2268,7 +2268,7 @@ function mod_rebuild() { $log[] = 'Clearing template cache'; load_twig(); - $twig->clearCacheFiles(); + $twig->getCache()->clear(); } if (isset($_POST['rebuild_themes'])) { diff --git a/inc/template.php b/inc/template.php index 4c4fa36d..373e1a6e 100644 --- a/inc/template.php +++ b/inc/template.php @@ -10,16 +10,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) { @@ -67,3 +71,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 b4cdf3f9..60d54400 100644 --- a/templates/banned.html +++ b/templates/banned.html @@ -1,4 +1,4 @@ -{% filter remove_whitespace %} +{% apply spaceless %} {# Automatically removes unnecessary whitespace #}
There were {{ errors }} error(s) and {{ warnings }} warning(s).
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.
{{ var.default }}
- {% endif %}
-
-
- {{ var.default }}
+ {% endif %}
+